@event4u/agent-config 14.8.0 → 14.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.
Files changed (136) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +165 -237
  3. package/README.md +1 -1
  4. package/agents/templates/.ai-council.yml.example +34 -4
  5. package/dist/agent-src/commands/pr/merge.md +9 -5
  6. package/dist/agent-src/commands/review/changes.md +95 -14
  7. package/dist/agent-src/commands/roadmap/process-full.md +2 -2
  8. package/dist/agent-src/contexts/execution/host-capability-manifest.md +77 -0
  9. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +36 -0
  10. package/dist/agent-src/contexts/execution/subagent-response-contract.md +80 -0
  11. package/dist/agent-src/rules/untrusted-input-defense.md +9 -3
  12. package/dist/agent-src/skills/code-review/evals/evals.json +87 -46
  13. package/dist/agent-src/skills/humanizer/SKILL.md +39 -0
  14. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +57 -0
  15. package/dist/agent-src/skills/humanizer/references/fixtures.md +54 -0
  16. package/dist/agent-src/skills/judge-spec-compliance/SKILL.md +154 -0
  17. package/dist/agent-src/skills/judge-synthesis/SKILL.md +45 -0
  18. package/dist/agent-src/skills/roadmap-writing/SKILL.md +18 -18
  19. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  20. package/dist/agent-src/templates/roadmaps.md +8 -0
  21. package/dist/cli/registry.js +2 -0
  22. package/dist/cli/registry.js.map +1 -1
  23. package/dist/cli-delegate/{chunk-MMSGVZKV.js → chunk-77GR3VD4.js} +65 -40
  24. package/dist/cli-delegate/{chunk-Q26HT4QT.js → chunk-E46KPN6K.js} +251 -150
  25. package/dist/cli-delegate/{chunk-EEJUMCDZ.js → chunk-PLSG6UL5.js} +1 -1
  26. package/dist/cli-delegate/cmd_conformance.js +89 -13
  27. package/dist/cli-delegate/cmd_doctor.js +3 -3
  28. package/dist/cli-delegate/cmd_handoff.js +2 -2
  29. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  30. package/dist/cli-delegate/cmd_route_audit.js +1 -1
  31. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  32. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  33. package/dist/discovery/deprecation-report.md +1 -1
  34. package/dist/discovery/discovery-manifest.json +37 -15
  35. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  36. package/dist/discovery/discovery-manifest.summary.md +3 -3
  37. package/dist/discovery/dormancy-report.md +1 -1
  38. package/dist/discovery/orphan-report.md +1 -1
  39. package/dist/discovery/packs.json +6 -5
  40. package/dist/discovery/trust-report.md +2 -2
  41. package/dist/discovery/workspaces.json +5 -4
  42. package/dist/hooks/dispatch.js +562 -204
  43. package/dist/mcp/registry-manifest.json +3 -3
  44. package/dist/mcp/server.json +2 -2
  45. package/dist/mcp/server.mjs +808 -331
  46. package/dist/scripts/_lib/claude_plugin.js +162 -0
  47. package/dist/scripts/_lib/claude_plugin.js.map +1 -0
  48. package/dist/scripts/_lib/environment_detector.js +397 -0
  49. package/dist/scripts/_lib/environment_detector.js.map +1 -0
  50. package/dist/scripts/_lib/spawn_env.js +129 -0
  51. package/dist/scripts/_lib/spawn_env.js.map +1 -0
  52. package/dist/scripts/ai_council/modes.js +199 -0
  53. package/dist/scripts/ai_council/modes.js.map +1 -0
  54. package/dist/scripts/ai_council/transport_resolver.js +418 -0
  55. package/dist/scripts/ai_council/transport_resolver.js.map +1 -0
  56. package/dist/server/routes/wizard.js +3 -2
  57. package/dist/server/routes/wizard.js.map +1 -1
  58. package/dist/ui/assets/index-Cxgy63kz.js +26 -0
  59. package/dist/ui/assets/index-Cxgy63kz.js.map +1 -0
  60. package/dist/ui/index.html +1 -1
  61. package/docs/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  62. package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +17 -0
  63. package/package.json +7 -3
  64. package/src/config/estate-count-budget.json +13 -744
  65. package/src/config/evaluator-budgets.json +4 -4
  66. package/src/config/gate-coverage.yml +247 -9
  67. package/src/config/gate-violation-baselines.json +72 -72
  68. package/src/config/publish-surface.json +60 -0
  69. package/src/config/requirements-trace-budget.json +32 -0
  70. package/src/config/rule-stub-ceilings.json +8 -1
  71. package/src/scripts/_dispatch.bash +7 -0
  72. package/src/scripts/_lib/base_tree.ts +175 -0
  73. package/src/scripts/_lib/billing_grant.ts +165 -0
  74. package/src/scripts/_lib/billing_grant_cli.ts +123 -0
  75. package/src/scripts/_lib/council_fallback_posture.ts +53 -6
  76. package/src/scripts/_lib/council_fallback_wiring.ts +61 -1
  77. package/src/scripts/_lib/host_capability.ts +59 -5
  78. package/src/scripts/_lib/quota_parked.ts +133 -0
  79. package/src/scripts/_lib/retrieval_sanitize.ts +62 -0
  80. package/src/scripts/_lib/review_telemetry.ts +196 -0
  81. package/src/scripts/_lib/subagent_response.ts +92 -0
  82. package/src/scripts/adr/regenerate_index.ts +14 -7
  83. package/src/scripts/ai_council/clients.ts +12 -1
  84. package/src/scripts/ai_council/config.ts +72 -115
  85. package/src/scripts/ai_council/fallback_config.ts +19 -7
  86. package/src/scripts/ai_council/mid_flight_fallback.ts +88 -7
  87. package/src/scripts/ai_council/orchestrator.ts +2 -2
  88. package/src/scripts/ai_council/py_format.ts +124 -0
  89. package/src/scripts/ai_council/transport_resolver.ts +65 -2
  90. package/src/scripts/audit_adr_coverage.ts +33 -6
  91. package/src/scripts/check_council_pin_staleness.ts +300 -0
  92. package/src/scripts/check_estate_count.ts +420 -293
  93. package/src/scripts/check_gate_coverage.ts +91 -0
  94. package/src/scripts/check_no_stub_inventory_table.ts +292 -0
  95. package/src/scripts/check_pack_size.ts +234 -1
  96. package/src/scripts/check_publish_surface.ts +297 -0
  97. package/src/scripts/check_requirements_trace.ts +378 -0
  98. package/src/scripts/check_secret_leak.ts +166 -12
  99. package/src/scripts/code_graph/cli.ts +44 -5
  100. package/src/scripts/code_graph/extract.ts +87 -0
  101. package/src/scripts/council_cli.ts +12 -16
  102. package/src/scripts/detect_ai_tells.ts +87 -0
  103. package/src/scripts/dispatch_r2_reviewer.ts +42 -0
  104. package/src/scripts/generate_capabilities_index.ts +41 -0
  105. package/src/scripts/git_authorization_hook.ts +54 -4
  106. package/src/scripts/hooks/block_unauthorized_git.ts +19 -1
  107. package/src/scripts/hooks/run_continuation_hook.ts +3 -1
  108. package/src/scripts/hooks/subagent_ledger_hook.ts +76 -11
  109. package/src/scripts/injection_scan_hook.ts +120 -10
  110. package/src/scripts/lint_adr_sweep_routing.ts +365 -0
  111. package/src/scripts/lint_workflow_security.ts +53 -10
  112. package/src/scripts/lint_workflow_security_allowlist.json +2 -18
  113. package/src/scripts/report_envelope_rate.ts +166 -0
  114. package/src/scripts/review_axis_report.ts +218 -0
  115. package/src/scripts/run_supervise.ts +46 -1
  116. package/src/scripts/schemas/evals.schema.json +5 -0
  117. package/src/scripts/sync_pr_branch.ts +14 -7
  118. package/dist/cli/commands/commands.candidates.test.js +0 -257
  119. package/dist/cli/commands/commands.candidates.test.js.map +0 -1
  120. package/dist/cli/commands/profiles.test.js +0 -88
  121. package/dist/cli/commands/profiles.test.js.map +0 -1
  122. package/dist/cli/commands/recordTriggerEval.test.js +0 -113
  123. package/dist/cli/commands/recordTriggerEval.test.js.map +0 -1
  124. package/dist/cli/configRoot.test.js +0 -97
  125. package/dist/cli/configRoot.test.js.map +0 -1
  126. package/dist/cli/mcp/content.test.js +0 -54
  127. package/dist/cli/mcp/content.test.js.map +0 -1
  128. package/dist/cli/mcp/dispatch.test.js +0 -108
  129. package/dist/cli/mcp/dispatch.test.js.map +0 -1
  130. package/dist/server/writeRoot.test.js +0 -91
  131. package/dist/server/writeRoot.test.js.map +0 -1
  132. package/dist/shared/capabilities.test.js +0 -39
  133. package/dist/shared/capabilities.test.js.map +0 -1
  134. package/dist/ui/assets/index-C1pBRm1f.js +0 -26
  135. package/dist/ui/assets/index-C1pBRm1f.js.map +0 -1
  136. /package/dist/cli-delegate/{chunk-N7CDDGI3.js → chunk-CYH5SP6M.js} +0 -0
@@ -1,257 +0,0 @@
1
- /**
2
- * `commands ls --candidates` — the surface-reduction report of roadmap step 3.4
3
- * (`road-to-inbox-harvest-2026-08-b-release-integrity`).
4
- *
5
- * Every assertion derives its expectation from the synthetic input rather than
6
- * pinning a literal the implementation happens to emit, so the suite cannot go
7
- * green for the wrong reason. The report is deliberately built from the
8
- * discovery manifest ALONE — no census file, no `utilization_report` import —
9
- * and the tests pin exactly that: the honesty band must survive, and the
10
- * ownership pointers must not be dropped by a later edit.
11
- */
12
- import { describe, expect, it } from 'vitest';
13
- import { buildCandidatesReport, renderCandidates, runCommandsLs, CANDIDATES_INCOMPATIBLE, REDUCTION_OWNERS, REPORT_ONLY_NOTICE, TEXT_LIST_CAP, } from './commands.js';
14
- function cmd(slug, pack, extra = {}) {
15
- return {
16
- path: `src/domains/${pack}/${slug}/command.md`,
17
- category: 'command',
18
- name: slug,
19
- slug,
20
- pack,
21
- visibility: 'internal',
22
- workspaces: [],
23
- packs: [pack],
24
- lifecycle: 'stable',
25
- trust: { level: 'core', confidence: 'high', human_review_required: false },
26
- install: { default: true, removable: false },
27
- intent: `do ${slug}`,
28
- ...extra,
29
- };
30
- }
31
- /** An artefact with NO `intent` key at all — distinct from `intent: ''`, and the
32
- * shape `exactOptionalPropertyTypes` forces us to build by omission. */
33
- function cmdWithoutIntent(slug, pack, visibility) {
34
- const { intent: _omitted, ...rest } = cmd(slug, pack, { visibility });
35
- return rest;
36
- }
37
- /** Mixed fixture: two absorbed-name commands, two undocumented, three packs of
38
- * unequal weight. */
39
- const FIXTURE = [
40
- cmd('alpha', 'engineering-base', { visibility: 'visible' }),
41
- cmd('bravo', 'engineering-base', { visibility: 'advanced' }),
42
- cmd('charlie', 'engineering-base', { visibility: 'internal', intent: '' }),
43
- cmd('delta', 'frontend-design', { visibility: 'visible', replaces: ['old-delta'] }),
44
- cmd('echo', 'frontend-design', { visibility: 'internal', replaces: ['old-echo', 'older-echo'] }),
45
- cmdWithoutIntent('foxtrot', 'finance-basic', 'advanced'),
46
- ];
47
- describe('buildCandidatesReport', () => {
48
- const report = buildCandidatesReport(FIXTURE);
49
- it('counts the whole estate it was given', () => {
50
- expect(report.total).toBe(FIXTURE.length);
51
- });
52
- it('partitions visibility exhaustively — the buckets sum to the total', () => {
53
- const summed = Object.values(report.byVisibility).reduce((a, b) => a + b, 0);
54
- expect(summed).toBe(FIXTURE.length);
55
- });
56
- it('collects the commands that ABSORBED prior names, named explicitly', () => {
57
- // Named rather than recomputed from the implementation predicate: the
58
- // first version of this bucket inverted the field's meaning, and a test
59
- // that re-derives `(replaces ?? []).length > 0` certifies whatever the
60
- // code does — including the inversion.
61
- expect(report.absorbedNames.map((r) => r.slug)).toEqual(['delta', 'echo']);
62
- expect(report.absorbedNames.map((r) => r.slug)).not.toContain('alpha');
63
- });
64
- it('carries each absorbed-name list through unchanged', () => {
65
- for (const row of report.absorbedNames) {
66
- const source = FIXTURE.find((c) => c.slug === row.slug);
67
- expect(row.replaces).toEqual(source?.replaces ?? []);
68
- }
69
- });
70
- it('treats an empty-string intent as undocumented, not as documented', () => {
71
- const expected = FIXTURE
72
- .filter((c) => (c.intent ?? '').trim() === '')
73
- .map((c) => c.slug)
74
- .sort();
75
- expect(report.noIntent.map((r) => r.slug)).toEqual(expected);
76
- // Guard the boundary the implementation could get wrong in either
77
- // direction: '' and undefined both count, a real string never does.
78
- expect(expected).toContain('charlie');
79
- expect(expected).toContain('foxtrot');
80
- expect(expected).not.toContain('alpha');
81
- });
82
- it('orders packs by weight descending', () => {
83
- const counts = report.byPack.map(([, n]) => n);
84
- expect([...counts]).toEqual([...counts].sort((a, b) => b - a));
85
- const summed = counts.reduce((a, b) => a + b, 0);
86
- expect(summed).toBe(FIXTURE.length);
87
- });
88
- it('breaks a pack tie by name — exercised on an actual tie', () => {
89
- // The mixed fixture has counts 3/2/1 and never hits the tie-break, so
90
- // the previous version of this test asserted a branch it never reached.
91
- const tied = buildCandidatesReport([
92
- cmd('one', 'zulu'),
93
- cmd('two', 'alpha'),
94
- ]);
95
- expect(tied.byPack.map(([p]) => p)).toEqual(['alpha', 'zulu']);
96
- });
97
- it('is byte-stable across input permutations — the report is a set view', () => {
98
- const shuffled = [...FIXTURE].reverse();
99
- expect(renderCandidates(buildCandidatesReport(shuffled)))
100
- .toBe(renderCandidates(buildCandidatesReport(FIXTURE)));
101
- });
102
- });
103
- describe('buildCandidatesReport — empty estate', () => {
104
- it('reports a measured zero rather than throwing or omitting sections', () => {
105
- const empty = buildCandidatesReport([]);
106
- expect(empty.total).toBe(0);
107
- expect(empty.absorbedNames).toEqual([]);
108
- expect(empty.noIntent).toEqual([]);
109
- expect(empty.byPack).toEqual([]);
110
- const text = renderCandidates(empty);
111
- // An absent section would let a real zero read as a missing check.
112
- expect(text).toContain('measured zero');
113
- });
114
- });
115
- describe('renderCandidates — the honesty band', () => {
116
- const text = renderCandidates(buildCandidatesReport(FIXTURE));
117
- it('states up front that it decides nothing', () => {
118
- expect(text.split('\n')[0]).toMatch(/report-only/i);
119
- });
120
- it('names the usage-evidence owner it deliberately does not import', () => {
121
- expect(text).toContain('utilization_report');
122
- });
123
- it('warns that both census snapshots are dated, not current', () => {
124
- expect(text).toContain('docs/SKILL_CENSUS.md');
125
- expect(text).toContain('docs/artefact-census.md');
126
- expect(text).toMatch(/point-in-time|do not\s+read their numbers as current/i);
127
- });
128
- it('hands the reduction targets to their owning roadmaps, all of them', () => {
129
- for (const owner of REDUCTION_OWNERS)
130
- expect(text).toContain(owner);
131
- expect(REDUCTION_OWNERS.length).toBeGreaterThan(0);
132
- });
133
- it('never presents itself as a prune instruction', () => {
134
- // Assert the exported contract, not a hand-copied sentence — a reworded
135
- // disclaimer stays covered, a DELETED one fails.
136
- expect(text).toContain(REPORT_ONLY_NOTICE);
137
- });
138
- it('states that the absorbed-name bucket is NOT a retirement class', () => {
139
- // The defect this pins: the bucket was first labelled "deprecation
140
- // shims", i.e. the exact inverse of what `replaces` means.
141
- expect(text).not.toMatch(/deprecation shims +\d/);
142
- expect(text).toMatch(/NOT a retirement class/);
143
- expect(text).toContain('absorbed prior names');
144
- });
145
- it('reports the real shim class as not computable, with its canonical figure', () => {
146
- expect(text).toMatch(/deprecation shims\s+not computable/);
147
- expect(text).toContain('superseded_by');
148
- expect(text).toContain('0 shims of 196');
149
- });
150
- it('renders every absorbed-name row it counted, with its absorbed ids', () => {
151
- const report = buildCandidatesReport(FIXTURE);
152
- for (const row of report.absorbedNames) {
153
- expect(text).toContain(row.slug);
154
- for (const prior of row.replaces)
155
- expect(text).toContain(prior);
156
- }
157
- });
158
- });
159
- describe('runCommandsLs — --candidates refuses the narrowing flags', () => {
160
- // Regression: each of these silently produced a whole-estate report, and a
161
- // typo'd --profile exited 0 where plain `ls` exits 1.
162
- for (const flag of CANDIDATES_INCOMPATIBLE) {
163
- it(`exits 1 when combined with ${flag}`, () => {
164
- const opts = { candidates: true };
165
- if (flag === '--pack')
166
- opts['pack'] = 'git';
167
- if (flag === '--visible')
168
- opts['visible'] = true;
169
- if (flag === '--profile')
170
- opts['profile'] = 'bogus';
171
- if (flag === '--expanded')
172
- opts['expanded'] = true;
173
- expect(runCommandsLs(opts)).toBe(1);
174
- });
175
- }
176
- });
177
- describe('renderCandidates — an unrecognised visibility value cannot vanish', () => {
178
- // `visibility` is a free string in the manifest (ADR-092 named the field,
179
- // nothing pins its domain). Rendering only the three known labels made the
180
- // printed breakdown silently disagree with the total — the exact false-green
181
- // shape a report must not have.
182
- const withUnknown = [
183
- cmd('known', 'engineering-base', { visibility: 'visible' }),
184
- cmd('odd-one', 'engineering-base', { visibility: 'experimental' }),
185
- cmd('odd-two', 'engineering-base', { visibility: 'experimental' }),
186
- ];
187
- const report = buildCandidatesReport(withUnknown);
188
- const text = renderCandidates(report);
189
- it('counts the unrecognised value rather than dropping it', () => {
190
- expect(report.byVisibility['experimental']).toBe(2);
191
- const summed = Object.values(report.byVisibility).reduce((a, b) => a + b, 0);
192
- expect(summed).toBe(withUnknown.length);
193
- });
194
- it('renders it, so the printed breakdown sums to the printed total', () => {
195
- expect(text).toContain('experimental');
196
- // Sum only the visibility block: the run of bucket lines directly
197
- // following the `surface` line. (A wider filter also matched the
198
- // owning-packs block, which is why the earlier version of this test
199
- // carried a variable that did not hold what its name claimed.)
200
- const rows = text.split('\n');
201
- const start = rows.findIndex((l) => l.startsWith('surface '));
202
- const block = [];
203
- for (const line of rows.slice(start + 1)) {
204
- const m = line.match(/^ {2}(\S+) +(\d+)$/);
205
- if (!m)
206
- break;
207
- block.push(Number(m[2]));
208
- }
209
- expect(block).toHaveLength(4);
210
- expect(block.reduce((a, b) => a + b, 0)).toBe(report.total);
211
- });
212
- it('keeps the JSON record key order deterministic too, not just the render', () => {
213
- // The fix first sorted unknowns in the renderer only, leaving the record
214
- // a --json consumer reads in first-seen order.
215
- const forward = buildCandidatesReport([
216
- cmd('a', 'p', { visibility: 'zeta' }),
217
- cmd('b', 'p', { visibility: 'alpha' }),
218
- ]);
219
- const reversed = buildCandidatesReport([
220
- cmd('b', 'p', { visibility: 'alpha' }),
221
- cmd('a', 'p', { visibility: 'zeta' }),
222
- ]);
223
- expect(Object.keys(forward.byVisibility)).toEqual(Object.keys(reversed.byVisibility));
224
- expect(Object.keys(forward.byVisibility).slice(-2)).toEqual(['alpha', 'zeta']);
225
- });
226
- it('keeps the known labels ahead of the unrecognised one, for byte stability', () => {
227
- const order = [...text.matchAll(/^ {2}(visible|advanced|internal|experimental) +\d+$/gm)]
228
- .map((m) => m[1]);
229
- expect(order[order.length - 1]).toBe('experimental');
230
- });
231
- });
232
- describe('renderCandidates — the text-mode cap is named, never silent', () => {
233
- /** One more undocumented command than the cap allows, so truncation bites. */
234
- const over = Array.from({ length: TEXT_LIST_CAP + 3 }, (_unused, i) => cmd(`undoc-${String(i).padStart(3, '0')}`, 'engineering-base', { intent: '' }));
235
- const report = buildCandidatesReport(over);
236
- const text = renderCandidates(report);
237
- it('keeps the COUNT honest even though the list is truncated', () => {
238
- expect(report.noIntent.length).toBe(over.length);
239
- expect(text).toContain(`no stated intent ${over.length}`);
240
- });
241
- it('states how many rows it withheld, derived from the input', () => {
242
- expect(text).toContain(`… and ${over.length - TEXT_LIST_CAP} more`);
243
- });
244
- it('caps the enumeration at exactly TEXT_LIST_CAP rows', () => {
245
- const listed = over.filter((c) => text.includes(` ${c.slug} (`)).length;
246
- expect(listed).toBe(TEXT_LIST_CAP);
247
- });
248
- it('never caps the structured payload', () => {
249
- // --json consumers get the whole set; the cap is a text-mode concern.
250
- expect(report.noIntent).toHaveLength(over.length);
251
- });
252
- it('adds no truncation notice when the set fits', () => {
253
- const fits = renderCandidates(buildCandidatesReport(over.slice(0, TEXT_LIST_CAP)));
254
- expect(fits).not.toContain('more — the full set is in --json');
255
- });
256
- });
257
- //# sourceMappingURL=commands.candidates.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.candidates.test.js","sourceRoot":"","sources":["../../../src/cli/commands/commands.candidates.test.ts"],"names":[],"mappings":"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"}
@@ -1,88 +0,0 @@
1
- /**
2
- * Routing evals for profiles-as-views (6.0.0-D Step 14/15).
3
- *
4
- * Proves the roadmap acceptance criterion: `commands ls --profile developer`
5
- * renders exactly {work, review-changes, fix-ci, git-commit, git-pr-create}
6
- * in view order, and `--expanded` adds the active packs' full set on top.
7
- */
8
- import { describe, expect, it } from 'vitest';
9
- import { loadProfile, resolveProfileView } from './profiles.js';
10
- function cmd(slug, pack, visibility = 'internal') {
11
- return {
12
- path: `src/domains/${pack}/${slug}/command.md`,
13
- category: 'command',
14
- name: slug,
15
- slug,
16
- pack,
17
- visibility,
18
- workspaces: [],
19
- packs: [pack],
20
- lifecycle: 'stable',
21
- trust: { level: 'core', confidence: 'high', human_review_required: false },
22
- install: { default: true, removable: false },
23
- };
24
- }
25
- const MANIFEST = [
26
- cmd('work', 'engineering-base', 'visible'),
27
- cmd('review-changes', 'engineering-base', 'advanced'),
28
- cmd('fix-ci', 'engineering-base'),
29
- cmd('git-commit', 'git', 'visible'),
30
- cmd('git-pr-create', 'git', 'advanced'),
31
- cmd('git-sync', 'git'),
32
- cmd('research', 'product-discovery', 'visible'), // not in developer's packs
33
- ];
34
- describe('profiles-as-views', () => {
35
- it('developer built-in declares the curated five', () => {
36
- const p = loadProfile('developer');
37
- expect(p).not.toBeNull();
38
- expect(p?.immutable).toBe(true);
39
- expect(p?.view).toEqual(['work', 'review-changes', 'fix-ci', 'git-commit', 'git-pr-create']);
40
- });
41
- it('curated view renders exactly the five, in declared order', () => {
42
- const p = loadProfile('developer');
43
- const view = resolveProfileView(p, MANIFEST);
44
- expect(view.map((c) => c.slug)).toEqual([
45
- 'work',
46
- 'review-changes',
47
- 'fix-ci',
48
- 'git-commit',
49
- 'git-pr-create',
50
- ]);
51
- });
52
- it('--expanded adds the active packs full set after the curated view', () => {
53
- const p = loadProfile('developer');
54
- const view = resolveProfileView(p, MANIFEST, { expanded: true });
55
- const slugs = view.map((c) => c.slug);
56
- // curated five first, in order
57
- expect(slugs.slice(0, 5)).toEqual([
58
- 'work',
59
- 'review-changes',
60
- 'fix-ci',
61
- 'git-commit',
62
- 'git-pr-create',
63
- ]);
64
- // git-sync (git pack, not in the curated view) is added by --expanded
65
- expect(slugs).toContain('git-sync');
66
- // research (product-discovery, not a developer pack) is NOT surfaced
67
- expect(slugs).not.toContain('research');
68
- });
69
- it('a view entry with no live command is silently dropped', () => {
70
- const p = loadProfile('developer');
71
- const partial = MANIFEST.filter((c) => c.slug !== 'fix-ci');
72
- const view = resolveProfileView(p, partial);
73
- expect(view.map((c) => c.slug)).toEqual(['work', 'review-changes', 'git-commit', 'git-pr-create']);
74
- });
75
- it('unknown profile id resolves to null', () => {
76
- expect(loadProfile('nope')).toBeNull();
77
- expect(loadProfile('../etc/passwd')).toBeNull();
78
- });
79
- it('every built-in profile loads and is immutable', () => {
80
- for (const id of ['developer', 'founder', 'content_creator', 'agency', 'finance', 'ops']) {
81
- const p = loadProfile(id);
82
- expect(p, id).not.toBeNull();
83
- expect(p?.immutable, id).toBe(true);
84
- expect(p?.view.length, id).toBeGreaterThan(0);
85
- }
86
- });
87
- });
88
- //# sourceMappingURL=profiles.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profiles.test.js","sourceRoot":"","sources":["../../../src/cli/commands/profiles.test.ts"],"names":[],"mappings":"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"}
@@ -1,113 +0,0 @@
1
- /**
2
- * Tests for `agent-config eval:record` (recordTriggerEval).
3
- *
4
- * No network, no real eval run — fixtures only. Asserts the integrity guards
5
- * and exit-code contract: live result records & passes, mock is rejected,
6
- * floor miss is recorded but fails, and the domain-specific floor is applied.
7
- */
8
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
9
- import { tmpdir } from 'node:os';
10
- import { join } from 'node:path';
11
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
12
- import { runRecordTriggerEval } from './recordTriggerEval.js';
13
- let dir;
14
- let manifestPath;
15
- let evalPath;
16
- const MANIFEST = {
17
- upstream: {
18
- repo: 'https://github.com/example-org/example-upstream-skill',
19
- sha: 'b7e3af80f6e331f6fb456667b82b12cade7c9d35',
20
- last_checked: '2026-06-07',
21
- },
22
- };
23
- /** Write an EvalResult JSON for `skill` at `path`. */
24
- function writeEvalAt(path, over) {
25
- writeFileSync(path, JSON.stringify({
26
- skill: over.skill ?? 'design-intelligence',
27
- model: 'claude-sonnet-4-5',
28
- router: over.router ?? 'anthropic',
29
- metrics: {
30
- true_positive: 5,
31
- false_positive: over.precision === undefined ? 1 : 0,
32
- false_negative: over.recall === undefined ? 0 : 1,
33
- true_negative: 4,
34
- precision: over.precision ?? 0.833,
35
- recall: over.recall ?? 1.0,
36
- },
37
- }), 'utf8');
38
- }
39
- function writeEval(over) {
40
- writeEvalAt(evalPath, over);
41
- }
42
- /** Create a `.../skills/<skill>/data/manifest.json` and return its path. */
43
- function makeManifest(root, skill) {
44
- const dataDir = join(root, 'skills', skill, 'data');
45
- mkdirSync(dataDir, { recursive: true });
46
- const p = join(dataDir, 'manifest.json');
47
- writeFileSync(p, `${JSON.stringify(MANIFEST, null, 2)}\n`, 'utf8');
48
- return p;
49
- }
50
- beforeEach(() => {
51
- // Mirror the real layout `.../skills/<skill>/data/manifest.json` so the
52
- // skill-mismatch guard has something to infer from.
53
- dir = mkdtempSync(join(tmpdir(), 'eval-rec-'));
54
- manifestPath = makeManifest(dir, 'design-intelligence');
55
- evalPath = join(dir, 'eval.json');
56
- });
57
- afterEach(() => {
58
- rmSync(dir, { recursive: true, force: true });
59
- });
60
- describe('runRecordTriggerEval', () => {
61
- it('records a passing live result and returns 0', () => {
62
- writeEval({});
63
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath });
64
- expect(code).toBe(0);
65
- const out = JSON.parse(readFileSync(manifestPath, 'utf8'));
66
- expect(out.upstream.last_eval?.passed).toBe(true);
67
- expect(out.upstream.last_eval?.sha_at_eval).toBe(MANIFEST.upstream.sha);
68
- });
69
- it('rejects a MockRouter result with exit 2 and writes nothing', () => {
70
- writeEval({ router: 'mock' });
71
- const before = readFileSync(manifestPath, 'utf8');
72
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath });
73
- expect(code).toBe(2);
74
- expect(readFileSync(manifestPath, 'utf8')).toBe(before);
75
- });
76
- it('allows a mock result under --allow-mock', () => {
77
- writeEval({ router: 'mock' });
78
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath, allowMock: true });
79
- expect(code).toBe(0);
80
- });
81
- it('records but fails (exit 1) when recall is below the floor', () => {
82
- writeEval({ recall: 0.8 });
83
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath });
84
- expect(code).toBe(1);
85
- const out = JSON.parse(readFileSync(manifestPath, 'utf8'));
86
- expect(out.upstream.last_eval?.passed).toBe(false);
87
- });
88
- it('errors (exit 2) on a skill/manifest mismatch', () => {
89
- writeEval({ skill: 'some-other-skill' });
90
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath });
91
- expect(code).toBe(2);
92
- });
93
- it('does not write the manifest in dry-run', () => {
94
- writeEval({});
95
- const before = readFileSync(manifestPath, 'utf8');
96
- const code = runRecordTriggerEval({ evalJson: evalPath, manifest: manifestPath, dryRun: true });
97
- expect(code).toBe(0);
98
- expect(readFileSync(manifestPath, 'utf8')).toBe(before);
99
- });
100
- it('applies the domain-specific floor: brand-strategy 0.9/0.7 passes where the default 1.0/0.8 would fail', () => {
101
- const bsManifest = makeManifest(dir, 'brand-strategy');
102
- const bsEval = join(dir, 'brand-strategy-eval.json');
103
- // recall 0.9, precision 0.7 — below the universal default (1.0/0.8),
104
- // but exactly on the brand-strategy domain floor.
105
- writeEvalAt(bsEval, { skill: 'brand-strategy', recall: 0.9, precision: 0.7 });
106
- const code = runRecordTriggerEval({ evalJson: bsEval, manifest: bsManifest });
107
- expect(code).toBe(0);
108
- const out = JSON.parse(readFileSync(bsManifest, 'utf8'));
109
- expect(out.upstream.last_eval?.passed).toBe(true);
110
- expect(out.upstream.last_eval?.floor).toEqual({ min_recall: 0.9, min_precision: 0.7 });
111
- });
112
- });
113
- //# sourceMappingURL=recordTriggerEval.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recordTriggerEval.test.js","sourceRoot":"","sources":["../../../src/cli/commands/recordTriggerEval.test.ts"],"names":[],"mappings":"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"}
@@ -1,97 +0,0 @@
1
- /**
2
- * Unit tests for the host-supplied config-root seam.
3
- *
4
- * - `resolveConfigRoot` applies `flag > env > default` precedence.
5
- * - `ensureConfigRoot` validates + creates the dir (0700), rejects empty.
6
- * - `applyConfigRootFromArgv` extracts the flag, exports the env, cleans
7
- * argv, and is a pure passthrough (no side effects) when absent.
8
- */
9
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
10
- import { existsSync, mkdtempSync, rmSync, statSync } from 'node:fs';
11
- import { homedir, tmpdir } from 'node:os';
12
- import { join, resolve } from 'node:path';
13
- import { CONFIG_ROOT_ENV, applyConfigRootFromArgv, ensureConfigRoot, resolveConfigRoot, } from './configRoot.js';
14
- describe('config root', () => {
15
- let scratch;
16
- let savedEnv;
17
- beforeEach(() => {
18
- scratch = mkdtempSync(join(tmpdir(), 'configroot-'));
19
- savedEnv = process.env[CONFIG_ROOT_ENV];
20
- delete process.env[CONFIG_ROOT_ENV];
21
- });
22
- afterEach(() => {
23
- rmSync(scratch, { recursive: true, force: true });
24
- if (savedEnv === undefined) {
25
- delete process.env[CONFIG_ROOT_ENV];
26
- }
27
- else {
28
- process.env[CONFIG_ROOT_ENV] = savedEnv;
29
- }
30
- });
31
- describe('resolveConfigRoot (precedence flag > env > default)', () => {
32
- it('returns the flag value (absolute-resolved) when set — even if env is also set', () => {
33
- const flag = join(scratch, 'from-flag');
34
- const res = resolveConfigRoot({
35
- flag,
36
- env: { [CONFIG_ROOT_ENV]: join(scratch, 'from-env') },
37
- });
38
- expect(res).toBe(resolve(flag));
39
- });
40
- it('returns the env value when no flag is set', () => {
41
- const envRoot = join(scratch, 'from-env');
42
- const res = resolveConfigRoot({ env: { [CONFIG_ROOT_ENV]: envRoot } });
43
- expect(res).toBe(envRoot);
44
- });
45
- it('returns the vendor-namespaced default when neither flag nor env is set', () => {
46
- const res = resolveConfigRoot({ env: {} });
47
- expect(res).toBe(join(homedir(), '.event4u', 'agent-config'));
48
- });
49
- });
50
- describe('ensureConfigRoot', () => {
51
- it('creates the directory (mode 0700, no group/other access)', () => {
52
- const target = join(scratch, 'nested', 'root');
53
- expect(existsSync(target)).toBe(false);
54
- const abs = ensureConfigRoot(target);
55
- expect(abs).toBe(resolve(target));
56
- expect(statSync(abs).isDirectory()).toBe(true);
57
- const mode = statSync(abs).mode & 0o777;
58
- // Owner rwx present; group/other stripped (umask only restricts).
59
- expect(mode & 0o700).toBe(0o700);
60
- expect(mode & 0o077).toBe(0);
61
- });
62
- it('rejects an empty path', () => {
63
- expect(() => ensureConfigRoot(' ')).toThrow(/non-empty/);
64
- });
65
- });
66
- describe('applyConfigRootFromArgv', () => {
67
- it('extracts `--config-root <path>`, exports the env, and cleans argv', () => {
68
- const root = join(scratch, 'profile-a');
69
- const env = {};
70
- const res = applyConfigRootFromArgv(['config', '--config-root', root, '--port', '8080'], env);
71
- expect(res.configRoot).toBe(resolve(root));
72
- expect(env[CONFIG_ROOT_ENV]).toBe(resolve(root));
73
- expect(res.argv).toEqual(['config', '--port', '8080']);
74
- expect(existsSync(resolve(root))).toBe(true);
75
- });
76
- it('supports the `--config-root=<path>` form', () => {
77
- const root = join(scratch, 'profile-b');
78
- const env = {};
79
- const res = applyConfigRootFromArgv([`--config-root=${root}`, 'setup'], env);
80
- expect(res.configRoot).toBe(resolve(root));
81
- expect(env[CONFIG_ROOT_ENV]).toBe(resolve(root));
82
- expect(res.argv).toEqual(['setup']);
83
- });
84
- it('is a pure passthrough with no side effects when the flag is absent', () => {
85
- const env = {};
86
- const res = applyConfigRootFromArgv(['config', '--port', '8080'], env);
87
- expect(res.configRoot).toBeNull();
88
- expect(env[CONFIG_ROOT_ENV]).toBeUndefined();
89
- expect(res.argv).toEqual(['config', '--port', '8080']);
90
- });
91
- it('throws when the flag is present without a value', () => {
92
- expect(() => applyConfigRootFromArgv(['config', '--config-root'], {})).toThrow(/requires a path/);
93
- expect(() => applyConfigRootFromArgv(['--config-root', '--port'], {})).toThrow(/requires a path/);
94
- });
95
- });
96
- });
97
- //# sourceMappingURL=configRoot.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configRoot.test.js","sourceRoot":"","sources":["../../src/cli/configRoot.test.ts"],"names":[],"mappings":"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"}