@ornexus/neocortex 4.60.66 → 4.60.68
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/dist/release-source.json +1 -1
- package/dist/sbom.cdx.json +1598 -1640
- package/install.ps1 +1 -1
- package/install.sh +2 -1
- package/package.json +10 -7
- package/packages/client/dist/adapters/adapter-registry.js +108 -1
- package/packages/client/dist/adapters/antigravity-adapter.js +77 -2
- package/packages/client/dist/adapters/claude-code-adapter.js +79 -3
- package/packages/client/dist/adapters/codex-adapter.js +80 -2
- package/packages/client/dist/adapters/cursor-adapter.js +115 -4
- package/packages/client/dist/adapters/gemini-adapter.js +71 -2
- package/packages/client/dist/adapters/grok-adapter.js +42 -2
- package/packages/client/dist/adapters/index.js +22 -1
- package/packages/client/dist/adapters/platform-detector.js +212 -1
- package/packages/client/dist/adapters/target-adapter.js +12 -0
- package/packages/client/dist/adapters/vscode-adapter.js +72 -2
- package/packages/client/dist/agent/refresh-stubs.js +417 -2
- package/packages/client/dist/agent/update-agent-yaml.js +102 -1
- package/packages/client/dist/agent/update-description.js +251 -1
- package/packages/client/dist/cache/crypto-utils.js +78 -1
- package/packages/client/dist/cache/encrypted-cache.js +108 -1
- package/packages/client/dist/cache/in-memory-asset-cache.js +73 -1
- package/packages/client/dist/cache/index.js +13 -1
- package/packages/client/dist/cache/protected-pi-boundary.js +44 -1
- package/packages/client/dist/checkpoint/checkpoint-client-reader.js +127 -2
- package/packages/client/dist/checkpoint/index.js +11 -1
- package/packages/client/dist/checkpoint/shared-checkpoint-types.js +32 -1
- package/packages/client/dist/cli.js +303 -3
- package/packages/client/dist/commands/activate.js +394 -8
- package/packages/client/dist/commands/architecture-answers.js +274 -7
- package/packages/client/dist/commands/architecture-memory-terminal.js +253 -4
- package/packages/client/dist/commands/architecture-non-ui-continuation.js +100 -1
- package/packages/client/dist/commands/architecture-root-binding.js +51 -1
- package/packages/client/dist/commands/cache-status.js +112 -2
- package/packages/client/dist/commands/config.js +88 -1
- package/packages/client/dist/commands/doctor.d.ts +135 -0
- package/packages/client/dist/commands/doctor.js +635 -0
- package/packages/client/dist/commands/invoke.d.ts +18 -0
- package/packages/client/dist/commands/invoke.js +7140 -142
- package/packages/client/dist/commands/legacy-epic-terminal.js +71 -1
- package/packages/client/dist/commands/legacy-story-branch.js +96 -1
- package/packages/client/dist/commands/legacy-story-pr.js +276 -1
- package/packages/client/dist/commands/mutation-qa-checkpoint.js +285 -5
- package/packages/client/dist/commands/mutation-qa-gate.js +54 -1
- package/packages/client/dist/commands/mutation-qa-git.js +41 -1
- package/packages/client/dist/commands/mutation-qa-policy.js +102 -1
- package/packages/client/dist/commands/mutation-qa-run.js +219 -3
- package/packages/client/dist/commands/mutation-qa-verdict.js +149 -1
- package/packages/client/dist/commands/mutation-qa.js +220 -1
- package/packages/client/dist/commands/native-agent.js +136 -2
- package/packages/client/dist/commands/planning-diagnosis.js +43 -1
- package/packages/client/dist/commands/planning-generation.js +53 -1
- package/packages/client/dist/commands/planning-memory.js +40 -1
- package/packages/client/dist/commands/planning-research.js +42 -1
- package/packages/client/dist/commands/private-session.js +75 -1
- package/packages/client/dist/commands/property-qa.js +139 -1
- package/packages/client/dist/commands/qa-control.js +16 -1
- package/packages/client/dist/commands/qa-scan-browser-launch.js +55 -1
- package/packages/client/dist/commands/qa-scan-browser-route.js +28 -1
- package/packages/client/dist/commands/qa-scan-capture.js +663 -5
- package/packages/client/dist/commands/qa-scan-discovery.js +376 -3
- package/packages/client/dist/commands/qa-scan-review.js +826 -5
- package/packages/client/dist/commands/qa-synthetic-backend-capture.js +266 -1
- package/packages/client/dist/commands/qa-synthetic-backend-review.js +297 -1
- package/packages/client/dist/commands/qa-synthetic-backend.js +340 -2
- package/packages/client/dist/commands/qa-synthetic-broker-port.js +85 -1
- package/packages/client/dist/commands/qa-synthetic-browser.js +39 -1
- package/packages/client/dist/commands/refactor-characterization.js +671 -21
- package/packages/client/dist/commands/refactor-commit.js +399 -13
- package/packages/client/dist/commands/refactor-control.js +142 -3
- package/packages/client/dist/commands/refactor-cpp-assertions.js +93 -3
- package/packages/client/dist/commands/refactor-review.js +283 -5
- package/packages/client/dist/commands/refactor-root.js +588 -7
- package/packages/client/dist/commands/refresh-memory.js +156 -3
- package/packages/client/dist/commands/shared-architecture-non-ui.js +24 -1
- package/packages/client/dist/commands/story-checkpoint.js +171 -1
- package/packages/client/dist/config/profile-directory.js +13 -1
- package/packages/client/dist/config/resolver-selection.js +278 -1
- package/packages/client/dist/config/secure-config.js +281 -12
- package/packages/client/dist/config.js +223 -2
- package/packages/client/dist/constants.js +25 -1
- package/packages/client/dist/context/context-collector.js +222 -2
- package/packages/client/dist/context/context-sanitizer.js +145 -1
- package/packages/client/dist/continuity/autonomous-governance.js +285 -1
- package/packages/client/dist/continuity/continuity-client-state-store.js +1587 -1
- package/packages/client/dist/continuity/invoke-hooks.js +129 -1
- package/packages/client/dist/continuity/migrations/001-initial-schema.js +12 -2
- package/packages/client/dist/continuity/migrations/002-processing-output-summary-indexes.js +12 -2
- package/packages/client/dist/continuity/migrations/003-headless-execution-attempts.js +12 -2
- package/packages/client/dist/continuity/migrations/004-outbox-delivery-state.js +12 -2
- package/packages/client/dist/continuity/migrations/005-bounded-headless-queue.js +12 -2
- package/packages/client/dist/continuity/migrations/006-native-agent-dispatches.js +10 -2
- package/packages/client/dist/continuity/native-agent-store.js +69 -1
- package/packages/client/dist/continuity/native-agent-types.js +90 -1
- package/packages/client/dist/continuity/outbox.js +117 -1
- package/packages/client/dist/continuity/runner-bootstrap-policy.js +172 -1
- package/packages/client/dist/continuity/sqlite-store.js +2536 -81
- package/packages/client/dist/effects/invoke-effect-gateways.js +62 -1
- package/packages/client/dist/errors/error-messages.js +228 -2
- package/packages/client/dist/errors/frontmatter-diagnostics.js +125 -1
- package/packages/client/dist/evidence/collector.js +347 -1
- package/packages/client/dist/evidence/index.js +1 -1
- package/packages/client/dist/evidence/types.js +2 -0
- package/packages/client/dist/fs/atomic-state-replace.js +152 -1
- package/packages/client/dist/generated/command-registry.generated.js +4076 -1
- package/packages/client/dist/generated/public-projections.generated.js +149 -1
- package/packages/client/dist/git/direct-yolo-c01-retry.js +138 -4
- package/packages/client/dist/git/direct-yolo-checkpoint.js +1234 -4
- package/packages/client/dist/git/git-lifecycle-step-ids.js +14 -1
- package/packages/client/dist/git/git-lifecycle-store.js +1938 -9
- package/packages/client/dist/git/legacy-story-branch-checkpoint.js +259 -9
- package/packages/client/dist/git/legacy-story-branch-setup.js +348 -4
- package/packages/client/dist/git/legacy-story-pr.js +3538 -70
- package/packages/client/dist/git/secure-filesystem-boundary.js +182 -5
- package/packages/client/dist/graph-retrieval/pre-command-hook.js +284 -1
- package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +237 -1
- package/packages/client/dist/i18n/first-run.js +60 -2
- package/packages/client/dist/index.js +47 -1
- package/packages/client/dist/invocation/invoke-input.js +24 -1
- package/packages/client/dist/license/index.js +5 -1
- package/packages/client/dist/license/license-client.js +304 -1
- package/packages/client/dist/machine/fingerprint.js +163 -2
- package/packages/client/dist/machine/index.js +5 -1
- package/packages/client/dist/memory/project-memory-path-scope.js +62 -1
- package/packages/client/dist/memory/project-memory-writer.js +1007 -40
- package/packages/client/dist/memory/shared-project-memory-types.js +253 -2
- package/packages/client/dist/migrations/project-identity-capability.js +50 -1
- package/packages/client/dist/migrations/project-identity.js +493 -7
- package/packages/client/dist/migrations/state-json.js +344 -4
- package/packages/client/dist/policy/architecture-policy.js +184 -2
- package/packages/client/dist/policy/index.js +7 -1
- package/packages/client/dist/policy/shared-policy-types.js +38 -0
- package/packages/client/dist/policy/subagent-approval-policy.js +55 -1
- package/packages/client/dist/private-execution/clean-baseline.js +279 -2
- package/packages/client/dist/private-execution/codex-executor.js +574 -4
- package/packages/client/dist/private-execution/codex-host-runtime.js +137 -1
- package/packages/client/dist/private-execution/codex-lifecycle-guard.js +97 -1
- package/packages/client/dist/private-execution/codex-scoped-permissions.js +128 -1
- package/packages/client/dist/private-execution/delivery.js +410 -13
- package/packages/client/dist/private-execution/diagnosis-root-review.js +294 -2
- package/packages/client/dist/private-execution/frozen-handoff.js +19 -6
- package/packages/client/dist/private-execution/implementation-validation.js +106 -2
- package/packages/client/dist/private-execution/isolated-admission.js +1432 -23
- package/packages/client/dist/private-execution/isolated-session.js +725 -5
- package/packages/client/dist/private-execution/isolated-workspace.js +122 -1
- package/packages/client/dist/private-execution/pact-consumer-runtime.js +409 -3
- package/packages/client/dist/private-execution/pact-test-source.js +258 -1
- package/packages/client/dist/private-execution/pact-toolchain.js +290 -3
- package/packages/client/dist/private-execution/pact-write-set.js +172 -1
- package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.js +406 -5
- package/packages/client/dist/private-execution/planning-generation-checkpoint.js +462 -5
- package/packages/client/dist/private-execution/planning-memory-checkpoint.js +139 -3
- package/packages/client/dist/private-execution/planning-research-checkpoint.js +325 -4
- package/packages/client/dist/private-execution/private-report-store.js +42 -1
- package/packages/client/dist/private-execution/property-test-candidate.js +103 -1
- package/packages/client/dist/private-execution/property-test-choices.js +147 -3
- package/packages/client/dist/private-execution/property-test-plan.js +271 -7
- package/packages/client/dist/private-execution/property-test-review.js +258 -4
- package/packages/client/dist/private-execution/property-test-runtime.js +372 -9
- package/packages/client/dist/private-execution/property-test-source.js +139 -1
- package/packages/client/dist/private-execution/root-checkpoint.js +80 -1
- package/packages/client/dist/private-execution/root-memory-git-evidence.js +135 -3
- package/packages/client/dist/private-execution/root-memory-recovery.js +93 -1
- package/packages/client/dist/private-execution/root-memory-request.js +29 -1
- package/packages/client/dist/private-execution/root-memory-scope.js +178 -1
- package/packages/client/dist/private-execution/root-memory-writer.js +102 -1
- package/packages/client/dist/private-execution/session-lease.js +63 -1
- package/packages/client/dist/private-execution/shared-private-admission-types.js +50 -1
- package/packages/client/dist/private-execution/shared-project-validation.js +66 -1
- package/packages/client/dist/private-execution/shared-root-memory-types.js +61 -1
- package/packages/client/dist/private-execution/ux-source-validation.js +372 -1
- package/packages/client/dist/private-execution/ux-write-set.js +191 -2
- package/packages/client/dist/resilience/circuit-breaker.js +170 -1
- package/packages/client/dist/resilience/degradation-manager.js +164 -1
- package/packages/client/dist/resilience/freshness-indicator.js +100 -1
- package/packages/client/dist/resilience/index.js +8 -1
- package/packages/client/dist/resilience/recovery-detector.js +74 -1
- package/packages/client/dist/resolvers/asset-resolver.js +13 -0
- package/packages/client/dist/resolvers/local-resolver.js +255 -8
- package/packages/client/dist/resolvers/remote-resolver.js +233 -1
- package/packages/client/dist/runner/binary.js +404 -1
- package/packages/client/dist/runner/cli.js +1571 -17
- package/packages/client/dist/runner/headless/adapters.js +49 -1
- package/packages/client/dist/runner/headless/claude-code-adapter.js +79 -1
- package/packages/client/dist/runner/headless/continuous-story-workspace.js +1628 -11
- package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.js +69 -1
- package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +110 -2
- package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +1236 -8
- package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +318 -2
- package/packages/client/dist/runner/headless/fake-adapter.js +62 -1
- package/packages/client/dist/runner/headless/managed-profile.js +132 -1
- package/packages/client/dist/runner/headless/opencode-adapter.js +145 -2
- package/packages/client/dist/runner/headless/prepared-story-bundle.js +43 -1
- package/packages/client/dist/runner/headless/resolver.js +231 -1
- package/packages/client/dist/runner/headless/run-yolo.js +885 -1
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +4 -1
- package/packages/client/dist/runner/headless/run-yoloop.js +2574 -2
- package/packages/client/dist/runner/headless/types.js +574 -2
- package/packages/client/dist/runner/local-console.js +396 -13
- package/packages/client/dist/runner/portal-sync-worker.js +1487 -1
- package/packages/client/dist/runner/project-identity.js +106 -1
- package/packages/client/dist/runner/scheduler.js +995 -7
- package/packages/client/dist/runner-cli.js +18 -2
- package/packages/client/dist/state/invocation-shape.js +13 -1
- package/packages/client/dist/state/project-state-snapshot.js +1677 -1
- package/packages/client/dist/state/state-json-repair.js +785 -3
- package/packages/client/dist/state/structural-dag-projection.js +118 -1
- package/packages/client/dist/telemetry/index.js +5 -1
- package/packages/client/dist/telemetry/offline-queue.js +131 -1
- package/packages/client/dist/tier/index.js +5 -1
- package/packages/client/dist/tier/tier-aware-client.js +405 -1
- package/packages/client/dist/types/index.js +38 -1
- package/packages/client/dist/version.js +27 -1
- package/packages/client/dist/yolo/change-evidence-collector.js +126 -1
- package/packages/client/dist/yolo/invoke-envelope-capability.js +62 -1
- package/packages/client/dist/yolo/spec-envelope-collector.js +185 -5
- package/packages/client/dist/yoloop/discovery-hook.js +300 -2
- package/packages/client/dist/yoloop/index.js +8 -1
- package/packages/client/dist/yoloop/invoke-hooks.js +669 -12
- package/packages/client/dist/yoloop/shared-discover-epics.js +1007 -1
- package/packages/client/dist/yoloop/shared-yoloop-types.js +33 -1
- package/packages/client/dist/yoloop/target-normalization.js +180 -1
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1723 -1
- package/packages/shared/dist/compatibility/index.js +476 -0
- package/packages/shared/dist/yoloop/release-blocked.js +653 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +3 -2
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +5 -5
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +8 -9
- package/targets-stubs/codex/AGENTS.md +3 -3
- package/targets-stubs/cursor/agent.md +4 -3
- package/targets-stubs/gemini-cli/agent.md +5 -4
- package/targets-stubs/opencode/neocortex-root.md +3 -3
- package/targets-stubs/vscode/neocortex.agent.md +5 -4
|
@@ -1,3 +1,156 @@
|
|
|
1
|
-
import{createHash
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstatSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { getProjectMemoryTarget, isProjectMemoryTargetId, listProjectMemoryTargets } from '../memory/shared-project-memory-types.js';
|
|
5
|
+
import { writeProjectMemoryTargetFiles } from '../memory/project-memory-writer.js';
|
|
6
|
+
function parseCsv(value) {
|
|
7
|
+
return (value ?? '').split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
8
|
+
}
|
|
9
|
+
export function parseRefreshMemoryArgs(args) {
|
|
10
|
+
let projectRoot = process.cwd();
|
|
11
|
+
let dryRun = false;
|
|
12
|
+
let verify = false;
|
|
13
|
+
const requestedTargets = [];
|
|
14
|
+
const memoryNotes = [];
|
|
15
|
+
for (let index = 0; index < args.length; index++) {
|
|
16
|
+
const arg = args[index];
|
|
17
|
+
if (arg === '--dry-run' || arg === '--preview') {
|
|
18
|
+
dryRun = true;
|
|
19
|
+
}
|
|
20
|
+
else if (arg === '--verify') {
|
|
21
|
+
verify = true;
|
|
22
|
+
dryRun = true;
|
|
23
|
+
}
|
|
24
|
+
else if (arg === '--project-root') {
|
|
25
|
+
projectRoot = args[++index] ?? projectRoot;
|
|
26
|
+
}
|
|
27
|
+
else if (arg.startsWith('--project-root=')) {
|
|
28
|
+
projectRoot = arg.slice('--project-root='.length);
|
|
29
|
+
}
|
|
30
|
+
else if (arg === '--target' || arg === '--targets') {
|
|
31
|
+
requestedTargets.push(...parseCsv(args[++index]));
|
|
32
|
+
}
|
|
33
|
+
else if (arg.startsWith('--target=')) {
|
|
34
|
+
requestedTargets.push(...parseCsv(arg.slice('--target='.length)));
|
|
35
|
+
}
|
|
36
|
+
else if (arg.startsWith('--targets=')) {
|
|
37
|
+
requestedTargets.push(...parseCsv(arg.slice('--targets='.length)));
|
|
38
|
+
}
|
|
39
|
+
else if (arg === '--note' || arg === '--memory-note' || arg === '--change') {
|
|
40
|
+
const note = args[++index];
|
|
41
|
+
if (note)
|
|
42
|
+
memoryNotes.push(note);
|
|
43
|
+
}
|
|
44
|
+
else if (arg.startsWith('--note=')) {
|
|
45
|
+
memoryNotes.push(arg.slice('--note='.length));
|
|
46
|
+
}
|
|
47
|
+
else if (arg.startsWith('--memory-note=')) {
|
|
48
|
+
memoryNotes.push(arg.slice('--memory-note='.length));
|
|
49
|
+
}
|
|
50
|
+
else if (arg.startsWith('--change=')) {
|
|
51
|
+
memoryNotes.push(arg.slice('--change='.length));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (verify && (requestedTargets.length > 0 || memoryNotes.length > 0)) {
|
|
55
|
+
throw new Error('Project memory verification requires all targets and no update notes.');
|
|
56
|
+
}
|
|
57
|
+
const targetIds = requestedTargets.length > 0
|
|
58
|
+
? requestedTargets.map((target) => {
|
|
59
|
+
if (!isProjectMemoryTargetId(target))
|
|
60
|
+
throw new Error(`Unknown project-memory target: ${target}`);
|
|
61
|
+
return target;
|
|
62
|
+
})
|
|
63
|
+
: ['canonical', ...listProjectMemoryTargets().map((target) => target.targetId)];
|
|
64
|
+
return { projectRoot: resolve(projectRoot), targetIds: Array.from(new Set(targetIds)), dryRun, verify, memoryNotes };
|
|
65
|
+
}
|
|
66
|
+
export function refreshProjectMemoryTargets(options) {
|
|
67
|
+
return options.targetIds.map((targetId) => writeProjectMemoryTargetFiles({
|
|
68
|
+
projectRoot: options.projectRoot,
|
|
69
|
+
targetId,
|
|
70
|
+
dryRun: options.dryRun,
|
|
71
|
+
memoryNotes: options.memoryNotes ?? [],
|
|
72
|
+
backupDirectory: options.backupDirectory,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
/** Root-only, read-only physical check; this is not independent stage QA or server authority. */
|
|
76
|
+
export function verifyProjectMemoryTargets(options) {
|
|
77
|
+
if (!options.verify || !options.dryRun || options.memoryNotes?.length
|
|
78
|
+
|| options.targetIds.join(',') !== ['canonical', ...listProjectMemoryTargets().map((target) => target.targetId)].join(',')) {
|
|
79
|
+
throw new Error('Project memory verification requires the complete read-only target set.');
|
|
80
|
+
}
|
|
81
|
+
const canonicalPath = join(options.projectRoot, 'NEOCORTEX.md');
|
|
82
|
+
let entry;
|
|
83
|
+
try {
|
|
84
|
+
entry = lstatSync(canonicalPath);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error('Canonical project memory is missing or unsafe.');
|
|
88
|
+
}
|
|
89
|
+
if (!entry.isFile() || entry.isSymbolicLink())
|
|
90
|
+
throw new Error('Canonical project memory must be a regular file.');
|
|
91
|
+
const canonical = readFileSync(canonicalPath, 'utf8');
|
|
92
|
+
const start = '<!-- NEOCORTEX-MEMORY-START -->';
|
|
93
|
+
const end = '<!-- NEOCORTEX-MEMORY-END -->';
|
|
94
|
+
const budget = getProjectMemoryTarget('canonical').budget;
|
|
95
|
+
if (canonical.split(start).length !== 2 || canonical.split(end).length !== 2
|
|
96
|
+
|| canonical.indexOf(start) >= canonical.indexOf(end)
|
|
97
|
+
|| Buffer.byteLength(canonical, 'utf8') > budget.maxBytes
|
|
98
|
+
|| canonical.split('\n').length > budget.maxLines) {
|
|
99
|
+
throw new Error('Canonical project memory markers or budget are invalid.');
|
|
100
|
+
}
|
|
101
|
+
const files = refreshProjectMemoryTargets(options).flatMap((result) => result.files);
|
|
102
|
+
if (files.some((file) => file.changed || file.mode === 'compatibility-materialized-fallback'
|
|
103
|
+
|| file.fallbackReason || file.remediationDebt)) {
|
|
104
|
+
throw new Error('Project memory verification found stale or fallback targets.');
|
|
105
|
+
}
|
|
106
|
+
let projection;
|
|
107
|
+
try {
|
|
108
|
+
projection = [...new Set(files.map((file) => file.relativeFile))].sort()
|
|
109
|
+
.map((relativeFile) => {
|
|
110
|
+
const bytes = readFileSync(join(options.projectRoot, relativeFile));
|
|
111
|
+
const mode = files.find((file) => file.relativeFile === relativeFile).mode;
|
|
112
|
+
return `${relativeFile}:${mode}:${createHash('sha256').update(bytes).digest('hex')}`;
|
|
113
|
+
});
|
|
114
|
+
if (readFileSync(canonicalPath, 'utf8') !== canonical
|
|
115
|
+
|| refreshProjectMemoryTargets(options).some((result) => result.changed)) {
|
|
116
|
+
throw new Error('project-memory-verification-race');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
throw new Error('Project memory changed during verification.');
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
schemaVersion: 'ProjectMemoryVerification/1',
|
|
124
|
+
canonicalSha256: createHash('sha256').update(canonical).digest('hex'),
|
|
125
|
+
projectionSha256: createHash('sha256').update(projection.join('\n')).digest('hex'),
|
|
126
|
+
fileCount: projection.length,
|
|
127
|
+
publicSafe: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export async function refreshMemoryCliHandler(args) {
|
|
131
|
+
try {
|
|
132
|
+
const options = parseRefreshMemoryArgs(args);
|
|
133
|
+
if (options.verify) {
|
|
134
|
+
const verification = verifyProjectMemoryTargets(options);
|
|
135
|
+
console.log(`Project memory verified: files=${verification.fileCount} canonical_sha256=${verification.canonicalSha256} projection_sha256=${verification.projectionSha256}`);
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
const results = refreshProjectMemoryTargets(options);
|
|
139
|
+
const rows = results.flatMap((result) => result.files.map((file) => [
|
|
140
|
+
file.changed ? (options.dryRun ? 'would-change' : 'changed') : 'unchanged',
|
|
141
|
+
file.mode,
|
|
142
|
+
file.relativeFile,
|
|
143
|
+
file.fallbackReason ? `warning=${file.fallbackReason}` : undefined,
|
|
144
|
+
file.remediationDebt ? `debt=${file.remediationDebt}` : undefined,
|
|
145
|
+
file.reasonCodes && file.reasonCodes.length > 0 ? `reasons=${file.reasonCodes.join(',')}` : undefined,
|
|
146
|
+
].filter(Boolean).join(' ')));
|
|
147
|
+
console.log(`${options.dryRun ? 'Project memory preview' : 'Project memory refreshed'}: ${options.projectRoot}`);
|
|
148
|
+
for (const row of rows)
|
|
149
|
+
console.log(row);
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
154
|
+
return 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -1 +1,24 @@
|
|
|
1
|
-
const
|
|
1
|
+
export const ARCHITECTURE_PUBLIC_COMMANDS = Object.freeze([
|
|
2
|
+
'arch-prd', 'arch-architecture', 'arch-fitness-functions', 'arch-api-contracts', 'generate-pacts',
|
|
3
|
+
'arch-api-integrations', 'arch-database', 'arch-security', 'arch-design-system', 'arch-ux-design',
|
|
4
|
+
'arch-performance', 'arch-testing', 'arch-infrastructure', 'arch-review', 'update-memory',
|
|
5
|
+
]);
|
|
6
|
+
export const ARCHITECTURE_NON_UI_COMMANDS = Object.freeze(ARCHITECTURE_PUBLIC_COMMANDS
|
|
7
|
+
.filter(command => command !== 'arch-design-system' && command !== 'arch-ux-design'));
|
|
8
|
+
const EXCLUDED = Object.freeze(['arch-design-system', 'arch-ux-design']);
|
|
9
|
+
export function parseArchitectureNonUiScopeReceipt(value) {
|
|
10
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
11
|
+
return undefined;
|
|
12
|
+
const receipt = value;
|
|
13
|
+
if (Object.keys(receipt).sort().join(',') !== ['schemaVersion', 'kind', 'licenseHash', 'projectHash', 'targetEpicId',
|
|
14
|
+
'graphRevision', 'rootInputSha256', 'accountingId', 'applicability', 'excludedStageCommands', 'macSha256', 'publicSafe'].sort().join(',')
|
|
15
|
+
|| receipt.schemaVersion !== 1 || receipt.kind !== 'ArchitectureNonUiScope/1' || receipt.publicSafe !== true
|
|
16
|
+
|| receipt.applicability !== 'non-ui' || typeof receipt.targetEpicId !== 'string'
|
|
17
|
+
|| !/^P[1-9][0-9]{0,11}$/.test(receipt.targetEpicId) || typeof receipt.accountingId !== 'string'
|
|
18
|
+
|| !/^arch-accounting-[a-f0-9]{32}$/.test(receipt.accountingId)
|
|
19
|
+
|| !['licenseHash', 'projectHash', 'graphRevision', 'rootInputSha256', 'macSha256'].every(key => typeof receipt[key] === 'string' && /^[a-f0-9]{64}$/.test(receipt[key]))
|
|
20
|
+
|| !Array.isArray(receipt.excludedStageCommands) || receipt.excludedStageCommands.length !== EXCLUDED.length
|
|
21
|
+
|| !receipt.excludedStageCommands.every((command, index) => command === EXCLUDED[index]))
|
|
22
|
+
return undefined;
|
|
23
|
+
return Object.freeze({ ...receipt, excludedStageCommands: EXCLUDED });
|
|
24
|
+
}
|
|
@@ -1 +1,171 @@
|
|
|
1
|
-
import{readFile
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { acceptDirectYoloSetupCheckpoint, beginDirectYoloStoryCommit, finalizeDirectYoloStoryCheckpoint, issueDirectYoloSetupLeaseHandoff, prepareDirectYoloSetup, recoverLegacyDirectYoloStoryCheckpoint, } from '../git/direct-yolo-checkpoint.js';
|
|
4
|
+
import { applyDirectYoloC01Retry, inspectDirectYoloC01Retry } from '../git/direct-yolo-c01-retry.js';
|
|
5
|
+
export function parseStoryCheckpointArgs(args) {
|
|
6
|
+
const action = args[0];
|
|
7
|
+
if (action !== 'setup' && action !== 'accept-setup' && action !== 'handoff' && action !== 'begin' && action !== 'finalize' && action !== 'recover' && action !== 'retry-c01') {
|
|
8
|
+
throw new Error('story-checkpoint-action-invalid');
|
|
9
|
+
}
|
|
10
|
+
let storyId = '';
|
|
11
|
+
let projectRoot = process.cwd();
|
|
12
|
+
let commitSha;
|
|
13
|
+
let remote = 'origin';
|
|
14
|
+
let push = false;
|
|
15
|
+
let format = 'plain';
|
|
16
|
+
let setupHandoffSessionId;
|
|
17
|
+
let setupHandoffTokenFile;
|
|
18
|
+
let expectedHeadSha;
|
|
19
|
+
let apply = false;
|
|
20
|
+
for (let index = 1; index < args.length; index++) {
|
|
21
|
+
const arg = args[index];
|
|
22
|
+
const next = () => args[++index] ?? '';
|
|
23
|
+
if (arg === '--story')
|
|
24
|
+
storyId = next();
|
|
25
|
+
else if (arg.startsWith('--story='))
|
|
26
|
+
storyId = arg.slice('--story='.length);
|
|
27
|
+
else if (arg === '--project-root')
|
|
28
|
+
projectRoot = next() || projectRoot;
|
|
29
|
+
else if (arg.startsWith('--project-root='))
|
|
30
|
+
projectRoot = arg.slice('--project-root='.length);
|
|
31
|
+
else if (arg === '--commit')
|
|
32
|
+
commitSha = next();
|
|
33
|
+
else if (arg.startsWith('--commit='))
|
|
34
|
+
commitSha = arg.slice('--commit='.length);
|
|
35
|
+
else if (arg === '--remote')
|
|
36
|
+
remote = next();
|
|
37
|
+
else if (arg.startsWith('--remote='))
|
|
38
|
+
remote = arg.slice('--remote='.length);
|
|
39
|
+
else if (arg === '--push' || arg === '--require-remote')
|
|
40
|
+
push = true;
|
|
41
|
+
else if (arg === '--setup-handoff-session')
|
|
42
|
+
setupHandoffSessionId = next();
|
|
43
|
+
else if (arg.startsWith('--setup-handoff-session='))
|
|
44
|
+
setupHandoffSessionId = arg.slice('--setup-handoff-session='.length);
|
|
45
|
+
else if (arg === '--setup-handoff-token-file')
|
|
46
|
+
setupHandoffTokenFile = next();
|
|
47
|
+
else if (arg.startsWith('--setup-handoff-token-file='))
|
|
48
|
+
setupHandoffTokenFile = arg.slice('--setup-handoff-token-file='.length);
|
|
49
|
+
else if (arg === '--expected-head')
|
|
50
|
+
expectedHeadSha = next();
|
|
51
|
+
else if (arg.startsWith('--expected-head='))
|
|
52
|
+
expectedHeadSha = arg.slice('--expected-head='.length);
|
|
53
|
+
else if (arg === '--apply')
|
|
54
|
+
apply = true;
|
|
55
|
+
else if (arg === '--format') {
|
|
56
|
+
const value = next();
|
|
57
|
+
if (value !== 'json' && value !== 'plain')
|
|
58
|
+
throw new Error('story-checkpoint-format-invalid');
|
|
59
|
+
format = value;
|
|
60
|
+
}
|
|
61
|
+
else if (arg.startsWith('--format=')) {
|
|
62
|
+
const value = arg.slice('--format='.length);
|
|
63
|
+
if (value !== 'json' && value !== 'plain')
|
|
64
|
+
throw new Error('story-checkpoint-format-invalid');
|
|
65
|
+
format = value;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw new Error('story-checkpoint-argument-invalid');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!storyId)
|
|
72
|
+
throw new Error('story-checkpoint-story-required');
|
|
73
|
+
if (action === 'recover' && !commitSha)
|
|
74
|
+
throw new Error('story-checkpoint-commit-required');
|
|
75
|
+
if (action === 'recover' && !push)
|
|
76
|
+
throw new Error('story-checkpoint-remote-proof-required');
|
|
77
|
+
if (action === 'finalize' && !push)
|
|
78
|
+
throw new Error('story-checkpoint-push-required');
|
|
79
|
+
if (action === 'begin' && (commitSha || push || remote !== 'origin'))
|
|
80
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
81
|
+
if ((action === 'setup' || action === 'accept-setup' || action === 'handoff') && (commitSha || push || remote !== 'origin')) {
|
|
82
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
83
|
+
}
|
|
84
|
+
if (action === 'finalize' && commitSha)
|
|
85
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
86
|
+
if ((setupHandoffSessionId === undefined) !== (setupHandoffTokenFile === undefined)) {
|
|
87
|
+
throw new Error('story-checkpoint-setup-handoff-incomplete');
|
|
88
|
+
}
|
|
89
|
+
if (action !== 'begin' && (setupHandoffSessionId || setupHandoffTokenFile)) {
|
|
90
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
91
|
+
}
|
|
92
|
+
if (action !== 'retry-c01' && (expectedHeadSha || apply))
|
|
93
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
94
|
+
if (action === 'retry-c01' && (commitSha || push || remote !== 'origin'
|
|
95
|
+
|| apply && !/^[a-f0-9]{40,64}$/.test(expectedHeadSha ?? '')))
|
|
96
|
+
throw new Error('story-checkpoint-option-invalid');
|
|
97
|
+
return {
|
|
98
|
+
action, storyId, projectRoot: resolve(projectRoot), commitSha, remote, push, format,
|
|
99
|
+
...(expectedHeadSha ? { expectedHeadSha } : {}), ...(apply ? { apply } : {}),
|
|
100
|
+
...(setupHandoffSessionId ? { setupHandoffSessionId } : {}),
|
|
101
|
+
...(setupHandoffTokenFile ? { setupHandoffTokenFile: resolve(setupHandoffTokenFile) } : {}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export async function storyCheckpointCliHandler(args) {
|
|
105
|
+
let options;
|
|
106
|
+
try {
|
|
107
|
+
options = parseStoryCheckpointArgs(args);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error(error instanceof Error ? error.message : 'story-checkpoint-arguments-invalid');
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
if (options.action === 'retry-c01') {
|
|
114
|
+
try {
|
|
115
|
+
const result = options.apply
|
|
116
|
+
? await applyDirectYoloC01Retry(options.projectRoot, options.storyId, options.expectedHeadSha)
|
|
117
|
+
: await inspectDirectYoloC01Retry(options.projectRoot, options.storyId);
|
|
118
|
+
console.log(options.format === 'json' ? JSON.stringify(result, null, 2)
|
|
119
|
+
: `story-checkpoint retry-c01: ${options.apply ? 'committed' : 'eligible'}`);
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error(error instanceof Error ? error.message : 'direct-yolo-retry-unverified');
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
let setupLeaseHandoff;
|
|
128
|
+
if (options.setupHandoffSessionId && options.setupHandoffTokenFile) {
|
|
129
|
+
try {
|
|
130
|
+
setupLeaseHandoff = {
|
|
131
|
+
sessionId: options.setupHandoffSessionId,
|
|
132
|
+
token: (await readFile(options.setupHandoffTokenFile, 'utf8')).trim(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
console.error('story-checkpoint-setup-handoff-read-failed');
|
|
137
|
+
return 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const result = options.action === 'setup'
|
|
141
|
+
? await prepareDirectYoloSetup(options)
|
|
142
|
+
: options.action === 'accept-setup'
|
|
143
|
+
? await acceptDirectYoloSetupCheckpoint(options)
|
|
144
|
+
: options.action === 'handoff'
|
|
145
|
+
? await issueDirectYoloSetupLeaseHandoff(options)
|
|
146
|
+
: options.action === 'begin'
|
|
147
|
+
? await beginDirectYoloStoryCommit({ ...options, ...(setupLeaseHandoff ? { setupLeaseHandoff } : {}) })
|
|
148
|
+
: options.action === 'finalize'
|
|
149
|
+
? await finalizeDirectYoloStoryCheckpoint(options)
|
|
150
|
+
: await recoverLegacyDirectYoloStoryCheckpoint({
|
|
151
|
+
...options,
|
|
152
|
+
commitSha: options.commitSha,
|
|
153
|
+
});
|
|
154
|
+
if (options.format === 'json') {
|
|
155
|
+
console.log(JSON.stringify({ action: options.action, ...result }, null, 2));
|
|
156
|
+
}
|
|
157
|
+
else if (result.ok) {
|
|
158
|
+
console.log(`story-checkpoint ${options.action}: ok`);
|
|
159
|
+
if (options.action === 'begin' && 'trailers' in result.value) {
|
|
160
|
+
for (const trailer of result.value.trailers)
|
|
161
|
+
console.log(trailer);
|
|
162
|
+
}
|
|
163
|
+
else if ('headSha' in result.value) {
|
|
164
|
+
console.log(`head=${result.value.headSha}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.error(`story-checkpoint ${options.action}: ${result.reasonCode}`);
|
|
169
|
+
}
|
|
170
|
+
return result.ok ? 0 : 1;
|
|
171
|
+
}
|
|
@@ -1 +1,13 @@
|
|
|
1
|
-
import{homedir
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { basename, isAbsolute, join, normalize } from 'node:path';
|
|
3
|
+
/** Explicit isolated profile for local integration runs; the default remains unchanged. */
|
|
4
|
+
export function neocortexProfileDirectory() {
|
|
5
|
+
const override = process.env.NEOCORTEX_PROFILE_DIR;
|
|
6
|
+
if (override === undefined)
|
|
7
|
+
return join(homedir(), '.neocortex');
|
|
8
|
+
const normalized = normalize(override);
|
|
9
|
+
if (!isAbsolute(override) || /[\r\n\0]/.test(override) || basename(normalized) !== '.neocortex') {
|
|
10
|
+
throw new Error('neocortex-profile-dir-invalid');
|
|
11
|
+
}
|
|
12
|
+
return normalized;
|
|
13
|
+
}
|