@aperant/framework 0.8.0 → 0.8.4
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 +311 -1
- package/README.md +12 -0
- package/agents/apt-planner.md +5 -4
- package/dist/cli/commands/adr.mjs +1 -1
- package/dist/cli/commands/audit-branch-current.d.mts +25 -0
- package/dist/cli/commands/audit-branch-current.d.mts.map +1 -0
- package/dist/cli/commands/audit-branch-current.mjs +252 -0
- package/dist/cli/commands/audit-branch-current.mjs.map +1 -0
- package/dist/cli/commands/audit.d.mts.map +1 -1
- package/dist/cli/commands/audit.mjs +13 -2
- package/dist/cli/commands/audit.mjs.map +1 -1
- package/dist/cli/commands/check-version.d.mts.map +1 -1
- package/dist/cli/commands/check-version.mjs +19 -1
- package/dist/cli/commands/check-version.mjs.map +1 -1
- package/dist/cli/commands/context.mjs +3 -3
- package/dist/cli/commands/context.mjs.map +1 -1
- package/dist/cli/commands/detect-runtime.d.mts +6 -0
- package/dist/cli/commands/detect-runtime.d.mts.map +1 -0
- package/dist/cli/commands/detect-runtime.mjs +136 -0
- package/dist/cli/commands/detect-runtime.mjs.map +1 -0
- package/dist/cli/commands/driver-doctor.d.mts +29 -0
- package/dist/cli/commands/driver-doctor.d.mts.map +1 -0
- package/dist/cli/commands/driver-doctor.mjs +291 -0
- package/dist/cli/commands/driver-doctor.mjs.map +1 -0
- package/dist/cli/commands/gate.mjs +14 -0
- package/dist/cli/commands/gate.mjs.map +1 -1
- package/dist/cli/commands/init.d.mts.map +1 -1
- package/dist/cli/commands/init.mjs +76 -33
- package/dist/cli/commands/init.mjs.map +1 -1
- package/dist/cli/commands/install-from-source.d.mts +2 -0
- package/dist/cli/commands/install-from-source.d.mts.map +1 -0
- package/dist/cli/commands/install-from-source.mjs +2 -0
- package/dist/cli/commands/install-from-source.mjs.map +1 -0
- package/dist/cli/commands/modes.mjs +1 -1
- package/dist/cli/commands/route.d.mts.map +1 -1
- package/dist/cli/commands/route.mjs +38 -1
- package/dist/cli/commands/route.mjs.map +1 -1
- package/dist/cli/commands/triage.mjs +1 -1
- package/dist/cli/config/load.d.mts.map +1 -1
- package/dist/cli/config/load.mjs +9 -3
- package/dist/cli/config/load.mjs.map +1 -1
- package/dist/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
- package/dist/cli/coordination/event-schema.d.mts.map +1 -1
- package/dist/cli/coordination/event-schema.mjs +18 -0
- package/dist/cli/coordination/event-schema.mjs.map +1 -1
- package/dist/cli/design/frontmatter-schema.d.mts +4 -4
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +18 -1
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/context.d.mts +1 -0
- package/dist/cli/gate/context.d.mts.map +1 -1
- package/dist/cli/gate/context.mjs +14 -1
- package/dist/cli/gate/context.mjs.map +1 -1
- package/dist/cli/gate/gates/consistency-check.d.mts +1 -0
- package/dist/cli/gate/gates/consistency-check.d.mts.map +1 -1
- package/dist/cli/gate/gates/consistency-check.mjs +1 -0
- package/dist/cli/gate/gates/consistency-check.mjs.map +1 -1
- package/dist/cli/gate/gates/review-clean.d.mts +1 -0
- package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
- package/dist/cli/gate/gates/review-clean.mjs +1 -0
- package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
- package/dist/cli/gate/gates/verify-approved.d.mts +1 -0
- package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
- package/dist/cli/gate/gates/verify-approved.mjs +1 -0
- package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
- package/dist/cli/gate/registry.d.mts.map +1 -1
- package/dist/cli/gate/registry.mjs +9 -1
- package/dist/cli/gate/registry.mjs.map +1 -1
- package/dist/cli/install/cli-to-install-root.d.mts.map +1 -1
- package/dist/cli/install/cli-to-install-root.mjs +0 -2
- package/dist/cli/install/cli-to-install-root.mjs.map +1 -1
- package/dist/cli/install/find-workspace-framework-version.d.mts +16 -0
- package/dist/cli/install/find-workspace-framework-version.d.mts.map +1 -0
- package/dist/cli/install/find-workspace-framework-version.mjs +85 -0
- package/dist/cli/install/find-workspace-framework-version.mjs.map +1 -0
- package/dist/cli/install/install-from-source.d.mts +10 -0
- package/dist/cli/install/install-from-source.d.mts.map +1 -0
- package/dist/cli/install/install-from-source.mjs +271 -0
- package/dist/cli/install/install-from-source.mjs.map +1 -0
- package/dist/cli/install/install-kernel.d.mts.map +1 -1
- package/dist/cli/install/install-kernel.mjs +24 -0
- package/dist/cli/install/install-kernel.mjs.map +1 -1
- package/dist/cli/install/legacy-paths.d.mts +33 -11
- package/dist/cli/install/legacy-paths.d.mts.map +1 -1
- package/dist/cli/install/legacy-paths.mjs +161 -39
- package/dist/cli/install/legacy-paths.mjs.map +1 -1
- package/dist/cli/install/runtime-detect.d.mts +2 -6
- package/dist/cli/install/runtime-detect.d.mts.map +1 -1
- package/dist/cli/install/runtime-detect.mjs +9 -4
- package/dist/cli/install/runtime-detect.mjs.map +1 -1
- package/dist/cli/install/runtime-migrate.d.mts +34 -14
- package/dist/cli/install/runtime-migrate.d.mts.map +1 -1
- package/dist/cli/install/runtime-migrate.mjs +63 -30
- package/dist/cli/install/runtime-migrate.mjs.map +1 -1
- package/dist/cli/install/transforms/codex.d.mts.map +1 -1
- package/dist/cli/install/transforms/codex.mjs +28 -17
- package/dist/cli/install/transforms/codex.mjs.map +1 -1
- package/dist/cli/install/transforms/pi.d.mts +6 -0
- package/dist/cli/install/transforms/pi.d.mts.map +1 -0
- package/dist/cli/install/transforms/pi.mjs +37 -0
- package/dist/cli/install/transforms/pi.mjs.map +1 -0
- package/dist/cli/personas/sidecar.d.mts +1 -1
- package/dist/cli/roadmap/lifecycle.d.mts +1 -1
- package/dist/cli/roadmap/rollup.d.mts +2 -2
- package/dist/cli/skill-author/contract.mjs +2 -2
- package/dist/cli/skill-author/contract.mjs.map +1 -1
- package/dist/cli/verify-proof/audit.d.mts +34 -0
- package/dist/cli/verify-proof/audit.d.mts.map +1 -0
- package/dist/cli/verify-proof/audit.mjs +53 -0
- package/dist/cli/verify-proof/audit.mjs.map +1 -0
- package/dist/cli/verify-proof/exec.d.mts +20 -0
- package/dist/cli/verify-proof/exec.d.mts.map +1 -0
- package/dist/cli/verify-proof/exec.mjs +74 -0
- package/dist/cli/verify-proof/exec.mjs.map +1 -0
- package/dist/cli/verify-proof/idl/index.d.mts +2 -0
- package/dist/cli/verify-proof/idl/index.d.mts.map +1 -0
- package/dist/cli/verify-proof/idl/index.mjs +14 -0
- package/dist/cli/verify-proof/idl/index.mjs.map +1 -0
- package/dist/cli/verify-proof/idl/types.d.ts +9 -0
- package/dist/cli/verify-proof/idl/types.d.ts.map +1 -0
- package/dist/cli/verify-proof/idl/types.js +9 -0
- package/dist/cli/verify-proof/idl/types.js.map +1 -0
- package/dist/cli/verify-proof/manifest-validator.d.mts +19 -0
- package/dist/cli/verify-proof/manifest-validator.d.mts.map +1 -0
- package/dist/cli/verify-proof/manifest-validator.mjs +182 -0
- package/dist/cli/verify-proof/manifest-validator.mjs.map +1 -0
- package/dist/cli/verify-proof/resolver.d.mts +43 -0
- package/dist/cli/verify-proof/resolver.d.mts.map +1 -0
- package/dist/cli/verify-proof/resolver.mjs +160 -0
- package/dist/cli/verify-proof/resolver.mjs.map +1 -0
- package/dist/cli/verify-proof/runtime-detect.d.mts +27 -0
- package/dist/cli/verify-proof/runtime-detect.d.mts.map +1 -0
- package/dist/cli/verify-proof/runtime-detect.mjs +116 -0
- package/dist/cli/verify-proof/runtime-detect.mjs.map +1 -0
- package/dist/cli/verify-proof/trust.d.mts +70 -0
- package/dist/cli/verify-proof/trust.d.mts.map +1 -0
- package/dist/cli/verify-proof/trust.mjs +174 -0
- package/dist/cli/verify-proof/trust.mjs.map +1 -0
- package/dist/plugin/.claude-plugin/plugin.json +4 -1
- package/dist/plugin/agents/apt-executor.md +12 -0
- package/dist/plugin/agents/apt-planner.md +5 -4
- package/dist/plugin/agents/apt-team-docs-narrator.md +11 -0
- package/dist/plugin/skills/apt/SKILL.md +78 -8
- package/dist/plugin/skills/apt-caveman/SKILL.md +64 -0
- package/dist/plugin/skills/apt-debug/SKILL.md +36 -4
- package/dist/plugin/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
- package/dist/plugin/skills/apt-discuss/SKILL.md +4 -4
- package/dist/plugin/skills/apt-discuss/appendices/grill-discipline.md +2 -11
- package/dist/plugin/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
- package/dist/plugin/skills/apt-execute/SKILL.md +40 -4
- package/dist/plugin/skills/apt-execute/appendices/tdd-mode.md +2 -10
- package/dist/plugin/skills/apt-fan-out/SKILL.md +159 -0
- package/dist/plugin/skills/apt-handoff/SKILL.md +228 -0
- package/dist/plugin/skills/apt-improve/DEEPENING.md +0 -8
- package/dist/plugin/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
- package/dist/plugin/skills/apt-improve/LANGUAGE.md +0 -8
- package/dist/plugin/skills/apt-improve/SKILL.md +4 -4
- package/dist/plugin/skills/apt-plan/SKILL.md +23 -5
- package/dist/plugin/skills/apt-plan/adapters/conductor.md +1 -1
- package/dist/plugin/skills/apt-pr-review/SKILL.md +8 -1
- package/dist/plugin/skills/apt-prototype/LOGIC.md +0 -8
- package/dist/plugin/skills/apt-prototype/SKILL.md +4 -4
- package/dist/plugin/skills/apt-prototype/UI.md +0 -8
- package/dist/plugin/skills/apt-quick/SKILL.md +31 -1
- package/dist/plugin/skills/apt-resume/SKILL.md +54 -31
- package/dist/plugin/skills/apt-review/SKILL.md +4 -0
- package/dist/plugin/skills/apt-run/SKILL.md +134 -21
- package/dist/plugin/skills/apt-setup/SKILL.md +97 -8
- package/dist/plugin/skills/apt-ship/SKILL.md +165 -9
- package/dist/plugin/skills/apt-spar/SKILL.md +77 -25
- package/dist/plugin/skills/apt-triage/AGENT-BRIEF.md +0 -8
- package/dist/plugin/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
- package/dist/plugin/skills/apt-triage/SKILL.md +2 -2
- package/dist/plugin/skills/apt-update/SKILL.md +74 -17
- package/dist/plugin/skills/apt-verify/SKILL.md +11 -0
- package/dist/plugin/skills/apt-verify-proof/SKILL.md +48 -1
- package/dist/plugin/skills/apt-watch-ci/SKILL.md +2 -2
- package/dist/plugin/skills/apt-zoom-out/SKILL.md +3 -3
- package/dist/schemas/quick-task.d.ts +17 -17
- package/dist/schemas/quick-task.d.ts.map +1 -1
- package/dist/schemas/quick-task.js +2 -2
- package/dist/schemas/quick-task.js.map +1 -1
- package/dist/types/config.d.ts +33 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/state.d.ts +1 -1
- package/dist/types/state.d.ts.map +1 -1
- package/dist/types/task-record.d.ts +1 -1
- package/dist/types/task-record.d.ts.map +1 -1
- package/package.json +134 -133
- package/prompts/planner.md +1 -1
- package/prompts/spec_writer.md +1 -1
- package/skills/apt/SKILL.md +78 -8
- package/skills/apt-caveman/SKILL.md +64 -0
- package/skills/apt-debug/SKILL.md +36 -4
- package/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
- package/skills/apt-discuss/SKILL.md +4 -4
- package/skills/apt-discuss/appendices/grill-discipline.md +2 -11
- package/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
- package/skills/apt-execute/SKILL.md +27 -4
- package/skills/apt-execute/appendices/tdd-mode.md +2 -10
- package/skills/apt-fan-out/SKILL.md +36 -1
- package/skills/apt-handoff/SKILL.md +228 -0
- package/skills/apt-improve/DEEPENING.md +0 -8
- package/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
- package/skills/apt-improve/LANGUAGE.md +0 -8
- package/skills/apt-improve/SKILL.md +4 -4
- package/skills/apt-plan/SKILL.md +23 -5
- package/skills/apt-plan/adapters/conductor.md +1 -1
- package/skills/apt-planner.md +1 -1
- package/skills/apt-prototype/LOGIC.md +0 -8
- package/skills/apt-prototype/SKILL.md +4 -4
- package/skills/apt-prototype/UI.md +0 -8
- package/skills/apt-quick/SKILL.md +31 -1
- package/skills/apt-resume/SKILL.md +54 -31
- package/skills/apt-run/SKILL.md +114 -16
- package/skills/apt-setup/SKILL.md +97 -8
- package/skills/apt-ship/SKILL.md +165 -9
- package/skills/apt-spar/SKILL.md +65 -16
- package/skills/apt-triage/AGENT-BRIEF.md +0 -8
- package/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
- package/skills/apt-triage/SKILL.md +2 -2
- package/skills/apt-update/SKILL.md +74 -17
- package/skills/apt-verify-proof/SKILL.md +48 -1
- package/skills/apt-zoom-out/SKILL.md +3 -3
- package/src/cli/commands/adr.mjs +1 -1
- package/src/cli/commands/audit-branch-current.mjs +250 -0
- package/src/cli/commands/audit.mjs +13 -2
- package/src/cli/commands/check-version.mjs +20 -1
- package/src/cli/commands/context.mjs +3 -3
- package/src/cli/commands/detect-runtime.mjs +134 -0
- package/src/cli/commands/driver-doctor.mjs +294 -0
- package/src/cli/commands/gate.mjs +15 -0
- package/src/cli/commands/init.mjs +75 -33
- package/src/cli/commands/install-from-source.mjs +1 -0
- package/src/cli/commands/modes.mjs +1 -1
- package/src/cli/commands/route.mjs +42 -1
- package/src/cli/commands/triage.mjs +1 -1
- package/src/cli/config/load.mjs +9 -3
- package/src/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
- package/src/cli/coordination/event-schema.mjs +19 -0
- package/src/cli/dispatch.mjs +17 -1
- package/src/cli/gate/context.mjs +20 -1
- package/src/cli/gate/gates/consistency-check.mjs +1 -0
- package/src/cli/gate/gates/review-clean.mjs +1 -0
- package/src/cli/gate/gates/verify-approved.mjs +1 -0
- package/src/cli/gate/registry.mjs +11 -1
- package/src/cli/install/cli-to-install-root.mjs +0 -2
- package/src/cli/install/find-workspace-framework-version.mjs +88 -0
- package/src/cli/install/install-from-source.mjs +276 -0
- package/src/cli/install/install-kernel.mjs +24 -0
- package/src/cli/install/legacy-paths.mjs +162 -39
- package/src/cli/install/runtime-detect.mjs +9 -4
- package/src/cli/install/runtime-migrate.mjs +63 -30
- package/src/cli/install/transforms/codex.mjs +26 -17
- package/src/cli/install/transforms/pi.mjs +37 -0
- package/src/cli/skill-author/contract.mjs +2 -2
- package/src/cli/verify-proof/.gitkeep +0 -0
- package/src/cli/verify-proof/audit.mjs +55 -0
- package/src/cli/verify-proof/exec.mjs +74 -0
- package/src/cli/verify-proof/idl/index.mjs +24 -0
- package/src/cli/verify-proof/idl/types.ts +41 -0
- package/src/cli/verify-proof/manifest-schema.json +211 -0
- package/src/cli/verify-proof/manifest-validator.mjs +184 -0
- package/src/cli/verify-proof/resolver.mjs +163 -0
- package/src/cli/verify-proof/runtime-detect.mjs +122 -0
- package/src/cli/verify-proof/trust.mjs +187 -0
- package/templates/adr-format.md +0 -8
- package/templates/aperant-claude-md-appendix.md +1 -1
- package/templates/context-format.md +1 -9
- package/templates/proof-verification.md +19 -5
- package/workflows/verify-proof.md +56 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.mjs","sourceRoot":"","sources":["../../../src/cli/verify-proof/resolver.mjs"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect runtime capabilities from a parsed package.json object.
|
|
3
|
+
*
|
|
4
|
+
* @param {Record<string, unknown> | null} packageJson
|
|
5
|
+
* @returns {RuntimeCapabilities}
|
|
6
|
+
*/
|
|
7
|
+
export function detectFromPackageJson(packageJson: Record<string, unknown> | null): RuntimeCapabilities;
|
|
8
|
+
/**
|
|
9
|
+
* Load and detect capabilities from a project directory's package.json.
|
|
10
|
+
* Returns empty capabilities if no package.json exists (malformed or
|
|
11
|
+
* missing — both cases fall through to "nothing detected").
|
|
12
|
+
*
|
|
13
|
+
* @param {string} projectDir
|
|
14
|
+
* @returns {RuntimeCapabilities}
|
|
15
|
+
*/
|
|
16
|
+
export function loadRuntimeCapabilities(projectDir: string): RuntimeCapabilities;
|
|
17
|
+
export type RuntimeCapabilities = {
|
|
18
|
+
is_electron: boolean;
|
|
19
|
+
is_tauri: boolean;
|
|
20
|
+
is_nextjs: boolean;
|
|
21
|
+
is_nuxt: boolean;
|
|
22
|
+
is_web_frontend: boolean;
|
|
23
|
+
is_expo: boolean;
|
|
24
|
+
is_react_native: boolean;
|
|
25
|
+
has_node: boolean;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=runtime-detect.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-detect.d.mts","sourceRoot":"","sources":["../../../src/cli/verify-proof/runtime-detect.mjs"],"names":[],"mappings":"AAyCA;;;;;GAKG;AACH,mDAHW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC5B,mBAAmB,CAwD/B;AAED;;;;;;;GAOG;AACH,oDAHW,MAAM,GACJ,mBAAmB,CAY/B;;iBAxGa,OAAO;cACP,OAAO;eACP,OAAO;aACP,OAAO;qBACP,OAAO;aACP,OAAO;qBACP,OAAO;cACP,OAAO"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runtime-detect.mjs — pure project-shape capability detection.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from packages/core/src/prompts/prompt-loader.ts:572-595 so the
|
|
5
|
+
* framework CLI is self-contained (no @aperant/core dep). Same heuristics:
|
|
6
|
+
* read package.json's dependencies + devDependencies, return a capability
|
|
7
|
+
* record the resolver can score against.
|
|
8
|
+
*
|
|
9
|
+
* Pattern: pure data in → pure data out. No filesystem walking, no exec.
|
|
10
|
+
* Use loadRuntimeCapabilities(projectDir) for the cwd-rooted variant.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { join, resolve } from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {Object} RuntimeCapabilities
|
|
16
|
+
* @property {boolean} is_electron
|
|
17
|
+
* @property {boolean} is_tauri
|
|
18
|
+
* @property {boolean} is_nextjs
|
|
19
|
+
* @property {boolean} is_nuxt
|
|
20
|
+
* @property {boolean} is_web_frontend
|
|
21
|
+
* @property {boolean} is_expo
|
|
22
|
+
* @property {boolean} is_react_native
|
|
23
|
+
* @property {boolean} has_node
|
|
24
|
+
*/
|
|
25
|
+
/** A capability record with every flag defaulted to false. */
|
|
26
|
+
function emptyCapabilities() {
|
|
27
|
+
return {
|
|
28
|
+
is_electron: false,
|
|
29
|
+
is_tauri: false,
|
|
30
|
+
is_nextjs: false,
|
|
31
|
+
is_nuxt: false,
|
|
32
|
+
is_web_frontend: false,
|
|
33
|
+
is_expo: false,
|
|
34
|
+
is_react_native: false,
|
|
35
|
+
has_node: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Detect runtime capabilities from a parsed package.json object.
|
|
40
|
+
*
|
|
41
|
+
* @param {Record<string, unknown> | null} packageJson
|
|
42
|
+
* @returns {RuntimeCapabilities}
|
|
43
|
+
*/
|
|
44
|
+
export function detectFromPackageJson(packageJson) {
|
|
45
|
+
const capabilities = emptyCapabilities();
|
|
46
|
+
if (packageJson === null || typeof packageJson !== 'object')
|
|
47
|
+
return capabilities;
|
|
48
|
+
const allDeps = {
|
|
49
|
+
...(packageJson.dependencies ?? {}) /** @type {Record<string,string>} */,
|
|
50
|
+
...(packageJson.devDependencies ?? {}) /** @type {Record<string,string>} */,
|
|
51
|
+
};
|
|
52
|
+
const deps = new Set(Object.keys(allDeps).map((k) => k.toLowerCase()));
|
|
53
|
+
if (deps.has('electron') || [...deps].some((d) => d.startsWith('@electron'))) {
|
|
54
|
+
capabilities.is_electron = true;
|
|
55
|
+
}
|
|
56
|
+
if (deps.has('@tauri-apps/api') || deps.has('tauri')) {
|
|
57
|
+
capabilities.is_tauri = true;
|
|
58
|
+
}
|
|
59
|
+
if (deps.has('expo'))
|
|
60
|
+
capabilities.is_expo = true;
|
|
61
|
+
if (deps.has('react-native'))
|
|
62
|
+
capabilities.is_react_native = true;
|
|
63
|
+
// Web frontends — react/vue/svelte/angular/solid → frontend. BUT: an
|
|
64
|
+
// Electron app commonly bundles React as its renderer; in that case the
|
|
65
|
+
// runtime is "electron", not "web_frontend". Electron + react-native +
|
|
66
|
+
// expo + tauri all win over the web flag.
|
|
67
|
+
const isNativeContainer = capabilities.is_electron ||
|
|
68
|
+
capabilities.is_tauri ||
|
|
69
|
+
capabilities.is_react_native ||
|
|
70
|
+
capabilities.is_expo;
|
|
71
|
+
const webFrameworks = ['react', 'vue', 'svelte', 'angular', 'solid'];
|
|
72
|
+
if (!isNativeContainer && webFrameworks.some((f) => deps.has(f))) {
|
|
73
|
+
capabilities.is_web_frontend = true;
|
|
74
|
+
}
|
|
75
|
+
if (deps.has('next')) {
|
|
76
|
+
capabilities.is_nextjs = true;
|
|
77
|
+
capabilities.is_web_frontend = true;
|
|
78
|
+
}
|
|
79
|
+
if (deps.has('nuxt')) {
|
|
80
|
+
capabilities.is_nuxt = true;
|
|
81
|
+
capabilities.is_web_frontend = true;
|
|
82
|
+
}
|
|
83
|
+
if (deps.has('vite') && !isNativeContainer) {
|
|
84
|
+
capabilities.is_web_frontend = true;
|
|
85
|
+
}
|
|
86
|
+
// Node-ish? Anything with a package.json + an entry point counts.
|
|
87
|
+
if (typeof packageJson.main === 'string' || typeof packageJson.module === 'string') {
|
|
88
|
+
capabilities.has_node = true;
|
|
89
|
+
}
|
|
90
|
+
if (!capabilities.has_node && packageJson.scripts && typeof packageJson.scripts === 'object') {
|
|
91
|
+
capabilities.has_node = true;
|
|
92
|
+
}
|
|
93
|
+
return capabilities;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Load and detect capabilities from a project directory's package.json.
|
|
97
|
+
* Returns empty capabilities if no package.json exists (malformed or
|
|
98
|
+
* missing — both cases fall through to "nothing detected").
|
|
99
|
+
*
|
|
100
|
+
* @param {string} projectDir
|
|
101
|
+
* @returns {RuntimeCapabilities}
|
|
102
|
+
*/
|
|
103
|
+
export function loadRuntimeCapabilities(projectDir) {
|
|
104
|
+
const pkgPath = join(resolve(projectDir), 'package.json');
|
|
105
|
+
if (!existsSync(pkgPath))
|
|
106
|
+
return emptyCapabilities();
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return emptyCapabilities();
|
|
113
|
+
}
|
|
114
|
+
return detectFromPackageJson(parsed);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=runtime-detect.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-detect.mjs","sourceRoot":"","sources":["../../../src/cli/verify-proof/runtime-detect.mjs"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute a stable manifest hash for TOFU + audit lines.
|
|
3
|
+
* @param {DriverManifest} manifest
|
|
4
|
+
* @returns {string}
|
|
5
|
+
*/
|
|
6
|
+
export function manifestSha256(manifest: DriverManifest): string;
|
|
7
|
+
/**
|
|
8
|
+
* Read the TOFU lock file. Returns an empty object if missing or malformed.
|
|
9
|
+
* @param {string} projectDir
|
|
10
|
+
* @returns {Record<string, {manifest_sha256: string, artifact_digest?: string, approved_at: string, trust_tier: string}>}
|
|
11
|
+
*/
|
|
12
|
+
export function readTofuLock(projectDir: string): Record<string, {
|
|
13
|
+
manifest_sha256: string;
|
|
14
|
+
artifact_digest?: string;
|
|
15
|
+
approved_at: string;
|
|
16
|
+
trust_tier: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Persist a TOFU lock file (atomic-ish: write + rename not used since we
|
|
20
|
+
* append-only to a tiny JSON; conflicting writes from parallel agents
|
|
21
|
+
* would clobber an entry but `.aperant/driver-tofu.json` is per-project,
|
|
22
|
+
* not per-agent).
|
|
23
|
+
*
|
|
24
|
+
* @param {string} projectDir
|
|
25
|
+
* @param {Record<string, unknown>} tofu
|
|
26
|
+
*/
|
|
27
|
+
export function writeTofuLock(projectDir: string, tofu: Record<string, unknown>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Build the canonical TOFU key for a (driver, version) pair. The hash is
|
|
30
|
+
* NOT part of the key — the value's manifest_sha256 + artifact_digest
|
|
31
|
+
* detect drift.
|
|
32
|
+
* @param {string} driverId
|
|
33
|
+
* @param {string} version
|
|
34
|
+
* @returns {string}
|
|
35
|
+
*/
|
|
36
|
+
export function tofuKey(driverId: string, version: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Read the project's policy file. Returns the default policy if missing.
|
|
39
|
+
* @param {string} projectDir
|
|
40
|
+
* @returns {{mode: 'first_party_only' | 'allowlist', allowed: string[], denied: string[]}}
|
|
41
|
+
*/
|
|
42
|
+
export function readPolicy(projectDir: string): {
|
|
43
|
+
mode: "first_party_only" | "allowlist";
|
|
44
|
+
allowed: string[];
|
|
45
|
+
denied: string[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Decide whether a driver invocation is allowed.
|
|
49
|
+
*
|
|
50
|
+
* @param {DriverManifest} manifest
|
|
51
|
+
* @param {ReturnType<typeof readTofuLock>} tofu
|
|
52
|
+
* @param {ReturnType<typeof readPolicy>} policy
|
|
53
|
+
* @returns {{decision: 'allow' | 'deny' | 'requires_approval', reason: string, expected_manifest_sha256?: string}}
|
|
54
|
+
*/
|
|
55
|
+
export function decide(manifest: DriverManifest, tofu: ReturnType<typeof readTofuLock>, policy: ReturnType<typeof readPolicy>): {
|
|
56
|
+
decision: "allow" | "deny" | "requires_approval";
|
|
57
|
+
reason: string;
|
|
58
|
+
expected_manifest_sha256?: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Persist a one-time approval for a (driver, version) pair into the TOFU
|
|
62
|
+
* lock. The caller is responsible for actually prompting the user; this
|
|
63
|
+
* function just writes the entry.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} projectDir
|
|
66
|
+
* @param {DriverManifest} manifest
|
|
67
|
+
*/
|
|
68
|
+
export function recordApproval(projectDir: string, manifest: DriverManifest): void;
|
|
69
|
+
export type DriverManifest = import("@aperant/driver-sdk").DriverManifest;
|
|
70
|
+
//# sourceMappingURL=trust.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.mts","sourceRoot":"","sources":["../../../src/cli/verify-proof/trust.mjs"],"names":[],"mappings":"AA+BA;;;;GAIG;AACH,yCAHW,cAAc,GACZ,MAAM,CAKlB;AAED;;;;GAIG;AACH,yCAHW,MAAM,GACJ,MAAM,CAAC,MAAM,EAAE;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAUxH;AAED;;;;;;;;GAQG;AACH,0CAHW,MAAM,QACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAMjC;AAED;;;;;;;GAOG;AACH,kCAJW,MAAM,WACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;GAIG;AACH,uCAHW,MAAM,GACJ;IAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,CAgBzF;AAED;;;;;;;GAOG;AACH,iCALW,cAAc,QACd,UAAU,CAAC,OAAO,YAAY,CAAC,UAC/B,UAAU,CAAC,OAAO,UAAU,CAAC,GAC3B;IAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAAC,CAwDjH;AAED;;;;;;;GAOG;AACH,2CAHW,MAAM,YACN,cAAc,QAYxB;6BAjKY,OAAO,qBAAqB,EAAE,cAAc"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trust.mjs — driver trust enforcement (TOFU lock + policy file + decision).
|
|
3
|
+
*
|
|
4
|
+
* Implements ID-03:
|
|
5
|
+
* - 4 trust tiers: first_party_signed (default-allow), community_verified,
|
|
6
|
+
* community_unverified, local_unverified.
|
|
7
|
+
* - Default policy: only first_party_signed auto-runs.
|
|
8
|
+
* - Non-first-party drivers require one-time user approval; approval is
|
|
9
|
+
* bound to a TOFU lock at .aperant/driver-tofu.json keyed by
|
|
10
|
+
* {driver_id, version, manifest_sha256, artifact_digest}. Any drift
|
|
11
|
+
* re-prompts.
|
|
12
|
+
*
|
|
13
|
+
* The audit log (audit.mjs) writes one line per decision (allow/deny).
|
|
14
|
+
* The execution layer (exec.mjs) enforces structured-only local_command.
|
|
15
|
+
*
|
|
16
|
+
* This module is decision-only: it does NOT prompt the user. The caller
|
|
17
|
+
* (workflow runner / apt-tools driver doctor) decides whether to invoke
|
|
18
|
+
* the prompt UX, then calls recordApproval() to persist the TOFU entry.
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from 'node:crypto';
|
|
21
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
22
|
+
import { dirname, join, resolve } from 'node:path';
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {import('@aperant/driver-sdk').DriverManifest} DriverManifest
|
|
25
|
+
*/
|
|
26
|
+
const TOFU_PATH = '.aperant/driver-tofu.json';
|
|
27
|
+
const POLICY_PATH = '.aperant/policy.json';
|
|
28
|
+
/**
|
|
29
|
+
* Compute a stable manifest hash for TOFU + audit lines.
|
|
30
|
+
* @param {DriverManifest} manifest
|
|
31
|
+
* @returns {string}
|
|
32
|
+
*/
|
|
33
|
+
export function manifestSha256(manifest) {
|
|
34
|
+
const stable = JSON.stringify(manifest, Object.keys(manifest).sort());
|
|
35
|
+
return createHash('sha256').update(stable).digest('hex');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read the TOFU lock file. Returns an empty object if missing or malformed.
|
|
39
|
+
* @param {string} projectDir
|
|
40
|
+
* @returns {Record<string, {manifest_sha256: string, artifact_digest?: string, approved_at: string, trust_tier: string}>}
|
|
41
|
+
*/
|
|
42
|
+
export function readTofuLock(projectDir) {
|
|
43
|
+
const path = join(resolve(projectDir), TOFU_PATH);
|
|
44
|
+
if (!existsSync(path))
|
|
45
|
+
return {};
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Persist a TOFU lock file (atomic-ish: write + rename not used since we
|
|
55
|
+
* append-only to a tiny JSON; conflicting writes from parallel agents
|
|
56
|
+
* would clobber an entry but `.aperant/driver-tofu.json` is per-project,
|
|
57
|
+
* not per-agent).
|
|
58
|
+
*
|
|
59
|
+
* @param {string} projectDir
|
|
60
|
+
* @param {Record<string, unknown>} tofu
|
|
61
|
+
*/
|
|
62
|
+
export function writeTofuLock(projectDir, tofu) {
|
|
63
|
+
const path = join(resolve(projectDir), TOFU_PATH);
|
|
64
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
65
|
+
writeFileSync(path, JSON.stringify(tofu, null, 2) + '\n', 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build the canonical TOFU key for a (driver, version) pair. The hash is
|
|
69
|
+
* NOT part of the key — the value's manifest_sha256 + artifact_digest
|
|
70
|
+
* detect drift.
|
|
71
|
+
* @param {string} driverId
|
|
72
|
+
* @param {string} version
|
|
73
|
+
* @returns {string}
|
|
74
|
+
*/
|
|
75
|
+
export function tofuKey(driverId, version) {
|
|
76
|
+
return `${driverId}@${version}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read the project's policy file. Returns the default policy if missing.
|
|
80
|
+
* @param {string} projectDir
|
|
81
|
+
* @returns {{mode: 'first_party_only' | 'allowlist', allowed: string[], denied: string[]}}
|
|
82
|
+
*/
|
|
83
|
+
export function readPolicy(projectDir) {
|
|
84
|
+
const path = join(resolve(projectDir), POLICY_PATH);
|
|
85
|
+
const defaults = { mode: 'first_party_only', allowed: [], denied: [] };
|
|
86
|
+
if (!existsSync(path))
|
|
87
|
+
return defaults;
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
90
|
+
return {
|
|
91
|
+
mode: parsed.mode === 'allowlist' ? 'allowlist' : 'first_party_only',
|
|
92
|
+
allowed: Array.isArray(parsed.allowed) ? parsed.allowed : [],
|
|
93
|
+
denied: Array.isArray(parsed.denied) ? parsed.denied : [],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return defaults;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Decide whether a driver invocation is allowed.
|
|
102
|
+
*
|
|
103
|
+
* @param {DriverManifest} manifest
|
|
104
|
+
* @param {ReturnType<typeof readTofuLock>} tofu
|
|
105
|
+
* @param {ReturnType<typeof readPolicy>} policy
|
|
106
|
+
* @returns {{decision: 'allow' | 'deny' | 'requires_approval', reason: string, expected_manifest_sha256?: string}}
|
|
107
|
+
*/
|
|
108
|
+
export function decide(manifest, tofu, policy) {
|
|
109
|
+
const tier = manifest.trust?.tier;
|
|
110
|
+
const driverId = manifest.driverId;
|
|
111
|
+
const version = manifest.version;
|
|
112
|
+
// Policy denylist always wins.
|
|
113
|
+
if (policy.denied.includes(driverId)) {
|
|
114
|
+
return { decision: 'deny', reason: `policy denies driver ${driverId}` };
|
|
115
|
+
}
|
|
116
|
+
// first_party_signed: default-allow under either policy mode (unless
|
|
117
|
+
// explicitly denied above).
|
|
118
|
+
if (tier === 'first_party_signed') {
|
|
119
|
+
return { decision: 'allow', reason: 'first_party_signed driver — default allow' };
|
|
120
|
+
}
|
|
121
|
+
// first_party_only mode blocks every other tier.
|
|
122
|
+
if (policy.mode === 'first_party_only') {
|
|
123
|
+
return {
|
|
124
|
+
decision: 'deny',
|
|
125
|
+
reason: `policy.mode=first_party_only blocks ${tier} driver`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// allowlist mode: require explicit allow entry AND a valid TOFU lock.
|
|
129
|
+
if (!policy.allowed.includes(driverId)) {
|
|
130
|
+
return {
|
|
131
|
+
decision: 'deny',
|
|
132
|
+
reason: `policy.mode=allowlist but ${driverId} not in allowed[]`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Check TOFU lock.
|
|
136
|
+
const key = tofuKey(driverId, version);
|
|
137
|
+
const entry = tofu[key];
|
|
138
|
+
const currentHash = manifestSha256(manifest);
|
|
139
|
+
if (!entry) {
|
|
140
|
+
return {
|
|
141
|
+
decision: 'requires_approval',
|
|
142
|
+
reason: `no TOFU entry for ${key} — first run requires approval`,
|
|
143
|
+
expected_manifest_sha256: currentHash,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (entry.manifest_sha256 !== currentHash) {
|
|
147
|
+
return {
|
|
148
|
+
decision: 'requires_approval',
|
|
149
|
+
reason: `TOFU manifest_sha256 drift for ${key} — driver changed since approval, re-prompt required`,
|
|
150
|
+
expected_manifest_sha256: currentHash,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { decision: 'allow', reason: `TOFU entry valid for ${key}` };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Persist a one-time approval for a (driver, version) pair into the TOFU
|
|
157
|
+
* lock. The caller is responsible for actually prompting the user; this
|
|
158
|
+
* function just writes the entry.
|
|
159
|
+
*
|
|
160
|
+
* @param {string} projectDir
|
|
161
|
+
* @param {DriverManifest} manifest
|
|
162
|
+
*/
|
|
163
|
+
export function recordApproval(projectDir, manifest) {
|
|
164
|
+
const tofu = readTofuLock(projectDir);
|
|
165
|
+
const key = tofuKey(manifest.driverId, manifest.version);
|
|
166
|
+
tofu[key] = {
|
|
167
|
+
manifest_sha256: manifestSha256(manifest),
|
|
168
|
+
artifact_digest: manifest.trust?.integrity?.artifact_digest,
|
|
169
|
+
approved_at: new Date().toISOString(),
|
|
170
|
+
trust_tier: manifest.trust?.tier,
|
|
171
|
+
};
|
|
172
|
+
writeTofuLock(projectDir, tofu);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=trust.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.mjs","sourceRoot":"","sources":["../../../src/cli/verify-proof/trust.mjs"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aperant",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.4",
|
|
4
4
|
"description": "AI coding framework — composable skills for planning, executing, verifying, and reviewing code with any LLM provider. Works as Claude Code commands, Codex tasks, or programmatically.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mikalsen AI",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"skills/apt",
|
|
26
26
|
"skills/apt-author-skill",
|
|
27
27
|
"skills/apt-bootstrap",
|
|
28
|
+
"skills/apt-caveman",
|
|
28
29
|
"skills/apt-classify",
|
|
29
30
|
"skills/apt-close-task",
|
|
30
31
|
"skills/apt-create-docs",
|
|
@@ -34,6 +35,8 @@
|
|
|
34
35
|
"skills/apt-discuss",
|
|
35
36
|
"skills/apt-docs",
|
|
36
37
|
"skills/apt-execute",
|
|
38
|
+
"skills/apt-fan-out",
|
|
39
|
+
"skills/apt-handoff",
|
|
37
40
|
"skills/apt-improve",
|
|
38
41
|
"skills/apt-mockup",
|
|
39
42
|
"skills/apt-pause",
|
|
@@ -46,6 +46,18 @@ node packages/framework/bin/apt-tools.mjs gate check . --task-id {task-id} --ski
|
|
|
46
46
|
|
|
47
47
|
If `status == "fail"`, STOP. Report the failed gates verbatim and exit — do NOT auto-apply `--force`. Forcing is a human decision; the user can re-invoke with `--force --reason "<explanation>"` to bypass (the override is logged to `.aperant/events/{today}.jsonl`).
|
|
48
48
|
|
|
49
|
+
## 0a. Fan-out worker identity (FRAMEWORK-BUG-033 defect 3)
|
|
50
|
+
|
|
51
|
+
If your spawn prompt contains both `batch_id` and `task_id` (i.e. you are a fan-out worker subagent dispatched by `/apt:fan-out`), export `APT_AGENT_ID` in EVERY `Bash` invocation that runs `apt-tools ...`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
APT_AGENT_ID=fanout-${batch_id}-${task_id} node packages/framework/bin/apt-tools.mjs <command> ...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
This pins your `team-status/{agentId}.json` file across short-lived CLI invocations. Without it, each `apt-tools` call gets a fresh `hostname-pid` agentId (per `agent-identity.mjs:86`), the previous pid dies, and `listTeamStatus({ includeStale: false })` filters healthy workers out between invocations — the team-status dashboard flickers into emptiness instead of showing 4 stable fan-out workers.
|
|
58
|
+
|
|
59
|
+
Non-fan-out invocations of this agent receive no `batch_id` and skip this export — the legacy `hostname-pid` path remains correct for single-task work.
|
|
60
|
+
|
|
49
61
|
## 1. Load Context
|
|
50
62
|
|
|
51
63
|
1. Read `CLAUDE.md` and `AGENTS.md` if they exist
|
|
@@ -32,7 +32,8 @@ Before planning, discover project context:
|
|
|
32
32
|
<environment>
|
|
33
33
|
- **Working directory:** The project root
|
|
34
34
|
- **apt-tools:** Always invoke as `node packages/framework/bin/apt-tools.mjs`
|
|
35
|
-
- **Task directory:** Provided in the spawn prompt as `task_dir`. ALL artifacts (spec.md, implementation_plan.json) are written here, NOT to project root.
|
|
35
|
+
- **Task directory:** Provided in the spawn prompt as `task_dir`. It MUST be an absolute path under the main repo's `.aperant/tasks/{task-id}/`. ALL artifacts (spec.md, implementation_plan.json) are written here, NOT to project root and NOT to a worktree-local `.aperant/tasks/` directory.
|
|
36
|
+
- **Worktree path:** If provided, use it only for code investigation/editing context. Do not derive artifact paths from it.
|
|
36
37
|
- **Config:** `.aperant/config.json` — project preferences
|
|
37
38
|
- **State:** `.aperant/state.json` — execution state
|
|
38
39
|
</environment>
|
|
@@ -43,7 +44,7 @@ Before planning, discover project context:
|
|
|
43
44
|
|
|
44
45
|
1. Read `CLAUDE.md` and `AGENTS.md` if they exist — extract conventions, stack, constraints
|
|
45
46
|
2. Run `node packages/framework/bin/apt-tools.mjs state .` to understand current project state
|
|
46
|
-
3. Parse the task description and task_dir from the spawn prompt
|
|
47
|
+
3. Parse the task description and task_dir from the spawn prompt. If task_dir is relative, resolve the real main repo path first instead of writing under the current worktree.
|
|
47
48
|
|
|
48
49
|
## 2. Assess Complexity
|
|
49
50
|
|
|
@@ -211,7 +212,7 @@ If unable to enumerate (network unavailable, action docs unclear), flag it expli
|
|
|
211
212
|
|
|
212
213
|
## 4. Write Specification
|
|
213
214
|
|
|
214
|
-
The spec.md content format **branches on track** (
|
|
215
|
+
The spec.md content format **branches on track** (ID-05,
|
|
215
216
|
Fast Path Guarantee). QUICK-routed tasks keep the existing 4-section
|
|
216
217
|
shape; STANDARD/DEEP/COMPLEX tasks get a PRD-shaped artifact that
|
|
217
218
|
survives the task as a second-consumer document.
|
|
@@ -344,7 +345,7 @@ fix it now, not later.
|
|
|
344
345
|
|
|
345
346
|
## 5. Create Implementation Plan
|
|
346
347
|
|
|
347
|
-
Subtask schema branches on track
|
|
348
|
+
Subtask schema branches on track.
|
|
348
349
|
|
|
349
350
|
### 5.A. QUICK track / SIMPLE complexity — legacy flat subtask schema
|
|
350
351
|
|
|
@@ -72,6 +72,17 @@ If the parent spawned you without a mode you recognize, write an error line to `
|
|
|
72
72
|
rendered table. If present, REPLACE the content between anchors (never
|
|
73
73
|
append — this is how re-runs stay idempotent).
|
|
74
74
|
7. Call `apt-tools roadmap sync . --reason 'narrator:phase-ship:<phase_id>'`.
|
|
75
|
+
8. **Slice 5 / AC14 / ADR-0006 dual-write.** Write the rendered prose
|
|
76
|
+
block to a temp file (e.g. `mktemp -t narrator-prose-XXXXXX.md`), then
|
|
77
|
+
run
|
|
78
|
+
`apt-tools roadmap convex-mirror . --scope <scope> --phase <phase_id> --anchor-id phase-ship:<phase_id> --prose-path <tempfile>`
|
|
79
|
+
(add `--merged-pr <pr-number>` when known). The markdown write from
|
|
80
|
+
step 7 is canonical (ADR-0006); this step is the Convex mirror.
|
|
81
|
+
Fail-soft contract:
|
|
82
|
+
- exit 0 with `status:ok` or `status:queued` → continue normally
|
|
83
|
+
- exit non-zero with `status:error` → append the error message to
|
|
84
|
+
`.aperant/digests/errors.log` and continue (do NOT block on Convex
|
|
85
|
+
failures; the in-process cron drainer reconciles within 5 min)
|
|
75
86
|
|
|
76
87
|
## Mode 2: `decision-merge` — merge a recorded decision into the roadmap
|
|
77
88
|
|