@ornexus/neocortex 4.60.22 → 4.60.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/sbom.cdx.json +24 -24
  2. package/install.js +67 -10
  3. package/install.ps1 +39 -8
  4. package/install.sh +18 -6
  5. package/package.json +9 -3
  6. package/packages/client/dist/adapters/adapter-registry.d.ts +2 -2
  7. package/packages/client/dist/adapters/adapter-registry.js +1 -1
  8. package/packages/client/dist/adapters/grok-adapter.d.ts +11 -0
  9. package/packages/client/dist/adapters/grok-adapter.js +2 -0
  10. package/packages/client/dist/adapters/index.d.ts +1 -0
  11. package/packages/client/dist/adapters/index.js +1 -1
  12. package/packages/client/dist/adapters/platform-detector.d.ts +1 -1
  13. package/packages/client/dist/adapters/platform-detector.js +1 -1
  14. package/packages/client/dist/agent/refresh-stubs.js +2 -2
  15. package/packages/client/dist/cli.js +21 -2
  16. package/packages/client/dist/commands/invoke.d.ts +39 -26
  17. package/packages/client/dist/commands/invoke.js +56 -50
  18. package/packages/client/dist/commands/story-checkpoint.d.ts +15 -0
  19. package/packages/client/dist/commands/story-checkpoint.js +1 -0
  20. package/packages/client/dist/config.js +1 -1
  21. package/packages/client/dist/continuity/invoke-hooks.js +1 -1
  22. package/packages/client/dist/fs/atomic-state-replace.d.ts +16 -0
  23. package/packages/client/dist/fs/atomic-state-replace.js +1 -0
  24. package/packages/client/dist/generated/command-registry.generated.d.ts +51 -51
  25. package/packages/client/dist/generated/command-registry.generated.js +1 -1
  26. package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +67 -0
  27. package/packages/client/dist/git/direct-yolo-checkpoint.js +3 -0
  28. package/packages/client/dist/git/git-lifecycle-store.d.ts +198 -0
  29. package/packages/client/dist/git/git-lifecycle-store.js +4 -0
  30. package/packages/client/dist/git/secure-filesystem-boundary.d.ts +26 -0
  31. package/packages/client/dist/git/secure-filesystem-boundary.js +123 -0
  32. package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +11 -0
  33. package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -1
  34. package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +1 -1
  35. package/packages/client/dist/index.d.ts +2 -0
  36. package/packages/client/dist/index.js +1 -1
  37. package/packages/client/dist/invocation/invoke-input.d.ts +9 -0
  38. package/packages/client/dist/invocation/invoke-input.js +1 -0
  39. package/packages/client/dist/memory/shared-project-memory-types.d.ts +29 -2
  40. package/packages/client/dist/memory/shared-project-memory-types.js +2 -2
  41. package/packages/client/dist/migrations/project-identity-capability.d.ts +13 -0
  42. package/packages/client/dist/migrations/project-identity-capability.js +1 -0
  43. package/packages/client/dist/migrations/project-identity.d.ts +41 -0
  44. package/packages/client/dist/migrations/project-identity.js +7 -0
  45. package/packages/client/dist/policy/subagent-approval-policy.js +1 -1
  46. package/packages/client/dist/runner/headless/continuous-story-workspace.d.ts +131 -0
  47. package/packages/client/dist/runner/headless/continuous-story-workspace.js +58 -0
  48. package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.d.ts +23 -0
  49. package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.js +1 -0
  50. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +15 -0
  51. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +28 -0
  52. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +12 -0
  53. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +8 -0
  54. package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +134 -0
  55. package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -0
  56. package/packages/client/dist/runner/headless/prepared-story-bundle.js +1 -1
  57. package/packages/client/dist/runner/headless/run-yolo.js +1 -1
  58. package/packages/client/dist/runner/headless/run-yoloop.d.ts +7 -2
  59. package/packages/client/dist/runner/headless/run-yoloop.js +8 -1
  60. package/packages/client/dist/runner/headless/types.d.ts +1 -1
  61. package/packages/client/dist/runner/headless/types.js +2 -2
  62. package/packages/client/dist/state/invocation-shape.d.ts +9 -0
  63. package/packages/client/dist/state/invocation-shape.js +1 -0
  64. package/packages/client/dist/state/project-state-snapshot.d.ts +9 -3
  65. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  66. package/packages/client/dist/state/state-json-repair.d.ts +9 -0
  67. package/packages/client/dist/state/state-json-repair.js +3 -3
  68. package/packages/client/dist/state/structural-dag-projection.d.ts +24 -0
  69. package/packages/client/dist/state/structural-dag-projection.js +1 -0
  70. package/packages/client/dist/tier/tier-aware-client.js +1 -1
  71. package/packages/client/dist/yoloop/invoke-hooks.d.ts +13 -10
  72. package/packages/client/dist/yoloop/invoke-hooks.js +8 -5
  73. package/packages/client/dist/yoloop/shared-discover-epics.js +1 -1
  74. package/packages/shared/dist/generated/command-registry.generated.js +64 -65
  75. package/packages/shared/dist/generated/invocation-schema.generated.js +16 -24
  76. package/packages/shared/dist/invocation/index.d.ts +6 -2
  77. package/packages/shared/dist/invocation/index.js +5 -0
  78. package/packages/shared/dist/invocation/input-envelope.d.ts +37 -0
  79. package/packages/shared/dist/invocation/input-envelope.js +98 -0
  80. package/packages/shared/dist/invocation/project-identity-migration.d.ts +28 -0
  81. package/packages/shared/dist/invocation/project-identity-migration.js +83 -0
  82. package/packages/shared/dist/invocation/public-diagnostics.d.ts +87 -0
  83. package/packages/shared/dist/invocation/public-diagnostics.js +181 -0
  84. package/packages/shared/dist/invocation/state-projection.d.ts +21 -0
  85. package/packages/shared/dist/invocation/state-projection.js +1 -0
  86. package/packages/shared/dist/invocation/strict-effect-receipt.d.ts +12 -0
  87. package/packages/shared/dist/invocation/strict-effect-receipt.js +43 -0
  88. package/packages/shared/dist/yoloop/epic-terminal-git.js +227 -0
  89. package/packages/shared/dist/yoloop/planning-graph.js +119 -0
  90. package/packages/shared/dist/yoloop/public-story-write-set.js +27 -0
  91. package/packages/shared/dist/yoloop/wave-decision-receipt.js +19 -0
  92. package/targets-stubs/antigravity/gemini.md +1 -1
  93. package/targets-stubs/antigravity/neocortex.md +18 -0
  94. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  95. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  96. package/targets-stubs/claude-code/neocortex-root.md +21 -2
  97. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  98. package/targets-stubs/claude-code/neocortex.md +2 -2
  99. package/targets-stubs/codex/AGENTS.md +20 -1
  100. package/targets-stubs/cursor/agent.md +20 -2
  101. package/targets-stubs/gemini-cli/agent.md +2 -2
  102. package/targets-stubs/gemini-cli/gemini.md +18 -0
  103. package/targets-stubs/grok/README.md +13 -0
  104. package/targets-stubs/grok/SKILL.md +50 -0
  105. package/targets-stubs/grok/config-mcp.toml +22 -0
  106. package/targets-stubs/grok/install-grok.sh +31 -0
  107. package/targets-stubs/kimi/neocortex.md +18 -0
  108. package/targets-stubs/openclaw/SKILL.md +18 -0
  109. package/targets-stubs/opencode/neocortex-root.md +20 -1
  110. package/targets-stubs/vscode/neocortex.agent.md +20 -2
@@ -0,0 +1,15 @@
1
+ type StoryCheckpointAction = 'handoff' | 'begin' | 'finalize' | 'recover';
2
+ interface StoryCheckpointCliOptions {
3
+ readonly action: StoryCheckpointAction;
4
+ readonly storyId: string;
5
+ readonly projectRoot: string;
6
+ readonly commitSha?: string;
7
+ readonly remote: string;
8
+ readonly push: boolean;
9
+ readonly format: 'json' | 'plain';
10
+ readonly setupHandoffSessionId?: string;
11
+ readonly setupHandoffTokenFile?: string;
12
+ }
13
+ export declare function parseStoryCheckpointArgs(args: readonly string[]): StoryCheckpointCliOptions;
14
+ export declare function storyCheckpointCliHandler(args: readonly string[]): Promise<number>;
15
+ export {};
@@ -0,0 +1 @@
1
+ import{readFile as m}from"node:fs/promises";import{resolve as u}from"node:path";import{beginDirectYoloStoryCommit as k,finalizeDirectYoloStoryCheckpoint as w,issueDirectYoloSetupLeaseHandoff as y,recoverLegacyDirectYoloStoryCheckpoint as g}from"../git/direct-yolo-checkpoint.js";function v(a){const e=a[0];if(e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover")throw new Error("story-checkpoint-action-invalid");let i="",t=process.cwd(),r,h="origin",f=!1,d="plain",l,c;for(let p=1;p<a.length;p++){const o=a[p],n=()=>a[++p]??"";if(o==="--story")i=n();else if(o.startsWith("--story="))i=o.slice(8);else if(o==="--project-root")t=n()||t;else if(o.startsWith("--project-root="))t=o.slice(15);else if(o==="--commit")r=n();else if(o.startsWith("--commit="))r=o.slice(9);else if(o==="--remote")h=n();else if(o.startsWith("--remote="))h=o.slice(9);else if(o==="--push"||o==="--require-remote")f=!0;else if(o==="--setup-handoff-session")l=n();else if(o.startsWith("--setup-handoff-session="))l=o.slice(24);else if(o==="--setup-handoff-token-file")c=n();else if(o.startsWith("--setup-handoff-token-file="))c=o.slice(27);else if(o==="--format"){const s=n();if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else if(o.startsWith("--format=")){const s=o.slice(9);if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else throw new Error("story-checkpoint-argument-invalid")}if(!i)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!r)throw new Error("story-checkpoint-commit-required");if(e==="recover"&&!f)throw new Error("story-checkpoint-remote-proof-required");if(e==="finalize"&&!f)throw new Error("story-checkpoint-push-required");if(e==="begin"&&(r||f||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="handoff"&&(r||f||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&r)throw new Error("story-checkpoint-option-invalid");if(l===void 0!=(c===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(l||c))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:i,projectRoot:u(t),commitSha:r,remote:h,push:f,format:d,...l?{setupHandoffSessionId:l}:{},...c?{setupHandoffTokenFile:u(c)}:{}}}async function j(a){let e;try{e=v(a)}catch(r){return console.error(r instanceof Error?r.message:"story-checkpoint-arguments-invalid"),1}let i;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{i={sessionId:e.setupHandoffSessionId,token:(await m(e.setupHandoffTokenFile,"utf8")).trim()}}catch{return console.error("story-checkpoint-setup-handoff-read-failed"),1}const t=e.action==="handoff"?await y(e):e.action==="begin"?await k({...e,...i?{setupLeaseHandoff:i}:{}}):e.action==="finalize"?await w(e):await g({...e,commitSha:e.commitSha});if(e.format==="json")console.log(JSON.stringify({action:e.action,...t},null,2));else if(t.ok)if(console.log(`story-checkpoint ${e.action}: ok`),e.action==="begin"&&"trailers"in t.value)for(const r of t.value.trailers)console.log(r);else"headSha"in t.value&&console.log(`head=${t.value.headSha}`);else console.error(`story-checkpoint ${e.action}: ${t.reasonCode}`);return t.ok?0:1}export{v as parseStoryCheckpointArgs,j as storyCheckpointCliHandler};
@@ -1,2 +1,2 @@
1
- import{existsSync as y,mkdirSync as w,readFileSync as O,renameSync as C,unlinkSync as M,writeFileSync as T}from"node:fs";import{homedir as R}from"node:os";import{dirname as _,join as F}from"node:path";import{SUBAGENT_APPROVAL_MANAGED_DEFAULT as h,SUBAGENT_APPROVAL_EVIDENCE as k,SUBAGENT_APPROVAL_POLICY_SCHEMA_VERSION as c,createSubagentApprovalAuditEvent as l,isSubagentApprovalMode as d,resolveSubagentApprovalPolicy as E}from"./policy/subagent-approval-policy.js";import{setSecureDirPermissions as V,setSecureFilePermissions as b}from"./config/secure-config.js";const u="subagentApprovalPolicy",g="subagentApprovalPolicyAudit",x=25,N=new Set(["managed-default-materialized","user-override-updated","user-override-reset"]),D=new Set(["managed-default","user-override"]),L=new Set(["child","session","global","inherited","none"]),I=new Set(["requested-mode-honored","host-policy-reduced","host-capability-unvalidated","host-capability-unsupported","platform-target-unknown"]),U=new Set(["none","root-inline","shell-loop"]),j=new Set(["claude-code","opencode","codex","gemini","vscode","github-copilot-cli","kimi","cursor","antigravity","openclaw","runner","unknown"]);class i extends Error{reasonCode;constructor(e,t){super(t),this.reasonCode=e,this.name="ApprovalPolicyConfigError"}}function P(r){return r.configFilePath??F(R(),".neocortex","config.json")}function p(r){const e=P(r);if(!y(e))return{};try{const t=JSON.parse(O(e,"utf8").replace(/^\uFEFF/,""));if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Config root must be an object");return t}catch(t){throw t instanceof i?t:new i("approval-config-invalid","Neocortex config is not valid JSON; approval policy was not changed.")}}function f(r){const e=r[u];if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e))throw new i("approval-config-invalid","Stored subagent approval policy is invalid.");const t=e;if(t.schemaVersion!==c)throw new i("approval-policy-schema-unsupported","Stored subagent approval policy schema is not supported.");if(t.userOverride!==void 0&&!d(t.userOverride))throw new i("approval-policy-mode-invalid","Stored subagent approval mode is invalid.");return t}function s(r,e){const t=f(r);return E({userOverride:t?.userOverride,hostPolicy:e.hostPolicy,platformTarget:e.platformTarget})}function v(r,e){const t=Array.isArray(r[g])?r[g].map(q).filter(n=>n!==null):[];r[g]=[...t,e].slice(-x)}function q(r){if(!r||typeof r!="object"||Array.isArray(r))return null;const e=r;if(e.evidence!==k||e.schemaVersion!==c||!N.has(String(e.event))||!d(e.requestedMode)||!d(e.effectiveMode)||!D.has(String(e.source))||!j.has(String(e.platformTarget))||!L.has(String(e.scope))||!I.has(String(e.effectiveReason))||typeof e.occurredAt!="string"||!Number.isFinite(Date.parse(e.occurredAt)))return null;const t=E({userOverride:e.requestedMode,platformTarget:String(e.platformTarget)}),n=U.has(String(e.fallbackMode))?e.fallbackMode:t.fallbackMode,o=e.fallbackReasonCode===null||typeof e.fallbackReasonCode=="string"?e.fallbackReasonCode:t.fallbackReasonCode;return l(e.event,{schemaVersion:c,requestedMode:e.requestedMode,effectiveMode:e.effectiveMode,source:e.source,platformTarget:e.platformTarget,scope:e.scope,effectiveReason:e.effectiveReason,fallbackMode:n,fallbackReasonCode:o},e.occurredAt)}function A(r,e){const t=P(e),n=_(t),o=`${t}.tmp`;w(n,{recursive:!0}),V(n);try{T(o,`${JSON.stringify(r,null,2)}
1
+ import{existsSync as y,mkdirSync as w,readFileSync as O,renameSync as C,unlinkSync as M,writeFileSync as T}from"node:fs";import{homedir as R}from"node:os";import{dirname as _,join as k}from"node:path";import{SUBAGENT_APPROVAL_MANAGED_DEFAULT as h,SUBAGENT_APPROVAL_EVIDENCE as F,SUBAGENT_APPROVAL_POLICY_SCHEMA_VERSION as c,createSubagentApprovalAuditEvent as l,isSubagentApprovalMode as d,resolveSubagentApprovalPolicy as E}from"./policy/subagent-approval-policy.js";import{setSecureDirPermissions as V,setSecureFilePermissions as b}from"./config/secure-config.js";const u="subagentApprovalPolicy",g="subagentApprovalPolicyAudit",x=25,N=new Set(["managed-default-materialized","user-override-updated","user-override-reset"]),D=new Set(["managed-default","user-override"]),L=new Set(["child","session","global","inherited","none"]),I=new Set(["requested-mode-honored","host-policy-reduced","host-capability-unvalidated","host-capability-unsupported","platform-target-unknown"]),U=new Set(["none","root-inline","shell-loop"]),j=new Set(["claude-code","opencode","codex","gemini","vscode","github-copilot-cli","kimi","cursor","antigravity","openclaw","grok","runner","unknown"]);class i extends Error{reasonCode;constructor(e,t){super(t),this.reasonCode=e,this.name="ApprovalPolicyConfigError"}}function P(r){return r.configFilePath??k(R(),".neocortex","config.json")}function p(r){const e=P(r);if(!y(e))return{};try{const t=JSON.parse(O(e,"utf8").replace(/^\uFEFF/,""));if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Config root must be an object");return t}catch(t){throw t instanceof i?t:new i("approval-config-invalid","Neocortex config is not valid JSON; approval policy was not changed.")}}function f(r){const e=r[u];if(e===void 0)return;if(!e||typeof e!="object"||Array.isArray(e))throw new i("approval-config-invalid","Stored subagent approval policy is invalid.");const t=e;if(t.schemaVersion!==c)throw new i("approval-policy-schema-unsupported","Stored subagent approval policy schema is not supported.");if(t.userOverride!==void 0&&!d(t.userOverride))throw new i("approval-policy-mode-invalid","Stored subagent approval mode is invalid.");return t}function s(r,e){const t=f(r);return E({userOverride:t?.userOverride,hostPolicy:e.hostPolicy,platformTarget:e.platformTarget})}function v(r,e){const t=Array.isArray(r[g])?r[g].map(q).filter(n=>n!==null):[];r[g]=[...t,e].slice(-x)}function q(r){if(!r||typeof r!="object"||Array.isArray(r))return null;const e=r;if(e.evidence!==F||e.schemaVersion!==c||!N.has(String(e.event))||!d(e.requestedMode)||!d(e.effectiveMode)||!D.has(String(e.source))||!j.has(String(e.platformTarget))||!L.has(String(e.scope))||!I.has(String(e.effectiveReason))||typeof e.occurredAt!="string"||!Number.isFinite(Date.parse(e.occurredAt)))return null;const t=E({userOverride:e.requestedMode,platformTarget:String(e.platformTarget)}),n=U.has(String(e.fallbackMode))?e.fallbackMode:t.fallbackMode,o=e.fallbackReasonCode===null||typeof e.fallbackReasonCode=="string"?e.fallbackReasonCode:t.fallbackReasonCode;return l(e.event,{schemaVersion:c,requestedMode:e.requestedMode,effectiveMode:e.effectiveMode,source:e.source,platformTarget:e.platformTarget,scope:e.scope,effectiveReason:e.effectiveReason,fallbackMode:n,fallbackReasonCode:o},e.occurredAt)}function A(r,e){const t=P(e),n=_(t),o=`${t}.tmp`;w(n,{recursive:!0}),V(n);try{T(o,`${JSON.stringify(r,null,2)}
2
2
  `,"utf8"),b(o),C(o,t),b(t)}catch(a){try{y(o)&&M(o)}catch{}throw a}}function S(r){return(r.now?.()??new Date).toISOString()}function K(r={}){return{resolution:s(p(r),r)}}function $(r={}){const e=p(r);if(f(e))return{resolution:s(e,r)};const n=S(r);e[u]={schemaVersion:c,managedDefault:h,updatedAt:n};const o=s(e,r),a=l("managed-default-materialized",o,n);return v(e,a),A(e,r),{resolution:o,auditEvent:a}}function H(r,e={}){if(!d(r))throw new i("approval-policy-mode-invalid","Requested subagent approval mode is invalid.");const t=p(e),n=f(t),o=S(e);t[u]={...n??{},schemaVersion:c,managedDefault:h,userOverride:r,updatedAt:o};const a=s(t,e),m=l("user-override-updated",a,o);return v(t,m),A(t,e),{resolution:a,auditEvent:m}}function X(r={}){const e=p(r);f(e),delete e[u];const t=S(r),n=s(e,r),o=l("user-override-reset",n,t);return v(e,o),A(e,r),{resolution:n,auditEvent:o}}export{i as ApprovalPolicyConfigError,$ as ensureManagedSubagentApprovalPolicy,K as getSubagentApprovalPolicy,X as resetSubagentApprovalMode,H as setSubagentApprovalMode};
@@ -1 +1 @@
1
- import{CONTINUITY_CLIENT_REASON_CODES as u,ContinuityClientStateStoreError as I,continuitySqliteExists as l,createContinuityHardStopSnapshot as O,openContinuityClientStateStore as c}from"./continuity-client-state-store.js";import{buildAutonomousGovernanceEnvelope as C,parseAutonomousInvokeIntent as S}from"./autonomous-governance.js";import{RUNNER_BOOTSTRAP_POLICY_REASON_CODES as b,classifyRunnerBootstrapPolicy as D,classifyRunnerBootstrapPolicyFromArgs as N,parseRunnerBootstrapCommandIntent as L}from"./runner-bootstrap-policy.js";import{parseRunnerBootstrapCommandIntent as E}from"./runner-bootstrap-policy.js";import{StrictReadOnlyError as y}from"../../../shared/dist/strict-readonly.js";function f(e){return E(e).kind!=="unknown"||S(e)!==null}async function A(e,r,o,i){const n=S(e),s=n!==null||f(e)||l(r);if(!(!s&&!i))try{const t=i?await i.executeAsync({phase:"client-preflight",domain:"client-persistence",category:"continuity-store",operation:"create"},async()=>s?{kind:"writable",store:await c({projectRoot:r,now:()=>o??new Date().toISOString()})}:{kind:"skipped"},async()=>{try{return{kind:"readonly",store:await c({projectRoot:r,now:()=>o??new Date().toISOString(),strictReadOnly:!0})}}catch{throw new y("readonly-physical-boundary-unsafe","boundary")}}):{kind:"writable",store:await c({projectRoot:r,now:()=>o??new Date().toISOString()})};if(t.kind==="skipped")return;if(t.kind==="readonly")try{return t.store.collectSnapshot({nowIso:o})}finally{t.store.close()}const a=t.store;try{if(n){const d=o??new Date().toISOString(),p=C(n);return i?i.execute({phase:"client-preflight",domain:"client-persistence",category:"continuity-store",operation:"create"},()=>a.recordAutonomousGovernance(p,d),()=>{}):a.recordAutonomousGovernance(p,d),{...a.collectSnapshot({nowIso:d}),autonomousGovernance:p}}return a.collectSnapshot({nowIso:o})}finally{a.close()}}catch(t){if(t instanceof y)throw t;const a=m(t);return f(e)||l(r)?O(a,o??new Date().toISOString()):void 0}}async function _(e,r){const o=e?.continuityStateUpdate;if(!o)return{ok:!0,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:[u.OK],publicSafe:!0};let i;try{i=await c({projectRoot:r});const n=i.applyStateUpdate(o);return{ok:!0,appliedOperationIds:n.appliedOperationIds,ignoredOperationIds:n.ignoredOperationIds,reasonCodes:n.reasonCodes,publicSafe:!0}}catch(n){const s=m(n),t=n instanceof Error?n.message:String(n);return{ok:!1,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:s,error:t,publicSafe:!0}}finally{i?.close()}}function m(e){if(e instanceof I)return e.reasonCodes;const r=e instanceof Error?e.message:String(e);return/sqlite-adapter-unavailable/i.test(r)?[u.SQLITE_ADAPTER_UNAVAILABLE]:/integrity|corrupt|malformed|not a database/i.test(r)?[u.SQLITE_INTEGRITY_FAILED]:[u.SQLITE_MUTATION_FAILED]}export{b as RUNNER_BOOTSTRAP_POLICY_REASON_CODES,D as classifyRunnerBootstrapPolicy,N as classifyRunnerBootstrapPolicyFromArgs,f as isContinuityTrigger,L as parseRunnerBootstrapCommandIntent,_ as persistContinuityFromResponse,A as readContinuityForRequest};
1
+ import{CONTINUITY_CLIENT_REASON_CODES as u,ContinuityClientStateStoreError as I,continuitySqliteExists as l,createContinuityHardStopSnapshot as O,openContinuityClientStateStore as c}from"./continuity-client-state-store.js";import{buildAutonomousGovernanceEnvelope as C,parseAutonomousInvokeIntent as y}from"./autonomous-governance.js";import{RUNNER_BOOTSTRAP_POLICY_REASON_CODES as b,classifyRunnerBootstrapPolicy as D,classifyRunnerBootstrapPolicyFromArgs as N,parseRunnerBootstrapCommandIntent as L}from"./runner-bootstrap-policy.js";import{parseRunnerBootstrapCommandIntent as E}from"./runner-bootstrap-policy.js";import{StrictReadOnlyError as S}from"../../../shared/dist/strict-readonly.js";function f(e){return E(e).kind!=="unknown"||y(e)!==null}async function T(e,r,o,i){const t=y(e),s=t!==null||f(e)||l(r);if(s)try{const n=i?await i.executeAsync({phase:"client-preflight",domain:"client-persistence",category:"continuity-store",operation:"create"},async()=>s?{kind:"writable",store:await c({projectRoot:r,now:()=>o??new Date().toISOString()})}:{kind:"skipped"},async()=>{try{return{kind:"readonly",store:await c({projectRoot:r,now:()=>o??new Date().toISOString(),strictReadOnly:!0})}}catch{throw new S("readonly-physical-boundary-unsafe","boundary")}}):{kind:"writable",store:await c({projectRoot:r,now:()=>o??new Date().toISOString()})};if(n.kind==="skipped")return;if(n.kind==="readonly")try{return n.store.collectSnapshot({nowIso:o})}finally{n.store.close()}const a=n.store;try{if(t){const d=o??new Date().toISOString(),p=C(t);return i?i.execute({phase:"client-preflight",domain:"client-persistence",category:"continuity-store",operation:"create"},()=>a.recordAutonomousGovernance(p,d),()=>{}):a.recordAutonomousGovernance(p,d),{...a.collectSnapshot({nowIso:d}),autonomousGovernance:p}}return a.collectSnapshot({nowIso:o})}finally{a.close()}}catch(n){if(n instanceof S)throw n;const a=m(n);return f(e)||l(r)?O(a,o??new Date().toISOString()):void 0}}async function _(e,r){const o=e?.continuityStateUpdate;if(!o)return{ok:!0,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:[u.OK],publicSafe:!0};let i;try{i=await c({projectRoot:r});const t=i.applyStateUpdate(o);return{ok:!0,appliedOperationIds:t.appliedOperationIds,ignoredOperationIds:t.ignoredOperationIds,reasonCodes:t.reasonCodes,publicSafe:!0}}catch(t){const s=m(t),n=t instanceof Error?t.message:String(t);return{ok:!1,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:s,error:n,publicSafe:!0}}finally{i?.close()}}function m(e){if(e instanceof I)return e.reasonCodes;const r=e instanceof Error?e.message:String(e);return/sqlite-adapter-unavailable/i.test(r)?[u.SQLITE_ADAPTER_UNAVAILABLE]:/integrity|corrupt|malformed|not a database/i.test(r)?[u.SQLITE_INTEGRITY_FAILED]:[u.SQLITE_MUTATION_FAILED]}export{b as RUNNER_BOOTSTRAP_POLICY_REASON_CODES,D as classifyRunnerBootstrapPolicy,N as classifyRunnerBootstrapPolicyFromArgs,f as isContinuityTrigger,L as parseRunnerBootstrapCommandIntent,_ as persistContinuityFromResponse,T as readContinuityForRequest};
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Recover a fully-fsynced artifact left by a process crash. A swap is the
3
+ * conservative authority because it restores the last committed destination;
4
+ * without a swap, one unambiguous temp can be promoted for first creation.
5
+ */
6
+ export declare function recoverAtomicReplaceUtf8(path: string): 'none' | 'restored-swap' | 'promoted-temp';
7
+ /** Best-effort directory durability; Windows can reject directory handles. */
8
+ export declare function fsyncDirectoryBestEffort(path: string): void;
9
+ /** Create a new UTF-8 file and make its contents durable before returning. */
10
+ export declare function durableCreateUtf8(path: string, contents: string): void;
11
+ /**
12
+ * Replace one UTF-8 state file without truncating the live destination.
13
+ * The fallback swap exists for Windows rename semantics and restores the
14
+ * original if installing the new file fails.
15
+ */
16
+ export declare function atomicReplaceUtf8(path: string, contents: string): void;
@@ -0,0 +1 @@
1
+ import{randomUUID as C}from"node:crypto";import{closeSync as E,existsSync as f,fsyncSync as y,lstatSync as p,mkdirSync as w,openSync as u,readdirSync as R,renameSync as l,unlinkSync as d,writeFileSync as A}from"node:fs";import{basename as S,dirname as s,join as h}from"node:path";const _=/^\d+\.[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}\.(tmp|swap)$/i;function k(t){const n=s(t);if(!f(n))return"none";const o=`${S(t)}.`,e=R(n).filter(r=>r.startsWith(o)&&_.test(r.slice(o.length))).map(r=>({entry:r,path:h(n,r),kind:r.endsWith(".swap")?"swap":"tmp"}));if(f(t)){if(!p(t).isFile())throw new Error("ATOMIC_REPLACE_RECOVERY_UNSAFE");for(const r of e)if(!p(r.path).isFile())throw new Error("ATOMIC_REPLACE_RECOVERY_UNSAFE");for(const r of e)d(r.path);return e.length>0&&m(n),"none"}const c=e.filter(r=>r.kind==="swap"),a=e.filter(r=>r.kind==="tmp");if(c.length>1||c.length===0&&a.length>1)throw new Error("ATOMIC_REPLACE_RECOVERY_AMBIGUOUS");const i=c[0]??a[0];if(!i)return"none";if(!p(i.path).isFile())throw new Error("ATOMIC_REPLACE_RECOVERY_UNSAFE");l(i.path,t);for(const r of e)if(!(r.path===i.path||!f(r.path)))try{d(r.path)}catch{}return m(n),i.kind==="swap"?"restored-swap":"promoted-temp"}function m(t){let n;try{n=u(t,"r"),y(n)}catch{}finally{n!==void 0&&E(n)}}function x(t,n){w(s(t),{recursive:!0,mode:448});let o;try{o=u(t,"wx",384),A(o,n,"utf8"),y(o)}catch(e){if(o!==void 0){try{E(o)}catch{}o=void 0}try{f(t)&&d(t)}catch{}throw m(s(t)),e}finally{o!==void 0&&E(o)}m(s(t))}function $(t,n){w(s(t),{recursive:!0,mode:448});const o=`${process.pid}.${C()}`,e=`${t}.${o}.tmp`,c=`${t}.${o}.swap`;A(e,n,{encoding:"utf8",mode:384,flag:"wx"});const a=u(e,"r");try{y(a)}finally{E(a)}try{l(e,t)}catch{let i=!1;try{f(t)&&(l(t,c),i=!0),l(e,t)}catch(r){i&&!f(t)&&f(c)&&l(c,t);try{f(e)&&d(e)}catch{}throw r}if(i)try{d(c)}catch{}}m(s(t))}export{$ as atomicReplaceUtf8,x as durableCreateUtf8,m as fsyncDirectoryBestEffort,k as recoverAtomicReplaceUtf8};
@@ -1,35 +1,35 @@
1
1
  /** Generated by scripts/generate-command-registry.mjs. Do not edit. */
2
2
  export declare const COMMAND_REGISTRY_SCHEMA_VERSION: 1;
3
3
  export declare const COMMAND_REGISTRY_VERSION: "1.0.0";
4
- export declare const COMMAND_REGISTRY_CHECKSUM: "b8fcdb246f7e22f820f667442f7a489bf3f53376b6540280d59fb89495ff4520";
4
+ export declare const COMMAND_REGISTRY_CHECKSUM: "5ed842e2bf9a9e959f23096cec199be4200bb4056b99479b5dc47b2dbe1293e6";
5
5
  export declare const COMMAND_REGISTRY_PROJECTION_MANIFEST: {
6
6
  readonly schemaVersion: 1;
7
7
  readonly registryVersion: "1.0.0";
8
- readonly registryChecksum: "b8fcdb246f7e22f820f667442f7a489bf3f53376b6540280d59fb89495ff4520";
8
+ readonly registryChecksum: "5ed842e2bf9a9e959f23096cec199be4200bb4056b99479b5dc47b2dbe1293e6";
9
9
  readonly projections: readonly [{
10
10
  readonly kind: "admin";
11
11
  readonly entryCount: 62;
12
- readonly sha256: "4ca10e54b2028a01dad3b492dacead708d858842ba5ba23bcca70faa8c5b9689";
12
+ readonly sha256: "d752e65aa65ee7864416b4c68af6d516233e180cd5b0408dcb244751ede7a21a";
13
13
  }, {
14
14
  readonly kind: "client";
15
15
  readonly entryCount: 62;
16
- readonly sha256: "4ca10e54b2028a01dad3b492dacead708d858842ba5ba23bcca70faa8c5b9689";
16
+ readonly sha256: "d752e65aa65ee7864416b4c68af6d516233e180cd5b0408dcb244751ede7a21a";
17
17
  }, {
18
18
  readonly kind: "docs";
19
19
  readonly entryCount: 62;
20
- readonly sha256: "4ca10e54b2028a01dad3b492dacead708d858842ba5ba23bcca70faa8c5b9689";
20
+ readonly sha256: "d752e65aa65ee7864416b4c68af6d516233e180cd5b0408dcb244751ede7a21a";
21
21
  }, {
22
22
  readonly kind: "metrics";
23
23
  readonly entryCount: 62;
24
- readonly sha256: "4ca10e54b2028a01dad3b492dacead708d858842ba5ba23bcca70faa8c5b9689";
24
+ readonly sha256: "d752e65aa65ee7864416b4c68af6d516233e180cd5b0408dcb244751ede7a21a";
25
25
  }, {
26
26
  readonly kind: "server";
27
27
  readonly entryCount: 67;
28
- readonly sha256: "682d4238281ea4e00d110fdf7d67257cc9ee8c029a87232b26c8fc3f00604884";
28
+ readonly sha256: "1b3e29b3b462a8fb283a308e311ca681d7b106f986723d4c08b84805c878a00a";
29
29
  }, {
30
30
  readonly kind: "shared";
31
31
  readonly entryCount: 67;
32
- readonly sha256: "f82436b633efc99f247aa0f0e755d66fe538ba3afd205dcec49e4a5fdb7d9928";
32
+ readonly sha256: "0d181e8f869891e7c3e09b76ad00b122ca7c5a4ca530e86391d64517d14b7bc8";
33
33
  }];
34
34
  };
35
35
  export declare const GENERATED_CLIENT_COMMANDS: readonly [{
@@ -801,14 +801,14 @@ export declare const GENERATED_CLIENT_COMMANDS: readonly [{
801
801
  readonly name: "Diagnosticar Story ou Contexto";
802
802
  readonly number: 25;
803
803
  readonly policy: {
804
- readonly billingClass: "billable";
805
- readonly idempotencyClass: "logical-supported";
804
+ readonly billingClass: "non-billable";
805
+ readonly idempotencyClass: "none";
806
806
  readonly minimumTier: "free";
807
- readonly mutationClass: "stateful";
807
+ readonly mutationClass: "read-only";
808
808
  readonly privilege: "authenticated";
809
- readonly quotaClass: "workflow";
809
+ readonly quotaClass: "none";
810
810
  readonly replayClass: "signed-request";
811
- readonly strictReadOnly: "deny";
811
+ readonly strictReadOnly: "allow";
812
812
  };
813
813
  readonly projections: readonly ["admin", "client", "docs", "metrics", "server", "shared"];
814
814
  readonly stepId: "step-c-02-diagnose";
@@ -1385,40 +1385,6 @@ export declare const GENERATED_CLIENT_COMMANDS: readonly [{
1385
1385
  readonly stepId: "step-c-06-implement-tasks";
1386
1386
  readonly subcommands: readonly [];
1387
1387
  readonly visibility: "public";
1388
- }, {
1389
- readonly aliases: readonly ["inicializar"];
1390
- readonly category: "quick-start";
1391
- readonly compatibility: {
1392
- readonly deprecatedIn: null;
1393
- readonly introducedIn: "1.0.0";
1394
- readonly removedIn: null;
1395
- readonly replacement: null;
1396
- };
1397
- readonly description: {
1398
- readonly en: "Initialize project";
1399
- readonly es: "Inicializar proyecto";
1400
- readonly "pt-BR": "Inicializar projeto";
1401
- };
1402
- readonly examples: readonly ["@neocortex *init", "@neocortex init", "@neocortex 2"];
1403
- readonly id: "init";
1404
- readonly inputShape: "epics";
1405
- readonly mode: "utility";
1406
- readonly name: "Inicializar + Enrichment";
1407
- readonly number: 2;
1408
- readonly policy: {
1409
- readonly billingClass: "billable";
1410
- readonly idempotencyClass: "logical-supported";
1411
- readonly minimumTier: "free";
1412
- readonly mutationClass: "stateful";
1413
- readonly privilege: "authenticated";
1414
- readonly quotaClass: "workflow";
1415
- readonly replayClass: "signed-request";
1416
- readonly strictReadOnly: "deny";
1417
- };
1418
- readonly projections: readonly ["admin", "client", "docs", "metrics", "server", "shared"];
1419
- readonly stepId: "step-u-init";
1420
- readonly subcommands: readonly [];
1421
- readonly visibility: "public";
1422
1388
  }, {
1423
1389
  readonly aliases: readonly ["continuity-jobs", "job"];
1424
1390
  readonly category: "utility-wave";
@@ -1870,6 +1836,40 @@ export declare const GENERATED_CLIENT_COMMANDS: readonly [{
1870
1836
  readonly stepId: "step-c-12-merge-pr";
1871
1837
  readonly subcommands: readonly [];
1872
1838
  readonly visibility: "public";
1839
+ }, {
1840
+ readonly aliases: readonly ["migrate-project", "project-id-migrate"];
1841
+ readonly category: "recovery";
1842
+ readonly compatibility: {
1843
+ readonly deprecatedIn: null;
1844
+ readonly introducedIn: "1.0.0";
1845
+ readonly removedIn: null;
1846
+ readonly replacement: null;
1847
+ };
1848
+ readonly description: {
1849
+ readonly en: "Migrate stable project identity with backup and remote seed.";
1850
+ readonly es: "Migra la identidad estable del proyecto con respaldo y seed remoto.";
1851
+ readonly "pt-BR": "Migra a identidade estavel do projeto com backup e seed remoto.";
1852
+ };
1853
+ readonly examples: readonly ["@neocortex *migrate-project-id"];
1854
+ readonly id: "migrate-project-id";
1855
+ readonly inputShape: "standalone";
1856
+ readonly mode: "utility";
1857
+ readonly name: "Migrate Project Identity";
1858
+ readonly number: 63;
1859
+ readonly policy: {
1860
+ readonly billingClass: "non-billable";
1861
+ readonly idempotencyClass: "logical-required";
1862
+ readonly minimumTier: "free";
1863
+ readonly mutationClass: "stateful";
1864
+ readonly privilege: "authenticated";
1865
+ readonly quotaClass: "none";
1866
+ readonly replayClass: "signed-request";
1867
+ readonly strictReadOnly: "deny";
1868
+ };
1869
+ readonly projections: readonly ["admin", "client", "docs", "metrics", "server", "shared"];
1870
+ readonly stepId: "step-u-migrate-project-id";
1871
+ readonly subcommands: readonly [];
1872
+ readonly visibility: "public";
1873
1873
  }, {
1874
1874
  readonly aliases: readonly ["migrate", "schema-migrate", "state-migrate"];
1875
1875
  readonly category: "utility-wave";
@@ -2380,15 +2380,15 @@ export declare const GENERATED_CLIENT_COMMANDS: readonly [{
2380
2380
  readonly replacement: null;
2381
2381
  };
2382
2382
  readonly description: {
2383
- readonly en: "Setup branch";
2384
- readonly es: "Configurar branch";
2385
- readonly "pt-BR": "Configurar branch";
2383
+ readonly en: "Set up branch in the current checkout";
2384
+ readonly es: "Configurar branch en el checkout actual";
2385
+ readonly "pt-BR": "Configurar branch no checkout atual";
2386
2386
  };
2387
2387
  readonly examples: readonly ["@neocortex *setup-branch @docs/stories/P126.01.story.md"];
2388
2388
  readonly id: "setup-branch";
2389
2389
  readonly inputShape: "story";
2390
2390
  readonly mode: "step";
2391
- readonly name: "Configurar Branch & Worktree";
2391
+ readonly name: "Configurar Branch";
2392
2392
  readonly number: 24;
2393
2393
  readonly policy: {
2394
2394
  readonly billingClass: "billable";