auriga-cli 1.20.5 → 1.24.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 +5 -11
- package/README.zh-CN.md +5 -11
- package/dist/api-types.d.ts +1 -1
- package/dist/apply-handlers.d.ts +1 -1
- package/dist/catalog.json +3 -31
- package/dist/cli.js +2 -2
- package/dist/plugins.js +83 -37
- package/dist/state.js +3 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -11,9 +11,9 @@ 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** | External development process skills — systematic-debugging, TDD, verification, planning, playwright (spec authoring
|
|
14
|
+
| **Skills** | External development process skills — systematic-debugging, TDD, verification, planning, playwright (spec authoring and architecture design ship as the `spec-design` and `arch-design` skills inside the `auriga-workflow` plugin) |
|
|
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-
|
|
16
|
+
| **Plugins** | Recommended Claude Code and Codex plugins — skill-creator, claude-md-management, codex, auriga-workflow, auriga-notify, session-instructions-loader |
|
|
17
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
|
|
@@ -107,7 +107,6 @@ Installs selected skills via `npx skills add`, targeting both Claude Code and Co
|
|
|
107
107
|
| Skill | Source | Description |
|
|
108
108
|
|---|---|---|
|
|
109
109
|
| claude-code-agent | [Ben2pc/g-claude-code-plugins](https://github.com/Ben2pc/g-claude-code-plugins) | Delegate coding, review, diagnosis, and planning to standalone Claude Code sessions |
|
|
110
|
-
| code-simplification | [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | Refactor for clarity without changing behavior — trim accumulated complexity |
|
|
111
110
|
| codex-agent | [Ben2pc/g-claude-code-plugins](https://github.com/Ben2pc/g-claude-code-plugins) | Delegate to Codex sessions for cross-model coverage |
|
|
112
111
|
| deprecation-and-migration | [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | Sunset, replace, or migrate legacy code — deprecation discipline |
|
|
113
112
|
| design-taste-frontend | [Leonxlnx/taste-skill](https://github.com/Leonxlnx/taste-skill) | Senior UI/UX engineer with metric-based design rules and strict component architecture |
|
|
@@ -119,16 +118,14 @@ Supports both project and global installation scopes.
|
|
|
119
118
|
|
|
120
119
|
### Plugins
|
|
121
120
|
|
|
122
|
-
Installs selected plugins for Claude Code, Codex, or both. Claude Code uses `claude plugins install` and honors `--scope project|user`; Codex uses `codex plugin marketplace add` and enables selected plugins in `~/.codex/config.toml`.
|
|
121
|
+
Installs selected plugins for Claude Code, Codex, or both. Claude Code uses `claude plugins install` and honors `--scope project|user`; Codex uses `codex plugin marketplace add/upgrade` (the right one is picked by reading `~/.codex/config.toml`) and enables selected plugins in `~/.codex/config.toml`.
|
|
123
122
|
|
|
124
123
|
Examples:
|
|
125
124
|
|
|
126
125
|
```bash
|
|
127
|
-
npx -y auriga-cli install plugins --plugin auriga-
|
|
128
|
-
npx -y auriga-cli install plugins --agent both --plugin auriga-workflow-skills
|
|
126
|
+
npx -y auriga-cli install plugins --agent both --plugin auriga-workflow
|
|
129
127
|
npx -y auriga-cli install plugins --plugin auriga-notify
|
|
130
128
|
npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
|
|
131
|
-
npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
|
|
132
129
|
```
|
|
133
130
|
|
|
134
131
|
| Plugin | Runtime | Description |
|
|
@@ -136,12 +133,9 @@ npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
|
|
|
136
133
|
| skill-creator | Claude Code | Create and manage custom skills |
|
|
137
134
|
| claude-md-management | Claude Code | Audit and improve CLAUDE.md |
|
|
138
135
|
| codex | Claude Code | Codex cross-model collaboration |
|
|
139
|
-
| auriga-
|
|
140
|
-
| 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). |
|
|
141
|
-
| auriga-workflow-skills | Claude Code / Codex | Bundles the auriga-owned workflow execution skills: `incremental-impl`, `test-designer`, `session-compound`, and `spec-design`. Installed by default through the plugin path instead of `install skills`. |
|
|
136
|
+
| auriga-workflow | Claude Code / Codex | The auriga workflow plugin — workflow skills plus the git lifecycle hooks that enforce them. Skills: `incremental-impl`, `test-designer`, `spec-design`, `arch-design`, `code-simplify`, `session-compound`, `goalify` (plans an autonomous goal and dispatches it via Claude Code's built-in `/goal` command), `deep-review` (multi-dimensional PR review orchestrator — parallel per-dimension reviewers synthesized into an actionable punch list), `reviewer-creator` (scaffolds project-level custom reviewers under `docs/rules/review/`), and `git-workflow` (git lifecycle skill). Hooks: `commit-reminder` (PostToolUse on file edits — `Edit` / `Write` / `MultiEdit` in Claude Code, `apply_patch` in Codex — nudges to commit at the next semantic boundary when uncommitted diff vs `HEAD` exceeds 200 lines or 8 files), `pr-create-guard` (PostToolUse on `gh pr create` → injects a PR-body snapshot for five-element self-verification and flags non-Conventional-Commits titles), and `pr-ready-guard` (PreToolUse on `gh pr ready` and non-draft `gh pr create` → blocks on stray planning docs, unfinalized active specs under `docs/specs/`, or unpushed commits). 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). Installed by default through the plugin path. |
|
|
142
137
|
| 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
138
|
| session-instructions-loader | Codex | Codex-only SessionStart plugin that injects ancestor `AGENTS.md` files plus repo-configured extra instruction files. |
|
|
144
|
-
| 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
139
|
|
|
146
140
|
### Hooks
|
|
147
141
|
|
package/README.zh-CN.md
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
| 模块 | 说明 |
|
|
12
12
|
|---|---|
|
|
13
13
|
| **Workflow** | `CLAUDE.md` 里的 auriga 工作流:需求澄清 → TDD → Review,Harness 原则,Subagent 使用指南 |
|
|
14
|
-
| **Skills** | 外部开发流程 skills —— systematic-debugging、TDD、verification、planning、playwright(spec
|
|
14
|
+
| **Skills** | 外部开发流程 skills —— systematic-debugging、TDD、verification、planning、playwright(spec 撰写与架构设计由 `auriga-workflow` 插件内的 `spec-design`、`arch-design` skill 提供)|
|
|
15
15
|
| **Recommended Skills** | 可选的工具类 skills(如 `codex-agent`、`claude-code-agent`),在 workflow skills 之外按需追加 |
|
|
16
|
-
| **Plugins** | 推荐的 Claude Code 和 Codex 插件 —— skill-creator、claude-md-management、codex、auriga-
|
|
16
|
+
| **Plugins** | 推荐的 Claude Code 和 Codex 插件 —— skill-creator、claude-md-management、codex、auriga-workflow、auriga-notify、session-instructions-loader |
|
|
17
17
|
| **Hooks** | 传统 Claude Code hook 安装器。目前没有仓库自维护 hook 暴露在这里;`notify` 已迁移为 `auriga-notify` 插件。 |
|
|
18
18
|
|
|
19
19
|
## 快速开始
|
|
@@ -107,7 +107,6 @@ npx auriga-cli
|
|
|
107
107
|
| Skill | 来源 | 说明 |
|
|
108
108
|
|---|---|---|
|
|
109
109
|
| claude-code-agent | [Ben2pc/g-claude-code-plugins](https://github.com/Ben2pc/g-claude-code-plugins) | 通过 Claude Code Agent SDK 把任务委派给独立 Claude Code 会话 |
|
|
110
|
-
| code-simplification | [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | 不改变行为前提下重构代码以提升可读性 —— 清掉累积的不必要复杂度 |
|
|
111
110
|
| codex-agent | [Ben2pc/g-claude-code-plugins](https://github.com/Ben2pc/g-claude-code-plugins) | 委派给 Codex 会话,做跨模型覆盖 |
|
|
112
111
|
| deprecation-and-migration | [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills) | 废弃与迁移流程 —— 安全地下线、替换或迁移遗留代码 |
|
|
113
112
|
| design-taste-frontend | [Leonxlnx/taste-skill](https://github.com/Leonxlnx/taste-skill) | 高阶 UI/UX 工程师 —— 度量化设计规则与严格的组件架构约束 |
|
|
@@ -119,16 +118,14 @@ npx auriga-cli
|
|
|
119
118
|
|
|
120
119
|
### Plugins
|
|
121
120
|
|
|
122
|
-
可以把选中的插件安装到 Claude Code、Codex 或两者都装。Claude Code 路径使用 `claude plugins install`,并遵守 `--scope project|user`;Codex
|
|
121
|
+
可以把选中的插件安装到 Claude Code、Codex 或两者都装。Claude Code 路径使用 `claude plugins install`,并遵守 `--scope project|user`;Codex 路径根据 `~/.codex/config.toml` 中是否已注册同名 marketplace 自动选择 `codex plugin marketplace add` 或 `upgrade`,并在 `~/.codex/config.toml` 里启用选中的插件。
|
|
123
122
|
|
|
124
123
|
示例:
|
|
125
124
|
|
|
126
125
|
```bash
|
|
127
|
-
npx -y auriga-cli install plugins --plugin auriga-
|
|
128
|
-
npx -y auriga-cli install plugins --agent both --plugin auriga-workflow-skills
|
|
126
|
+
npx -y auriga-cli install plugins --agent both --plugin auriga-workflow
|
|
129
127
|
npx -y auriga-cli install plugins --plugin auriga-notify
|
|
130
128
|
npx -y auriga-cli install plugins --agent codex --plugin session-instructions-loader
|
|
131
|
-
npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
|
|
132
129
|
```
|
|
133
130
|
|
|
134
131
|
| 插件 | 运行时 | 说明 |
|
|
@@ -136,12 +133,9 @@ npx -y auriga-cli install plugins --agent both --plugin auriga-git-guards
|
|
|
136
133
|
| skill-creator | Claude Code | 创建和管理自定义 skills |
|
|
137
134
|
| claude-md-management | Claude Code | 审计和改进 CLAUDE.md |
|
|
138
135
|
| codex | Claude Code | Codex 跨模型协作 |
|
|
139
|
-
| auriga-
|
|
140
|
-
| 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 路径两边一致)。 |
|
|
141
|
-
| auriga-workflow-skills | Claude Code / Codex | 打包 auriga 自维护的工作流执行 skills:`incremental-impl`、`test-designer`、`session-compound`、`spec-design`。默认通过插件路径安装,不再通过 `install skills` 作为独立条目安装。 |
|
|
136
|
+
| auriga-workflow | Claude Code / Codex | auriga 工作流插件 —— 工作流 skill 加上强制执行工作流的 git 生命周期 hook。Skills:`incremental-impl`、`test-designer`、`spec-design`、`arch-design`、`code-simplify`、`session-compound`、`goalify`(plan 出自驱 goal 并通过 Claude Code 内置 `/goal` 命令分发执行)、`deep-review`(多维度 PR review 编排器——并行派发各维度 reviewer,汇总成可执行的 punch list)、`reviewer-creator`(在 `docs/rules/review/` 下生成项目级自定义 reviewer)、`git-workflow`(git 生命周期 skill)。Hooks:`commit-reminder`(文件编辑的 PostToolUse —— Claude Code 匹配 `Edit` / `Write` / `MultiEdit`,Codex 匹配 `apply_patch` —— 未提交 diff 对比 `HEAD` 超过 200 行或 8 个文件时,提醒在下一个语义边界 commit)、`pr-create-guard`(`gh pr create` 的 PostToolUse —— 注入 PR body 快照供五要素自检,并对不符合 Conventional Commits 的标题提示)、`pr-ready-guard`(`gh pr ready` 与非 draft `gh pr create` 的 PreToolUse —— 拦截游离规划文档、`docs/specs/` 内未结案的活跃 spec、未 push commits)。两个 PostToolUse hook 在 Claude Code / Codex 上完全对齐;Codex 仅对 `pr-ready-guard` 的 PreToolUse `additionalContext` 信息路径 fail-open(block 路径两边一致)。默认通过插件路径安装。 |
|
|
142
137
|
| auriga-notify *(opt-in)* | Claude Code | Claude Code `Notification` 事件的 macOS 原生通知插件。支持焦点感知仅提示音、点击唤起终端、按项目分组通知,并迁移旧 `config.json` / `icon.png`。不随 `install --all` 默认安装,需要显式执行 `install plugins --plugin auriga-notify`。 |
|
|
143
138
|
| session-instructions-loader | Codex | Codex-only SessionStart 插件,注入上层目录的 `AGENTS.md` 和仓库配置的额外 instruction 文件。 |
|
|
144
|
-
| 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
139
|
|
|
146
140
|
### Hooks
|
|
147
141
|
|
package/dist/api-types.d.ts
CHANGED
|
@@ -50,7 +50,7 @@ export interface PluginState {
|
|
|
50
50
|
description: string;
|
|
51
51
|
status: ItemStatus;
|
|
52
52
|
/** Which Agent runtimes this plugin can install into. Most plugins target
|
|
53
|
-
* a single agent; dual-Agent plugins (e.g. auriga-
|
|
53
|
+
* a single agent; dual-Agent plugins (e.g. auriga-workflow) have both. When
|
|
54
54
|
* `agents.length === 2` the UI shows a BOTH badge and Apply installs to
|
|
55
55
|
* each agent in turn. Status is aggregated across all targeted agents:
|
|
56
56
|
* `installed` ⇔ all agents installed; `not-installed` ⇔ all not-installed;
|
package/dist/apply-handlers.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface ApplyHandlerContext {
|
|
|
7
7
|
cwd: string;
|
|
8
8
|
/** Resolves plugin name → the list of agents this plugin can install
|
|
9
9
|
* into. Built at boot from the same scan catalog the /api/state route
|
|
10
|
-
* uses. dual-Agent plugins (e.g. `auriga-
|
|
10
|
+
* uses. dual-Agent plugins (e.g. `auriga-workflow`) yield `["claude","codex"]`
|
|
11
11
|
* and the handler iterates the list, installing to each agent in turn.
|
|
12
12
|
* Names not in the map default to `["claude"]` (existing CLI default). */
|
|
13
13
|
pluginAgentsByName: Map<string, ("claude" | "codex")[]>;
|
package/dist/catalog.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-05-
|
|
2
|
+
"generatedAt": "2026-05-15T17:31:57.831Z",
|
|
3
3
|
"workflowSkills": [
|
|
4
4
|
{
|
|
5
5
|
"name": "planning-with-files",
|
|
@@ -27,10 +27,6 @@
|
|
|
27
27
|
"name": "claude-code-agent",
|
|
28
28
|
"description": "Delegate coding, review, diagnosis, planning, and structured-output tasks to an independent Claude Code session via `claude -p` (Agent SDK)."
|
|
29
29
|
},
|
|
30
|
-
{
|
|
31
|
-
"name": "code-simplification",
|
|
32
|
-
"description": "Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity."
|
|
33
|
-
},
|
|
34
30
|
{
|
|
35
31
|
"name": "codex-agent",
|
|
36
32
|
"description": "Delegate coding, review, diagnosis, planning, and browser tasks to an independent Codex session via `codex exec` / resume / review."
|
|
@@ -58,24 +54,8 @@
|
|
|
58
54
|
],
|
|
59
55
|
"plugins": [
|
|
60
56
|
{
|
|
61
|
-
"name": "auriga-
|
|
62
|
-
"description": "(Claude/Codex)
|
|
63
|
-
"agents": [
|
|
64
|
-
"claude",
|
|
65
|
-
"codex"
|
|
66
|
-
]
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"name": "auriga-git-guards",
|
|
70
|
-
"description": "(Claude/Codex) Git lifecycle guardrails: commit-reminder (PostToolUse on Edit/Write/MultiEdit/apply_patch) + pr-create-guard with PR-body snapshot and Conventional Commits title check (PostToolUse on `gh pr create`) + pr-ready-guard structural block at PR Ready transitions, firing on BOTH `gh pr ready` AND `gh pr create` without `--draft` (PreToolUse). Bundles the git-workflow skill. Dual-Agent compatible (Claude Code + Codex).",
|
|
71
|
-
"agents": [
|
|
72
|
-
"claude",
|
|
73
|
-
"codex"
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
"name": "auriga-workflow-skills",
|
|
78
|
-
"description": "(Claude/Codex) Bundles the auriga-owned workflow execution skills: incremental-impl, test-designer, session-compound, and spec-design. Dual-Agent compatible (Claude Code + Codex).",
|
|
57
|
+
"name": "auriga-workflow",
|
|
58
|
+
"description": "(Claude/Codex) The auriga workflow plugin: workflow skills — incremental-impl (implementation slicing), test-designer (independent test design), spec-design (requirement clarification), arch-design (architecture design), code-simplify (code simplification), session-compound (session compounding), goalify (autonomous /goal planning), deep-review (multi-dimensional PR review orchestrator), reviewer-creator (custom reviewer scaffolding), git-workflow (git lifecycle skill) — plus the git lifecycle hooks that enforce them: commit-reminder, pr-create-guard, pr-ready-guard. Dual-Agent compatible (Claude Code + Codex).",
|
|
79
59
|
"agents": [
|
|
80
60
|
"claude",
|
|
81
61
|
"codex"
|
|
@@ -88,14 +68,6 @@
|
|
|
88
68
|
"claude"
|
|
89
69
|
]
|
|
90
70
|
},
|
|
91
|
-
{
|
|
92
|
-
"name": "deep-review",
|
|
93
|
-
"description": "(Claude/Codex) Multi-dimensional PR review orchestrator. Dispatches parallel reviewers (spec-conformance, correctness, test-quality, docs-sync, robustness, security, ux, performance, structure, code-quality, skill-plugin-quality) and synthesizes findings into an actionable punch list. Supports project-level custom reviewers via `docs/rules/review/` and ships a `reviewer-creator` skill for scaffolding them.",
|
|
94
|
-
"agents": [
|
|
95
|
-
"claude",
|
|
96
|
-
"codex"
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
71
|
{
|
|
100
72
|
"name": "skill-creator",
|
|
101
73
|
"description": "Create and manage custom skills",
|
package/dist/cli.js
CHANGED
|
@@ -325,7 +325,7 @@ function validateFilterAgainstCatalog(type, filter) {
|
|
|
325
325
|
function migratedPluginHint(type, name) {
|
|
326
326
|
if (type === "skills" &&
|
|
327
327
|
["incremental-impl", "test-designer", "session-compound"].includes(name)) {
|
|
328
|
-
return "This skill moved to the auriga-workflow
|
|
328
|
+
return "This skill moved to the auriga-workflow plugin; install it with `install plugins --plugin auriga-workflow`.";
|
|
329
329
|
}
|
|
330
330
|
if (type === "hooks" && name === "notify") {
|
|
331
331
|
return "The notify hook moved to the auriga-notify plugin; install it with `install plugins --plugin auriga-notify`.";
|
|
@@ -802,7 +802,7 @@ async function runLegacyMenu() {
|
|
|
802
802
|
{ name: "Workflow — CLAUDE.md + AGENTS.md", value: "workflow", checked: true },
|
|
803
803
|
{ name: "Skills — Development process skills (TDD, debugging, verification, planning...)", value: "skills", checked: true },
|
|
804
804
|
{ name: "Recommended Skills — Extra utility skills (claude-code-agent, codex-agent...)", value: "recommended", checked: true },
|
|
805
|
-
{ name: "Plugins — Claude Code / Codex plugins (skill-creator, codex, auriga-
|
|
805
|
+
{ name: "Plugins — Claude Code / Codex plugins (skill-creator, codex, auriga-workflow...)", value: "plugins", checked: true },
|
|
806
806
|
{ name: "Hooks — Claude Code hooks (notifications, etc.)", value: "hooks", checked: true },
|
|
807
807
|
],
|
|
808
808
|
}));
|
package/dist/plugins.js
CHANGED
|
@@ -22,7 +22,7 @@ const MIGRATED_WORKFLOW_SKILLS = [
|
|
|
22
22
|
"session-compound",
|
|
23
23
|
];
|
|
24
24
|
const NOTIFY_PLUGIN_NAME = "auriga-notify";
|
|
25
|
-
const WORKFLOW_SKILLS_PLUGIN_NAME = "auriga-workflow
|
|
25
|
+
const WORKFLOW_SKILLS_PLUGIN_NAME = "auriga-workflow";
|
|
26
26
|
const LEGACY_NOTIFY_MARKER = "auriga:notify";
|
|
27
27
|
const CODEX_PLUGIN_VERSION_RE = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
|
|
28
28
|
function validateClaudeMarketplace(raw) {
|
|
@@ -287,7 +287,7 @@ function isWorkflowPluginDevSymlink(skillPath, cwd, name) {
|
|
|
287
287
|
return false;
|
|
288
288
|
const target = fs.readlinkSync(skillPath);
|
|
289
289
|
const resolved = path.resolve(path.dirname(skillPath), target);
|
|
290
|
-
const expected = path.resolve(cwd, "plugins", "auriga-workflow
|
|
290
|
+
const expected = path.resolve(cwd, "plugins", "auriga-workflow", "skills", name);
|
|
291
291
|
return resolved === expected;
|
|
292
292
|
}
|
|
293
293
|
function removeMigratedSkillFromLock(cwd, name, opts) {
|
|
@@ -422,18 +422,30 @@ function runPostInstallMigration(pluginName, opts, runtimes) {
|
|
|
422
422
|
migrateLegacyNotifyConfig(opts);
|
|
423
423
|
}
|
|
424
424
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
425
|
+
// Source string Codex CLI records in `~/.codex/config.toml`
|
|
426
|
+
// `[marketplaces.<name>].source` after `marketplace add` succeeds. Used for
|
|
427
|
+
// exact-string compare against the registered marketplace's source to detect
|
|
428
|
+
// same-name-different-source hijack attempts before running `upgrade`.
|
|
429
|
+
function codexLocalMarketplaceSource(packageRoot) {
|
|
430
|
+
if (process.env.DEV === "1")
|
|
431
|
+
return packageRoot;
|
|
432
|
+
return "https://github.com/Ben2pc/auriga-cli.git";
|
|
430
433
|
}
|
|
431
|
-
function
|
|
434
|
+
function codexExternalMarketplaceSource(source) {
|
|
432
435
|
// `source` is validated by validateExtraPluginConfigs against
|
|
433
436
|
// MARKETPLACE_SOURCE_RE (alphanumerics + `._/-`) — no shell metachars
|
|
434
|
-
// can reach this string.
|
|
435
|
-
|
|
436
|
-
|
|
437
|
+
// can reach this string.
|
|
438
|
+
return `https://github.com/${source}.git`;
|
|
439
|
+
}
|
|
440
|
+
function codexMarketplaceAddCommand(packageRoot) {
|
|
441
|
+
const source = codexLocalMarketplaceSource(packageRoot);
|
|
442
|
+
// DEV-mode local paths may contain spaces; URLs need no shell quoting.
|
|
443
|
+
return process.env.DEV === "1"
|
|
444
|
+
? `codex plugin marketplace add ${shellQuote(source)}`
|
|
445
|
+
: `codex plugin marketplace add ${source}`;
|
|
446
|
+
}
|
|
447
|
+
function codexExternalMarketplaceAddCommand(source) {
|
|
448
|
+
return `codex plugin marketplace add ${codexExternalMarketplaceSource(source)}`;
|
|
437
449
|
}
|
|
438
450
|
function codexMarketplaceUpgradeCommand(marketplaceName) {
|
|
439
451
|
return `codex plugin marketplace upgrade ${shellQuote(marketplaceName)}`;
|
|
@@ -449,13 +461,36 @@ function commandErrorText(error) {
|
|
|
449
461
|
parts.push(String(withOutput.stderr));
|
|
450
462
|
return parts.join("\n");
|
|
451
463
|
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
464
|
+
// Codex CLI records every added marketplace as `[marketplaces.<name>]` in
|
|
465
|
+
// `~/.codex/config.toml` with a `source` field. Returns that stored source
|
|
466
|
+
// for an exact-string compare against the source we would `add`, or null
|
|
467
|
+
// when the marketplace isn't registered or the entry is malformed.
|
|
468
|
+
//
|
|
469
|
+
// Why config.toml is the authoritative signal: Codex's `add` command is
|
|
470
|
+
// silently idempotent for an already-added marketplace (exit 0, prints to
|
|
471
|
+
// stdout, no error), so we can't detect already-added by catching an
|
|
472
|
+
// `add` failure. The stored source also lets us guard against same-name
|
|
473
|
+
// hijack — a fork registered under our marketplace name would be invisible
|
|
474
|
+
// to a presence-only check.
|
|
475
|
+
function readCodexMarketplaceSource(marketplaceName) {
|
|
476
|
+
const configPath = path.join(codexHome(), "config.toml");
|
|
477
|
+
if (!fs.existsSync(configPath))
|
|
478
|
+
return null;
|
|
479
|
+
try {
|
|
480
|
+
const parsed = parseToml(fs.readFileSync(configPath, "utf-8"));
|
|
481
|
+
const marketplaces = parsed.marketplaces;
|
|
482
|
+
if (typeof marketplaces !== "object" || marketplaces === null || Array.isArray(marketplaces)) {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
const entry = marketplaces[marketplaceName];
|
|
486
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry))
|
|
487
|
+
return null;
|
|
488
|
+
const source = entry.source;
|
|
489
|
+
return typeof source === "string" ? source : null;
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
459
494
|
}
|
|
460
495
|
function isCodexMarketplaceDifferentSource(error) {
|
|
461
496
|
return /already added from a different source/i.test(commandErrorText(error));
|
|
@@ -616,34 +651,45 @@ function enableCodexPluginConfig(configPath, pluginKeys, needsPluginHooks) {
|
|
|
616
651
|
const content = minimalContent ?? buildCodexPluginConfigToml(originalContent, configPath, pluginKeys, needsPluginHooks);
|
|
617
652
|
atomicWriteFile(configPath, content.endsWith("\n") ? content : `${content}\n`);
|
|
618
653
|
}
|
|
619
|
-
async function addCodexMarketplaceWithRetry(marketplaceName, addCommand, opts, marketplaceExecOpts, failures) {
|
|
654
|
+
async function addCodexMarketplaceWithRetry(marketplaceName, addCommand, expectedSource, opts, marketplaceExecOpts, failures) {
|
|
655
|
+
const registeredSource = readCodexMarketplaceSource(marketplaceName);
|
|
656
|
+
if (registeredSource !== null) {
|
|
657
|
+
if (registeredSource !== expectedSource) {
|
|
658
|
+
// Supply-chain guard: a same-name marketplace pointing at a different
|
|
659
|
+
// source (e.g. a fork URL) must not be silently `upgrade`d — its
|
|
660
|
+
// content would be cached under our name and consumed downstream.
|
|
661
|
+
const msg = `Codex marketplace ${marketplaceName} is already added from a different source`;
|
|
662
|
+
log.error(`${msg}\n registered: ${registeredSource}\n expected: ${expectedSource}`);
|
|
663
|
+
failures.push(msg);
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
try {
|
|
667
|
+
exec(codexMarketplaceUpgradeCommand(marketplaceName), marketplaceExecOpts);
|
|
668
|
+
log.ok(`Codex marketplace ${marketplaceName} upgraded`);
|
|
669
|
+
}
|
|
670
|
+
catch (e) {
|
|
671
|
+
// Surface the underlying upgrade error so a 6-month-out reader
|
|
672
|
+
// can tell apart ENOENT / network / auth / git failures.
|
|
673
|
+
log.error(`Failed to upgrade Codex marketplace: ${marketplaceName}\n${commandErrorText(e)}`);
|
|
674
|
+
failures.push(`codex marketplace ${marketplaceName}`);
|
|
675
|
+
}
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
620
678
|
try {
|
|
621
679
|
exec(addCommand, marketplaceExecOpts);
|
|
622
680
|
log.ok(`Codex marketplace ${marketplaceName} added`);
|
|
623
|
-
return;
|
|
624
681
|
}
|
|
625
682
|
catch (e) {
|
|
626
683
|
if (isCodexMarketplaceDifferentSource(e)) {
|
|
684
|
+
// Defense-in-depth: config.toml didn't claim the name but Codex CLI
|
|
685
|
+
// refused with "different source" — rare divergence between Codex
|
|
686
|
+
// internal state and config.toml.
|
|
627
687
|
const msg = `Codex marketplace ${marketplaceName} is already added from a different source`;
|
|
628
688
|
log.error(`${msg}\n${commandErrorText(e)}`);
|
|
629
689
|
failures.push(msg);
|
|
630
690
|
return;
|
|
631
691
|
}
|
|
632
|
-
|
|
633
|
-
try {
|
|
634
|
-
exec(codexMarketplaceUpgradeCommand(marketplaceName), marketplaceExecOpts);
|
|
635
|
-
log.ok(`Codex marketplace ${marketplaceName} upgraded`);
|
|
636
|
-
return;
|
|
637
|
-
}
|
|
638
|
-
catch (upgradeErr) {
|
|
639
|
-
// Surface the underlying upgrade error so a 6-month-out reader
|
|
640
|
-
// can tell apart ENOENT / network / auth / git failures.
|
|
641
|
-
log.error(`Failed to upgrade Codex marketplace: ${marketplaceName}\n${commandErrorText(upgradeErr)}`);
|
|
642
|
-
failures.push(`codex marketplace ${marketplaceName}`);
|
|
643
|
-
return;
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
// Same: surface the add error rather than masking ENOENT / network / auth.
|
|
692
|
+
// Surface the add error rather than masking ENOENT / network / auth.
|
|
647
693
|
log.error(`Failed to add Codex marketplace: ${marketplaceName}\n${commandErrorText(e)}`);
|
|
648
694
|
failures.push(`codex marketplace ${marketplaceName}`);
|
|
649
695
|
}
|
|
@@ -726,7 +772,7 @@ async function installCodexPlugins(packageRoot, opts) {
|
|
|
726
772
|
? { inherit: true }
|
|
727
773
|
: undefined;
|
|
728
774
|
if (localMarketplace) {
|
|
729
|
-
await addCodexMarketplaceWithRetry(localMarketplace.name, codexMarketplaceAddCommand(packageRoot), opts, marketplaceExecOpts, failures);
|
|
775
|
+
await addCodexMarketplaceWithRetry(localMarketplace.name, codexMarketplaceAddCommand(packageRoot), codexLocalMarketplaceSource(packageRoot), opts, marketplaceExecOpts, failures);
|
|
730
776
|
}
|
|
731
777
|
// Dedupe external marketplaces by name — multiple plugins from the same
|
|
732
778
|
// upstream share a single `marketplace add` call.
|
|
@@ -735,7 +781,7 @@ async function installCodexPlugins(packageRoot, opts) {
|
|
|
735
781
|
uniqueExternalMarketplaces.set(p.marketplace.name, p.marketplace);
|
|
736
782
|
}
|
|
737
783
|
for (const mp of uniqueExternalMarketplaces.values()) {
|
|
738
|
-
await addCodexMarketplaceWithRetry(mp.name, codexExternalMarketplaceAddCommand(mp.source), opts, marketplaceExecOpts, failures);
|
|
784
|
+
await addCodexMarketplaceWithRetry(mp.name, codexExternalMarketplaceAddCommand(mp.source), codexExternalMarketplaceSource(mp.source), opts, marketplaceExecOpts, failures);
|
|
739
785
|
}
|
|
740
786
|
if (failures.length === 0) {
|
|
741
787
|
const localMarketplaceContentRoot = localMarketplace
|
package/dist/state.js
CHANGED
|
@@ -301,7 +301,7 @@ async function scanClaudePlugins(scope, entries, execPluginList, warnings) {
|
|
|
301
301
|
return entries.map(([id, def]) => degradedClaudeRow(id, def, scope));
|
|
302
302
|
}
|
|
303
303
|
// claude plugins list emits ids in `<plugin>@<marketplace>` form (e.g.
|
|
304
|
-
// `auriga-
|
|
304
|
+
// `auriga-workflow@auriga-cli`). The auriga-cli catalog tracks plugins by bare
|
|
305
305
|
// name. Index both forms so lookups succeed regardless of which side the
|
|
306
306
|
// suffix is on.
|
|
307
307
|
const installedById = new Map();
|
|
@@ -388,9 +388,9 @@ async function scanCodexPlugins(entries, readCodexConfig, readCodexPluginsDir, w
|
|
|
388
388
|
catch {
|
|
389
389
|
fsVersions = new Map();
|
|
390
390
|
}
|
|
391
|
-
// Mirror the Claude side: catalog tracks bare names (e.g. "auriga-
|
|
391
|
+
// Mirror the Claude side: catalog tracks bare names (e.g. "auriga-workflow") but
|
|
392
392
|
// ~/.codex/config.toml [plugins.*] sections and defaultReadCodexPluginsDir
|
|
393
|
-
// both emit `<plugin>@<marketplace>` keys (e.g. "auriga-
|
|
393
|
+
// both emit `<plugin>@<marketplace>` keys (e.g. "auriga-workflow@auriga-cli").
|
|
394
394
|
// Without dual indexing every dual-Agent plugin reports `not-installed` on
|
|
395
395
|
// the Codex side, which `mergePluginsById` then folds into a permanent
|
|
396
396
|
// `partial-install` even when both sides are genuinely installed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auriga-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.24.0",
|
|
4
4
|
"description": "Interactive CLI to install Claude Code harness modules (Workflow, Skills, Recommended Skills, Plugins, Hooks)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"dev": "tsc --watch",
|
|
26
26
|
"start": "node dist/cli.js",
|
|
27
27
|
"pretest": "npm run build",
|
|
28
|
-
"test": "tsc -p tsconfig.test.json && DEV=1 node --test --experimental-test-module-mocks dist-test/tests/hooks.test.js dist-test/tests/hooks-uninstall.test.js dist-test/tests/skills.test.js dist-test/tests/skills-uninstall.test.js dist-test/tests/catalog.test.js dist-test/tests/cli-parse.test.js dist-test/tests/install-nontty.test.js dist-test/tests/plugins.test.js dist-test/tests/plugins-uninstall.test.js dist-test/tests/content-fetch.test.js dist-test/tests/utils.test.js dist-test/tests/guide.test.js dist-test/tests/validators.test.js dist-test/tests/entrypoint.test.js dist-test/tests/state.test.js dist-test/tests/server.test.js dist-test/tests/server-auth.test.js dist-test/tests/server-apply.test.js dist-test/tests/apply-handlers.test.js dist-test/tests/ui-fetch.test.js dist-test/tests/workflow-install.test.js dist-test/tests/workflow-uninstall.test.js dist-test/tests/tarball-shape.test.js dist-test/tests/spec-design.test.js",
|
|
29
|
-
"test:watch": "tsc -p tsconfig.test.json --watch & node --test --watch --experimental-test-module-mocks dist-test/tests/hooks.test.js dist-test/tests/hooks-uninstall.test.js dist-test/tests/skills.test.js dist-test/tests/skills-uninstall.test.js dist-test/tests/catalog.test.js dist-test/tests/cli-parse.test.js dist-test/tests/install-nontty.test.js dist-test/tests/plugins.test.js dist-test/tests/plugins-uninstall.test.js dist-test/tests/content-fetch.test.js dist-test/tests/utils.test.js dist-test/tests/guide.test.js dist-test/tests/validators.test.js dist-test/tests/entrypoint.test.js dist-test/tests/state.test.js dist-test/tests/server.test.js dist-test/tests/server-auth.test.js dist-test/tests/server-apply.test.js dist-test/tests/apply-handlers.test.js dist-test/tests/ui-fetch.test.js dist-test/tests/workflow-install.test.js dist-test/tests/workflow-uninstall.test.js dist-test/tests/tarball-shape.test.js dist-test/tests/spec-design.test.js",
|
|
28
|
+
"test": "tsc -p tsconfig.test.json && DEV=1 node --test --experimental-test-module-mocks dist-test/tests/hooks.test.js dist-test/tests/hooks-uninstall.test.js dist-test/tests/skills.test.js dist-test/tests/skills-uninstall.test.js dist-test/tests/catalog.test.js dist-test/tests/cli-parse.test.js dist-test/tests/install-nontty.test.js dist-test/tests/plugins.test.js dist-test/tests/plugins-uninstall.test.js dist-test/tests/content-fetch.test.js dist-test/tests/utils.test.js dist-test/tests/guide.test.js dist-test/tests/validators.test.js dist-test/tests/entrypoint.test.js dist-test/tests/state.test.js dist-test/tests/server.test.js dist-test/tests/server-auth.test.js dist-test/tests/server-apply.test.js dist-test/tests/apply-handlers.test.js dist-test/tests/ui-fetch.test.js dist-test/tests/workflow-install.test.js dist-test/tests/workflow-uninstall.test.js dist-test/tests/tarball-shape.test.js dist-test/tests/spec-design.test.js dist-test/tests/plugin-skill-frontmatter.test.js",
|
|
29
|
+
"test:watch": "tsc -p tsconfig.test.json --watch & node --test --watch --experimental-test-module-mocks dist-test/tests/hooks.test.js dist-test/tests/hooks-uninstall.test.js dist-test/tests/skills.test.js dist-test/tests/skills-uninstall.test.js dist-test/tests/catalog.test.js dist-test/tests/cli-parse.test.js dist-test/tests/install-nontty.test.js dist-test/tests/plugins.test.js dist-test/tests/plugins-uninstall.test.js dist-test/tests/content-fetch.test.js dist-test/tests/utils.test.js dist-test/tests/guide.test.js dist-test/tests/validators.test.js dist-test/tests/entrypoint.test.js dist-test/tests/state.test.js dist-test/tests/server.test.js dist-test/tests/server-auth.test.js dist-test/tests/server-apply.test.js dist-test/tests/apply-handlers.test.js dist-test/tests/ui-fetch.test.js dist-test/tests/workflow-install.test.js dist-test/tests/workflow-uninstall.test.js dist-test/tests/tarball-shape.test.js dist-test/tests/spec-design.test.js dist-test/tests/plugin-skill-frontmatter.test.js",
|
|
30
30
|
"pretest:e2e": "npm run build",
|
|
31
31
|
"test:e2e": "tsc -p tsconfig.test.json && node --test dist-test/tests/e2e-install.test.js",
|
|
32
32
|
"pretest:web-ui-e2e": "npm run build && npm --prefix ui ci && npm --prefix ui run build",
|