@event4u/agent-config 4.7.2 → 4.9.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +37 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +1 -1
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +1 -1
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +1 -1
- package/dist/install/wizard-plan.js +8 -0
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +1 -1
- package/docs/decisions/ADR-030-claude-code-command-projection.md +147 -0
- package/docs/decisions/INDEX.md +1 -0
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/installed_lock.py +44 -0
- package/scripts/install.py +247 -11
- package/scripts/inventory_abstraction_budget.py +616 -0
package/CHANGELOG.md
CHANGED
|
@@ -802,6 +802,43 @@ our recommendation order, not its support status.
|
|
|
802
802
|
> that forces a new era split (`# Era: 4.6.x`, etc.) — see
|
|
803
803
|
> [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
|
|
804
804
|
|
|
805
|
+
## [4.9.0](https://github.com/event4u-app/agent-config/compare/4.8.0...4.9.0) (2026-05-28)
|
|
806
|
+
|
|
807
|
+
### Features
|
|
808
|
+
|
|
809
|
+
* **scripts:** inventory abstraction-budget classes via grep-backed audit ([bf4de06](https://github.com/event4u-app/agent-config/commit/bf4de06d12908281e7a657cab8783c3cdae39a2e))
|
|
810
|
+
|
|
811
|
+
### Documentation
|
|
812
|
+
|
|
813
|
+
* **roadmaps:** close discovery, charter scoped reduction follow-up ([f749c77](https://github.com/event4u-app/agent-config/commit/f749c778ae02f6718c9d499213c8781392e95b3e))
|
|
814
|
+
* **evidence:** abstraction-budget Phase-1 inventory + frontmatter audit ([178c0b6](https://github.com/event4u-app/agent-config/commit/178c0b605085801282c7f61c2b01d6d8dc83396e))
|
|
815
|
+
|
|
816
|
+
Tests: 5078 (+0 since 4.8.0)
|
|
817
|
+
|
|
818
|
+
## [4.8.0](https://github.com/event4u-app/agent-config/compare/4.7.2...4.8.0) (2026-05-28)
|
|
819
|
+
|
|
820
|
+
### Features
|
|
821
|
+
|
|
822
|
+
* **install:** close Claude Code global distribution gap ([aa15db9](https://github.com/event4u-app/agent-config/commit/aa15db9651c4fd21f8bd30ef88e3aeeb1eb31e22))
|
|
823
|
+
|
|
824
|
+
### Bug Fixes
|
|
825
|
+
|
|
826
|
+
* **maintainer:** align .claude/settings.json plugin id ([b59e080](https://github.com/event4u-app/agent-config/commit/b59e0804e874e9c7c95cfc821a31746e4241f61c))
|
|
827
|
+
|
|
828
|
+
### Documentation
|
|
829
|
+
|
|
830
|
+
* **adr:** record claude-code command-projection strategy (ADR-030) ([706dedb](https://github.com/event4u-app/agent-config/commit/706dedb54f5792a2cf5b7c2401054b30490edeec))
|
|
831
|
+
|
|
832
|
+
### Tests
|
|
833
|
+
|
|
834
|
+
* **install:** regression coverage for global distribution heal ([bfdbc90](https://github.com/event4u-app/agent-config/commit/bfdbc9053d9032ffd10248835ba03f276631c7b3))
|
|
835
|
+
|
|
836
|
+
### Chores
|
|
837
|
+
|
|
838
|
+
* gitignore install-time artefacts in maintainer repo ([d75aeac](https://github.com/event4u-app/agent-config/commit/d75aeac4ed8858d2cddc7e3534eeff6bfb1ab036))
|
|
839
|
+
|
|
840
|
+
Tests: 5078 (+14 since 4.7.2)
|
|
841
|
+
|
|
805
842
|
## [4.7.2](https://github.com/event4u-app/agent-config/compare/4.7.1...4.7.2) (2026-05-28)
|
|
806
843
|
|
|
807
844
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
02075520b8ccb3025ec9d54d7ec0585f26f09c3c947d3c696f3ef4328aa04e74 discovery-manifest.json
|
|
@@ -62,6 +62,14 @@ export const USER_SCOPE_PATHS = {
|
|
|
62
62
|
const CLAUDE_SKILL_BUNDLE = [
|
|
63
63
|
['.agent-src/rules', 'rules'],
|
|
64
64
|
['.agent-src/skills', 'skills'],
|
|
65
|
+
// Commands ship to ~/.claude/commands/ — native Claude Code slash-
|
|
66
|
+
// command surface. Verified empirically 2026-05-28: rich frontmatter
|
|
67
|
+
// (disable-model-invocation, custom fields) tolerated; nested
|
|
68
|
+
// subdirs route as `/<cluster>:<sub>`. Council session 2026-05-28
|
|
69
|
+
// converged on Option B (native slash-only) — see
|
|
70
|
+
// agents/runtime/council/responses/claude-code-distribution.json
|
|
71
|
+
// and scripts/install.py:_CLAUDE_SKILL_BUNDLE for the Python mirror.
|
|
72
|
+
['.agent-src/commands', 'commands'],
|
|
65
73
|
['.agent-src/personas', 'personas'],
|
|
66
74
|
];
|
|
67
75
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard-plan.js","sourceRoot":"","sources":["../../src/install/wizard-plan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wizard-plan.js","sourceRoot":"","sources":["../../src/install/wizard-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,WAAW,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAC9D,aAAa,EAAK,YAAY;IAC9B,gBAAgB,EAAE,uCAAuC;IACzD,MAAM,EAAY,YAAY;IAC9B,QAAQ,EAAU,sBAAsB;IACxC,KAAK,EAAa,0BAA0B;IAC5C,YAAY,EAAM,YAAY;IAC9B,OAAO,EAAW,aAAa;IAC/B,OAAO,EAAW,aAAa;IAC/B,KAAK,EAAa,mBAAmB;IACrC,KAAK,EAAa,WAAW;IAC7B,OAAO,EAAW,SAAS;IAC3B,QAAQ,EAAU,cAAc;IAChC,QAAQ,EAAU,cAAc;IAChC,GAAG,EAAe,gBAAgB;IAClC,SAAS,EAAS,sBAAsB;IACxC,IAAI,EAAc,UAAU;IAC5B,KAAK,EAAa,WAAW;IAC7B,QAAQ,EAAU,cAAc;IAChC,IAAI,EAAc,UAAU;IAC5B,WAAW,EAAO,YAAY;IAC9B,SAAS,EAAS,eAAe;IACjC,KAAK,EAAa,aAAa;IAC/B,IAAI,EAAc,UAAU;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,mBAAmB,GAA6C;IAClE,CAAC,kBAAkB,EAAK,OAAO,CAAC;IAChC,CAAC,mBAAmB,EAAI,QAAQ,CAAC;IACjC,mEAAmE;IACnE,qEAAqE;IACrE,8DAA8D;IAC9D,kEAAkE;IAClE,kDAAkD;IAClD,iEAAiE;IACjE,qEAAqE;IACrE,CAAC,qBAAqB,EAAE,UAAU,CAAC;IACnC,CAAC,qBAAqB,EAAE,UAAU,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAuE;IACrG,aAAa,EAAE,mBAAmB;IAClC,OAAO,EAAE;QACL,CAAC,kBAAkB,EAAM,OAAO,CAAC;QACjC,CAAC,mBAAmB,EAAK,QAAQ,CAAC;QAClC,CAAC,qBAAqB,EAAG,UAAU,CAAC;QACpC,CAAC,qBAAqB,EAAG,UAAU,CAAC;QACpC,CAAC,qBAAqB,EAAG,UAAU,CAAC;QACpC,CAAC,sBAAsB,EAAE,WAAW,CAAC;KACxC;IACD,MAAM,EAAE;QACJ,CAAC,kBAAkB,EAAK,OAAO,CAAC;QAChC,CAAC,qBAAqB,EAAE,UAAU,CAAC;QACnC,CAAC,qBAAqB,EAAE,UAAU,CAAC;KACtC;IACD,QAAQ,EAAE;QACN,CAAC,kBAAkB,EAAE,OAAO,CAAC;KAChC;IACD,KAAK,EAAE;QACH,CAAC,kBAAkB,EAAE,EAAE,CAAC;KAC3B;IACD,YAAY,EAAE,mBAAmB;IACjC,KAAK,EAAS,mBAAmB;IACjC,QAAQ,EAAM,mBAAmB;IACjC,OAAO,EAAO,mBAAmB;IACjC,QAAQ,EAAM,mBAAmB;IACjC,KAAK,EAAS,mBAAmB;IACjC,QAAQ,EAAM,mBAAmB;IACjC,IAAI,EAAU,mBAAmB;IACjC,WAAW,EAAG,mBAAmB;IACjC,SAAS,EAAK,mBAAmB;IACjC,KAAK,EAAS,mBAAmB;IACjC,IAAI,EAAU,mBAAmB;IACjC,IAAI,EAAE;QACF,CAAC,kBAAkB,EAAK,OAAO,CAAC;QAChC,CAAC,mBAAmB,EAAI,UAAU,CAAC;QACnC,CAAC,qBAAqB,EAAE,UAAU,CAAC;KACtC;CACJ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAa;IACtD,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IAC5B,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAYD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC1D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,SAAS;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,gBAAgB,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,MAAM;KACxB,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 030
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-05-28
|
|
5
|
+
decision: claude-code-command-projection
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-claude-code-global-distribution Phase 3
|
|
9
|
+
type: structural
|
|
10
|
+
review_date: 2026-06-11
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-030 — Claude Code command-projection strategy: native slash-only
|
|
14
|
+
|
|
15
|
+
## Status
|
|
16
|
+
|
|
17
|
+
**Accepted** · 2026-05-28. Three conditions enumerated below; all three
|
|
18
|
+
verified empirically in the same session, so the decision lands
|
|
19
|
+
**without** soak. The 14-day kill-switch keeps the revert path one
|
|
20
|
+
commit away; review date 2026-06-11 closes the window.
|
|
21
|
+
|
|
22
|
+
## Context
|
|
23
|
+
|
|
24
|
+
The package ships commands as `.agent-src/commands/<cluster>/<sub>.md`
|
|
25
|
+
(canonical source) and projects them per-tool through
|
|
26
|
+
`scripts/condense.py`. Pre-2026-05-28 the Claude Code projection was a
|
|
27
|
+
single path: `generate_claude_commands` rewrote each command into
|
|
28
|
+
`.claude/skills/<flat-slug>/SKILL.md` with
|
|
29
|
+
`disable-model-invocation: true` in the source frontmatter.
|
|
30
|
+
|
|
31
|
+
The 2026-05-28 diagnostic surfaced the failure mode:
|
|
32
|
+
|
|
33
|
+
- `.claude/commands/` was never populated — commands carried no
|
|
34
|
+
filesystem channel into Claude Code's native slash router.
|
|
35
|
+
- The skills-projection target was filtered out of the
|
|
36
|
+
model-invokable skill list (`disable-model-invocation: true`).
|
|
37
|
+
- `_CLAUDE_SKILL_BUNDLE` shipped `rules` / `skills` / `personas` but
|
|
38
|
+
**no** `commands` subtree.
|
|
39
|
+
|
|
40
|
+
Net result: Claude Code received zero command surface from the package
|
|
41
|
+
outside the cwd-local repo install. Augment Code and Cursor bundles
|
|
42
|
+
already shipped `commands/`; Claude Code was the outlier.
|
|
43
|
+
|
|
44
|
+
## Decision
|
|
45
|
+
|
|
46
|
+
Adopt **Option B (native slash-only)**:
|
|
47
|
+
|
|
48
|
+
1. Ship `.agent-src/commands/` directly into Claude Code's native
|
|
49
|
+
slash-command surface at `~/.claude/commands/` via the global
|
|
50
|
+
deploy bundle (`_CLAUDE_SKILL_BUNDLE` in `scripts/install.py` and
|
|
51
|
+
its TypeScript mirror in `src/install/wizard-plan.ts`).
|
|
52
|
+
Subdirectory layout maps 1:1 to the `/<cluster>:<sub>` namespace
|
|
53
|
+
per Claude Code's filesystem-channel convention. No separate
|
|
54
|
+
`condense.py` projector — the source tree already follows the
|
|
55
|
+
target layout, so the global-install copy is the projection.
|
|
56
|
+
2. Keep `condense.py::generate_claude_commands` (skills-list
|
|
57
|
+
projection at `.claude/skills/`) unchanged **for now** —
|
|
58
|
+
backwards compat for any consumer already discovering commands
|
|
59
|
+
via `.claude/skills/`. Retirement deferred to a separate roadmap
|
|
60
|
+
if needed.
|
|
61
|
+
|
|
62
|
+
Rejected alternatives:
|
|
63
|
+
|
|
64
|
+
- **Option A — dual projection (slash + skills, both active).**
|
|
65
|
+
Conservative, but doubles maintenance surface and keeps the
|
|
66
|
+
filter-out-of-skill-list semantics. Verdict: only useful if Option B
|
|
67
|
+
fails the kill-switch window.
|
|
68
|
+
- **Option C — commands_unsupported (no Claude Code command
|
|
69
|
+
surface).** Eliminates the bug class by removing the feature.
|
|
70
|
+
Verdict: regression in product surface; Claude Code consumers lose
|
|
71
|
+
parity with Augment / Cursor.
|
|
72
|
+
|
|
73
|
+
### Council convergence
|
|
74
|
+
|
|
75
|
+
Session 2026-05-28, design mode, 2 rounds, $0.06 actual.
|
|
76
|
+
Members: `claude-sonnet-4-5` + `gpt-4o`. Both converged on Option B,
|
|
77
|
+
CONDITIONAL on the three verifications below. Responses captured at
|
|
78
|
+
`agents/runtime/council/responses/claude-code-distribution.json`.
|
|
79
|
+
|
|
80
|
+
### Three conditions (all verified 2026-05-28)
|
|
81
|
+
|
|
82
|
+
1. **Plugin loader reads `.claude/commands/` for globally-installed
|
|
83
|
+
plugins (not just cwd-local).**
|
|
84
|
+
Verified empirically: `~/.claude/commands/probe/sub.md` →
|
|
85
|
+
`/probe:sub` routed successfully via
|
|
86
|
+
`echo '' | claude --print "/probe:sub"`. Native filesystem channel
|
|
87
|
+
works for user-scope at top-level AND in subdirectories.
|
|
88
|
+
2. **Command parser tolerates `disable-model-invocation: true` in
|
|
89
|
+
frontmatter (or strip during projection).**
|
|
90
|
+
Verified empirically: probe command carrying the package's full
|
|
91
|
+
rich frontmatter routed successfully. Subtle behaviour:
|
|
92
|
+
`disable-model-invocation: true` hides the command from `/help`
|
|
93
|
+
listing but keeps it slash-invokable when typed directly — the
|
|
94
|
+
desired UX for heavyweight commands. No frontmatter-strip step
|
|
95
|
+
required.
|
|
96
|
+
3. **Kill-switch defined: if native slash doesn't resolve in
|
|
97
|
+
production within 14 days, fall back to dual-projection with
|
|
98
|
+
deprecation timeline.**
|
|
99
|
+
The kill-switch is the inverse of Phase 4 Step 1 — remove
|
|
100
|
+
`(".agent-src/commands", "commands")` from `_CLAUDE_SKILL_BUNDLE`
|
|
101
|
+
in `scripts/install.py` and `src/install/wizard-plan.ts`. One-line
|
|
102
|
+
revert per file. Tracked by review date 2026-06-11.
|
|
103
|
+
|
|
104
|
+
## Consequences
|
|
105
|
+
|
|
106
|
+
**Positive:**
|
|
107
|
+
|
|
108
|
+
- `~/.claude/commands/<cluster>/<sub>.md` lands the package's full
|
|
109
|
+
command surface natively in Claude Code, matching Augment and
|
|
110
|
+
Cursor parity.
|
|
111
|
+
- `disable-model-invocation: true` semantics preserved — heavyweight
|
|
112
|
+
commands stay invokable but hidden from auto-complete, the intended
|
|
113
|
+
UX.
|
|
114
|
+
- No frontmatter mangling — the source command file is the artifact
|
|
115
|
+
that ships, no projection transform needed.
|
|
116
|
+
|
|
117
|
+
**Negative / accepted:**
|
|
118
|
+
|
|
119
|
+
- Two projection paths coexist (`.claude/commands/` for slash routing
|
|
120
|
+
+ `.claude/skills/` for the legacy skills-projection list). Cost is
|
|
121
|
+
one extra subtree per install; benefit is no consumer-breaking
|
|
122
|
+
during the 14-day kill-switch window. Retirement of the skills
|
|
123
|
+
projection is a separate decision.
|
|
124
|
+
- Frontmatter shipped to Claude Code carries package-internal fields
|
|
125
|
+
(`tier`, `cluster`, `sub`, `lifecycle`, `trust`, `install`, etc.)
|
|
126
|
+
the runtime ignores. Empirically tolerated; documented as
|
|
127
|
+
belt-and-braces against future runtime tightening.
|
|
128
|
+
|
|
129
|
+
## Alternatives considered
|
|
130
|
+
|
|
131
|
+
See § Decision above — Option A (dual projection) and Option C
|
|
132
|
+
(commands_unsupported) explicitly rejected with stated rationale.
|
|
133
|
+
|
|
134
|
+
## References
|
|
135
|
+
|
|
136
|
+
- Roadmap:
|
|
137
|
+
`agents/roadmaps/road-to-claude-code-global-distribution.md` Phase 3.
|
|
138
|
+
- Council session responses:
|
|
139
|
+
`agents/runtime/council/responses/claude-code-distribution.json`.
|
|
140
|
+
- Empirical verification: `~/.claude/commands/probe/sub.md` route
|
|
141
|
+
test, 2026-05-28 (Condition 1 + Condition 2).
|
|
142
|
+
- Mirror implementation: `scripts/install.py::_CLAUDE_SKILL_BUNDLE`
|
|
143
|
+
and `src/install/wizard-plan.ts::CLAUDE_SKILL_BUNDLE` — both
|
|
144
|
+
include `(".agent-src/commands", "commands")` so a global install
|
|
145
|
+
drops `~/.claude/commands/<cluster>/<sub>.md` directly.
|
|
146
|
+
- Predecessor projection: `scripts/condense.py::generate_claude_commands`
|
|
147
|
+
(skills-list, retained pending separate retirement decision).
|
package/docs/decisions/INDEX.md
CHANGED
|
@@ -33,6 +33,7 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
|
|
|
33
33
|
| [ADR-027](ADR-027-changelog-machine-vs-manual.md) | Changelog Machine Vs Manual | accepted | 2026-05-25 | — |
|
|
34
34
|
| [ADR-028](ADR-028-root-layout.md) | Root Layout | accepted | 2026-05-25 | — |
|
|
35
35
|
| [ADR-029](ADR-029-multi-workspace-deferred.md) | Multi Workspace Deferred | accepted | 2026-05-25 | — |
|
|
36
|
+
| [ADR-030](ADR-030-claude-code-command-projection.md) | Claude Code Command Projection | accepted | 2026-05-28 | — |
|
|
36
37
|
|
|
37
38
|
## Unnumbered (legacy)
|
|
38
39
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event4u/agent-config",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.9.0",
|
|
4
4
|
"description": "Universal AI Agent OS \u2014 audited skills, governance rules, commands, and templates for AI coding tools (Claude Code, Cursor, Windsurf, Copilot).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -198,6 +198,50 @@ def check_version(
|
|
|
198
198
|
return (recorded == installed_version, recorded)
|
|
199
199
|
|
|
200
200
|
|
|
201
|
+
_SEMVER_RE = re.compile(r"^\s*v?(\d+)\.(\d+)\.(\d+)")
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _parse_semver(version: str) -> Optional[tuple[int, int, int]]:
|
|
205
|
+
"""Parse ``X.Y.Z[-suffix]`` into a ``(major, minor, patch)`` tuple.
|
|
206
|
+
|
|
207
|
+
Returns ``None`` when the leading three numeric segments cannot be
|
|
208
|
+
extracted. Suffixes (``-rc1``, ``+build.5``) are ignored: the
|
|
209
|
+
classification only needs the numeric prefix to decide upgrade vs
|
|
210
|
+
downgrade.
|
|
211
|
+
"""
|
|
212
|
+
match = _SEMVER_RE.match(version)
|
|
213
|
+
if not match:
|
|
214
|
+
return None
|
|
215
|
+
return int(match.group(1)), int(match.group(2)), int(match.group(3))
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def classify_mismatch(
|
|
219
|
+
installed_version: str, recorded: Optional[str],
|
|
220
|
+
) -> str:
|
|
221
|
+
"""Classify the relationship between recorded and installed versions.
|
|
222
|
+
|
|
223
|
+
Returns one of:
|
|
224
|
+
* ``"none"`` — no lockfile yet; install proceeds clean.
|
|
225
|
+
* ``"match"`` — recorded equals installed.
|
|
226
|
+
* ``"upgrade"`` — recorded < installed; auto-heal allowed.
|
|
227
|
+
* ``"downgrade"`` — recorded > installed; refuse without ``--force``.
|
|
228
|
+
* ``"unparseable"`` — recorded shape unrecognizable (pre-1.0, 1.x
|
|
229
|
+
legacy formats from the namespace migration); treated as
|
|
230
|
+
upgrade by the install path.
|
|
231
|
+
"""
|
|
232
|
+
if recorded is None:
|
|
233
|
+
return "none"
|
|
234
|
+
if recorded == installed_version:
|
|
235
|
+
return "match"
|
|
236
|
+
rec = _parse_semver(recorded)
|
|
237
|
+
inst = _parse_semver(installed_version)
|
|
238
|
+
if rec is None or inst is None:
|
|
239
|
+
return "unparseable"
|
|
240
|
+
if rec < inst:
|
|
241
|
+
return "upgrade"
|
|
242
|
+
return "downgrade"
|
|
243
|
+
|
|
244
|
+
|
|
201
245
|
def current_package_version(repo_root: Optional[Path] = None) -> str:
|
|
202
246
|
"""Read ``version`` from the package's own ``package.json``."""
|
|
203
247
|
if repo_root is None:
|