Repository navigation
Conversation
- 📝 - 📝 - Merge branch \'main\' of https://github.com/iyekChen/ableton-project-manager - chore(release): 准备上架 Raycast Store(package.json、CHANGELOG 修正) - 📝 - 📝 - 📝 - 📝 - feat(docs): template 支持 {{date:format}} 与 {{time}},日期改用本地时区 - fix(docs): Edit Note 新建笔记与空文件也套用 template - docs(readme): 按代码核对并重写中英文 README(shortcuts、energy、storage、project tracking) - refactor(sets): 用 daw.projectFileExtension 替换写死的 .als 后缀 - docs(readme): 重写 README 中英文版,新增 Quick Start、Your Data 与 screenshots 缩略图网格 - docs(preferences): 更新设置项 title 与 description;README 中英文版同步并新增能量计算说明 - feat(ui): 补充空项目文件夹、模板缺失、分析进度提示;失败 Toast 统一 showFailure 并加 Copy Error - feat(manage-tags): 新增 Assign to Projects 批量打 Stage / Genre;删除标签时显示使用数 - fix(player): 频谱分析改为流式处理,内存不随时长增长;区分 EOF 与真实读取错误 - fix: Move to Trash 与 Edit Info 在动文件前预检所有要写的 storage;Edit Note 区分笔记不存在与读取失败 - Revert "fix(ui): 合集内 searchBarPlaceholder 改为 Search Tracks in Collection" - docs: 添加 Store screenshots,README 中英文版同步更新 Screenshots - fix(ui): 合集内 searchBarPlaceholder 改为 Search Projects in Collection - feat(ui): 各列表的 searchBarPlaceholder 显示当前页面;View Sets 详情无数据时留空 - fix(finder-sync): 按 Projects Folder 分别存 snapshot,换文件夹不再误报;缩短 manyProjectsMissing 提示并加操作 - feat(docs): 监听 Notes / Lyrics 文件夹,外部编辑器保存后即时刷新 Detail - ci: 校验 AudioPlayer.swift 源码哈希,源码改动后未重新编译 binary 时报错 - fix(storage): 新增 removeJson 走写入队列;archiveDeletedProject 移动文档前先检查存储可写 - perf: 歌词改为加载时读入 Project,render 时不再同步读文件 - docs: 新增中文版 README,并在两份 README 顶部加语言切换 - chore(store): 新增 CHANGELOG,命令 subtitle 改为 Ableton Live,README 补充二进制来源与快捷键 - test: 新增 Finder 同步、能量分数与视图偏好测试 - fix: 播放器 PID 校验进程身份,避免 PID 复用时显示幽灵播放;编辑笔记时检测外部改动并确认后再覆盖 - fix(ui): 排序与分组偏好改存同步 Cache,消除进入时的重排闪烁;视图偏好统一到 view-prefs - refactor: 合并两份 slugify 到 taxonomy - fix(projects): 重新加载串行化,避免 Finder 同步交错;bounce 取法统一到 findLatestProjectBounce/countProjectBounces - refactor(storage): 新增 updateJson,所有 LocalStorage 读写统一排队并做损坏保护;归档时不再用空数据覆盖已有删除记录 - docs: 修正 README 配置表、存储与 Finder 删除说明,统一 Clean up Leftovers 与标签重名文案 - fix(player): 播放器二进制改为原子替换;分析模式一次预留缓冲,避免长文件退化 - fix: 模板标题中的 $ 不再被当成替换模式;删除 Bounce 失败时提示;Finder 改名后笔记未迁移时提示 - fix(collections): 播放、复制、排队与能量分析改用含外部来源的最新 bounce,与主列表一致 - fix(projects): 视图偏好改存同步 Cache,消除进入时 Detail/Overview 闪烁 - fix(collections): Delete Collection 改为一次读写移除成员,修复并发覆盖导致成员残留 - feat(tags): Manage Tags 新增 Reset to Defaults,并清理指向已删除选项的标签引用 - feat(collections): 新增批量 Add Projects(含空合集入口),统一 Tracklist/Unsorted 渲染,默认 Overview 并消除视图闪烁 - feat(stage): 删除 Draft,新增 Recording(红色,位于 Production 前),Demo 改用 PrimaryText - refactor(apm): 更名为 Ableton Project Manager(含二进制 audio-player、Store 搜索元数据、README) - fix(collections): Move to Top/Bottom 用 ⌘⇧↑/↓,消除快捷键冲突 - chore(eslint): 忽略自动生成的 raycast-env.d.ts - test: vitest 解析 @/ 别名(与 tsconfig paths 对齐) - test: 修正测试对已迁移模块的引用路径 - refactor(structure): projects 并入 core/projects - refactor(daws): als-metadata 归入 daws/ableton,track-info 改走 adapter - refactor(structure): 迁移推送视图到 core/ui - refactor(structure): 迁移 project 组件到 core/ui/components/project - refactor(structure): 迁移 use-audio-player 到 core/ui/hooks - refactor(structure): 迁移 grouping/sorting 到 core/ui - fix(structure): 修复 audio-analysis 对已迁移 audio-player-path 的引用 - refactor(structure): 迁移元数据与分类模块到 core/metadata - refactor(structure): 迁移文档模块到 core/docs - refactor(structure): 迁移音频模块到 core/audio - build(tsconfig): 启用 @/* 路径别名并试接一处 import - refactor(daws): 工程探测、元数据解析与应用查找接入 DawAdapter - refactor(daws): 抽出 DawAdapter 接口与 Ableton 适配器 - refactor(i18n): 删除 8 个无引用的孤儿文案 key - refactor(grouping): 移除中文删除后恒为 false 的 isZh 死分支 - perf(bounces): 缓存默认 Bounces 计数并在无外部来源时复用,减少重复扫描 - refactor(i18n): 移除中文本地化,扩展改为英文单一语言 - feat(collections): Browse Collections 筛选加入 Genre,与 Search Projects 对齐 - feat(bounces): 文件名后缀灰显,Rename 只编辑文件名主体 - feat(bounces): 外部 bounce 来源(计数/播放/浏览/管理) - feat(bounces): Browse Bounces 支持外部来源(分组/重命名/移除) - feat(bounces): 新增 Manage External Bounce 入口与管理表单(File 分段) - feat(bounces): 项目计数与 Play/Copy Latest 接入外部 bounce 聚合(接线层) - feat(bounces): 外部 bounce 来源的数据模型与聚合核心(地基层) - feat(projects): Clean up Leftovers 内联到 Search Projects,检测到才提示与出现 - feat(edit-info): 移出合集加确认与实时提示;无改动则提示 No Changes 不写盘 - chore(lint): 关闭过时的 @raycast/prefer-common-shortcut 规则 - refactor(collections): Back to Search Projects 图标统一为 Compass - refactor(collections): 曲目面板两种 item 共用 renderItemActions,消除重复 - refactor(collections): 统一 Browse Collections 列表的操作面板(图标 / 分段) - style(bounces): Bounces 页按词汇表统一图标/快捷键/分节 - style(sets): Sets 页按词汇表统一图标/快捷键/分节 - style(search-projects): New Live Set 图标改为 NewDocument - style(search-projects): Edit Info 并入 Details 节,Sort/Group 独立为 Arrange 节 - style(search-projects): 统一图标与快捷键,Action 面板按终稿分节加标题 - fix(storage): 损坏存储不再静默覆盖,补齐加载/占位/废纸篓失败提示 - fix(cleanup): 清理命令按文件夹是否存在判断,废纸篓确认要求 inode - fix(data): 删除 Stage/Genre 清理项目引用、修复 countBounces 目录误计、复制失败不误删他人目录 - feat(grouping): date groups 改为 Finder 风格动态分段,统一 Group By 子菜单顺序 - feat: 新增 Group By(按创建/修改时间分段为今天/本周/本月/今年/更早,默认按创建时间),三个列表页通用;菜单拆分为显示选项与分组/排序两个分区 - feat: 新增 Duplicate Project(⌘D,整个文件夹按 Finder 逻辑后台复制,失败时清理半成品,不继承扩展数据)与 Rename Set(⌘E,以 inode 判断只改大小写,不覆盖同名 Set) - fix(collections): Edit Info 移出合集时同步清除该曲在合集中的轨号与角色(与 Remove from Tracklist 清理一致);合集面板保存后重读映射防回写,面板改动回传 Browse Collections,返回 Search Projects 时重新加载 - fix(docs): 笔记撞名时原名即文件名的项目作为正主照常读写,只拦截经字符替换后撞上的项目;归档与改名迁移按归属判断,正主被删除时带走自己的笔记 - fix(docs): 检测文档文件名撞名的项目并拦截读写、改名迁移与删除归档,Edit Info 改名预检;test: 新增删除→放回→重试的完整还原流程用例 - fix: 改名时以 inode 判断目标是否为同一文件,区分大小写的卷上不再覆盖另一份文档;旧快照缺少 inode 时不判定为改名;文档文件名不再 trim 首尾空格 - fix: 删除编辑笔记时的重复写入;Finder 同步改以创建时间+inode 识别同一文件夹,复制后删原件不再误判为改名,多候选时跳过并提示;放回时文档文件夹不可用则保留待还原文档并在下次加载重试 - feat: 删除项目时归档文档至 Deleted Projects 并在放回后还原数据;识别 Finder 中的改名/删除(有完全磁盘访问权限时以废纸篓核实)并监听项目目录自动重载;新增 Strict Line Breaks、改名大小写放行与笔记撞名预警、合集按显示名判重;文档文件夹失效时拒绝写入 - fix(docs): 记住上次用过的自定义文档文件夹,设置被清空且旧文件夹已消失时仍判定失效、拒绝写入;feat: 监听项目根目录,Finder 增删改名与放回项目时自动重载 - test: 新增文档路径用例(普通名不变、清洗撞名分流、哈希稳定、提示字符检测),偏好桩支持按用例设置 - fix(docs): 自定义文件夹的文档名在清洗改动原名时追加稳定短哈希,避免不同项目共用同一 .md;Edit Info 提示会被替换的字符 - test: 为项目改名的轨号/角色迁移补回归用例,LocalStorage 改用内存桩 - fix: 项目改名时迁移各合集的轨号/角色映射,合集面板改名后重读映射防止旧表回写;修正 Unsorted 曲目残留的 Project.png 图标引用 - feat(ui): 扩展图标与 Project 列表统一为 icon.png,Bounce/Collection/Set 换用自定义 bounce.png/collection.png/set.png,删除旧图标 - feat(ui): 扩展图标与 Project 列表统一为 icon.png,Bounce/Collection/Set 换用自定义 bounce.png/collection.png/set.png,删除旧图标 - chore: 重新提交 package.json - chore: 删除空的 Raycast Test 命令及占位文件 src/test.tsx - chore: 提交 package-lock.json,锁定 vitest 依赖树供 CI 的 npm ci 使用 - ci: 新增 GitHub Actions 工作流,push/PR 到 main 时跑 lint + test + build - test: 接入 Vitest,新增 bounces 纯函数用例(findLatestBounce 锁定 mtime 行为、listBounces 不递归、isAudioFile 后缀识别) - docs: README 同步后台播放/导航/合集排队等功能与快捷键、补 .m3u 限制说明,新增 LICENSE 文件 - fix: 最新 bounce 改按 mtime、删项目清孤儿数据(元数据/顺序/角色)、文档改名用 link+unlink 原子不覆盖并如实回报结果 - fix: 删合集时清理关联数据(成员/顺序/角色/置顶)、改名文档防覆盖、停后台播放前校验进程身份、删除未用的 cleanupAudioPlayer - feat(collection): 新增 Queue Collection in Player(⌘⇧Enter),按 Track Number 生成 .m3u 交默认播放器连播 - feat(ui): 导航互返(⌃Enter/⌥Enter)、Collection 增 Edit Note(⌘⌥N)、Collection 时长改 0:00 式对齐 - feat(player): 新增状态文件(每 0.5s 原子写入),切回命令后经轮询恢复实时进度与暂停态 - feat(player): 传输命令改走命令文件轮询,切回命令后 pause/快退快进/restart 跨进程生效;stop 统一用 SIGTERM - feat(player): 后台播放脱离命令进程(detached + PID 文件),⌘Q 看门狗与 SIGTERM 停止,重开命令按 PID 恢复 Toast - 后台播放:重开命令时按 PID 恢复 Toast(PID 文件增存 project id) - Collection Edit Info:Track Role 改用 Dropdown 并本地化,& 可用 n 搜索(keywords 预置) - feat(player): 为全局播放器添加终止播放快捷键 - refactor(collections): 将 Set Track Role 整合到 Edit Info - feat(tags): 新增 Genre 预设标签并保留用户排序 - feat(tags): 新增 Genre 预设标签并保留用户排序 - Collection View: 曲目支持 Edit Info(⌘E),保存后刷新 Stage/Genre/Collection - Manage Tags: Stage 支持编辑颜色,列表显示彩色圆圈,Rename 统一为 Edit - 规范化 package.json 格式(ray lint 自动排版) - Manage Tags: 新增 Move to Top,Move to Top/Bottom 改用 ⌘⇧↑ / ⌘⇧↓ - feat(tags): Manage Tags 支持 Move Up/Down 与 Move to Bottom 排序 - feat(tags): 重构 Manage Categories 为 Manage Tags(Stage/Genre/Role),Role 改名删除同步到轨道 - refactor(roles): Track Role 改为可编辑词表 roleTaxonomy,子菜单改读词表 - feat(docs): Open Note 无文件时打开即建;Collection Rename 打开即可输入 - feat(collections): Browse Collections 支持 Pin/排序与增删改,数量显示 N Track(s) - build(player): 重新编译二进制,补上播放进度输出 - feat(docs): 新增 Lyrics,统一 Notes/Lyrics 存储与 Detail 切换 - feat(copy): 统一 Copy 快捷键并新增 Copy Bounce Name / Path - feat(player): 播放 Toast 显示 elapsed / total 进度 - feat: 新增 Copy Latest Bounce / Copy Bounce,复制统一为「拷贝」 - feat: Stage/Genre 筛选、Duplicate Set 与 Move to Trash - docs: 补写 README(功能、配置、命令与 roadmap) - Browse Bounces 增加 Show in Finder / Open in Default App,Sets 用 Ableton 应用图标 - Collection 播放与 Detail 视图、全局共享播放器、New Live Set - Search Projects 视图模式改为视图内切换 - 为 Play Latest Bounce 增加播放控制与 ActionPanel 重排 - 能量计算增加可调权重设置 - feat(energy): 能量评分加入 spectral flux (activity) - feat(energy): 能量评分加入 spectral centroid (brightness) - feat(energy): drive track energy from crest factor (loudness-independent) - feat(collections): add energy meter, duration, and role to tracklist - feat: Collection 内按专辑独立的曲目角色(Role) - feat: 为 Browse Bounces / Collections 添加快捷键 - feat: 新增音频 analyze 模式与分析缓存,产出时长/能量 - refactor: 抽出 bounce 扫描逻辑到 projects/bounces,消除重复 - feat: 播放状态按项目区分,仅正在播放的行显示停止 - refactor: 将播放器 READY/STOP 协议提为常量并标注跨语言契约 - fix: 播放器二进制改用 assets 打包并复制到 supportPath,移除 /tmp 硬编码 - 将音频播放器重构为独立模块 - 新增音频播放器测试实现 - 重构:拆分项目管理模块 - 初始化项目
|
Congratulations on your new Raycast extension! 🚀 We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days. Once the PR is approved and merged, the extension will be available on our Store. |
[Medium impact] The extension affects local Ableton project workflows for its users. The PR is not ready to merge because replacement projects can inherit saved data and collection edits can still lose renamed track numbers. Findings
Fix with agent prompt### Issue 1
extensions/ableton-project-manager/src/core/projects/load-projects.ts:undefined-53
Project identity is only the folder name. Switching `projectsFolder` to another library containing `Song` applies the first library's tags, collections, and external bounces to the unrelated `Song`. Replacing a project with a new same-named folder between scans has the same result because `diffSnapshots` compares names before checking folder identity. Include the library and folder identity in saved project references.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.SummaryAdds an Ableton Live project manager with project search, collections, bounce playback, and Markdown notes. Since the previous review:
Reviews (2) · Last reviewed commit: "fix: 处理 Store 审查意见(Preferences 类型、Finder..." · Reviewed by Greptile |
| }, 0); | ||
|
|
||
| projects.push({ | ||
| id: folder, |
There was a problem hiding this comment.
Unrelated projects share saved data
Project identity is only the folder name. Switching projectsFolder to another library containing Song applies the first library's tags, collections, and external bounces to the unrelated Song. Replacing a project with a new same-named folder between scans has the same result because diffSnapshots compares names before checking folder identity. Include the library and folder identity in saved project references.
Knowledge Base Used: Extension command implementation patterns
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/ableton-project-manager/src/core/projects/load-projects.ts
Line: 53
Comment:
**Unrelated projects share saved data**
Project identity is only the folder name. Switching `projectsFolder` to another library containing `Song` applies the first library's tags, collections, and external bounces to the unrelated `Song`. Replacing a project with a new same-named folder between scans has the same result because `diffSnapshots` compares names before checking folder identity. Include the library and folder identity in saved project references.
**Knowledge Base Used:** [Extension command implementation patterns](https://app.greptile.com/raycast/-/custom-context/knowledge-base/raycast/extensions/-/docs/extension-command-implementation.md)
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Acknowledged. Projects are keyed by folder name within the configured Projects Folder, and the extension is designed around a single library. Changing this would mean migrating every stored reference, so I've documented it under Known limitations for now and will revisit it later.
| } | ||
| const base = docFileBaseName(project.title); | ||
| // 规则 3:相同文件夹 → 带类型后缀;规则 2:不同文件夹 → 纯项目名。 | ||
| const fileName = customFoldersCollide() ? `${base}${COLLISION_SUFFIX[kind]}.md` : `${base}.md`; |
There was a problem hiding this comment.
Lyrics settings hide existing notes
Changing whether notes and lyrics share a folder also changes existing note file names. With notes in a custom folder and lyrics in project folders, notes use Song.md. Setting lyrics to that same custom folder makes notes suddenly use Song @Notes.md, without moving or finding the existing note. Keep existing documents reachable when this preference changes.
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/ableton-project-manager/src/core/docs/docs.ts
Line: 307
Comment:
**Lyrics settings hide existing notes**
Changing whether notes and lyrics share a folder also changes existing note file names. With notes in a custom folder and lyrics in project folders, notes use `Song.md`. Setting lyrics to that same custom folder makes notes suddenly use `Song @Notes.md`, without moving or finding the existing note. Keep existing documents reachable when this preference changes.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Acknowledged. This only happens when the user changes whether notes and lyrics share a folder, which is rare and explicit. Renaming files automatically on a preference change felt riskier than documenting it, so it's now listed under Known limitations.
0xdhrv
left a comment
There was a problem hiding this comment.
Hey @iyekChen 👋
Thanks for your contribution 🔥 This is a really thorough project manager for Live: collections with track roles, bounce playback that keeps going after Raycast closes, and the Trash-restore safety net are all great touches.
We already have an extension in the Store for Ableton Live projects:
It already searches your local Live projects. Could you add your features there instead, for example tags, collections, bounce playback, and notes and lyrics as new commands, with project search folded into its existing command? That keeps Live users in one place and makes them easier to discover. You can find how to contribute to an existing extension here. If there's a workflow that really can't fit there, let me know which one and we can take another look.
This would help avoid duplication and keep Ableton Live tooling consolidated in one extension.
As mentioned in our extension guidelines here ↗
|
Hi @0xdhrv, thanks for the review. I'd prefer to keep Ableton Project Manager (APM) as a separate extension. Some users just want to reopen a Set quickly, while others want to manage their whole project library. The Prepare an Extension for Store guide suggests creating a new extension when the changes "would be significant and might break other people's workflows", and I think this is one of those cases. Could you take another look? 1. They serve different purposes. In the Ableton Live app, a project is a folder that holds one or more Sets (
This is close to the guide's Spotify example: a lightweight extension and a deeper one that needs setup are kept apart, because merging them "would only make things more complicated". 2. Merging would replace the Ableton Live extension more than extend it. After a merge, APM would make up almost all of the extension, and the current search and favorites would be a small part of it. Its current users, who came for a lightweight launcher, would get a library manager that asks them to choose a Projects Folder, has ten preferences, and bundles a native binary. Keeping them separate lets each group install what they need. To avoid confusion in the Store, I can make the difference clear in the description and README, or adjust the title or subtitle. For context, I'm actively maintaining APM, and its Ableton-specific code sits behind an adapter so I can build a Logic Project Manager on the same foundation. What APM adds, in detail
|
|
Thanks sooo much @dch09, glad you like it 🙌🏻 |
As far as I understand, your extension handles searching, opening, and pinning as well, rendering mine redundant; therefore, it can and most definitely should replace mine! ✅ |
Description
Browse, organize, and listen to your Ableton Live projects from Raycast: tags, pins, notes and lyrics, bounce playback, and collections for EPs and albums.
Testing: set Projects Folder to a folder containing Ableton project folders (each with a
.alsfile), then open Search Projects.About the bundled binary
assets/audio-playeris a small Swift helper that plays bounces in the background and measures audio features for the energy score. Node can't do either efficiently.swift/AudioPlayer.swift. It uses only Foundation, AVFoundation, Accelerate, and Darwin, with no networking and no third-party code.npm run build:player(swiftc -O, arm64 + x86_64, merged withlipo). It's ad-hoc signed and reproducible: rebuilding with Swift 6.4 gives the same SHA-256,f3463c2dd1d8f9de7796d4a253acf5507fe386de149ef8a67f333afccb415cc9.environment.supportPath.environment.supportPath, made executable, and has its quarantine attribute removed.Happy to follow your preferred process for binaries, including having the Raycast team build it from source.
Screencast
2026-10-22.at.07.51.52.-.Raycast.APM.mp4
Checklist
npm run buildand tested this distribution build in Raycastassetsfolder are used by the extension itselfREADMEare placed outside of themetadatafolder