@aperant/framework 0.11.0 → 0.12.1
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/CHANGELOG.md +226 -29
- package/agents/apt-planner.md +15 -0
- package/agents/apt-verifier.md +15 -10
- package/bin/apt-proof-video.mjs +256 -76
- package/dist/cli/commands/apply-recipe.d.mts +6 -0
- package/dist/cli/commands/apply-recipe.d.mts.map +1 -0
- package/dist/cli/commands/apply-recipe.mjs +98 -0
- package/dist/cli/commands/apply-recipe.mjs.map +1 -0
- package/dist/cli/commands/mobile-prepare.d.mts +53 -0
- package/dist/cli/commands/mobile-prepare.d.mts.map +1 -0
- package/dist/cli/commands/mobile-prepare.mjs +139 -0
- package/dist/cli/commands/mobile-prepare.mjs.map +1 -0
- package/dist/cli/commands/recipe-diff.d.mts +6 -0
- package/dist/cli/commands/recipe-diff.d.mts.map +1 -0
- package/dist/cli/commands/recipe-diff.mjs +75 -0
- package/dist/cli/commands/recipe-diff.mjs.map +1 -0
- package/dist/cli/commands/roadmap.d.mts.map +1 -1
- package/dist/cli/commands/roadmap.mjs +53 -0
- package/dist/cli/commands/roadmap.mjs.map +1 -1
- package/dist/cli/commands/validate-evidence.d.mts +1 -1
- package/dist/cli/commands/verify-sandbox.d.mts +6 -0
- package/dist/cli/commands/verify-sandbox.d.mts.map +1 -0
- package/dist/cli/commands/verify-sandbox.mjs +200 -0
- package/dist/cli/commands/verify-sandbox.mjs.map +1 -0
- package/dist/cli/consistency/parse-qa.d.mts.map +1 -1
- package/dist/cli/consistency/parse-qa.mjs +18 -4
- package/dist/cli/consistency/parse-qa.mjs.map +1 -1
- package/dist/cli/consistency/rules/r5-verdict-consistency.d.mts.map +1 -1
- package/dist/cli/consistency/rules/r5-verdict-consistency.mjs +11 -10
- package/dist/cli/consistency/rules/r5-verdict-consistency.mjs.map +1 -1
- package/dist/cli/coverage-check/user-outcomes.d.mts +7 -2
- package/dist/cli/coverage-check/user-outcomes.d.mts.map +1 -1
- package/dist/cli/coverage-check/user-outcomes.mjs +50 -17
- package/dist/cli/coverage-check/user-outcomes.mjs.map +1 -1
- package/dist/cli/design/frontmatter-schema.d.mts +8 -8
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +28 -0
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/gates/verify-approved.d.mts +0 -48
- package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
- package/dist/cli/gate/gates/verify-approved.mjs +23 -80
- package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
- package/dist/cli/install/mcp-server-specs.d.mts +6 -5
- package/dist/cli/install/mcp-server-specs.d.mts.map +1 -1
- package/dist/cli/install/mcp-server-specs.mjs +22 -4
- package/dist/cli/install/mcp-server-specs.mjs.map +1 -1
- package/dist/cli/personas/sidecar.d.mts +1 -1
- package/dist/cli/roadmap/backend-adapter.d.mts +43 -0
- package/dist/cli/roadmap/backend-adapter.d.mts.map +1 -0
- package/dist/cli/roadmap/backend-adapter.mjs +222 -0
- package/dist/cli/roadmap/backend-adapter.mjs.map +1 -0
- package/dist/cli/roadmap/lifecycle.d.mts +1 -1
- package/dist/cli/roadmap/rollup.d.mts +2 -2
- package/dist/cli/util/runtime-capabilities.d.mts +7 -0
- package/dist/cli/util/runtime-capabilities.d.mts.map +1 -1
- package/dist/cli/util/runtime-capabilities.mjs +65 -0
- package/dist/cli/util/runtime-capabilities.mjs.map +1 -1
- package/dist/cli/verify-proof/manifest-validator.mjs +13 -0
- package/dist/cli/verify-proof/manifest-validator.mjs.map +1 -1
- package/dist/cli/verify-proof/resolver.d.mts +10 -7
- package/dist/cli/verify-proof/resolver.d.mts.map +1 -1
- package/dist/cli/verify-proof/resolver.mjs +28 -7
- package/dist/cli/verify-proof/resolver.mjs.map +1 -1
- package/dist/cli/verify-proof/sandbox/apply.d.mts +64 -0
- package/dist/cli/verify-proof/sandbox/apply.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/apply.mjs +379 -0
- package/dist/cli/verify-proof/sandbox/apply.mjs.map +1 -0
- package/dist/cli/verify-proof/sandbox/gate-predicate.d.mts +63 -0
- package/dist/cli/verify-proof/sandbox/gate-predicate.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/gate-predicate.mjs +115 -0
- package/dist/cli/verify-proof/sandbox/gate-predicate.mjs.map +1 -0
- package/dist/cli/verify-proof/sandbox/pattern-matcher.d.mts +57 -0
- package/dist/cli/verify-proof/sandbox/pattern-matcher.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/pattern-matcher.mjs +124 -0
- package/dist/cli/verify-proof/sandbox/pattern-matcher.mjs.map +1 -0
- package/dist/cli/verify-proof/sandbox/recipe-diff.d.mts +28 -0
- package/dist/cli/verify-proof/sandbox/recipe-diff.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/recipe-diff.mjs +190 -0
- package/dist/cli/verify-proof/sandbox/recipe-diff.mjs.map +1 -0
- package/dist/cli/verify-proof/sandbox/sandbox-config.d.mts +25 -0
- package/dist/cli/verify-proof/sandbox/sandbox-config.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/sandbox-config.mjs +85 -0
- package/dist/cli/verify-proof/sandbox/sandbox-config.mjs.map +1 -0
- package/dist/cli/verify-proof/sandbox/self-test.d.mts +39 -0
- package/dist/cli/verify-proof/sandbox/self-test.d.mts.map +1 -0
- package/dist/cli/verify-proof/sandbox/self-test.mjs +248 -0
- package/dist/cli/verify-proof/sandbox/self-test.mjs.map +1 -0
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/agents/apt-planner.md +15 -0
- package/dist/plugin/agents/apt-verifier.md +15 -10
- package/dist/plugin/skills/apt/SKILL.md +2 -2
- package/dist/plugin/skills/apt-plan/SKILL.md +23 -0
- package/dist/plugin/skills/apt-run/SKILL.md +1 -1
- package/dist/plugin/skills/apt-setup/SKILL.md +56 -0
- package/dist/plugin/skills/apt-verify/SKILL.md +20 -15
- package/dist/plugin/skills/apt-verify-proof/SKILL.md +146 -11
- package/dist/proof-report.d.ts.map +1 -1
- package/dist/proof-report.js +4 -1
- package/dist/proof-report.js.map +1 -1
- package/dist/types/config.d.ts +42 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/qa-scoring.d.ts +45 -9
- package/dist/types/qa-scoring.d.ts.map +1 -1
- package/dist/types/qa-scoring.js +34 -13
- package/dist/types/qa-scoring.js.map +1 -1
- package/dist/types/state.d.ts +7 -2
- package/dist/types/state.d.ts.map +1 -1
- package/dist/types/task-record.d.ts +10 -2
- package/dist/types/task-record.d.ts.map +1 -1
- package/drivers/mobile/README.md +40 -0
- package/drivers/mobile/driver.mjs +106 -0
- package/drivers/mobile/manifest.json +49 -0
- package/package.json +138 -138
- package/prompts/inbox-clarification.md +17 -0
- package/prompts/inbox-triage.md +21 -0
- package/prompts/qa_orchestrator_agentic.md +18 -17
- package/prompts/qa_reviewer.md +17 -15
- package/skills/apt/SKILL.md +2 -2
- package/skills/apt-plan/SKILL.md +23 -0
- package/skills/apt-run/SKILL.md +1 -1
- package/skills/apt-setup/SKILL.md +56 -0
- package/skills/apt-verifier.md +7 -4
- package/skills/apt-verify/SKILL.md +20 -15
- package/skills/apt-verify-proof/SKILL.md +146 -11
- package/src/cli/commands/apply-recipe.mjs +105 -0
- package/src/cli/commands/mobile-prepare.mjs +151 -0
- package/src/cli/commands/recipe-diff.mjs +81 -0
- package/src/cli/commands/roadmap.mjs +54 -0
- package/src/cli/commands/verify-sandbox.mjs +231 -0
- package/src/cli/consistency/parse-qa.mjs +20 -4
- package/src/cli/consistency/rules/r5-verdict-consistency.mjs +11 -13
- package/src/cli/coverage-check/user-outcomes.mjs +52 -17
- package/src/cli/dispatch.mjs +27 -0
- package/src/cli/gate/gates/verify-approved.mjs +22 -81
- package/src/cli/install/mcp-server-specs.mjs +24 -4
- package/src/cli/roadmap/backend-adapter.mjs +231 -0
- package/src/cli/util/runtime-capabilities.mjs +67 -0
- package/src/cli/verify-proof/manifest-validator.mjs +15 -0
- package/src/cli/verify-proof/resolver.mjs +27 -7
- package/src/cli/verify-proof/sandbox/apply.mjs +401 -0
- package/src/cli/verify-proof/sandbox/gate-predicate.mjs +126 -0
- package/src/cli/verify-proof/sandbox/pattern-matcher.mjs +127 -0
- package/src/cli/verify-proof/sandbox/recipe-diff.mjs +208 -0
- package/src/cli/verify-proof/sandbox/sandbox-config.mjs +82 -0
- package/src/cli/verify-proof/sandbox/sandbox-schema.json +33 -0
- package/src/cli/verify-proof/sandbox/self-test.mjs +265 -0
- package/templates/config.json +10 -1
- package/templates/proof-verification.md +27 -8
- package/workflows/verify-proof.md +376 -302
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/verify-sandbox.mjs — `apt-tools verify-sandbox <projectDir>`.
|
|
3
|
+
*
|
|
4
|
+
* Drives runSelfTest() then atomically writes
|
|
5
|
+
* .aperant/state/verify-proof-sandbox-verified.json with the v2-shaped
|
|
6
|
+
* verdict envelope. On win32, short-circuits to a platform_unsupported
|
|
7
|
+
* verdict WITHOUT spawning child processes (ID-06 v1 supported floor =
|
|
8
|
+
* darwin + linux).
|
|
9
|
+
*
|
|
10
|
+
* The state file is written for BOTH verified-true and verified-false
|
|
11
|
+
* outcomes (ID-02 — no silent state mutation). The sandbox gate at
|
|
12
|
+
* apt-verify-proof/SKILL.md Step 2c (subtask 5.1) reads this file.
|
|
13
|
+
*/
|
|
14
|
+
import { join, resolve } from 'node:path';
|
|
15
|
+
import { atomicWriteJson } from '../util/atomic-write.mjs';
|
|
16
|
+
import { withFileLock } from '../util/fs-lock.mjs';
|
|
17
|
+
import { err, exitWith, ok } from '../util/result.mjs';
|
|
18
|
+
import { loadRuntimeCapabilities } from '../util/runtime-capabilities.mjs';
|
|
19
|
+
import { matchPatternForProject } from '../verify-proof/sandbox/pattern-matcher.mjs';
|
|
20
|
+
import { discoverBundledRecipes, readSandboxConfig, } from '../verify-proof/sandbox/sandbox-config.mjs';
|
|
21
|
+
import { runSelfTest } from '../verify-proof/sandbox/self-test.mjs';
|
|
22
|
+
/**
|
|
23
|
+
* @param {string} projectDir
|
|
24
|
+
* @param {string[]} [extra]
|
|
25
|
+
*/
|
|
26
|
+
export async function cmdVerifySandbox(projectDir, _extra = []) {
|
|
27
|
+
if (!projectDir)
|
|
28
|
+
return err('Usage: apt-tools verify-sandbox <project-dir>');
|
|
29
|
+
const target = resolve(projectDir);
|
|
30
|
+
const platform = process.platform;
|
|
31
|
+
const statePath = join(target, '.aperant', 'state', 'verify-proof-sandbox-verified.json');
|
|
32
|
+
const at = new Date().toISOString();
|
|
33
|
+
const host = {
|
|
34
|
+
platform,
|
|
35
|
+
arch: process.arch,
|
|
36
|
+
nodeVersion: process.version,
|
|
37
|
+
};
|
|
38
|
+
// Resolve recipeId from config or runtime detection.
|
|
39
|
+
const sandboxCfg = readSandboxConfig(target);
|
|
40
|
+
const recipes = discoverBundledRecipes();
|
|
41
|
+
let recipeId = sandboxCfg?.recipeId ?? null;
|
|
42
|
+
let recipeVersion = sandboxCfg?.recipeVersion ?? null;
|
|
43
|
+
if (!recipeId) {
|
|
44
|
+
const runtime = loadRuntimeCapabilities(target);
|
|
45
|
+
const match = matchPatternForProject(target, runtime, recipes);
|
|
46
|
+
recipeId = match.recipeId;
|
|
47
|
+
}
|
|
48
|
+
// Always populate recipeVersion from bundled recipes when absent — covers
|
|
49
|
+
// the case where config pins recipeId but omits recipeVersion (LOG-003).
|
|
50
|
+
if (recipeId && !recipeVersion) {
|
|
51
|
+
recipeVersion = recipes.find((r) => r.recipeId === recipeId)?.recipeVersion ?? null;
|
|
52
|
+
}
|
|
53
|
+
// win32 short-circuit (AC12, ID-06 v1 floor).
|
|
54
|
+
if (platform === 'win32') {
|
|
55
|
+
const envelope = {
|
|
56
|
+
verified: false,
|
|
57
|
+
verdict: 'needs_human',
|
|
58
|
+
reason: 'platform_unsupported',
|
|
59
|
+
recipeId,
|
|
60
|
+
recipeVersion,
|
|
61
|
+
verifiedAt: at,
|
|
62
|
+
host,
|
|
63
|
+
};
|
|
64
|
+
const writeErr = writeStateFile(statePath, envelope);
|
|
65
|
+
if (writeErr) {
|
|
66
|
+
return exitWith({
|
|
67
|
+
status: 'error',
|
|
68
|
+
command: 'verify-sandbox',
|
|
69
|
+
code: 'E_STATE_WRITE_FAILED',
|
|
70
|
+
verdict: 'needs_human',
|
|
71
|
+
reason: 'state_write_failed',
|
|
72
|
+
cause: writeErr.message,
|
|
73
|
+
project_dir: target,
|
|
74
|
+
state_path: statePath,
|
|
75
|
+
}, 1);
|
|
76
|
+
}
|
|
77
|
+
return ok({
|
|
78
|
+
status: 'ok',
|
|
79
|
+
command: 'verify-sandbox',
|
|
80
|
+
project_dir: target,
|
|
81
|
+
state_path: statePath,
|
|
82
|
+
...envelope,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (!recipeId) {
|
|
86
|
+
const envelope = {
|
|
87
|
+
verified: false,
|
|
88
|
+
verdict: 'needs_human',
|
|
89
|
+
reason: 'no_recipe_available',
|
|
90
|
+
recipeId: null,
|
|
91
|
+
recipeVersion: null,
|
|
92
|
+
verifiedAt: at,
|
|
93
|
+
host,
|
|
94
|
+
};
|
|
95
|
+
const writeErr = writeStateFile(statePath, envelope);
|
|
96
|
+
if (writeErr) {
|
|
97
|
+
return exitWith({
|
|
98
|
+
status: 'error',
|
|
99
|
+
command: 'verify-sandbox',
|
|
100
|
+
code: 'E_STATE_WRITE_FAILED',
|
|
101
|
+
verdict: 'needs_human',
|
|
102
|
+
reason: 'state_write_failed',
|
|
103
|
+
cause: writeErr.message,
|
|
104
|
+
project_dir: target,
|
|
105
|
+
state_path: statePath,
|
|
106
|
+
}, 1);
|
|
107
|
+
}
|
|
108
|
+
return exitWith({
|
|
109
|
+
status: 'error',
|
|
110
|
+
command: 'verify-sandbox',
|
|
111
|
+
code: 'E_NO_RECIPE',
|
|
112
|
+
project_dir: target,
|
|
113
|
+
state_path: statePath,
|
|
114
|
+
...envelope,
|
|
115
|
+
}, 1);
|
|
116
|
+
}
|
|
117
|
+
let result;
|
|
118
|
+
try {
|
|
119
|
+
result = await runSelfTest({ projectDir: target, recipeId, recipes });
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
const envelope = {
|
|
123
|
+
verified: false,
|
|
124
|
+
verdict: 'needs_human',
|
|
125
|
+
reason: 'self_test_failed_app_init_timeout',
|
|
126
|
+
recipeId,
|
|
127
|
+
recipeVersion,
|
|
128
|
+
verifiedAt: at,
|
|
129
|
+
host,
|
|
130
|
+
error: e?.message ?? String(e),
|
|
131
|
+
};
|
|
132
|
+
const writeErr = writeStateFile(statePath, envelope);
|
|
133
|
+
if (writeErr) {
|
|
134
|
+
return exitWith({
|
|
135
|
+
status: 'error',
|
|
136
|
+
command: 'verify-sandbox',
|
|
137
|
+
code: 'E_STATE_WRITE_FAILED',
|
|
138
|
+
verdict: 'needs_human',
|
|
139
|
+
reason: 'state_write_failed',
|
|
140
|
+
cause: writeErr.message,
|
|
141
|
+
project_dir: target,
|
|
142
|
+
state_path: statePath,
|
|
143
|
+
}, 1);
|
|
144
|
+
}
|
|
145
|
+
return exitWith({
|
|
146
|
+
status: 'error',
|
|
147
|
+
command: 'verify-sandbox',
|
|
148
|
+
project_dir: target,
|
|
149
|
+
state_path: statePath,
|
|
150
|
+
...envelope,
|
|
151
|
+
}, 1);
|
|
152
|
+
}
|
|
153
|
+
const envelope = {
|
|
154
|
+
verified: result.verified,
|
|
155
|
+
verdict: result.verdict,
|
|
156
|
+
reason: result.reason,
|
|
157
|
+
recipeId,
|
|
158
|
+
recipeVersion,
|
|
159
|
+
verifiedAt: at,
|
|
160
|
+
host,
|
|
161
|
+
durationMs: result.durationMs,
|
|
162
|
+
};
|
|
163
|
+
const writeErr = writeStateFile(statePath, envelope);
|
|
164
|
+
if (writeErr) {
|
|
165
|
+
return exitWith({
|
|
166
|
+
status: 'error',
|
|
167
|
+
command: 'verify-sandbox',
|
|
168
|
+
code: 'E_STATE_WRITE_FAILED',
|
|
169
|
+
verdict: 'needs_human',
|
|
170
|
+
reason: 'state_write_failed',
|
|
171
|
+
cause: writeErr.message,
|
|
172
|
+
project_dir: target,
|
|
173
|
+
state_path: statePath,
|
|
174
|
+
}, 1);
|
|
175
|
+
}
|
|
176
|
+
const exitCode = result.verified ? 0 : 1;
|
|
177
|
+
return exitWith({
|
|
178
|
+
status: result.verified ? 'ok' : 'error',
|
|
179
|
+
command: 'verify-sandbox',
|
|
180
|
+
project_dir: target,
|
|
181
|
+
state_path: statePath,
|
|
182
|
+
...envelope,
|
|
183
|
+
}, exitCode);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Write the verdict envelope to the state file under a file lock.
|
|
187
|
+
* Returns null on success, or an Error if the lock or write fails.
|
|
188
|
+
*/
|
|
189
|
+
function writeStateFile(statePath, envelope) {
|
|
190
|
+
try {
|
|
191
|
+
withFileLock(statePath, () => {
|
|
192
|
+
atomicWriteJson(statePath, envelope);
|
|
193
|
+
});
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
return e instanceof Error ? e : new Error(String(e));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=verify-sandbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-sandbox.mjs","sourceRoot":"","sources":["../../../src/cli/commands/verify-sandbox.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-qa.d.mts","sourceRoot":"","sources":["../../../src/cli/consistency/parse-qa.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parse-qa.d.mts","sourceRoot":"","sources":["../../../src/cli/consistency/parse-qa.mjs"],"names":[],"mappings":"AAgCA;;GAEG;AACH,mCAFW,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;EAsBnC"}
|
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
* - flat findings: findings: [{severity}]
|
|
8
8
|
* - legacy `issues: [{severity}]`
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* v0.9.0 (verify-proof-v2-outcome-walker_27-05-26) — verdict closed set is
|
|
11
|
+
* `{approved, rejected, needs_human, needs-changes}`. `approved_with_notes`
|
|
12
|
+
* is DELETED (no shim) — reading a legacy `approved_with_notes` /
|
|
13
|
+
* `approved-with-notes` value throws a clear migration error pointing at
|
|
14
|
+
* the framework CHANGELOG entry. Anything else maps to `'unknown'`.
|
|
15
|
+
* Accepts legacy `status` as a fallback field name.
|
|
12
16
|
*
|
|
13
17
|
* Output: {verdict, findings: [{severity, title, status, file}]}
|
|
14
18
|
*/
|
|
15
|
-
const KNOWN_VERDICTS = new Set(['approved', '
|
|
19
|
+
const KNOWN_VERDICTS = new Set(['approved', 'rejected', 'needs-human', 'needs-changes']);
|
|
16
20
|
const SEVERITY_MAP = {
|
|
17
21
|
critical: 'critical',
|
|
18
22
|
blocker: 'critical',
|
|
@@ -55,7 +59,17 @@ function normalizeVerdict(v) {
|
|
|
55
59
|
const k = v.toLowerCase().trim();
|
|
56
60
|
// normalize common spellings
|
|
57
61
|
const canonical = k.replace(/_/g, '-');
|
|
58
|
-
|
|
62
|
+
// v0.9.0 migration: approved_with_notes / approved-with-notes is
|
|
63
|
+
// DELETED with no shim. Crash loudly so the consumer task is
|
|
64
|
+
// re-run, not silently re-mapped to `approved`.
|
|
65
|
+
if (canonical === 'approved-with-notes') {
|
|
66
|
+
throw new Error("qa_signoff.json carries the legacy verdict 'approved_with_notes' (or 'approved-with-notes'). " +
|
|
67
|
+
"This verdict is removed in framework v0.9.0+ (see packages/framework/CHANGELOG.md :: 'verify-proof v2 — outcome walker + two-gate verdict'). " +
|
|
68
|
+
'Re-run verify-proof on this task to mint a fresh qa_signoff.json with the new {approved, rejected, needs_human} enum.');
|
|
69
|
+
}
|
|
70
|
+
// Accept both snake_case and kebab-case for needs_human.
|
|
71
|
+
const needsHuman = canonical === 'needs-human' ? 'needs-human' : canonical;
|
|
72
|
+
return KNOWN_VERDICTS.has(needsHuman) ? needsHuman : 'unknown';
|
|
59
73
|
}
|
|
60
74
|
function collectRaw(qa) {
|
|
61
75
|
const out = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-qa.mjs","sourceRoot":"","sources":["../../../src/cli/consistency/parse-qa.mjs"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"parse-qa.mjs","sourceRoot":"","sources":["../../../src/cli/consistency/parse-qa.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r5-verdict-consistency.d.mts","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"r5-verdict-consistency.d.mts","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":";;;;;;IAyBC;;;;;;;;;;OA+CC"}
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
* consistency/rules/r5-verdict-consistency.mjs — R5 (C15).
|
|
4
4
|
*
|
|
5
5
|
* Fails when:
|
|
6
|
-
* - qa.verdict === 'approved'
|
|
7
|
-
*
|
|
8
|
-
* - qa.verdict === 'rejected' AND qa has no findings at all AND review
|
|
9
|
-
* zero unresolved findings (rejected-without-evidence)
|
|
6
|
+
* - qa.verdict === 'approved' AND review has >=1 unresolved critical or
|
|
7
|
+
* major finding.
|
|
8
|
+
* - qa.verdict === 'rejected' AND qa has no findings at all AND review
|
|
9
|
+
* has zero unresolved findings (rejected-without-evidence).
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* v0.9.0 (verify-proof-v2-outcome-walker_27-05-26) — the legacy
|
|
12
|
+
* `approved-with-notes` branch is REMOVED. The verdict enum is the closed
|
|
13
|
+
* set `{approved, rejected, needs_human}`. Reading a legacy verdict
|
|
14
|
+
* crashes in parseQaSignoff before this rule executes.
|
|
13
15
|
*
|
|
14
16
|
* Severity: error. Stages: verify, ship.
|
|
15
17
|
*/
|
|
@@ -26,8 +28,7 @@ const rule = {
|
|
|
26
28
|
const verdict = parsed.qa.verdict ?? 'unknown';
|
|
27
29
|
const reviewFindings = parsed?.review?.findings ?? [];
|
|
28
30
|
const unresolvedBlocking = reviewFindings.filter((f) => (f.severity === 'critical' || f.severity === 'major') && f.status !== 'fixed');
|
|
29
|
-
if (
|
|
30
|
-
unresolvedBlocking.length > 0) {
|
|
31
|
+
if (verdict === 'approved' && unresolvedBlocking.length > 0) {
|
|
31
32
|
return {
|
|
32
33
|
status: 'fail',
|
|
33
34
|
drift: [
|
|
@@ -37,10 +38,10 @@ const rule = {
|
|
|
37
38
|
id: f.id,
|
|
38
39
|
title: f.title,
|
|
39
40
|
})),
|
|
40
|
-
reason: 'approved
|
|
41
|
+
reason: 'approved verdict with unresolved critical or major finding(s) (G42 Phase 1)',
|
|
41
42
|
},
|
|
42
43
|
],
|
|
43
|
-
reason: `approved
|
|
44
|
+
reason: `approved verdict contradicts ${unresolvedBlocking.length} unresolved critical/major finding(s)`,
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
if (verdict === 'rejected') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r5-verdict-consistency.mjs","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"r5-verdict-consistency.mjs","sourceRoot":"","sources":["../../../../src/cli/consistency/rules/r5-verdict-consistency.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,IAAI,GAAG;IACZ,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,wDAAwD;IACrE,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE;QACrB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAA;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,SAAS,CAAA;QAC9C,MAAM,cAAc,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;QACrD,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CACpF,CAAA;QACD,IAAI,OAAO,KAAK,UAAU,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO;gBACN,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE;oBACN;wBACC,OAAO;wBACP,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACxC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,KAAK,EAAE,CAAC,CAAC,KAAK;yBACd,CAAC,CAAC;wBACH,MAAM,EAAE,6EAA6E;qBACrF;iBACD;gBACD,MAAM,EAAE,gCAAgC,kBAAkB,CAAC,MAAM,uCAAuC;aACxG,CAAA;QACF,CAAC;QACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAA;YAC3C,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAA;YAC5E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACrD,OAAO;oBACN,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE;wBACN;4BACC,OAAO;4BACP,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,6CAA6C;yBACrD;qBACD;oBACD,MAAM,EAAE,6CAA6C;iBACrD,CAAA;YACF,CAAC;QACF,CAAC;QACD,OAAO;YACN,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,WAAW,OAAO,qCAAqC;SAC/D,CAAA;IACF,CAAC;CACD,CAAA;AAED,YAAY,CAAC,IAAI,CAAC,CAAA;AAClB,eAAe,IAAI,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @typedef {Object} UserOutcome
|
|
3
3
|
* @property {string} id — synthesized positional ID (O1, O2, ...)
|
|
4
|
-
* @property {('electron'|'web'|'cli'|'api'|'electron+web')} surface
|
|
4
|
+
* @property {('electron'|'web'|'cli'|'api'|'mobile'|'electron+web')} surface
|
|
5
5
|
* @property {string} text — outcome prose (sans the surface tag and requires suffix)
|
|
6
|
+
* @property {string[]} inferred — v0.9.0 — indented child bullets under the parent outcome (raw prose, no further parsing). Defaults to [] when no children are present.
|
|
6
7
|
* @property {number} [requires] — the digit captured from `*(requires ON N)*`, when present and valid
|
|
7
8
|
*/
|
|
8
9
|
/**
|
|
@@ -49,11 +50,15 @@ export type UserOutcome = {
|
|
|
49
50
|
* — synthesized positional ID (O1, O2, ...)
|
|
50
51
|
*/
|
|
51
52
|
id: string;
|
|
52
|
-
surface: ("electron" | "web" | "cli" | "api" | "electron+web");
|
|
53
|
+
surface: ("electron" | "web" | "cli" | "api" | "mobile" | "electron+web");
|
|
53
54
|
/**
|
|
54
55
|
* — outcome prose (sans the surface tag and requires suffix)
|
|
55
56
|
*/
|
|
56
57
|
text: string;
|
|
58
|
+
/**
|
|
59
|
+
* — v0.9.0 — indented child bullets under the parent outcome (raw prose, no further parsing). Defaults to [] when no children are present.
|
|
60
|
+
*/
|
|
61
|
+
inferred: string[];
|
|
57
62
|
/**
|
|
58
63
|
* — the digit captured from `*(requires ON N)*`, when present and valid
|
|
59
64
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-outcomes.d.mts","sourceRoot":"","sources":["../../../src/cli/coverage-check/user-outcomes.mjs"],"names":[],"mappings":"AA4CA
|
|
1
|
+
{"version":3,"file":"user-outcomes.d.mts","sourceRoot":"","sources":["../../../src/cli/coverage-check/user-outcomes.mjs"],"names":[],"mappings":"AA4CA;;;;;;;GAOG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,+CAHW,MAAM,GACJ,uBAAuB,CA0LnC;AAED;;;;;;;;;;;;;;;GAeG;AACH,+CAJW,uBAAuB,oBACvB,MAAM,GACJ,CAAC,MAAM,GAAC,MAAM,GAAC,OAAO,CAAC,CAiBnC;;;;;QAvPa,MAAM;aACN,CAAC,UAAU,GAAC,KAAK,GAAC,KAAK,GAAC,KAAK,GAAC,QAAQ,GAAC,cAAc,CAAC;;;;UACtD,MAAM;;;;cACN,MAAM,EAAE;;;;;;;UAMR,yBAAyB;;;;gBACzB,MAAM;;;;cACN,MAAM;;;;YACN,MAAM;;;oBAKN,OAAO;eACP,CAAC,QAAQ,GAAC,OAAO,GAAC,iBAAiB,GAAC,UAAU,CAAC;;cAE/C,WAAW,EAAE"}
|
|
@@ -32,17 +32,18 @@
|
|
|
32
32
|
* See packages/framework/skills/apt-plan/SKILL.md Section 5.B for the
|
|
33
33
|
* authoring contract.
|
|
34
34
|
*/
|
|
35
|
-
const VALID_SURFACES = new Set(['electron', 'web', 'cli', 'api', 'electron+web']);
|
|
35
|
+
const VALID_SURFACES = new Set(['electron', 'web', 'cli', 'api', 'mobile', 'electron+web']);
|
|
36
36
|
const HEADING_RE = /^(#{1,6})\s+(.*)$/;
|
|
37
37
|
const USER_OUTCOMES_HEADING_RE = /^user\s+outcomes\s*$/i;
|
|
38
38
|
const EPIC_RE = /^\*\*Epic:\*\*\s+(.+)$/;
|
|
39
39
|
const EMPTY_WITH_NOTE_RE = /^_No user-observable changes — pure refactor\._\s*$/;
|
|
40
|
-
const OUTCOME_RE = /^-\s+\*\*ON\*\*\s+\[(electron|web|cli|api|electron\+web)\]:\s+(.+?)(\s+\*\(requires\s+ON\s+(\d+)\)\*)?\s*$/;
|
|
40
|
+
const OUTCOME_RE = /^-\s+\*\*ON\*\*\s+\[(electron|web|cli|api|mobile|electron\+web)\]:\s+(.+?)(\s+\*\(requires\s+ON\s+(\d+)\)\*)?\s*$/;
|
|
41
41
|
/**
|
|
42
42
|
* @typedef {Object} UserOutcome
|
|
43
43
|
* @property {string} id — synthesized positional ID (O1, O2, ...)
|
|
44
|
-
* @property {('electron'|'web'|'cli'|'api'|'electron+web')} surface
|
|
44
|
+
* @property {('electron'|'web'|'cli'|'api'|'mobile'|'electron+web')} surface
|
|
45
45
|
* @property {string} text — outcome prose (sans the surface tag and requires suffix)
|
|
46
|
+
* @property {string[]} inferred — v0.9.0 — indented child bullets under the parent outcome (raw prose, no further parsing). Defaults to [] when no children are present.
|
|
46
47
|
* @property {number} [requires] — the digit captured from `*(requires ON N)*`, when present and valid
|
|
47
48
|
*/
|
|
48
49
|
/**
|
|
@@ -151,26 +152,58 @@ export function parseUserOutcomes(specContent) {
|
|
|
151
152
|
result.epic = epic;
|
|
152
153
|
return result;
|
|
153
154
|
}
|
|
154
|
-
// Parse outcome rows in document order.
|
|
155
|
-
//
|
|
155
|
+
// Parse outcome rows in document order. v0.9.0 — walk the raw body lines
|
|
156
|
+
// (not the trimmed `outcomeLines`) so we preserve indentation of child
|
|
157
|
+
// bullets. A `**ON**` parent row is followed by zero or more indented
|
|
158
|
+
// child bullets (lines starting with at least 2 spaces + `- `); those
|
|
159
|
+
// children attach to the parent as `inferred: string[]` (raw prose, no
|
|
160
|
+
// further parsing). The children block ends at the next `**ON**` row,
|
|
161
|
+
// a non-indented line, or a section terminator (blank line followed by
|
|
162
|
+
// another non-bullet non-blank line is fine; the next `**ON**` always
|
|
163
|
+
// resets ownership).
|
|
156
164
|
/** @type {UserOutcome[]} */
|
|
157
165
|
const outcomes = [];
|
|
158
166
|
const rawRequires = [];
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
167
|
+
const CHILD_RE = /^(?: {2}|\t)+- (.+)$/;
|
|
168
|
+
let currentOutcomeIndex = -1;
|
|
169
|
+
for (let i = 0; i < bodyLines.length; i++) {
|
|
170
|
+
const rawLine = bodyLines[i];
|
|
171
|
+
const trimmed = rawLine.trim();
|
|
172
|
+
if (trimmed.length === 0) {
|
|
173
|
+
// Blank lines don't close the parent — children may resume after
|
|
174
|
+
// a blank line (loose-list markdown). The next non-blank line
|
|
175
|
+
// decides ownership.
|
|
162
176
|
continue;
|
|
163
|
-
|
|
164
|
-
|
|
177
|
+
}
|
|
178
|
+
const onMatch = trimmed.match(OUTCOME_RE);
|
|
179
|
+
if (onMatch) {
|
|
180
|
+
const surface = /** @type {UserOutcome['surface']} */ (onMatch[1]);
|
|
181
|
+
if (!VALID_SURFACES.has(surface)) {
|
|
182
|
+
currentOutcomeIndex = -1;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const text = onMatch[2].trim();
|
|
186
|
+
const id = 'O' + (outcomes.length + 1);
|
|
187
|
+
const outcome = /** @type {UserOutcome} */ ({ id, surface, text, inferred: [] });
|
|
188
|
+
if (onMatch[4]) {
|
|
189
|
+
const n = Number.parseInt(onMatch[4], 10);
|
|
190
|
+
rawRequires.push({ outcomeIndex: outcomes.length, requires: n });
|
|
191
|
+
}
|
|
192
|
+
outcomes.push(outcome);
|
|
193
|
+
currentOutcomeIndex = outcomes.length - 1;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
// Non-`**ON**` non-blank line. If it's an indented child bullet AND
|
|
197
|
+
// we have a current outcome, attach it. Otherwise (e.g. Epic line,
|
|
198
|
+
// sentinel, stray prose), drop ownership.
|
|
199
|
+
const childMatch = rawLine.match(CHILD_RE);
|
|
200
|
+
if (childMatch && currentOutcomeIndex >= 0) {
|
|
201
|
+
outcomes[currentOutcomeIndex].inferred.push(childMatch[1].trim());
|
|
165
202
|
continue;
|
|
166
|
-
const text = m[2].trim();
|
|
167
|
-
const id = 'O' + (outcomes.length + 1);
|
|
168
|
-
const outcome = /** @type {UserOutcome} */ ({ id, surface, text });
|
|
169
|
-
if (m[4]) {
|
|
170
|
-
const n = Number.parseInt(m[4], 10);
|
|
171
|
-
rawRequires.push({ outcomeIndex: outcomes.length, requires: n });
|
|
172
203
|
}
|
|
173
|
-
|
|
204
|
+
// Non-indented, non-`**ON**` line — closes the current outcome's
|
|
205
|
+
// child block. (The next `**ON**` will start a new block.)
|
|
206
|
+
currentOutcomeIndex = -1;
|
|
174
207
|
}
|
|
175
208
|
if (outcomes.length === 0) {
|
|
176
209
|
// Header present, prose present, but no parseable `**ON**` rows —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-outcomes.mjs","sourceRoot":"","sources":["../../../src/cli/coverage-check/user-outcomes.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"user-outcomes.mjs","sourceRoot":"","sources":["../../../src/cli/coverage-check/user-outcomes.mjs"],"names":[],"mappings":"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"}
|
|
@@ -82,21 +82,21 @@ export const TokensSchema: z.ZodObject<{
|
|
|
82
82
|
}, z.core.$loose>;
|
|
83
83
|
export const ComponentsSchema: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
84
84
|
export const AntiPatternCategorySchema: z.ZodEnum<{
|
|
85
|
+
content: "content";
|
|
85
86
|
color: "color";
|
|
86
87
|
typography: "typography";
|
|
87
|
-
motion: "motion";
|
|
88
88
|
layout: "layout";
|
|
89
|
-
|
|
89
|
+
motion: "motion";
|
|
90
90
|
interaction: "interaction";
|
|
91
91
|
}>;
|
|
92
92
|
export const AntiPatternSchema: z.ZodObject<{
|
|
93
93
|
id: z.ZodString;
|
|
94
94
|
category: z.ZodEnum<{
|
|
95
|
+
content: "content";
|
|
95
96
|
color: "color";
|
|
96
97
|
typography: "typography";
|
|
97
|
-
motion: "motion";
|
|
98
98
|
layout: "layout";
|
|
99
|
-
|
|
99
|
+
motion: "motion";
|
|
100
100
|
interaction: "interaction";
|
|
101
101
|
}>;
|
|
102
102
|
pattern: z.ZodString;
|
|
@@ -106,11 +106,11 @@ export const AntiPatternSchema: z.ZodObject<{
|
|
|
106
106
|
export const AntiPatternsSchema: z.ZodArray<z.ZodObject<{
|
|
107
107
|
id: z.ZodString;
|
|
108
108
|
category: z.ZodEnum<{
|
|
109
|
+
content: "content";
|
|
109
110
|
color: "color";
|
|
110
111
|
typography: "typography";
|
|
111
|
-
motion: "motion";
|
|
112
112
|
layout: "layout";
|
|
113
|
-
|
|
113
|
+
motion: "motion";
|
|
114
114
|
interaction: "interaction";
|
|
115
115
|
}>;
|
|
116
116
|
pattern: z.ZodString;
|
|
@@ -162,11 +162,11 @@ export const DesignFrontmatterSchema: z.ZodObject<{
|
|
|
162
162
|
antiPatterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
163
163
|
id: z.ZodString;
|
|
164
164
|
category: z.ZodEnum<{
|
|
165
|
+
content: "content";
|
|
165
166
|
color: "color";
|
|
166
167
|
typography: "typography";
|
|
167
|
-
motion: "motion";
|
|
168
168
|
layout: "layout";
|
|
169
|
-
|
|
169
|
+
motion: "motion";
|
|
170
170
|
interaction: "interaction";
|
|
171
171
|
}>;
|
|
172
172
|
pattern: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.mts","sourceRoot":"","sources":["../../src/cli/dispatch.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch.d.mts","sourceRoot":"","sources":["../../src/cli/dispatch.mjs"],"names":[],"mappings":"AAoHA;;;;;;GAMG;AACH,uCAFa,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CA+DjD;AAMD,gEAAgE;AAChE,uBADW,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CA0K3D"}
|
package/dist/cli/dispatch.mjs
CHANGED
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import { cmdActive } from './commands/active.mjs';
|
|
37
37
|
import { cmdAdr } from './commands/adr.mjs';
|
|
38
|
+
// cmdApplyRecipe — loaded lazily in the dispatch handler (Fast Path PRF-001)
|
|
38
39
|
import { cmdAudit } from './commands/audit.mjs';
|
|
39
40
|
import { cmdAuthorSkill } from './commands/author-skill.mjs';
|
|
40
41
|
import { cmdBootstrap } from './commands/bootstrap.mjs';
|
|
@@ -69,12 +70,14 @@ import { cmdInitState } from './commands/init-state.mjs';
|
|
|
69
70
|
import { cmdInstallFromSource } from './commands/install-from-source.mjs';
|
|
70
71
|
import { cmdLock } from './commands/lock.mjs';
|
|
71
72
|
import { cmdMigratePrReviews } from './commands/migrate-pr-reviews.mjs';
|
|
73
|
+
import { cmdMobilePrepare } from './commands/mobile-prepare.mjs';
|
|
72
74
|
import { cmdPersonas } from './commands/personas.mjs';
|
|
73
75
|
import { cmdPlanApproval } from './commands/plan-approval.mjs';
|
|
74
76
|
import { cmdPrReview } from './commands/pr-review.mjs';
|
|
75
77
|
import { cmdPrecompactHook } from './commands/precompact-hook.mjs';
|
|
76
78
|
import { cmdProductContext } from './commands/product-context.mjs';
|
|
77
79
|
import { cmdProfile } from './commands/profile.mjs';
|
|
80
|
+
// cmdRecipeDiff — loaded lazily in the dispatch handler (Fast Path PRF-001)
|
|
78
81
|
import { cmdReleaseNotes } from './commands/release-notes.mjs';
|
|
79
82
|
import { cmdRiskCheck } from './commands/risk-check.mjs';
|
|
80
83
|
import { cmdRoadmap } from './commands/roadmap.mjs';
|
|
@@ -97,6 +100,7 @@ import { cmdValidateEvidence } from './commands/validate-evidence.mjs';
|
|
|
97
100
|
import { cmdVariantGallery } from './commands/variant-gallery.mjs';
|
|
98
101
|
import { cmdVariantPick } from './commands/variant-pick.mjs';
|
|
99
102
|
import { cmdVariantPool } from './commands/variant-pool.mjs';
|
|
103
|
+
// cmdVerifySandbox — loaded lazily in the dispatch handler (Fast Path PRF-001)
|
|
100
104
|
import { cmdVitestDoctor } from './commands/vitest-doctor.mjs';
|
|
101
105
|
import { cmdWave } from './commands/wave.mjs';
|
|
102
106
|
import { cmdWfrun } from './commands/wfrun.mjs';
|
|
@@ -207,6 +211,18 @@ export const DISPATCH = {
|
|
|
207
211
|
'state-artifacts': (args) => wrap(cmdStateArtifacts)(args[1], args.slice(2)),
|
|
208
212
|
'detect-project': (args) => wrap(cmdDetectProject)(args[1]),
|
|
209
213
|
'detect-runtime': (args) => wrap(cmdDetectRuntime)(args[1], args.slice(2)),
|
|
214
|
+
'recipe-diff': async (args) => {
|
|
215
|
+
const { cmdRecipeDiff } = await import('./commands/recipe-diff.mjs');
|
|
216
|
+
return wrap(cmdRecipeDiff)(args[1], args.slice(2));
|
|
217
|
+
},
|
|
218
|
+
'apply-recipe': async (args) => {
|
|
219
|
+
const { cmdApplyRecipe } = await import('./commands/apply-recipe.mjs');
|
|
220
|
+
return wrap(cmdApplyRecipe)(args[1], args.slice(2));
|
|
221
|
+
},
|
|
222
|
+
'verify-sandbox': async (args) => {
|
|
223
|
+
const { cmdVerifySandbox } = await import('./commands/verify-sandbox.mjs');
|
|
224
|
+
return wrap(cmdVerifySandbox)(args[1], args.slice(2));
|
|
225
|
+
},
|
|
210
226
|
driver: (args) => {
|
|
211
227
|
// `apt-tools driver doctor <project-dir>` — only subcommand for now.
|
|
212
228
|
if (args[1] === 'doctor')
|
|
@@ -219,6 +235,18 @@ export const DISPATCH = {
|
|
|
219
235
|
exitCode: 1,
|
|
220
236
|
}))();
|
|
221
237
|
},
|
|
238
|
+
mobile: (args) => {
|
|
239
|
+
// `apt-tools mobile prepare <project-dir> --platform <ios|android> [--mode <expo|native>] [--device <id>]`
|
|
240
|
+
if (args[1] === 'prepare')
|
|
241
|
+
return wrap(cmdMobilePrepare)(args[2], args.slice(3));
|
|
242
|
+
return wrap(() => ({
|
|
243
|
+
envelope: {
|
|
244
|
+
status: 'error',
|
|
245
|
+
error: `Usage: apt-tools mobile prepare <project-dir> --platform <ios|android>. Unknown subcommand: ${args[1] ?? '(none)'}`,
|
|
246
|
+
},
|
|
247
|
+
exitCode: 1,
|
|
248
|
+
}))();
|
|
249
|
+
},
|
|
222
250
|
'features-audit': (args) => wrap(cmdFeaturesAudit)(args[1], args.slice(2)),
|
|
223
251
|
'init-state': (args) => wrap(cmdInitState)(args[1], args.slice(2)),
|
|
224
252
|
'risk-check': (args) => wrap(cmdRiskCheck)(args[1], args.slice(2)),
|