auriga-cli 1.18.5 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,10 +11,10 @@ This repo itself is a fully configured harness project. You can clone it to see
11
11
  | Module | Description |
12
12
  |---|---|
13
13
  | **Workflow** | `CLAUDE.md` auriga workflow: requirement clarification -> TDD -> Review, Harness principles, Subagent usage guide |
14
- | **Skills** | Development process + orchestration skills — brainstorming, systematic-debugging, TDD, verification, planning, playwright, test-designer, incremental-impl |
14
+ | **Skills** | External development process skills — brainstorming, systematic-debugging, TDD, verification, planning, playwright |
15
15
  | **Recommended Skills** | Optional utility skills (e.g. `codex-agent`, `claude-code-agent`) you can add on top of the workflow skills |
16
- | **Plugins** | Recommended Claude Code and Codex plugins — skill-creator, claude-md-management, codex, auriga-go, auriga-git-guards, session-instructions-loader, deep-review |
17
- | **Hooks** | Claude Code hooks: `notify` (macOS notification, focus-aware sound-only when terminal is frontmost **opt-in**: not installed by `install --all`, requires `install hooks --hook notify`) |
16
+ | **Plugins** | Recommended Claude Code and Codex plugins — skill-creator, claude-md-management, codex, auriga-go, auriga-git-guards, auriga-workflow-skills, auriga-notify, session-instructions-loader, deep-review |
17
+ | **Hooks** | Legacy Claude Code hook installer. No repo-owned hooks are currently exposed here; `notify` ships as the `auriga-notify` plugin. |
18
18
 
19
19
  ## Quick Start
20
20
 
@@ -41,14 +41,14 @@ The leading `-y` belongs to `npx` (it auto-confirms package installation), **not
41
41
  Non-interactive install commands:
42
42
 
43
43
  ```bash
44
- npx -y auriga-cli install --all # workflow + skills + plugins + hooks (atomic)
44
+ npx -y auriga-cli install --all # workflow + skills + default plugins (atomic)
45
45
  npx -y auriga-cli install recommended # opt-in utility skills (not in --all)
46
46
  npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
47
47
  npx -y auriga-cli install <type> [--flags] # one of: workflow | skills | recommended | plugins | hooks
48
48
  npx -y auriga-cli --help # full catalog + flags
49
49
  ```
50
50
 
51
- Exit codes: `0` success, `1` fatal (precheck / parse / fetch), `2` partial success — `stderr` lists per-category `[OK]/[FAIL]` and a `Retry:` hint. After install, reload the Claude Code or Codex session so the new `CLAUDE.md` / skills / plugins / hook registrations are picked up.
51
+ Exit codes: `0` success, `1` fatal (precheck / parse / fetch), `2` partial success — `stderr` lists per-category `[OK]/[FAIL]` and a `Retry:` hint. After install, reload the Claude Code or Codex session so the new `CLAUDE.md` / skills / plugins / hook-plugin registrations are picked up.
52
52
 
53
53
  ### Web UI (opt-in)
54
54
 
@@ -58,7 +58,7 @@ For a browser-based view of what's installed and one-click apply, run:
58
58
  npx auriga-cli web-ui
59
59
  ```
60
60
 
61
- This boots a local server on `127.0.0.1`, opens your default browser, and serves a dashboard that scans the current project, shows each module's status (installed / update-available / not-installed), and applies install / update / uninstall in a queue with live SSE progress. The server shuts down on its own ~15 s after the browser closes.
61
+ This boots a local server on `127.0.0.1`, opens your default browser, and serves a dashboard that scans the current project, shows each module's status (installed / not-installed / partial-install), and applies install / uninstall in a queue with live SSE progress. Re-running install is the update path — every installer is idempotent and overwrites in place. The server shuts down on its own ~15 s after the browser closes.
62
62
 
63
63
  The UI is opt-in — `npx auriga-cli` still launches the TTY menu below.
64
64
 
@@ -102,9 +102,6 @@ Installs selected skills via `npx skills add`, targeting both Claude Code and Co
102
102
  | verification-before-completion | [obra/superpowers](https://github.com/obra/superpowers) | Pre-completion verification — evidence before assertions |
103
103
  | planning-with-files | [OthmanAdi/planning-with-files](https://github.com/OthmanAdi/planning-with-files) | File-based task planning and progress tracking |
104
104
  | playwright-cli | [microsoft/playwright-cli](https://github.com/microsoft/playwright-cli) | Browser automation and testing |
105
- | test-designer | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | Independent-Evaluation test designer for TDD red phase |
106
- | incremental-impl | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | Decides how to implement a non-trivial change: size, slicing strategy, optional parallel dispatch, per-slice execution discipline |
107
- | session-compound | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | Post-merge session compounder — distills the session into an interactive HTML report (timeline + token / cache / tool health + playground for skill installs / AGENTS.md edits / new-skill gaps) |
108
105
 
109
106
  **Recommended Skills (opt-in, not installed by `--all`):**
110
107
 
@@ -129,6 +126,8 @@ Examples:
129
126
 
130
127
  ```bash
131
128
  npx -y auriga-cli install plugins --plugin auriga-go
129
+ npx -y auriga-cli install plugins --agent both --plugin auriga-workflow-skills
130
+ npx -y auriga-cli install plugins --plugin auriga-notify
132
131
  npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
133
132
  npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
134
133
  ```
@@ -140,31 +139,24 @@ npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
140
139
  | codex | Claude Code | Codex cross-model collaboration |
141
140
  | auriga-go | Claude Code / Codex | Workflow autopilot for the auriga workflow. Reminder-based navigation across the `CLAUDE.md` phases. Bundles two skills: `auriga-go` (description-based NL trigger + `/auriga-go`) and `/goalify` (plans an autonomous goal from a spec or work-in-progress and dispatches it via Claude Code's built-in `/goal` command). |
142
141
  | auriga-git-guards | Claude Code / Codex | Three git-lifecycle guardrails plus the bundled `git-workflow` skill. Hooks: `commit-reminder` (PostToolUse on `Edit` / `Write` / `MultiEdit` in Claude Code and on `apply_patch` — Codex's canonical file-edit `tool_name` — so it fires in both runtimes → when uncommitted diff vs `HEAD` exceeds 200 lines or 8 files and the last reminder was ≥ 60 s ago, inject a nudge to commit at the next semantic boundary), `pr-create-guard` (PostToolUse on `gh pr create` → fetch the new PR's body via `gh pr view` and inject headings + TODO counts as `additionalContext` so the Agent can self-verify the five-element PR description: scope / acceptance criteria / design decisions / risks / remaining TODOs), and `pr-ready-guard` (PreToolUse on `gh pr ready` → block on stray planning docs at `findings.md` / `progress.md` / `task_plan.md` / `docs/superpowers/specs/*.md`, unfinalized active specs in `docs/specs/*.md`, or unpushed commits; otherwise inject the body snapshot). The two PostToolUse hooks reach full Claude Code / Codex parity; Codex currently fails open on `pr-ready-guard`'s PreToolUse `additionalContext` informational path (block path identical). |
142
+ | auriga-workflow-skills | Claude Code / Codex | Bundles the auriga-owned workflow execution skills: `incremental-impl`, `test-designer`, and `session-compound`. Installed by default through the plugin path instead of `install skills`. |
143
+ | auriga-notify *(opt-in)* | Claude Code | macOS native notification plugin for Claude Code `Notification` events. Focus-aware sound-only mode, click-to-activate, per-project notification grouping, and migrated `config.json` / `icon.png` support. Not installed by `install --all`; install explicitly with `install plugins --plugin auriga-notify`. |
143
144
  | session-instructions-loader | Codex | Codex-only SessionStart plugin that injects ancestor `AGENTS.md` files plus repo-configured extra instruction files. |
144
145
  | deep-review | Claude Code / Codex | Multi-dimensional PR review orchestrator — dispatches parallel reviewers (spec-conformance, correctness, test-quality, docs-sync, plus conditional robustness/UX/performance/structure/code-quality/skill-plugin-quality) and synthesizes findings into an actionable punch list. Bundles a companion `reviewer-creator` skill for scaffolding project-level custom reviewers under `docs/rules/review/`. Drives the formal-review phase in `CLAUDE.md`. |
145
146
 
146
147
  ### Hooks
147
148
 
148
- Installs Claude Code hooks into a chosen scope. Each hook is self-contained under `.claude/hooks/<name>/` and can be customized without editing code.
149
-
150
- | Hook | Description |
151
- |---|---|
152
- | notify *(opt-in)* | Native macOS notification when Claude needs your attention. Shows the brand mark in the small app-icon position; click brings the originating terminal back to focus. **Focus-aware**: when the launching terminal is already frontmost, drops the banner and plays the sound only (toggle via `soundOnlyWhenFocused` in `config.json`). **Per-project group ID**: new notifications cleanly replace older ones in Notification Center, no process accumulation, no cross-project interference. Auto-installs `alerter` via Homebrew (`vjeantet/tap/alerter`). Customize sound and icon by editing `.claude/hooks/notify/config.json` and `.claude/hooks/notify/icon.png`. macOS-only at runtime; silent no-op on other platforms. |
153
-
154
- Scope choices:
155
-
156
- - **Project local** (recommended for cross-platform teams): files under `./.claude/hooks/`, registered in `./.claude/settings.local.json` — per-developer, not committed.
157
- - **Project**: same files, registered in `./.claude/settings.json` — shared with the team via git.
158
- - **User**: files under `~/.claude/hooks/`, registered in `~/.claude/settings.json` — global across all your projects.
159
-
160
- Re-running the installer preserves your customized `config.json` and `icon.png`, overwrites the runtime, and never produces duplicate hook entries (idempotent merge by sentinel marker).
149
+ The traditional hook installer remains for compatibility, but this repo no
150
+ longer exposes a repo-owned hook through `install hooks`. New repo-owned hooks
151
+ should be shipped inside plugins. The former `notify` hook is now the
152
+ `auriga-notify` plugin.
161
153
 
162
154
  ## Requirements
163
155
 
164
156
  - Node.js >= 18
165
157
  - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (required for Claude Code Plugins and Hooks modules)
166
158
  - Codex CLI (required only for `install plugins --agent codex|both`)
167
- - [Homebrew](https://brew.sh) (recommended for the `notify` hook to install `alerter`)
159
+ - [Homebrew](https://brew.sh) (recommended for the `auriga-notify` plugin to use `alerter`)
168
160
 
169
161
  ## Development
170
162
 
package/README.zh-CN.md CHANGED
@@ -11,10 +11,10 @@
11
11
  | 模块 | 说明 |
12
12
  |---|---|
13
13
  | **Workflow** | `CLAUDE.md` 里的 auriga 工作流:需求澄清 → TDD → Review,Harness 原则,Subagent 使用指南 |
14
- | **Skills** | 开发流程 + 编排类 skills —— brainstorming、systematic-debugging、TDD、verification、planning、playwright、test-designer、incremental-impl |
14
+ | **Skills** | 外部开发流程 skills —— brainstorming、systematic-debugging、TDD、verification、planning、playwright |
15
15
  | **Recommended Skills** | 可选的工具类 skills(如 `codex-agent`、`claude-code-agent`),在 workflow skills 之外按需追加 |
16
- | **Plugins** | 推荐的 Claude Code 和 Codex 插件 —— skill-creator、claude-md-management、codex、auriga-go、auriga-git-guards、session-instructions-loader、deep-review |
17
- | **Hooks** | Claude Code hooks:`notify`(macOS 通知,终端在焦点时仅放声不弹横幅 —— **opt-in**:`install --all` 不装,需要 `install hooks --hook notify`) |
16
+ | **Plugins** | 推荐的 Claude Code 和 Codex 插件 —— skill-creator、claude-md-management、codex、auriga-go、auriga-git-guards、auriga-workflow-skills、auriga-notify、session-instructions-loader、deep-review |
17
+ | **Hooks** | 传统 Claude Code hook 安装器。目前没有仓库自维护 hook 暴露在这里;`notify` 已迁移为 `auriga-notify` 插件。 |
18
18
 
19
19
  ## 快速开始
20
20
 
@@ -41,7 +41,7 @@ npx -y auriga-cli guide
41
41
  非交互安装命令:
42
42
 
43
43
  ```bash
44
- npx -y auriga-cli install --all # workflow + skills + plugins + hooks(原子)
44
+ npx -y auriga-cli install --all # workflow + skills + 默认 plugins(原子)
45
45
  npx -y auriga-cli install recommended # 可选工具 skills(不在 --all 内)
46
46
  npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
47
47
  npx -y auriga-cli install <type> [--flags] # 单类:workflow | skills | recommended | plugins | hooks
@@ -52,13 +52,13 @@ npx -y auriga-cli --help # 完整 catalog + flag 说明
52
52
 
53
53
  ### Web UI(可选)
54
54
 
55
- 如果想在浏览器里看到“已装 / 可更新 / 未装”全景并一键 apply,跑:
55
+ 如果想在浏览器里看到“已装 / 未装 / 半装”全景并一键 apply,跑:
56
56
 
57
57
  ```bash
58
58
  npx auriga-cli web-ui
59
59
  ```
60
60
 
61
- 它会在 `127.0.0.1` 起一个本地 server、自动开浏览器,扫描当前项目并展示 5 个分类的状态。勾选要安装/更新/卸载的项目后点 Apply,SSE 实时回传执行进度。关浏览器后约 15 秒 server 自动退出。
61
+ 它会在 `127.0.0.1` 起一个本地 server、自动开浏览器,扫描当前项目并展示 5 个分类的状态。勾选要安装/卸载的项目后点 Apply,SSE 实时回传执行进度。需要"升级"时就重新 install——每个安装器都是幂等覆盖。关浏览器后约 15 秒 server 自动退出。
62
62
 
63
63
  Web UI 是显式入口;`npx auriga-cli` 仍然走下面的 TTY 菜单。
64
64
 
@@ -102,9 +102,6 @@ npx auriga-cli
102
102
  | verification-before-completion | [obra/superpowers](https://github.com/obra/superpowers) | 完成前验证,用证据说话 |
103
103
  | planning-with-files | [OthmanAdi/planning-with-files](https://github.com/OthmanAdi/planning-with-files) | 文件化任务计划与进度跟踪 |
104
104
  | playwright-cli | [microsoft/playwright-cli](https://github.com/microsoft/playwright-cli) | 浏览器自动化与测试 |
105
- | test-designer | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | TDD 红灯阶段的 Independent Evaluation 测试设计器 |
106
- | incremental-impl | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | 决定如何实现非平凡改动:估算大小、选择切片策略、按需并行派遣、执行片间纪律 |
107
- | session-compound | [Ben2pc/auriga-cli](https://github.com/Ben2pc/auriga-cli) | PR 合并后的会话复利 skill — 将本次会话沉淀为交互式 HTML 报告(时间线 + token / cache / 工具健康度 + playground:skill 安装 / AGENTS.md 修改 / 新建 skill 缺口) |
108
105
 
109
106
  **Recommended Skills(可选,不在 `--all` 内):**
110
107
 
@@ -129,6 +126,8 @@ npx auriga-cli
129
126
 
130
127
  ```bash
131
128
  npx -y auriga-cli install plugins --plugin auriga-go
129
+ npx -y auriga-cli install plugins --agent both --plugin auriga-workflow-skills
130
+ npx -y auriga-cli install plugins --plugin auriga-notify
132
131
  npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
133
132
  npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
134
133
  ```
@@ -140,31 +139,23 @@ npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
140
139
  | codex | Claude Code | Codex 跨模型协作 |
141
140
  | auriga-go | Claude Code / Codex | auriga 工作流的自动驾驶:按 `CLAUDE.md` 的 phase 做 reminder-based 导航。内置两个 skill:`auriga-go`(按 description 的自然语言触发 + `/auriga-go` slash command)和 `/goalify`(根据 spec 或当前进展 plan 出 goal,并通过 Claude Code 内置的 `/goal` 命令分发执行)。 |
142
141
  | auriga-git-guards | Claude Code / Codex | 三个 git-lifecycle guardrail + 内置 `git-workflow` skill。Hooks:`commit-reminder`(Claude Code 下 PostToolUse 匹配 `Edit` / `Write` / `MultiEdit`,Codex 下匹配 `apply_patch`(Codex 文件编辑 canonical `tool_name`),两个 runtime 都触发 —— 未提交 diff 对比 `HEAD` 超过 200 行或 8 个文件,且距上次提醒 ≥ 60 s 时,注入提醒让 Agent 在下一个语义边界 commit)、`pr-create-guard`(`gh pr create` 的 PostToolUse —— 通过 `gh pr view` 拉真实 PR body,扫 `^##` / `^###` headings 并统计 `- [ ]` / `- [x]` 注入 `additionalContext`,让 Agent 对照五要素:scope / acceptance criteria / design decisions / risks / remaining TODOs)、`pr-ready-guard`(`gh pr ready` 的 PreToolUse —— 仅按结构信号拦截:游离 `findings.md` / `progress.md` / `task_plan.md` / `docs/superpowers/specs/*.md`、`docs/specs/*.md` 内未结案的活跃 spec、未 push commits;放行时注入 body 快照)。两个 PostToolUse hook 在 Claude Code / Codex 上完全对齐;Codex 仅对 `pr-ready-guard` 的 PreToolUse `additionalContext` 信息路径 fail-open(block 路径两边一致)。 |
142
+ | auriga-workflow-skills | Claude Code / Codex | 打包 auriga 自维护的工作流执行 skills:`incremental-impl`、`test-designer`、`session-compound`。默认通过插件路径安装,不再通过 `install skills` 作为独立条目安装。 |
143
+ | auriga-notify *(opt-in)* | Claude Code | Claude Code `Notification` 事件的 macOS 原生通知插件。支持焦点感知仅提示音、点击唤起终端、按项目分组通知,并迁移旧 `config.json` / `icon.png`。不随 `install --all` 默认安装,需要显式执行 `install plugins --plugin auriga-notify`。 |
143
144
  | session-instructions-loader | Codex | Codex-only SessionStart 插件,注入上层目录的 `AGENTS.md` 和仓库配置的额外 instruction 文件。 |
144
145
  | deep-review | Claude Code / Codex | 多维度 PR review 编排器 —— 并行派发各维度 reviewer(spec-conformance、correctness、test-quality、docs-sync,以及条件触发的 robustness/UX/performance/structure/code-quality/skill-plugin-quality),汇总成 punch list。同包内打包了 `reviewer-creator` skill,用于在 `docs/rules/review/` 下生成项目级自定义 reviewer。承担 `CLAUDE.md` 中的正式评审职责。 |
145
146
 
146
147
  ### Hooks
147
148
 
148
- Claude Code hooks 安装到选定的作用域。每个 hook 都是 `.claude/hooks/<name>/` 下一个自包含目录,可以**不改代码**自定义。
149
-
150
- | Hook | 说明 |
151
- |---|---|
152
- | notify *(opt-in)* | 当 Claude 需要你关注时弹一条原生 macOS 通知。在通知小图标位显示品牌图,点击通知可把发起 Claude 的终端拉回前台。**焦点感知**:发起 Claude 的终端正处于前台时,仅放提示音不弹横幅(通过 `config.json` 的 `soundOnlyWhenFocused` 切换)。**按项目分组**:新通知会干净地替换通知中心里的旧条目,不会进程堆积,也不会跨项目互相覆盖。会自动通过 Homebrew 安装 `alerter`(`vjeantet/tap/alerter`)。改 `.claude/hooks/notify/config.json` 即可换提示音、替换 `.claude/hooks/notify/icon.png` 即可换图标。仅 macOS 运行时生效,其它平台静默 no-op。 |
153
-
154
- 作用域选择:
155
-
156
- - **Project local**(推荐给跨平台团队):文件落在 `./.claude/hooks/`,注册到 `./.claude/settings.local.json` —— 每个开发者各自安装,不进 git。
157
- - **Project**:同样的文件,注册到 `./.claude/settings.json` —— 整个团队共享。
158
- - **User**:文件落在 `~/.claude/hooks/`,注册到 `~/.claude/settings.json` —— 全局生效。
159
-
160
- 重新跑安装器时会保留你修改过的 `config.json` 和 `icon.png`,覆盖运行时本身,并通过 marker 字段幂等去重,绝不会产生重复的 hook 条目。
149
+ 传统 hook 安装器仍保留作兼容入口,但本仓库当前不再通过
150
+ `install hooks` 暴露自维护 hook。新的自维护 hook 应随插件分发。原来的
151
+ `notify` hook 已迁移为 `auriga-notify` 插件。
161
152
 
162
153
  ## 环境要求
163
154
 
164
155
  - Node.js >= 18
165
156
  - [Claude Code](https://docs.anthropic.com/en/docs/claude-code)(Claude Code Plugins 和 Hooks 模块需要)
166
157
  - Codex CLI(仅 `install plugins --agent codex|both` 需要)
167
- - [Homebrew](https://brew.sh)(`notify` hook 用来安装 `alerter`,可选)
158
+ - [Homebrew](https://brew.sh)(`auriga-notify` 插件使用 `alerter` 时推荐安装)
168
159
 
169
160
  ## 开发
170
161
 
@@ -1,9 +1,8 @@
1
- export type ItemStatus = "installed" | "update-available" | "not-installed"
1
+ export type ItemStatus = "installed" | "not-installed"
2
2
  /** Dual-Agent plugin where some target Agents have the plugin installed
3
- * and some don't (e.g. Claude side installed, Codex side missing). Distinct
4
- * from `update-available` because the action is "install on the missing
5
- * side", not "upgrade to a newer version". The missing agents are
6
- * enumerated in `PluginState.missingAgents`. */
3
+ * and some don't (e.g. Claude side installed, Codex side missing). The
4
+ * user-facing action is "install on the missing side"; the missing
5
+ * agents are enumerated in `PluginState.missingAgents`. */
7
6
  | "partial-install";
8
7
  /**
9
8
  * Per-category scan scope. Each category (workflow / skills / plugins / hooks)
@@ -29,8 +28,6 @@ export interface StateReport {
29
28
  }
30
29
  export interface WorkflowState {
31
30
  status: ItemStatus;
32
- currentVersion?: string;
33
- expectedVersion: string;
34
31
  /** Which scope the scanner read to produce this row. Reflects the scope
35
32
  * scanned, not where the file was found — e.g. when scope=user and
36
33
  * ~/.claude/CLAUDE.md is absent, observedScope is still "user". The
@@ -44,8 +41,6 @@ export interface SkillState {
44
41
  description: string;
45
42
  status: ItemStatus;
46
43
  isWorkflow: boolean;
47
- currentHash?: string;
48
- expectedHash: string;
49
44
  /** Scope the scanner read to produce this row. See WorkflowState comment. */
50
45
  observedScope?: ScanScope;
51
46
  }
@@ -59,35 +54,26 @@ export interface PluginState {
59
54
  * `agents.length === 2` the UI shows a BOTH badge and Apply installs to
60
55
  * each agent in turn. Status is aggregated across all targeted agents:
61
56
  * `installed` ⇔ all agents installed; `not-installed` ⇔ all not-installed;
62
- * partial state (some installed, some not) → `partial-install`; agent-
63
- * uniform version drift → `update-available`. */
57
+ * mixed → `partial-install` (some installed, some not). */
64
58
  agents: ApplyAgent[];
65
59
  /** Agents that target this plugin but don't have it installed. Populated
66
- * iff `status === "partial-install"`. Lets the UI render per-agent
67
- * ✓/✗ marks and tell the user exactly which side needs `auriga-cli`
68
- * to backfill. Always omitted for `installed` / `not-installed` /
69
- * `update-available`. */
60
+ * iff `status === "partial-install"`. Drives the "Missing on Codex"
61
+ * UI caption + tells the user exactly which side needs backfill. */
70
62
  missingAgents?: ApplyAgent[];
71
- currentVersion?: string;
72
- expectedVersion?: string;
73
- versionSource: "upstream-live" | "catalog";
74
63
  /** Scope the scanner read to produce this row. Codex plugins are always
75
64
  * "user" (Codex has no project-scope plugin concept). See WorkflowState
76
65
  * comment on why this is typed optional. */
77
66
  observedScope?: ScanScope;
78
67
  /** True for plugins whose source lives in an upstream marketplace, not in
79
- * this repo (skill-creator / claude-md-management / codex). The scanner
80
- * short-circuits update-available reporting for these upgrades go
81
- * through `claude plugins update`, not us. The UI renders an EXTERNAL
82
- * badge to make the "not our jurisdiction" signal explicit. */
68
+ * this repo (skill-creator / claude-md-management / codex). Pure UI hint
69
+ * since v1.19.0 the EXTERNAL badge tells users upgrades go through
70
+ * `claude plugins update`, not via auriga-cli. */
83
71
  external?: boolean;
84
72
  }
85
73
  export interface HookState {
86
74
  name: string;
87
75
  description: string;
88
76
  status: ItemStatus;
89
- currentHash?: string;
90
- expectedHash: string;
91
77
  /** Scope the scanner read to produce this row. See WorkflowState comment. */
92
78
  observedScope?: ScanScope;
93
79
  }
@@ -101,7 +87,7 @@ export interface StateWarning {
101
87
  message: string;
102
88
  }
103
89
  export type ApplyCategory = "workflow" | "skill" | "recommended-skill" | "plugin" | "hook";
104
- export type ApplyAction = "install" | "update" | "uninstall";
90
+ export type ApplyAction = "install" | "uninstall";
105
91
  /**
106
92
  * Installer scope. Carried per-item so the Web UI can mix scopes within a
107
93
  * single apply batch.
@@ -17,6 +17,10 @@
17
17
  // hook: installHook(hookDef, "project",…)│ needs HookDef
18
18
  // hook: uninstallHook(name, …) │
19
19
  //
20
+ // v1.19.0 dropped the "update" action — every installer is idempotent and
21
+ // overwriting, so re-running install IS the update path. Apply receives
22
+ // "install" or "uninstall" only.
23
+ //
20
24
  // Spec: docs/architecture/web-ui.md §6.4 (apply execution model).
21
25
  import { installHook, loadHooksConfig, uninstallHook } from "./hooks.js";
22
26
  import { installPlugins, uninstallPlugin, } from "./plugins.js";
@@ -24,7 +28,6 @@ import { installRecommendedSkills, installSkills, uninstallSkill, } from "./skil
24
28
  import { installWorkflow, uninstallWorkflow } from "./workflow.js";
25
29
  const ALL_ACTIONS = new Set([
26
30
  "install",
27
- "update",
28
31
  "uninstall",
29
32
  ]);
30
33
  function assertAction(action) {
@@ -43,7 +46,7 @@ export function buildDefaultApplyHandlers(ctx) {
43
46
  // the Workflow column's EN/ZH-CN picker). Falls back to ctx lang for
44
47
  // CLI-mode callers that don't pass it.
45
48
  const installLang = requestedLang ?? lang;
46
- if (action === "install" || action === "update") {
49
+ if (action === "install") {
47
50
  await installWorkflow(packageRoot, {
48
51
  interactive: false,
49
52
  cwd,
@@ -68,7 +71,7 @@ export function buildDefaultApplyHandlers(ctx) {
68
71
  const skill = async (action, name, { onLog, scope }) => {
69
72
  assertAction(action);
70
73
  const installScope = scope ?? "project";
71
- if (action === "install" || action === "update") {
74
+ if (action === "install") {
72
75
  await installSkills(packageRoot, {
73
76
  interactive: false,
74
77
  cwd,
@@ -88,7 +91,7 @@ export function buildDefaultApplyHandlers(ctx) {
88
91
  const recommendedSkill = async (action, name, { onLog, scope }) => {
89
92
  assertAction(action);
90
93
  const installScope = scope ?? "project";
91
- if (action === "install" || action === "update") {
94
+ if (action === "install") {
92
95
  await installRecommendedSkills(packageRoot, {
93
96
  interactive: false,
94
97
  cwd,
@@ -119,7 +122,7 @@ export function buildDefaultApplyHandlers(ctx) {
119
122
  const failures = [];
120
123
  for (const agent of agents) {
121
124
  try {
122
- if (action === "install" || action === "update") {
125
+ if (action === "install") {
123
126
  await installPlugins(packageRoot, {
124
127
  interactive: false,
125
128
  cwd,
@@ -162,10 +165,9 @@ export function buildDefaultApplyHandlers(ctx) {
162
165
  });
163
166
  return;
164
167
  }
165
- // install + update both run installHook with the requested scope. The
166
- // hook installer is idempotent re-running == "update". Look up the
167
- // HookDef in the bundled registry; unknown name loud throw so the
168
- // SSE caller surfaces it as item:done success=false.
168
+ // Look up the HookDef in the bundled registry; unknown name → loud throw
169
+ // so the SSE caller surfaces it as item:done success=false. The hook
170
+ // installer is idempotent; re-running install is the update path.
169
171
  const config = loadHooksConfig(packageRoot);
170
172
  const hookDef = config.hooks.find((h) => h.name === name);
171
173
  if (!hookDef) {
package/dist/catalog.d.ts CHANGED
@@ -1,14 +1,6 @@
1
1
  export interface CatalogEntry {
2
2
  name: string;
3
3
  description: string;
4
- /** Build-time-baked plugin version. Set ONLY for plugin entries whose
5
- * source lives in this repo's `plugins/<name>/` directory — the scanner
6
- * uses it to surface "update-available" when the user's installed copy
7
- * is older. Absent for skill / hook entries and for external-marketplace
8
- * plugins (whose manifest lives upstream). Must be baked at build time
9
- * because `plugins/<name>/.claude-plugin/plugin.json` is NOT shipped in
10
- * the npm tarball (see `package.json` `files` field). */
11
- expectedVersion?: string;
12
4
  /** Build-time-baked agent map for plugin entries. Derived from
13
5
  * `.claude/plugins.json` ∪ `.agents/plugins/install.json` — those config
14
6
  * files are NOT shipped in the npm tarball, so the scanner can't read
@@ -17,21 +9,13 @@ export interface CatalogEntry {
17
9
  * Absent on skill / hook entries. */
18
10
  agents?: ("claude" | "codex")[];
19
11
  /** True for plugins whose source lives in an UPSTREAM marketplace
20
- * (skill-creator / claude-md-management / codex), not in this repo. The
21
- * scanner uses this to disable update-available reporting those
22
- * plugins update through `claude plugins update`, not through us. UI
23
- * surfaces an EXTERNAL badge so users know where to look. */
12
+ * (skill-creator / claude-md-management / codex), not in this repo.
13
+ * Pure UI hint since v1.19.0 the EXTERNAL badge tells users that
14
+ * upgrades go through `claude plugins update`, not us. */
24
15
  external?: boolean;
25
16
  }
26
17
  export interface Catalog {
27
18
  generatedAt: string;
28
- /** Workflow content version baked from `CLAUDE.md`'s `# auriga Workflow (vX.Y.Z)`
29
- * header at build time. MUST live here rather than be read at runtime
30
- * because `CLAUDE.md` is NOT in the npm tarball — `package.json` `files`
31
- * allowlists only `dist/`. Empty string when the header is unparseable;
32
- * the scanner then degrades to "trust whatever the user has" rather than
33
- * forcing phantom update-available against an empty expected value. */
34
- workflowVersion: string;
35
19
  workflowSkills: CatalogEntry[];
36
20
  recommendedSkills: CatalogEntry[];
37
21
  plugins: CatalogEntry[];
package/dist/catalog.json CHANGED
@@ -1,15 +1,10 @@
1
1
  {
2
- "generatedAt": "2026-05-12T16:35:23.439Z",
3
- "workflowVersion": "1.7.0",
2
+ "generatedAt": "2026-05-13T06:35:46.774Z",
4
3
  "workflowSkills": [
5
4
  {
6
5
  "name": "brainstorming",
7
6
  "description": "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation."
8
7
  },
9
- {
10
- "name": "incremental-impl",
11
- "description": "Plan a non-trivial code change end-to-end — size triage (XS–XL), slicing strategy, optional parallel subagent dispatch, per-slice Implement → Test → Verify → Commit discipline. Use for any multi-file change, refactor across files, executing a planned task from any planning source, cross-cutting modification (analytics sweep / i18n / library migration), or when about to write more than ~100 lines. 也用于增量实现 / 切片落地 / 推进已规划任务 / 跨切面改动。Skip only for trivial XS edits and pure documentation / configuration changes."
12
- },
13
8
  {
14
9
  "name": "planning-with-files",
15
10
  "description": "Implements Manus-style file-based planning to organize and track progress on complex tasks. Creates task_plan.md, findings.md, and progress.md. Use when asked to plan out, break down, or organize a multi-step project, research task, or any work requiring 5+ tool calls. Supports automatic session recovery after /clear."
@@ -18,18 +13,10 @@
18
13
  "name": "playwright-cli",
19
14
  "description": "Automate browser interactions, test web pages and work with Playwright tests."
20
15
  },
21
- {
22
- "name": "session-compound",
23
- "description": "This skill should be used when the user asks to \"复盘 / 总结 / 沉淀 / wrap up this session\", \"整理一下这次会话\", or \"extract takeaways from this session\". It compounds a single Claude Code or Codex CLI session into a self-contained interactive HTML report (narrative timeline + token / cache / tool health + a playground panel with checkable candidate items for ecosystem-skill installs / AGENTS.md edits / new-skill gaps) so the user can review, tick, and copy back a prompt that lands each item in the right place."
24
- },
25
16
  {
26
17
  "name": "systematic-debugging",
27
18
  "description": "Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes"
28
19
  },
29
- {
30
- "name": "test-designer",
31
- "description": "Design failing tests for complex features using Independent Evaluation — dispatches a context-free agent that sees only the requirement spec and code paths (not the implementation approach), then returns executable failing tests. Use when starting TDD for a non-trivial feature, when the requirement is ambiguous enough that biased tests are a risk, or when the user asks for independent test design."
32
- },
33
20
  {
34
21
  "name": "test-driven-development",
35
22
  "description": "Use when implementing any feature or bugfix, before writing implementation code"
@@ -104,8 +91,7 @@
104
91
  "agents": [
105
92
  "claude",
106
93
  "codex"
107
- ],
108
- "expectedVersion": "1.1.0"
94
+ ]
109
95
  },
110
96
  {
111
97
  "name": "auriga-git-guards",
@@ -113,8 +99,22 @@
113
99
  "agents": [
114
100
  "claude",
115
101
  "codex"
116
- ],
117
- "expectedVersion": "1.1.0"
102
+ ]
103
+ },
104
+ {
105
+ "name": "auriga-workflow-skills",
106
+ "description": "(Claude/Codex) Bundles the auriga-owned workflow execution skills: incremental-impl, test-designer, and session-compound.",
107
+ "agents": [
108
+ "claude",
109
+ "codex"
110
+ ]
111
+ },
112
+ {
113
+ "name": "auriga-notify",
114
+ "description": "(opt-in) Opt-in macOS native notification hook for Claude Code Notification events; migrates legacy notify config and icon on install.",
115
+ "agents": [
116
+ "claude"
117
+ ]
118
118
  },
119
119
  {
120
120
  "name": "deep-review",
@@ -122,22 +122,15 @@
122
122
  "agents": [
123
123
  "claude",
124
124
  "codex"
125
- ],
126
- "expectedVersion": "0.3.1"
125
+ ]
127
126
  },
128
127
  {
129
128
  "name": "session-instructions-loader",
130
129
  "description": "(Codex) Injects extra instruction files on session start",
131
130
  "agents": [
132
131
  "codex"
133
- ],
134
- "expectedVersion": "1.0.0"
132
+ ]
135
133
  }
136
134
  ],
137
- "hooks": [
138
- {
139
- "name": "notify",
140
- "description": "(opt-in) Native macOS notification when Claude needs your attention (auto-installs alerter via Homebrew)"
141
- }
142
- ]
135
+ "hooks": []
143
136
  }
package/dist/cli.js CHANGED
@@ -316,10 +316,22 @@ function validateFilterAgainstCatalog(type, filter) {
316
316
  const singular = categorySingular(type);
317
317
  for (const name of filter) {
318
318
  if (!available.includes(name)) {
319
- parseErr(`unknown ${singular} '${name}'; available: ${available.join(", ")}`);
319
+ const hint = migratedPluginHint(type, name);
320
+ const hintText = hint ? ` ${hint}` : "";
321
+ parseErr(`unknown ${singular} '${name}';${hintText} available: ${available.join(", ")}`);
320
322
  }
321
323
  }
322
324
  }
325
+ function migratedPluginHint(type, name) {
326
+ if (type === "skills" &&
327
+ ["incremental-impl", "test-designer", "session-compound"].includes(name)) {
328
+ return "This skill moved to the auriga-workflow-skills plugin; install it with `install plugins --plugin auriga-workflow-skills`.";
329
+ }
330
+ if (type === "hooks" && name === "notify") {
331
+ return "The notify hook moved to the auriga-notify plugin; install it with `install plugins --plugin auriga-notify`.";
332
+ }
333
+ return undefined;
334
+ }
323
335
  function categorySingular(type) {
324
336
  return type === "recommended" ? "recommended skill"
325
337
  : type === "skills" ? "skill"
@@ -576,7 +588,29 @@ async function runUi(p, version) {
576
588
  const { buildScanCatalog } = await import("./scan-catalog.js");
577
589
  const { ensureUiBundle } = await import("./ui-fetch.js");
578
590
  const cwd = process.cwd();
579
- const packageRoot = getPackageRoot();
591
+ // Two roots, two responsibilities (mirrors the TTY install path's pattern):
592
+ // - tarballRoot: where `dist/catalog.json` + the bundled DEV ui/dist live.
593
+ // Always read from the installed npm package; can't be fetched because
594
+ // dist/ is built artifact, not git content.
595
+ // - contentRoot: where the runtime install recipes live (CLAUDE.md,
596
+ // .claude/plugins.json, .claude/hooks/hooks.json, .agents/plugins/
597
+ // install.json + marketplace.json, skills-lock.json). These files are
598
+ // NOT in the npm tarball — the `files` allowlist only ships `dist/*`
599
+ // + npm defaults. They are fetched from GitHub, pinned to the CLI
600
+ // version tag, by fetchContentRoot(). Under DEV=1 fetchContentRoot
601
+ // short-circuits to the repo root so this is a no-op there.
602
+ // Without the contentRoot fix, tarball-installed Web UI users hit ENOENT
603
+ // on any Codex plugin install (apply handlers read .agents/plugins/
604
+ // install.json from packageRoot).
605
+ const tarballRoot = getPackageRoot();
606
+ let contentRoot;
607
+ try {
608
+ contentRoot = await fetchContentRoot();
609
+ }
610
+ catch (e) {
611
+ log.error(`Failed to fetch content: ${e.message}`);
612
+ return 1;
613
+ }
580
614
  // 1. Resolve UI bundle directory.
581
615
  let uiDir;
582
616
  if (p.uiDir) {
@@ -588,7 +622,7 @@ async function runUi(p, version) {
588
622
  }
589
623
  else if (process.env.DEV === "1") {
590
624
  // Dev convenience: prefer the locally-built ui/dist over a network fetch.
591
- const localDist = path.join(packageRoot, "ui", "dist");
625
+ const localDist = path.join(tarballRoot, "ui", "dist");
592
626
  if (fs.existsSync(path.join(localDist, "index.html"))) {
593
627
  uiDir = localDist;
594
628
  }
@@ -613,7 +647,9 @@ async function runUi(p, version) {
613
647
  // 2. Build scan catalog → ApplyCatalog + pluginAgentsByName.
614
648
  let scanCatalog;
615
649
  try {
616
- scanCatalog = await buildScanCatalog(packageRoot);
650
+ // dist/catalog.json ships in the tarball — read from tarballRoot, not
651
+ // the fetched content root (which doesn't carry build artifacts).
652
+ scanCatalog = await buildScanCatalog(tarballRoot);
617
653
  }
618
654
  catch (e) {
619
655
  log.error(`Failed to build catalog: ${e.message}`);
@@ -635,7 +671,10 @@ async function runUi(p, version) {
635
671
  pluginAgentsByName.set(name, def.agents);
636
672
  }
637
673
  const applyHandlers = buildDefaultApplyHandlers({
638
- packageRoot,
674
+ // contentRoot: install handlers read CLAUDE.md, plugins.json,
675
+ // hooks.json, install.json, marketplace.json — all CONTENT_FILES.
676
+ // Routing them at tarballRoot fails ENOENT for npm-installed users.
677
+ packageRoot: contentRoot,
639
678
  cwd,
640
679
  pluginAgentsByName,
641
680
  });
@@ -656,7 +695,11 @@ async function runUi(p, version) {
656
695
  port,
657
696
  token,
658
697
  cwd,
659
- packageRoot,
698
+ // server reads dist/catalog.json (tarball-shipped) via
699
+ // buildScanCatalog on each /api/state call; install-time content
700
+ // (install.json, plugins.json, CLAUDE.md, …) was already injected
701
+ // into applyHandlers above with contentRoot.
702
+ packageRoot: tarballRoot,
660
703
  heartbeatTimeoutMs: UI_HEARTBEAT_TIMEOUT_MS,
661
704
  applyHandlers,
662
705
  applyCatalog,