@encore-os/eos-spec 0.9.0 → 0.12.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/bin/check-dist-fresh.js +2 -2
- package/bin/eos-spec.js +9 -0
- package/dist/commands/archive.js +1 -1
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/close-out.js +1 -1
- package/dist/commands/close-out.js.map +1 -1
- package/dist/commands/complete.js +81 -4
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/create.js +6 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/funnel.js +7 -0
- package/dist/commands/funnel.js.map +1 -1
- package/dist/commands/next.d.ts +10 -4
- package/dist/commands/next.js +38 -12
- package/dist/commands/next.js.map +1 -1
- package/dist/commands/proceed.d.ts +48 -0
- package/dist/commands/proceed.js +144 -0
- package/dist/commands/proceed.js.map +1 -0
- package/dist/commands/reconcile.js +7 -1
- package/dist/commands/reconcile.js.map +1 -1
- package/dist/commands/run.d.ts +7 -4
- package/dist/commands/run.js +18 -10
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scorecard.d.ts +24 -0
- package/dist/commands/scorecard.js +49 -3
- package/dist/commands/scorecard.js.map +1 -1
- package/dist/commands/signoff.js +43 -2
- package/dist/commands/signoff.js.map +1 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.js +13 -1
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/walkthrough.js +10 -21
- package/dist/commands/walkthrough.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/completion-gate.d.ts +8 -7
- package/dist/lib/completion-gate.js +15 -10
- package/dist/lib/completion-gate.js.map +1 -1
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/coverage-gate.d.ts +43 -0
- package/dist/lib/coverage-gate.js +54 -0
- package/dist/lib/coverage-gate.js.map +1 -0
- package/dist/lib/events.d.ts +1 -0
- package/dist/lib/events.js +8 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/frontmatter.d.ts +1 -1
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/funnel.d.ts +5 -0
- package/dist/lib/funnel.js +2 -1
- package/dist/lib/funnel.js.map +1 -1
- package/dist/lib/pipeline-map.d.ts +24 -0
- package/dist/lib/pipeline-map.js +45 -5
- package/dist/lib/pipeline-map.js.map +1 -1
- package/dist/lib/reconcile-core.d.ts +20 -3
- package/dist/lib/reconcile-core.js +16 -6
- package/dist/lib/reconcile-core.js.map +1 -1
- package/dist/lib/scorecard.d.ts +5 -0
- package/dist/lib/scorecard.js +1 -0
- package/dist/lib/scorecard.js.map +1 -1
- package/dist/lib/spec-pure.js +6 -0
- package/dist/lib/spec-pure.js.map +1 -1
- package/dist/lib/specs.d.ts +17 -0
- package/dist/lib/specs.js.map +1 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/lib/version.js.map +1 -1
- package/dist/lib/walkthrough-manifest-io.d.ts +15 -0
- package/dist/lib/walkthrough-manifest-io.js +30 -0
- package/dist/lib/walkthrough-manifest-io.js.map +1 -0
- package/dist/lib/with-event-log.js +17 -3
- package/dist/lib/with-event-log.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/signoff.js
CHANGED
|
@@ -5,6 +5,8 @@ import { ErrorCode, emit, emitContinuing, getGlobalOptions } from '../lib/output
|
|
|
5
5
|
import { reconcileSpec } from '../lib/reconcile-core.js';
|
|
6
6
|
import { getRepoRoot, specsRoot } from '../lib/repo.js';
|
|
7
7
|
import { diagnoseMissingSpec, findSpec } from '../lib/specs.js';
|
|
8
|
+
import { checkWalkthroughCoverage, specRequirementIds } from '../lib/walkthrough-coverage.js';
|
|
9
|
+
import { loadManifest } from '../lib/walkthrough-manifest-io.js';
|
|
8
10
|
import { withEventLog } from '../lib/with-event-log.js';
|
|
9
11
|
const VALID_TYPES = [
|
|
10
12
|
'validated',
|
|
@@ -16,6 +18,9 @@ const VALID_TYPES = [
|
|
|
16
18
|
'ui-gate-waived',
|
|
17
19
|
'submit-e2e-waived',
|
|
18
20
|
'compliance',
|
|
21
|
+
'coverage-waived',
|
|
22
|
+
'video-walkthrough',
|
|
23
|
+
'walkthrough-waived',
|
|
19
24
|
];
|
|
20
25
|
/** Today's date in YYYY-MM-DD form in the operator's LOCAL timezone, suitable for
|
|
21
26
|
* sign-off markers. Local (not UTC) so an evening sign-off doesn't stamp tomorrow. */
|
|
@@ -26,9 +31,9 @@ function isoToday() {
|
|
|
26
31
|
export function registerSignoff(program) {
|
|
27
32
|
program
|
|
28
33
|
.command('signoff')
|
|
29
|
-
.description("Write a sign-off marker (validated | spec-reviewed | revalidated-after-review | ux-reviewed | heal-verified | docshots | ui-gate-waived | submit-e2e-waived | compliance) to a spec; idempotent. By default recomputes the spec's pipeline_status afterward (--no-reconcile to skip).")
|
|
34
|
+
.description("Write a sign-off marker (validated | spec-reviewed | revalidated-after-review | ux-reviewed | heal-verified | docshots | ui-gate-waived | submit-e2e-waived | compliance | coverage-waived | video-walkthrough | walkthrough-waived) to a spec; idempotent. By default recomputes the spec's pipeline_status afterward (--no-reconcile to skip).")
|
|
30
35
|
.requiredOption('--spec <id>', 'Spec id (e.g. PM-21)')
|
|
31
|
-
.requiredOption('--type <type>', 'Marker: validated | spec-reviewed | revalidated-after-review | ux-reviewed | heal-verified | docshots | ui-gate-waived | submit-e2e-waived | compliance')
|
|
36
|
+
.requiredOption('--type <type>', 'Marker: validated | spec-reviewed | revalidated-after-review | ux-reviewed | heal-verified | docshots | ui-gate-waived | submit-e2e-waived | compliance | coverage-waived | video-walkthrough | walkthrough-waived')
|
|
32
37
|
.option('--date <YYYY-MM-DD>', 'Override the marker date (default: today)')
|
|
33
38
|
.option('--reviewer <name>', 'Reviewer name (compliance sign-off only)')
|
|
34
39
|
// Finding A item 4: a sign-off is THE artifact-writing transition; auto-reconcile
|
|
@@ -105,6 +110,42 @@ export function registerSignoff(program) {
|
|
|
105
110
|
});
|
|
106
111
|
return;
|
|
107
112
|
}
|
|
113
|
+
// `video-walkthrough` is verified at sign-off: the persisted marker must MEAN
|
|
114
|
+
// "filmed coverage passed", so the completion gate can trust it without reading
|
|
115
|
+
// the gitignored manifest. Refuse unless the canonical checker passes.
|
|
116
|
+
if (type === 'video-walkthrough') {
|
|
117
|
+
const load = loadManifest(repoRoot, spec.id);
|
|
118
|
+
if (!load.ok) {
|
|
119
|
+
const msg = load.reason === 'missing'
|
|
120
|
+
? `signoff: no walkthrough manifest for ${spec.id} — record it first, then ` +
|
|
121
|
+
`\`eos-spec walkthrough --check --spec ${spec.id}\` before signing off`
|
|
122
|
+
: `signoff: ${load.message}`;
|
|
123
|
+
emit(global, {
|
|
124
|
+
ok: false,
|
|
125
|
+
error: { code: ErrorCode.IO_ERROR, message: msg },
|
|
126
|
+
data: { specId: spec.id, type, verified: false },
|
|
127
|
+
text: `✖ ${msg}`,
|
|
128
|
+
});
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const verdict = checkWalkthroughCoverage(load.manifest, specRequirementIds(readFileSync(spec.path, 'utf8')));
|
|
133
|
+
if (!verdict.ok) {
|
|
134
|
+
const detail = verdict.stale
|
|
135
|
+
? 'manifest specSha ≠ current spec (STALE — re-record)'
|
|
136
|
+
: `${verdict.acFilmed}/${verdict.acTotal} ACs filmed, ${verdict.storiesCovered}/${verdict.storiesTotal} stories covered`;
|
|
137
|
+
const msg = `signoff: walkthrough coverage incomplete for ${spec.id} — ${detail}. Run \`eos-spec walkthrough --check --spec ${spec.id}\` for the full report; not filming? \`--type walkthrough-waived\``;
|
|
138
|
+
emit(global, {
|
|
139
|
+
ok: false,
|
|
140
|
+
error: { code: ErrorCode.VALIDATION_FAILED, message: msg },
|
|
141
|
+
data: { specId: spec.id, type, verified: false, ...verdict },
|
|
142
|
+
text: `✖ ${msg}`,
|
|
143
|
+
});
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// coverage passed → fall through to the generic marker-insert path below.
|
|
148
|
+
}
|
|
108
149
|
const text = readFileSync(spec.path, 'utf8');
|
|
109
150
|
const { text: next, inserted } = insertSignoffMarker(text, type, date);
|
|
110
151
|
if (inserted)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signoff.js","sourceRoot":"","sources":["../../src/commands/signoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAoB,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,WAAW,GAA2B;IAC1C,WAAW;IACX,eAAe;IACf,0BAA0B;IAC1B,aAAa;IACb,eAAe;IACf,UAAU;IACV,gBAAgB;IAChB,mBAAmB;IACnB,YAAY;
|
|
1
|
+
{"version":3,"file":"signoff.js","sourceRoot":"","sources":["../../src/commands/signoff.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { loadConfig } from '../lib/config.js';
|
|
3
4
|
import { ErrorCode, emit, getGlobalOptions } from '../lib/output.js';
|
|
4
|
-
import {
|
|
5
|
+
import { isComplianceGated, pipelineForConfig } from '../lib/pipeline-map.js';
|
|
5
6
|
import { getRepoRoot } from '../lib/repo.js';
|
|
6
7
|
import { isClaimedCompleteUnverified } from '../lib/spec-debt.js';
|
|
7
8
|
import { findSpec, listSpecs } from '../lib/specs.js';
|
|
@@ -16,6 +17,10 @@ export function registerStatus(program) {
|
|
|
16
17
|
.action(withEventLog('status', async (options, cmd) => {
|
|
17
18
|
const global = getGlobalOptions(cmd);
|
|
18
19
|
const repoRoot = getRepoRoot(global.repoRoot);
|
|
20
|
+
// Build once per invocation from the repo's own config, so a
|
|
21
|
+
// `pipeline.layout: builder` config computes stage against the builder
|
|
22
|
+
// order instead of the static ENCORE1 default (F-4, #35).
|
|
23
|
+
const { computeStage } = pipelineForConfig(loadConfig(repoRoot, global.config));
|
|
19
24
|
if (options.spec) {
|
|
20
25
|
const spec = findSpec(repoRoot, options.spec, { includeArchived: options.includeArchived });
|
|
21
26
|
if (!spec) {
|
|
@@ -45,6 +50,7 @@ export function registerStatus(program) {
|
|
|
45
50
|
paths: { spec: spec.path, hasContext: spec.hasContext, hasPlan: spec.hasPlan, hasTasks: spec.hasTasks },
|
|
46
51
|
tasks: { total: totalTasks, completed: completedTasks },
|
|
47
52
|
claimedCompleteButUnverified: claimedCompleteUnverified,
|
|
53
|
+
isComplianceGated: isComplianceGated(spec),
|
|
48
54
|
};
|
|
49
55
|
emit(global, {
|
|
50
56
|
ok: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tasks.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
export declare function registerTasks(program: Command): void;
|
|
3
|
+
/**
|
|
4
|
+
* The per-core insertion guide at `.cursor/skills/_shared/module-phases-tasks.md` is an
|
|
5
|
+
* encoreos-repo artifact, not something every consumer ships. Only append the "review it"
|
|
6
|
+
* suggestion when the file actually exists (F-25) so a repo without it doesn't get a
|
|
7
|
+
* dangling pointer. Exported for unit testing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function moduleTasksHint(repoRoot: string): string;
|
|
3
10
|
/**
|
|
4
11
|
* Rebase relative markdown-link targets written relative to `fromDir` so they
|
|
5
12
|
* resolve from `toDir` instead. In-document (`#…`), absolute (`/…`), and external
|
package/dist/commands/tasks.js
CHANGED
|
@@ -45,10 +45,22 @@ export function registerTasks(program) {
|
|
|
45
45
|
emit(global, {
|
|
46
46
|
ok: true,
|
|
47
47
|
data: { target, spec: spec.id },
|
|
48
|
-
text: `tasks: wrote ${relPath(repoRoot, target)}
|
|
48
|
+
text: `tasks: wrote ${relPath(repoRoot, target)}${moduleTasksHint(repoRoot)}`,
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* The per-core insertion guide at `.cursor/skills/_shared/module-phases-tasks.md` is an
|
|
54
|
+
* encoreos-repo artifact, not something every consumer ships. Only append the "review it"
|
|
55
|
+
* suggestion when the file actually exists (F-25) so a repo without it doesn't get a
|
|
56
|
+
* dangling pointer. Exported for unit testing.
|
|
57
|
+
*/
|
|
58
|
+
export function moduleTasksHint(repoRoot) {
|
|
59
|
+
const hintRel = '.cursor/skills/_shared/module-phases-tasks.md';
|
|
60
|
+
return existsSync(join(repoRoot, '.cursor', 'skills', '_shared', 'module-phases-tasks.md'))
|
|
61
|
+
? `\nReview the per-core insertions in ${hintRel}`
|
|
62
|
+
: '';
|
|
63
|
+
}
|
|
52
64
|
function relPath(repoRoot, p) {
|
|
53
65
|
return p.startsWith(repoRoot) ? p.slice(repoRoot.length + 1) : p;
|
|
54
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from 'node:path';
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
3
2
|
import { ErrorCode, emit, getGlobalOptions } from '../lib/output.js';
|
|
4
3
|
import { getRepoRoot } from '../lib/repo.js';
|
|
5
4
|
import { diagnoseMissingSpec, findSpec } from '../lib/specs.js';
|
|
5
|
+
import { loadManifest } from '../lib/walkthrough-manifest-io.js';
|
|
6
6
|
import { checkWalkthroughCoverage, specRequirementIds } from '../lib/walkthrough-coverage.js';
|
|
7
7
|
import { withEventLog } from '../lib/with-event-log.js';
|
|
8
|
-
/** Repo-relative path to a spec's walkthrough manifest. */
|
|
9
|
-
function manifestPath(repoRoot, specId) {
|
|
10
|
-
return join(repoRoot, 'docs', 'walkthroughs', specId.toLowerCase(), 'manifest.json');
|
|
11
|
-
}
|
|
12
8
|
export function registerWalkthrough(program) {
|
|
13
9
|
program
|
|
14
10
|
.command('walkthrough')
|
|
@@ -26,29 +22,22 @@ export function registerWalkthrough(program) {
|
|
|
26
22
|
process.exitCode = 2;
|
|
27
23
|
return;
|
|
28
24
|
}
|
|
29
|
-
const
|
|
30
|
-
if (!
|
|
31
|
-
const msg =
|
|
32
|
-
`
|
|
25
|
+
const load = loadManifest(repoRoot, spec.id);
|
|
26
|
+
if (!load.ok) {
|
|
27
|
+
const msg = load.reason === 'missing'
|
|
28
|
+
? `walkthrough: no manifest for ${spec.id} — record it first ` +
|
|
29
|
+
`(\`npm run walkthrough -- --grep "${spec.id}"\` then \`walkthrough:build\`)`
|
|
30
|
+
: `walkthrough: ${load.message}`;
|
|
33
31
|
emit(global, {
|
|
34
32
|
ok: false,
|
|
35
33
|
error: { code: ErrorCode.IO_ERROR, message: msg },
|
|
36
|
-
data: { specId: spec.id, manifest: false },
|
|
34
|
+
data: load.reason === 'missing' ? { specId: spec.id, manifest: false } : null,
|
|
37
35
|
text: `✖ ${msg}`,
|
|
38
36
|
});
|
|
39
37
|
process.exitCode = 1;
|
|
40
38
|
return;
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
manifest = JSON.parse(readFileSync(mPath, 'utf8'));
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
const msg = `walkthrough: manifest for ${spec.id} is not valid JSON (${err instanceof Error ? err.message : String(err)})`;
|
|
48
|
-
emit(global, { ok: false, error: { code: ErrorCode.IO_ERROR, message: msg }, data: null, text: `✖ ${msg}` });
|
|
49
|
-
process.exitCode = 1;
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
40
|
+
const manifest = load.manifest;
|
|
52
41
|
const verdict = checkWalkthroughCoverage(manifest, specRequirementIds(readFileSync(spec.path, 'utf8')));
|
|
53
42
|
const lines = [
|
|
54
43
|
`Walkthrough filmed-coverage — ${spec.id}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walkthrough.js","sourceRoot":"","sources":["../../src/commands/walkthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"walkthrough.js","sourceRoot":"","sources":["../../src/commands/walkthrough.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export { type AcFilmStatus, type WalkthroughAc, type WalkthroughManifest, type W
|
|
|
17
17
|
export { parseComplianceSignoff } from './lib/compliance-signoff.js';
|
|
18
18
|
export { loadEnforcementAllowlist, type EnforcementAllowlist } from './lib/enforcement-allowlist.js';
|
|
19
19
|
export type { SessionState } from './lib/session-state.js';
|
|
20
|
+
export { runPipeline, HALT_BEFORE_IMPLEMENT } from './lib/run-pipeline.js';
|
|
21
|
+
export type { RunAutonomy, RunNextAction, GateExecution, GateExecutor, RunGateEvent, RunHaltReason, RunResult, RunDeps, RunConfig, } from './lib/run-pipeline.js';
|
|
20
22
|
/** The fully-registered CLI program. Exported (not parsed on import — the parse
|
|
21
23
|
* call below is guarded by the main-module check) so the command-surface gate
|
|
22
24
|
* and conformance pack can enumerate the registered command set. */
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,7 @@ import { registerList } from './commands/list.js';
|
|
|
22
22
|
import { registerMetrics } from './commands/metrics.js';
|
|
23
23
|
import { registerNext } from './commands/next.js';
|
|
24
24
|
import { registerPrecedent } from './commands/precedent.js';
|
|
25
|
+
import { registerProceed } from './commands/proceed.js';
|
|
25
26
|
import { registerProfile } from './commands/profile.js';
|
|
26
27
|
import { registerReady } from './commands/ready.js';
|
|
27
28
|
import { registerReconcile } from './commands/reconcile.js';
|
|
@@ -71,6 +72,14 @@ export { parseComplianceSignoff } from './lib/compliance-signoff.js';
|
|
|
71
72
|
// Shared with encoreos's validate-pipeline-status: the core-enforcement allowlist
|
|
72
73
|
// reader (block/warn cores), so the gate's escalation policy lives in ONE place.
|
|
73
74
|
export { loadEnforcementAllowlist } from './lib/enforcement-allowlist.js';
|
|
75
|
+
// The pure `run` driver core (TOOL-06 / #29). `runPipeline` is the fs-free
|
|
76
|
+
// drive-to-done loop and `HALT_BEFORE_IMPLEMENT` its halt set; consumers
|
|
77
|
+
// (Switchboard WEB-62) inject their own recommend/stage/reconcile + a GateExecutor
|
|
78
|
+
// to reuse the loop instead of reimplementing it. Pure (imports nothing
|
|
79
|
+
// fs/child_process/os), so it is safe here on the fs-bound main entry AND a value
|
|
80
|
+
// consumer pays no fs cost; it is deliberately NOT on `/pure` (per #29). Types are
|
|
81
|
+
// exported so a consumer can implement `GateExecutor`/`RunDeps` against the contract.
|
|
82
|
+
export { runPipeline, HALT_BEFORE_IMPLEMENT } from './lib/run-pipeline.js';
|
|
74
83
|
import { ENGINE_VERSION } from './lib/version.js';
|
|
75
84
|
/** The fully-registered CLI program. Exported (not parsed on import — the parse
|
|
76
85
|
* call below is guarded by the main-module check) so the command-surface gate
|
|
@@ -98,6 +107,7 @@ registerNext(program);
|
|
|
98
107
|
registerReady(program);
|
|
99
108
|
registerClaim(program);
|
|
100
109
|
registerPrecedent(program);
|
|
110
|
+
registerProceed(program);
|
|
101
111
|
registerStatus(program);
|
|
102
112
|
registerList(program);
|
|
103
113
|
registerCreate(program);
|
|
@@ -158,6 +168,15 @@ Documentation:
|
|
|
158
168
|
specs/_templates/SPEC_GUIDE.md # Spec authoring decision tree
|
|
159
169
|
specs/_templates/TEMPLATE_INDEX.md # Template selection
|
|
160
170
|
AI_GUIDE.md # Spec workflow process
|
|
171
|
+
|
|
172
|
+
Environment:
|
|
173
|
+
EOS_SPEC_EVENTS_PATH Override the telemetry sink file. By default events are
|
|
174
|
+
written to <repo-root>/.claude/tmp/eos-spec-events.jsonl,
|
|
175
|
+
where <repo-root> honors --repo-root (falling back to
|
|
176
|
+
git rev-parse --show-toplevel). Set an absolute path to
|
|
177
|
+
redirect the log; set it to /dev/null to discard events.
|
|
178
|
+
EOS_SPEC_RUN_ID Externally-supplied opaque run id to correlate events
|
|
179
|
+
across CLI invocations (defaults to a per-process UUID).
|
|
161
180
|
`);
|
|
162
181
|
export async function run(argv) {
|
|
163
182
|
await program.parseAsync(argv);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,13 @@ export type GateVerdict = {
|
|
|
6
6
|
reason: string;
|
|
7
7
|
};
|
|
8
8
|
/**
|
|
9
|
-
* UI-evidence completion gate (Epic C1). A UI-bearing spec must carry
|
|
10
|
-
*
|
|
11
|
-
* `status: complete` — the exact predicates the navigator enforces
|
|
12
|
-
* mark-complete tail (next.ts implementOrComplete). A `ui-gate-waived`
|
|
13
|
-
* is an explicit, dated escape
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* UI-evidence completion gate (Epic C1). A UI-bearing spec must carry docshot
|
|
10
|
+
* evidence, a browser auto-heal sign-off, and a video-walkthrough before it
|
|
11
|
+
* can claim `status: complete` — the exact predicates the navigator enforces
|
|
12
|
+
* in its mark-complete tail (next.ts implementOrComplete). A `ui-gate-waived`
|
|
13
|
+
* marker is an explicit, dated escape for the whole gate; `walkthrough-waived`
|
|
14
|
+
* exempts only the walkthrough leg. Pure: reads only the precomputed signals
|
|
15
|
+
* so the inline (complete.ts) and corpus (check-ui-completion-evidence.ts)
|
|
16
|
+
* call sites cannot diverge.
|
|
16
17
|
*/
|
|
17
18
|
export declare function uiEvidenceGate(spec: SpecFile): GateVerdict;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* UI-evidence completion gate (Epic C1). A UI-bearing spec must carry
|
|
3
|
-
*
|
|
4
|
-
* `status: complete` — the exact predicates the navigator enforces
|
|
5
|
-
* mark-complete tail (next.ts implementOrComplete). A `ui-gate-waived`
|
|
6
|
-
* is an explicit, dated escape
|
|
7
|
-
*
|
|
8
|
-
*
|
|
2
|
+
* UI-evidence completion gate (Epic C1). A UI-bearing spec must carry docshot
|
|
3
|
+
* evidence, a browser auto-heal sign-off, and a video-walkthrough before it
|
|
4
|
+
* can claim `status: complete` — the exact predicates the navigator enforces
|
|
5
|
+
* in its mark-complete tail (next.ts implementOrComplete). A `ui-gate-waived`
|
|
6
|
+
* marker is an explicit, dated escape for the whole gate; `walkthrough-waived`
|
|
7
|
+
* exempts only the walkthrough leg. Pure: reads only the precomputed signals
|
|
8
|
+
* so the inline (complete.ts) and corpus (check-ui-completion-evidence.ts)
|
|
9
|
+
* call sites cannot diverge.
|
|
9
10
|
*/
|
|
10
11
|
export function uiEvidenceGate(spec) {
|
|
11
12
|
const s = spec.signals;
|
|
@@ -13,16 +14,20 @@ export function uiEvidenceGate(spec) {
|
|
|
13
14
|
return { ok: true };
|
|
14
15
|
if (s.hasUiGateWaiver)
|
|
15
16
|
return { ok: true };
|
|
16
|
-
if (s.hasDocshots && s.hasHealSignoff)
|
|
17
|
-
return { ok: true };
|
|
18
17
|
const missing = [];
|
|
19
18
|
if (!s.hasDocshots)
|
|
20
19
|
missing.push('docshots');
|
|
21
20
|
if (!s.hasHealSignoff)
|
|
22
21
|
missing.push('heal-verified sign-off');
|
|
22
|
+
if (!(s.hasWalkthrough || s.hasWalkthroughWaiver))
|
|
23
|
+
missing.push('video-walkthrough');
|
|
24
|
+
if (missing.length === 0)
|
|
25
|
+
return { ok: true };
|
|
23
26
|
return {
|
|
24
27
|
ok: false,
|
|
25
|
-
reason: `UI-bearing spec missing ${missing.join(' + ')} — complete the verification tail or waive with
|
|
28
|
+
reason: `UI-bearing spec missing ${missing.join(' + ')} — complete the verification tail or waive with ` +
|
|
29
|
+
`\`eos-spec signoff --type ui-gate-waived --spec ${spec.id}\` ` +
|
|
30
|
+
`(walkthrough-only escape: \`--type walkthrough-waived\`).`,
|
|
26
31
|
};
|
|
27
32
|
}
|
|
28
33
|
//# sourceMappingURL=completion-gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-gate.js","sourceRoot":"","sources":["../../src/lib/completion-gate.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"completion-gate.js","sourceRoot":"","sources":["../../src/lib/completion-gate.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,IAAI,CAAC,CAAC,CAAC,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC,eAAe;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,oBAAoB,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EACJ,2BAA2B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kDAAkD;YAChG,mDAAmD,IAAI,CAAC,EAAE,KAAK;YAC/D,2DAA2D;KAC9D,CAAC;AACJ,CAAC"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -70,6 +70,16 @@ export type SpecConfig = {
|
|
|
70
70
|
pipeline?: {
|
|
71
71
|
layout?: 'encore1' | 'builder';
|
|
72
72
|
};
|
|
73
|
+
/** D2: opt-in verification-coverage gate on `eos-spec complete`. Absent (the
|
|
74
|
+
* whole block, or the `verification_coverage_min` key) ⇒ no gate — fully
|
|
75
|
+
* backward-compatible. `per_core` overrides win over the repo-wide default;
|
|
76
|
+
* see `resolveCoverageThreshold` in `lib/coverage-gate.ts`. Distinct from
|
|
77
|
+
* `defaults.test_coverage_target` (test-LINE coverage, 0–100): this is the
|
|
78
|
+
* requirement-VERIFICATION ratio (0–1), i.e. requirementsVerified/requirementsTotal. */
|
|
79
|
+
gate_thresholds?: {
|
|
80
|
+
verification_coverage_min?: number;
|
|
81
|
+
per_core?: Record<string, number>;
|
|
82
|
+
};
|
|
73
83
|
};
|
|
74
84
|
export declare function loadConfig(repoRoot: string, configOverride?: string): SpecConfig;
|
|
75
85
|
export declare function resetConfigCache(): void;
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SpecConfig } from './config.js';
|
|
2
|
+
/** Verdicts a single `eos-spec complete` invocation can reach for the D2
|
|
3
|
+
* verification-coverage gate. `no-gate` means the consuming repo never opted
|
|
4
|
+
* in (`gate_thresholds` absent from `specs/config.yaml`) — behavior is
|
|
5
|
+
* unchanged from before this gate existed. */
|
|
6
|
+
export type CoverageGateVerdict = 'no-gate' | 'pass' | 'waived' | 'blocked';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the verification-coverage threshold (a 0–1 ratio) for a core, per the
|
|
9
|
+
* D2 design: a `per_core` override wins, then the repo-wide
|
|
10
|
+
* `verification_coverage_min`, else `null` — meaning no gate is configured at
|
|
11
|
+
* all. `null` is load-bearing: it is how the gate stays fully opt-in (a repo
|
|
12
|
+
* that never sets `gate_thresholds` sees zero behavior change). Pure.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveCoverageThreshold(config: SpecConfig, core: string): number | null;
|
|
15
|
+
/**
|
|
16
|
+
* Evaluate the coverage gate's verdict from a computed ratio, the resolved
|
|
17
|
+
* threshold, and whether the spec carries a `coverage-waived` sign-off marker.
|
|
18
|
+
* Pure — the CLI wires the real coverage/threshold/waiver lookups.
|
|
19
|
+
*/
|
|
20
|
+
export declare function evaluateCoverageGate(input: {
|
|
21
|
+
ratio: number;
|
|
22
|
+
threshold: number | null;
|
|
23
|
+
hasWaiver: boolean;
|
|
24
|
+
}): {
|
|
25
|
+
gate: CoverageGateVerdict;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A single spec's verification coverage — `requirementsVerified/requirementsTotal`
|
|
29
|
+
* from the same machinery `eos-spec scorecard` runs (`scanVerifies` +
|
|
30
|
+
* `buildScorecardForCore`), mirroring `spec-debt.ts`'s
|
|
31
|
+
* `isClaimedCompleteUnverified` so `scorecard`/`complete`/this gate never drift.
|
|
32
|
+
* `total === 0` (no declared AC/US/FR) is vacuously fully covered (`ratio: 1`) —
|
|
33
|
+
* there is nothing left un-backed, though a caller may still want to treat an
|
|
34
|
+
* all-zero "complete" spec as advisory-suspicious. An unknown spec id (no
|
|
35
|
+
* scorecard row) also reads as `{ verified: 0, total: 0, ratio: 1 }`; callers
|
|
36
|
+
* that gate on this should have already confirmed the spec exists (e.g. via
|
|
37
|
+
* `findSpec`) before calling in.
|
|
38
|
+
*/
|
|
39
|
+
export declare function verificationCoverage(repoRoot: string, specId: string): {
|
|
40
|
+
verified: number;
|
|
41
|
+
total: number;
|
|
42
|
+
ratio: number;
|
|
43
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { buildScorecardForCore } from './scorecard-run.js';
|
|
2
|
+
import { scanVerifies } from './verifies-scan.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the verification-coverage threshold (a 0–1 ratio) for a core, per the
|
|
5
|
+
* D2 design: a `per_core` override wins, then the repo-wide
|
|
6
|
+
* `verification_coverage_min`, else `null` — meaning no gate is configured at
|
|
7
|
+
* all. `null` is load-bearing: it is how the gate stays fully opt-in (a repo
|
|
8
|
+
* that never sets `gate_thresholds` sees zero behavior change). Pure.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveCoverageThreshold(config, core) {
|
|
11
|
+
const perCore = config.gate_thresholds?.per_core?.[core.toLowerCase()];
|
|
12
|
+
if (typeof perCore === 'number')
|
|
13
|
+
return perCore;
|
|
14
|
+
const min = config.gate_thresholds?.verification_coverage_min;
|
|
15
|
+
return typeof min === 'number' ? min : null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Evaluate the coverage gate's verdict from a computed ratio, the resolved
|
|
19
|
+
* threshold, and whether the spec carries a `coverage-waived` sign-off marker.
|
|
20
|
+
* Pure — the CLI wires the real coverage/threshold/waiver lookups.
|
|
21
|
+
*/
|
|
22
|
+
export function evaluateCoverageGate(input) {
|
|
23
|
+
const { ratio, threshold, hasWaiver } = input;
|
|
24
|
+
if (threshold === null)
|
|
25
|
+
return { gate: 'no-gate' };
|
|
26
|
+
if (ratio >= threshold)
|
|
27
|
+
return { gate: 'pass' };
|
|
28
|
+
if (hasWaiver)
|
|
29
|
+
return { gate: 'waived' };
|
|
30
|
+
return { gate: 'blocked' };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A single spec's verification coverage — `requirementsVerified/requirementsTotal`
|
|
34
|
+
* from the same machinery `eos-spec scorecard` runs (`scanVerifies` +
|
|
35
|
+
* `buildScorecardForCore`), mirroring `spec-debt.ts`'s
|
|
36
|
+
* `isClaimedCompleteUnverified` so `scorecard`/`complete`/this gate never drift.
|
|
37
|
+
* `total === 0` (no declared AC/US/FR) is vacuously fully covered (`ratio: 1`) —
|
|
38
|
+
* there is nothing left un-backed, though a caller may still want to treat an
|
|
39
|
+
* all-zero "complete" spec as advisory-suspicious. An unknown spec id (no
|
|
40
|
+
* scorecard row) also reads as `{ verified: 0, total: 0, ratio: 1 }`; callers
|
|
41
|
+
* that gate on this should have already confirmed the spec exists (e.g. via
|
|
42
|
+
* `findSpec`) before calling in.
|
|
43
|
+
*/
|
|
44
|
+
export function verificationCoverage(repoRoot, specId) {
|
|
45
|
+
const core = specId.split('-')[0]?.toLowerCase();
|
|
46
|
+
const verifiedBySpec = scanVerifies(repoRoot);
|
|
47
|
+
const report = buildScorecardForCore(repoRoot, core, verifiedBySpec);
|
|
48
|
+
const row = report.rows.find((r) => r.id.toUpperCase() === specId.toUpperCase());
|
|
49
|
+
const verified = row?.requirementsVerified ?? 0;
|
|
50
|
+
const total = row?.requirementsTotal ?? 0;
|
|
51
|
+
const ratio = total === 0 ? 1 : verified / total;
|
|
52
|
+
return { verified, total, ratio };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=coverage-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-gate.js","sourceRoot":"","sources":["../../src/lib/coverage-gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAkB,EAAE,IAAY;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;IAC9D,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAsE;IAGzG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC9C,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACnD,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChD,IAAI,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,GAAG,EAAE,oBAAoB,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,EAAE,iBAAiB,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/lib/events.d.ts
CHANGED
|
@@ -55,6 +55,7 @@ export declare const RUN_ID: string;
|
|
|
55
55
|
export declare const EVENTS_RELATIVE_PATH: string;
|
|
56
56
|
export declare function logEvent(event: EosSpecEvent, opts?: {
|
|
57
57
|
path?: string;
|
|
58
|
+
repoRoot?: string;
|
|
58
59
|
}): void;
|
|
59
60
|
/** Convert a commander `options` object to a flat `['--key', 'value', ...]` array,
|
|
60
61
|
* allowlisting safe keys and redacting everything else (treated as potential secrets). */
|
package/dist/lib/events.js
CHANGED
|
@@ -28,7 +28,14 @@ function defaultPath() {
|
|
|
28
28
|
}
|
|
29
29
|
export function logEvent(event, opts = {}) {
|
|
30
30
|
try {
|
|
31
|
-
|
|
31
|
+
// Precedence: explicit path > EOS_SPEC_EVENTS_PATH override > caller-supplied
|
|
32
|
+
// repoRoot > git-rev-parse of cwd. Threading `repoRoot` lets a command whose
|
|
33
|
+
// repo root differs from the invoking cwd (e.g. `--repo-root`, or a subdir /
|
|
34
|
+
// wrong-repo cwd) steer telemetry into the INTENDED repo instead of whatever
|
|
35
|
+
// git repo the cwd happens to be in. Mirrors metrics.ts's reader path.
|
|
36
|
+
const path = opts.path ??
|
|
37
|
+
process.env.EOS_SPEC_EVENTS_PATH ??
|
|
38
|
+
(opts.repoRoot ? join(opts.repoRoot, EVENTS_RELATIVE_PATH) : defaultPath());
|
|
32
39
|
mkdirSync(dirname(path), { recursive: true });
|
|
33
40
|
appendFileSync(path, `${JSON.stringify(event)}\n`, 'utf8');
|
|
34
41
|
}
|