agentera 3.0.0-dev.25 → 3.0.0-dev.27

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 (495) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +29 -23
  3. package/bundle/CHANGELOG.md +18 -25
  4. package/bundle/README.md +13 -34
  5. package/bundle/UPGRADE.md +71 -165
  6. package/bundle/references/adapters/package-manifest-interface-model.yaml +40 -241
  7. package/bundle/references/adapters/package-registry.yaml +0 -145
  8. package/bundle/references/adapters/package-surface-characterization.md +22 -42
  9. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +5 -219
  10. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +2 -29
  11. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +1 -1
  12. package/bundle/references/analysis/analytics-boundary-proportional-2026-07-20.yaml +74 -0
  13. package/bundle/references/analysis/benchmark.md +11 -0
  14. package/bundle/references/analysis/evidence/analytics-boundary-proportional-2026-07-20/source-focused-1.json.gz +0 -0
  15. package/bundle/references/analysis/evidence/analytics-boundary-proportional-2026-07-20/source-focused-2.json.gz +0 -0
  16. package/bundle/references/analysis/evidence/analytics-boundary-proportional-2026-07-20/source-focused-3.json.gz +0 -0
  17. package/bundle/references/analysis/evidence/migration-pagination-proportional-2026-07-20/source-focused-1.json.gz +0 -0
  18. package/bundle/references/analysis/evidence/migration-pagination-proportional-2026-07-20/source-focused-2.json.gz +0 -0
  19. package/bundle/references/analysis/evidence/migration-pagination-proportional-2026-07-20/source-focused-3.json.gz +0 -0
  20. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/precommit-cli-route.log.gz +0 -0
  21. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/precommit-cli.log.gz +0 -0
  22. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/precommit-documentation.log.gz +0 -0
  23. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/recompute.mjs +98 -0
  24. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/source-1.json.gz +0 -0
  25. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/source-2.json.gz +0 -0
  26. package/bundle/references/analysis/evidence/verification-baseline-2026-07-20/source-3.json.gz +0 -0
  27. package/bundle/references/analysis/migration-pagination-proportional-2026-07-20.yaml +64 -0
  28. package/bundle/references/analysis/verification-baseline-2026-07-20.yaml +313 -0
  29. package/bundle/references/analysis/verification-final-proof-2026-07-21.yaml +340 -0
  30. package/bundle/references/analysis/verification-policy.yaml +142 -0
  31. package/bundle/references/analysis/worker-policy-2026-07-21.yaml +207 -0
  32. package/bundle/references/artifacts/state-storage-authority.yaml +48 -448
  33. package/bundle/references/cli/agent-ready-state-contract.yaml +9 -9
  34. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +3 -4
  35. package/bundle/references/cli/bundle-skill-vocabulary.yaml +9 -18
  36. package/bundle/references/cli/capability-tool-classification.yaml +2 -2
  37. package/bundle/references/cli/prime-consumer-compatibility.yaml +86 -112
  38. package/bundle/references/cli/routing-execution-vocabulary.yaml +4 -22
  39. package/bundle/references/cli/upgrade-repair-wording.md +8 -28
  40. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +2 -3
  41. package/bundle/references/cli/vocabulary.md +18 -23
  42. package/bundle/references/meta/documentation-inventory.md +3 -1
  43. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +3 -2
  44. package/bundle/skills/agentera/capabilities/orchestrate/schemas/exit.yaml +1 -1
  45. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +3 -11
  46. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +23 -5
  47. package/dist/analytics/extractCorpus/cli.js.map +1 -1
  48. package/dist/analytics/extractCorpus/copilotSessions.js.map +1 -1
  49. package/dist/analytics/extractCorpus/core.js.map +1 -1
  50. package/dist/analytics/extractCorpus/corpus.js.map +1 -1
  51. package/dist/analytics/extractCorpus/coverageAudit.js.map +1 -1
  52. package/dist/analytics/extractCorpus/cursorSessions.js.map +1 -1
  53. package/dist/analytics/extractCorpus/evidenceTiers.js.map +1 -1
  54. package/dist/analytics/extractCorpus/extractCorpusParity.js +1 -1
  55. package/dist/analytics/extractCorpus/extractCorpusParity.js.map +1 -1
  56. package/dist/analytics/extractCorpus/filesystemSources.js.map +1 -1
  57. package/dist/analytics/extractCorpus/index.js.map +1 -1
  58. package/dist/analytics/extractCorpus/jsonlSessions.js.map +1 -1
  59. package/dist/analytics/extractCorpus/sqliteCaps.js.map +1 -1
  60. package/dist/analytics/extractCorpus/sqliteSessions.js.map +1 -1
  61. package/dist/analytics/extractCorpus/tierReader.js.map +1 -1
  62. package/dist/analytics/extractCorpus.js.map +1 -1
  63. package/dist/analytics/profileSignals.js.map +1 -1
  64. package/dist/analytics/usageStats.js.map +1 -1
  65. package/dist/bin/agentera.js.map +1 -1
  66. package/dist/capabilities/audit/instructions.js.map +1 -1
  67. package/dist/capabilities/build/instructions.js.map +1 -1
  68. package/dist/capabilities/design/instructions.js.map +1 -1
  69. package/dist/capabilities/discuss/instructions.js.map +1 -1
  70. package/dist/capabilities/document/instructions.js.map +1 -1
  71. package/dist/capabilities/index.js.map +1 -1
  72. package/dist/capabilities/optimize/instructions.js.map +1 -1
  73. package/dist/capabilities/orchestrate/instructions.js +1 -1
  74. package/dist/capabilities/orchestrate/instructions.js.map +1 -1
  75. package/dist/capabilities/plan/instructions.js.map +1 -1
  76. package/dist/capabilities/profile/instructions.js.map +1 -1
  77. package/dist/capabilities/research/instructions.js.map +1 -1
  78. package/dist/capabilities/status/instructions.js.map +1 -1
  79. package/dist/capabilities/status/startupInstructions.js.map +1 -1
  80. package/dist/capabilities/vision/instructions.js.map +1 -1
  81. package/dist/cli/appContext.js.map +1 -1
  82. package/dist/cli/argvalidate.js.map +1 -1
  83. package/dist/cli/capabilityContext/benchmark.js.map +1 -1
  84. package/dist/cli/capabilityContext/bespoke.js +8 -2
  85. package/dist/cli/capabilityContext/bespoke.js.map +1 -1
  86. package/dist/cli/capabilityContext/build.js.map +1 -1
  87. package/dist/cli/capabilityContext/closeout.js +3 -3
  88. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  89. package/dist/cli/capabilityContext/contract.js.map +1 -1
  90. package/dist/cli/capabilityContext/evidence.js +52 -40
  91. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  92. package/dist/cli/capabilityContext/index.js.map +1 -1
  93. package/dist/cli/capabilityContext/orchestration.js +15 -5
  94. package/dist/cli/capabilityContext/orchestration.js.map +1 -1
  95. package/dist/cli/capabilityContext/planState.js +1 -1
  96. package/dist/cli/capabilityContext/planState.js.map +1 -1
  97. package/dist/cli/capabilityContext/progress.js.map +1 -1
  98. package/dist/cli/capabilityContext/shared.js.map +1 -1
  99. package/dist/cli/capabilityContext/slim.js +16 -3
  100. package/dist/cli/capabilityContext/slim.js.map +1 -1
  101. package/dist/cli/capabilityContext/startup.js +4 -1
  102. package/dist/cli/capabilityContext/startup.js.map +1 -1
  103. package/dist/cli/capabilityContext/types.js.map +1 -1
  104. package/dist/cli/capabilityContext.js.map +1 -1
  105. package/dist/cli/commands/appHome.js.map +1 -1
  106. package/dist/cli/commands/capability.js.map +1 -1
  107. package/dist/cli/commands/compact.js.map +1 -1
  108. package/dist/cli/commands/doctor.js +6 -64
  109. package/dist/cli/commands/doctor.js.map +1 -1
  110. package/dist/cli/commands/durability.js +12 -48
  111. package/dist/cli/commands/durability.js.map +1 -1
  112. package/dist/cli/commands/entityMigrate.js.map +1 -1
  113. package/dist/cli/commands/lint.js.map +1 -1
  114. package/dist/cli/commands/prime/briefOrientation.js +25 -24
  115. package/dist/cli/commands/prime/briefOrientation.js.map +1 -1
  116. package/dist/cli/commands/prime/bundleStatus.js +8 -2
  117. package/dist/cli/commands/prime/bundleStatus.js.map +1 -1
  118. package/dist/cli/commands/prime/collectEntityOrientation.js +76 -24
  119. package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -1
  120. package/dist/cli/commands/prime/collectOrientationState.js +34 -53
  121. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  122. package/dist/cli/commands/prime/orientationOutput.js +9 -14
  123. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  124. package/dist/cli/commands/prime/types.js.map +1 -1
  125. package/dist/cli/commands/prime/v1Migration.js.map +1 -1
  126. package/dist/cli/commands/prime.js +43 -25
  127. package/dist/cli/commands/prime.js.map +1 -1
  128. package/dist/cli/commands/query.js +17 -49
  129. package/dist/cli/commands/query.js.map +1 -1
  130. package/dist/cli/commands/report.js.map +1 -1
  131. package/dist/cli/commands/schema.js +19 -78
  132. package/dist/cli/commands/schema.js.map +1 -1
  133. package/dist/cli/commands/state/decisions.js +11 -57
  134. package/dist/cli/commands/state/decisions.js.map +1 -1
  135. package/dist/cli/commands/state/docs.js +56 -120
  136. package/dist/cli/commands/state/docs.js.map +1 -1
  137. package/dist/cli/commands/state/experimentRecords.js +22 -121
  138. package/dist/cli/commands/state/experimentRecords.js.map +1 -1
  139. package/dist/cli/commands/state/experiments.js +9 -75
  140. package/dist/cli/commands/state/experiments.js.map +1 -1
  141. package/dist/cli/commands/state/get.js +62 -143
  142. package/dist/cli/commands/state/get.js.map +1 -1
  143. package/dist/cli/commands/state/health.js +9 -123
  144. package/dist/cli/commands/state/health.js.map +1 -1
  145. package/dist/cli/commands/state/index.js +2 -2
  146. package/dist/cli/commands/state/index.js.map +1 -1
  147. package/dist/cli/commands/state/list.js +20 -36
  148. package/dist/cli/commands/state/list.js.map +1 -1
  149. package/dist/cli/commands/state/objective.js +19 -86
  150. package/dist/cli/commands/state/objective.js.map +1 -1
  151. package/dist/cli/commands/state/plan.js +9 -388
  152. package/dist/cli/commands/state/plan.js.map +1 -1
  153. package/dist/cli/commands/state/planTasks.js +58 -93
  154. package/dist/cli/commands/state/planTasks.js.map +1 -1
  155. package/dist/cli/commands/state/plans.js +13 -40
  156. package/dist/cli/commands/state/plans.js.map +1 -1
  157. package/dist/cli/commands/state/progress.js +10 -55
  158. package/dist/cli/commands/state/progress.js.map +1 -1
  159. package/dist/cli/commands/state/shared.js.map +1 -1
  160. package/dist/cli/commands/state/todo.js +24 -133
  161. package/dist/cli/commands/state/todo.js.map +1 -1
  162. package/dist/cli/commands/state/write.js +13 -35
  163. package/dist/cli/commands/state/write.js.map +1 -1
  164. package/dist/cli/commands/upgrade.js +48 -18
  165. package/dist/cli/commands/upgrade.js.map +1 -1
  166. package/dist/cli/commands/upgradeVerify.js +21 -15
  167. package/dist/cli/commands/upgradeVerify.js.map +1 -1
  168. package/dist/cli/commands/validate.js +1 -9
  169. package/dist/cli/commands/validate.js.map +1 -1
  170. package/dist/cli/commands/verify.js.map +1 -1
  171. package/dist/cli/contracts/bundleStatus.js.map +1 -1
  172. package/dist/cli/contracts/orientationState.js.map +1 -1
  173. package/dist/cli/dispatch/argvParser.js.map +1 -1
  174. package/dist/cli/dispatch/check.js +5 -12
  175. package/dist/cli/dispatch/check.js.map +1 -1
  176. package/dist/cli/dispatch/commands.js.map +1 -1
  177. package/dist/cli/dispatch/index.js +30 -29
  178. package/dist/cli/dispatch/index.js.map +1 -1
  179. package/dist/cli/dispatch/lifecycle.js +23 -40
  180. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  181. package/dist/cli/dispatch/prime.js.map +1 -1
  182. package/dist/cli/dispatch/shared.js.map +1 -1
  183. package/dist/cli/dispatch/state.js.map +1 -1
  184. package/dist/cli/dispatch.js.map +1 -1
  185. package/dist/cli/errors.js.map +1 -1
  186. package/dist/cli/help.js +20 -100
  187. package/dist/cli/help.js.map +1 -1
  188. package/dist/cli/migrationRequired.js +22 -19
  189. package/dist/cli/migrationRequired.js.map +1 -1
  190. package/dist/cli/orientation/attention.js +1 -97
  191. package/dist/cli/orientation/attention.js.map +1 -1
  192. package/dist/cli/orientation/corpusCoverage.js.map +1 -1
  193. package/dist/cli/orientation.js +18 -4
  194. package/dist/cli/orientation.js.map +1 -1
  195. package/dist/cli/planArtifacts.js.map +1 -1
  196. package/dist/cli/planEvidence.js.map +1 -1
  197. package/dist/cli/planLifecycleState.js.map +1 -1
  198. package/dist/cli/planTaskIndex.js +12 -0
  199. package/dist/cli/planTaskIndex.js.map +1 -0
  200. package/dist/cli/prime-blob.js +1 -1
  201. package/dist/cli/prime-blob.js.map +1 -1
  202. package/dist/cli/startupCompletenessContract.js.map +1 -1
  203. package/dist/cli/stateQuery.js +1 -2
  204. package/dist/cli/stateQuery.js.map +1 -1
  205. package/dist/cli/structured.js.map +1 -1
  206. package/dist/cli/todoMarkdown.js.map +1 -1
  207. package/dist/cli/todoSeverity.js.map +1 -1
  208. package/dist/core/atomicWriter.js.map +1 -1
  209. package/dist/core/difflib.js.map +1 -1
  210. package/dist/core/envPaths.js.map +1 -1
  211. package/dist/core/jsonValue.js.map +1 -1
  212. package/dist/core/paths.js.map +1 -1
  213. package/dist/core/pyjson.js.map +1 -1
  214. package/dist/core/skillIdentity.js +24 -0
  215. package/dist/core/skillIdentity.js.map +1 -0
  216. package/dist/core/sourceRoot.js.map +1 -1
  217. package/dist/core/text.js.map +1 -1
  218. package/dist/core/toml.js.map +1 -1
  219. package/dist/core/yaml.js.map +1 -1
  220. package/dist/eval/evalSkills.js.map +1 -1
  221. package/dist/eval/semanticEval.js.map +1 -1
  222. package/dist/eval/semanticFixtures.js.map +1 -1
  223. package/dist/hooks/common.js +1 -1
  224. package/dist/hooks/common.js.map +1 -1
  225. package/dist/hooks/compaction/apply.js.map +1 -1
  226. package/dist/hooks/compaction/dryRun.js.map +1 -1
  227. package/dist/hooks/compaction/index.js.map +1 -1
  228. package/dist/hooks/compaction/parse.js.map +1 -1
  229. package/dist/hooks/compaction/retention.js.map +1 -1
  230. package/dist/hooks/compaction/status.js +2 -1
  231. package/dist/hooks/compaction/status.js.map +1 -1
  232. package/dist/hooks/compaction/types.js.map +1 -1
  233. package/dist/hooks/cursorPreToolUse.js.map +1 -1
  234. package/dist/hooks/cursorSessionStart.js +4 -25
  235. package/dist/hooks/cursorSessionStart.js.map +1 -1
  236. package/dist/hooks/projectHookInput.js +26 -0
  237. package/dist/hooks/projectHookInput.js.map +1 -0
  238. package/dist/hooks/sessionStart.js +23 -239
  239. package/dist/hooks/sessionStart.js.map +1 -1
  240. package/dist/hooks/sessionStop.js +4 -12
  241. package/dist/hooks/sessionStop.js.map +1 -1
  242. package/dist/hooks/validateArtifact/agentFacing.js.map +1 -1
  243. package/dist/hooks/validateArtifact/index.js.map +1 -1
  244. package/dist/hooks/validateArtifact/markdown.js.map +1 -1
  245. package/dist/hooks/validateArtifact/runtime.js.map +1 -1
  246. package/dist/hooks/validateArtifact/schema.js.map +1 -1
  247. package/dist/hooks/validateArtifact/traversal.js +1 -1
  248. package/dist/hooks/validateArtifact/traversal.js.map +1 -1
  249. package/dist/hooks/validateArtifact/violations.js.map +1 -1
  250. package/dist/migrate/v2HandoffManifest.js.map +1 -1
  251. package/dist/registries/artifactProtocolIds.js.map +1 -1
  252. package/dist/registries/artifactRegistry.js +2 -1
  253. package/dist/registries/artifactRegistry.js.map +1 -1
  254. package/dist/registries/capabilityContract.js.map +1 -1
  255. package/dist/registries/evaluatorHandoffContract.js.map +1 -1
  256. package/dist/registries/evidenceTierContract.js.map +1 -1
  257. package/dist/registries/packageRegistry.js +57 -231
  258. package/dist/registries/packageRegistry.js.map +1 -1
  259. package/dist/registries/triggerLoader.js.map +1 -1
  260. package/dist/registries/verbosityBudgetContract.js.map +1 -1
  261. package/dist/release/releaseMetadata.js +1 -13
  262. package/dist/release/releaseMetadata.js.map +1 -1
  263. package/dist/runtime/lifecycleAdapterContract.js +4 -4
  264. package/dist/runtime/lifecycleAdapterContract.js.map +1 -1
  265. package/dist/runtime/lifecycleAdapters.js +14 -2
  266. package/dist/runtime/lifecycleAdapters.js.map +1 -1
  267. package/dist/runtime/lifecycleAuthority.js +5 -43
  268. package/dist/runtime/lifecycleAuthority.js.map +1 -1
  269. package/dist/runtime/lifecycleOperationContract.js +3 -2
  270. package/dist/runtime/lifecycleOperationContract.js.map +1 -1
  271. package/dist/runtime/lifecycleOperations.js.map +1 -1
  272. package/dist/runtime/lifecycleOwnershipJournal.js.map +1 -1
  273. package/dist/runtime/lifecyclePublication.js +21 -0
  274. package/dist/runtime/lifecyclePublication.js.map +1 -1
  275. package/dist/runtime/lifecycleSnapshot.js.map +1 -1
  276. package/dist/runtime/retiredRuntimeCleanup.js.map +1 -1
  277. package/dist/setup/codex/agents.js.map +1 -1
  278. package/dist/setup/codex/cli.js.map +1 -1
  279. package/dist/setup/codex/configToml.js.map +1 -1
  280. package/dist/setup/codex/constants.js.map +1 -1
  281. package/dist/setup/codex/installRoot.js.map +1 -1
  282. package/dist/setup/codex/state.js.map +1 -1
  283. package/dist/setup/codex.js.map +1 -1
  284. package/dist/setup/opencode.js +20 -12
  285. package/dist/setup/opencode.js.map +1 -1
  286. package/dist/setup/opencodeConstants.js.map +1 -1
  287. package/dist/setup/sharedSkill.js +46 -0
  288. package/dist/setup/sharedSkill.js.map +1 -0
  289. package/dist/setup/smokeChecks.js +16 -43
  290. package/dist/setup/smokeChecks.js.map +1 -1
  291. package/dist/state/archiveDiscovery.js.map +1 -1
  292. package/dist/state/archivePublication.js.map +1 -1
  293. package/dist/state/archiveRecovery.js.map +1 -1
  294. package/dist/state/archiveReplay.js.map +1 -1
  295. package/dist/state/decisionEntities.js +7 -4
  296. package/dist/state/decisionEntities.js.map +1 -1
  297. package/dist/state/decisionLegacyValidation.js.map +1 -1
  298. package/dist/state/decisionOverlay.js.map +1 -1
  299. package/dist/state/decisionRevision.js.map +1 -1
  300. package/dist/state/decisionRevisionPublication.js.map +1 -1
  301. package/dist/state/directRetrieval.js.map +1 -1
  302. package/dist/state/durability.js +4 -240
  303. package/dist/state/durability.js.map +1 -1
  304. package/dist/state/entityCutover.js +90 -186
  305. package/dist/state/entityCutover.js.map +1 -1
  306. package/dist/state/entityCutoverGit.js.map +1 -1
  307. package/dist/state/entityMigrationPreview.js +3 -3
  308. package/dist/state/entityMigrationPreview.js.map +1 -1
  309. package/dist/state/entityPublicationContext.js.map +1 -1
  310. package/dist/state/entityStorage.js +49 -10
  311. package/dist/state/entityStorage.js.map +1 -1
  312. package/dist/state/experimentArchive.js.map +1 -1
  313. package/dist/state/experimentIdentity.js.map +1 -1
  314. package/dist/state/experimentRetrieval.js.map +1 -1
  315. package/dist/state/healthEntities.js +7 -4
  316. package/dist/state/healthEntities.js.map +1 -1
  317. package/dist/state/healthEntityValidation.js.map +1 -1
  318. package/dist/state/healthRepair.js.map +1 -1
  319. package/dist/state/installRoot.js.map +1 -1
  320. package/dist/state/legacyEntityCutoverEvidence.js.map +1 -1
  321. package/dist/state/legacyIdentity.js.map +1 -1
  322. package/dist/state/listAccounting.js.map +1 -1
  323. package/dist/state/listClassification.js.map +1 -1
  324. package/dist/state/listRetrieval.js.map +1 -1
  325. package/dist/state/objectiveExperimentEntities.js +7 -5
  326. package/dist/state/objectiveExperimentEntities.js.map +1 -1
  327. package/dist/state/planEntities.js +60 -12
  328. package/dist/state/planEntities.js.map +1 -1
  329. package/dist/state/planIdentity.js.map +1 -1
  330. package/dist/state/planRetrieval.js.map +1 -1
  331. package/dist/state/planTaskRetrieval.js.map +1 -1
  332. package/dist/state/progressEntities.js +4 -2
  333. package/dist/state/progressEntities.js.map +1 -1
  334. package/dist/state/projectRoot.js.map +1 -1
  335. package/dist/state/projectionPolicy.js.map +1 -1
  336. package/dist/state/retrievalAuthority.js.map +1 -1
  337. package/dist/state/safeProjectFile.js.map +1 -1
  338. package/dist/state/startupAnalysis/benchmark.js.map +1 -1
  339. package/dist/state/startupAnalysis/contract.js.map +1 -1
  340. package/dist/state/startupAnalysis/helpers.js.map +1 -1
  341. package/dist/state/startupAnalysis/index.js.map +1 -1
  342. package/dist/state/startupAnalysis/metrics.js.map +1 -1
  343. package/dist/state/startupAnalysis/records.js.map +1 -1
  344. package/dist/state/startupAnalysis/report.js.map +1 -1
  345. package/dist/state/startupAnalysis/threshold.js.map +1 -1
  346. package/dist/state/startupAnalysis.js.map +1 -1
  347. package/dist/state/startupProjection.js +5 -3
  348. package/dist/state/startupProjection.js.map +1 -1
  349. package/dist/state/stateMode.js +7 -0
  350. package/dist/state/stateMode.js.map +1 -1
  351. package/dist/state/todoDocsEntities.js +6 -4
  352. package/dist/state/todoDocsEntities.js.map +1 -1
  353. package/dist/state/todoDocsEntityValidation.js.map +1 -1
  354. package/dist/state/write/assign.js.map +1 -1
  355. package/dist/state/write/candidateMutation.js.map +1 -1
  356. package/dist/state/write/errors.js.map +1 -1
  357. package/dist/state/write/experimentPublication.js.map +1 -1
  358. package/dist/state/write/explain.js +10 -12
  359. package/dist/state/write/explain.js.map +1 -1
  360. package/dist/state/write/fields.js.map +1 -1
  361. package/dist/state/write/helpers.js.map +1 -1
  362. package/dist/state/write/index.js.map +1 -1
  363. package/dist/state/write/input.js.map +1 -1
  364. package/dist/state/write/lock.js.map +1 -1
  365. package/dist/state/write/mutation.js.map +1 -1
  366. package/dist/state/write/operations.js +6 -0
  367. package/dist/state/write/operations.js.map +1 -1
  368. package/dist/state/write/planEvaluation.js +19 -5
  369. package/dist/state/write/planEvaluation.js.map +1 -1
  370. package/dist/state/write/planPublication.js +7 -0
  371. package/dist/state/write/planPublication.js.map +1 -1
  372. package/dist/state/write/serialize.js.map +1 -1
  373. package/dist/state/write/transaction.js +23 -532
  374. package/dist/state/write/transaction.js.map +1 -1
  375. package/dist/state/write/validate.js.map +1 -1
  376. package/dist/upgrade/appContentRefresh.js +54 -44
  377. package/dist/upgrade/appContentRefresh.js.map +1 -1
  378. package/dist/upgrade/appModel.js.map +1 -1
  379. package/dist/upgrade/atomicWriter.js.map +1 -1
  380. package/dist/upgrade/bundleEvidence.js.map +1 -1
  381. package/dist/upgrade/channels.js.map +1 -1
  382. package/dist/upgrade/coexistenceProbe.js.map +1 -1
  383. package/dist/upgrade/compatibility.js.map +1 -1
  384. package/dist/upgrade/doctor.js +5 -1
  385. package/dist/upgrade/doctor.js.map +1 -1
  386. package/dist/upgrade/doctorClassifier.js.map +1 -1
  387. package/dist/upgrade/installedHooksRetirement.js +46 -39
  388. package/dist/upgrade/installedHooksRetirement.js.map +1 -1
  389. package/dist/upgrade/legacyAgentCleanup.js +132 -32
  390. package/dist/upgrade/legacyAgentCleanup.js.map +1 -1
  391. package/dist/upgrade/lifecycleUpgrade.js +65 -378
  392. package/dist/upgrade/lifecycleUpgrade.js.map +1 -1
  393. package/dist/upgrade/migrateArtifactsV2ToV3.js +151 -52
  394. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -1
  395. package/dist/upgrade/migrationPublication.js +123 -0
  396. package/dist/upgrade/migrationPublication.js.map +1 -0
  397. package/dist/upgrade/nextMajorDoctor.js.map +1 -1
  398. package/dist/upgrade/npxPlatformStatus.js.map +1 -1
  399. package/dist/upgrade/projectIntegration.js +46 -113
  400. package/dist/upgrade/projectIntegration.js.map +1 -1
  401. package/dist/upgrade/projectIntegrationDecision.js +6 -96
  402. package/dist/upgrade/projectIntegrationDecision.js.map +1 -1
  403. package/dist/upgrade/runtimeMigration.js +222 -402
  404. package/dist/upgrade/runtimeMigration.js.map +1 -1
  405. package/dist/upgrade/upgradeCommands.js +5 -4
  406. package/dist/upgrade/upgradeCommands.js.map +1 -1
  407. package/dist/upgrade/upgradeLock.js +73 -41
  408. package/dist/upgrade/upgradeLock.js.map +1 -1
  409. package/dist/upgrade/upgradeOrchestrator.js +91 -158
  410. package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
  411. package/dist/upgrade/v3CapabilitySurface.js +2 -2
  412. package/dist/upgrade/v3CapabilitySurface.js.map +1 -1
  413. package/dist/upgrade/versionResolution.js.map +1 -1
  414. package/dist/validate/appHomeContract.js +0 -4
  415. package/dist/validate/appHomeContract.js.map +1 -1
  416. package/dist/validate/capability.js.map +1 -1
  417. package/dist/validate/crossCapability.js.map +1 -1
  418. package/dist/validate/selfAudit.js.map +1 -1
  419. package/dist/validate/vocabularyAuthority.js.map +1 -1
  420. package/package.json +23 -8
  421. package/bundle/.codex-plugin/plugin.json +0 -92
  422. package/bundle/.cursor/agents/agentera.md +0 -7
  423. package/bundle/.cursor/hooks.json +0 -32
  424. package/bundle/.cursor-plugin/plugin.json +0 -34
  425. package/bundle/.github/hooks/postToolUse.json +0 -9
  426. package/bundle/.github/hooks/preToolUse.json +0 -8
  427. package/bundle/.github/hooks/sessionEnd.json +0 -8
  428. package/bundle/.github/hooks/sessionStart.json +0 -8
  429. package/bundle/.github/plugin/plugin.json +0 -7
  430. package/bundle/.opencode/agents/agentera.md +0 -12
  431. package/bundle/.opencode/commands/agentera.md +0 -5
  432. package/bundle/.opencode/package.json +0 -31
  433. package/bundle/.opencode/plugins/agentera.js +0 -820
  434. package/bundle/agents/openai.yaml +0 -87
  435. package/bundle/hooks/codex-hooks.json +0 -31
  436. package/bundle/hooks/codex-plugin-hooks.json +0 -31
  437. package/bundle/plugin.json +0 -13
  438. package/bundle/references/adapters/cursor.md +0 -224
  439. package/bundle/references/adapters/opencode.md +0 -529
  440. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -44
  441. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  442. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -387
  443. package/bundle/references/adapters/runtime-feature-parity.md +0 -129
  444. package/dist/cli/commands/backfill.js +0 -231
  445. package/dist/cli/commands/backfill.js.map +0 -1
  446. package/dist/cli/commands/migrate.js +0 -681
  447. package/dist/cli/commands/migrate.js.map +0 -1
  448. package/dist/registries/runtimeAdapterRegistry.js +0 -324
  449. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  450. package/dist/setup/copilot.js +0 -227
  451. package/dist/setup/copilot.js.map +0 -1
  452. package/dist/setup/cursor.js +0 -129
  453. package/dist/setup/cursor.js.map +0 -1
  454. package/dist/setup/cursorSurfaces.js +0 -67
  455. package/dist/setup/cursorSurfaces.js.map +0 -1
  456. package/dist/setup/doctor/core.js +0 -296
  457. package/dist/setup/doctor/core.js.map +0 -1
  458. package/dist/setup/doctor/diagnostics.js +0 -201
  459. package/dist/setup/doctor/diagnostics.js.map +0 -1
  460. package/dist/setup/doctor/opencode.js +0 -301
  461. package/dist/setup/doctor/opencode.js.map +0 -1
  462. package/dist/setup/doctor/report.js +0 -425
  463. package/dist/setup/doctor/report.js.map +0 -1
  464. package/dist/setup/doctor.js +0 -10
  465. package/dist/setup/doctor.js.map +0 -1
  466. package/dist/state/gitBackfill.js +0 -561
  467. package/dist/state/gitBackfill.js.map +0 -1
  468. package/dist/state/gitBackfillAuthority.js +0 -141
  469. package/dist/state/gitBackfillAuthority.js.map +0 -1
  470. package/dist/state/gitBackfillHistory.js +0 -278
  471. package/dist/state/gitBackfillHistory.js.map +0 -1
  472. package/dist/state/gitBackfillOutput.js +0 -209
  473. package/dist/state/gitBackfillOutput.js.map +0 -1
  474. package/dist/state/legacyMigration.js +0 -516
  475. package/dist/state/legacyMigration.js.map +0 -1
  476. package/dist/state/legacyMigrationParser.js +0 -489
  477. package/dist/state/legacyMigrationParser.js.map +0 -1
  478. package/dist/state/migrationAuthority.js +0 -413
  479. package/dist/state/migrationAuthority.js.map +0 -1
  480. package/dist/state/migrationEnrichment.js +0 -35
  481. package/dist/state/migrationEnrichment.js.map +0 -1
  482. package/dist/state/projectionRecovery.js +0 -458
  483. package/dist/state/projectionRecovery.js.map +0 -1
  484. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -568
  485. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  486. package/dist/validate/lifecycleAdapters/legacyPythonParity.js +0 -93
  487. package/dist/validate/lifecycleAdapters/legacyPythonParity.js.map +0 -1
  488. package/dist/validate/lifecycleAdapters/lifecycleMain.js +0 -154
  489. package/dist/validate/lifecycleAdapters/lifecycleMain.js.map +0 -1
  490. package/dist/validate/lifecycleAdapters/nodeFormChecks.js +0 -481
  491. package/dist/validate/lifecycleAdapters/nodeFormChecks.js.map +0 -1
  492. package/dist/validate/lifecycleAdapters/shared.js +0 -198
  493. package/dist/validate/lifecycleAdapters/shared.js.map +0 -1
  494. package/dist/validate/lifecycleAdapters.js +0 -10
  495. package/dist/validate/lifecycleAdapters.js.map +0 -1
@@ -1,681 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import YAML from "yaml";
4
- import { emitInvalidInput } from "../errors.js";
5
- import { emitStructured } from "../structured.js";
6
- import { resolveSourceRoot } from "../../core/sourceRoot.js";
7
- import { migrationModeFlags, migrationSelectorFlag, migrationFailure, stateMigrationContract, } from "../../state/migrationAuthority.js";
8
- import { applyLegacyMigration, inspectLegacyMigration, } from "../../state/legacyMigration.js";
9
- import { migrationEnrichmentContract } from "../../state/migrationEnrichment.js";
10
- import { runEntityMigrate } from "./entityMigrate.js";
11
- function requestedFormat(argv, formats, formatFlag) {
12
- let requested;
13
- for (let index = 0; index < argv.length; index += 1) {
14
- if (argv[index] === formatFlag) {
15
- requested = argv[index + 1];
16
- }
17
- if (argv[index].startsWith(`${formatFlag}=`)) {
18
- requested = argv[index].slice(formatFlag.length + 1);
19
- }
20
- }
21
- if (!requested || (formats && !formats.includes(requested)))
22
- return "text";
23
- return requested;
24
- }
25
- function parseInteger(flag, value, pattern) {
26
- if (pattern && !new RegExp(pattern).test(value)) {
27
- return `argument ${flag}: invalid int value: '${value}'`;
28
- }
29
- const parsed = Number(value);
30
- return Number.isSafeInteger(parsed) ? parsed : `argument ${flag}: invalid int value: '${value}'`;
31
- }
32
- function candidatePathError(candidate, contract, project = process.cwd()) {
33
- if (candidate.includes("\0") ||
34
- candidate.includes("\\") ||
35
- path.isAbsolute(candidate) ||
36
- path.win32.isAbsolute(candidate)) {
37
- return "candidate path violates the project boundary: use a project-local relative path";
38
- }
39
- let decoded = candidate;
40
- try {
41
- decoded = decodeURIComponent(candidate);
42
- }
43
- catch {
44
- return "candidate path contains invalid percent encoding";
45
- }
46
- const normalized = decoded.replaceAll("\\", "/");
47
- const parts = normalized.split("/").filter((part) => part !== "" && part !== ".");
48
- if (parts.some((part) => part === "..") ||
49
- decoded.includes("://") ||
50
- /^[A-Za-z][A-Za-z0-9+.-]*:/.test(decoded)) {
51
- return "candidate path violates the project boundary: traversal and URI paths are forbidden";
52
- }
53
- const normalizedPath = parts.join("/");
54
- if (contract.inventory.excludedRelativePaths.some((excluded) => normalizedPath === excluded || normalizedPath.startsWith(`${excluded}/`))) {
55
- return "candidate path is excluded by the authority inventory policy";
56
- }
57
- const inScanRoot = contract.inventory.roots.some((root) => {
58
- const rootParts = root.path === "." ? [] : root.path.split("/").filter(Boolean);
59
- const relativeParts = parts.slice(rootParts.length);
60
- return (rootParts.every((part, index) => parts[index] === part) &&
61
- relativeParts.length > 0 &&
62
- relativeParts.length <= root.maximumDepth);
63
- });
64
- if (!inScanRoot)
65
- return "candidate path must remain within a declared project-local scan root";
66
- if (!new RegExp(contract.candidatePattern).test(parts[parts.length - 1])) {
67
- return "candidate path is unsupported by the authority candidate pattern";
68
- }
69
- let projectRoot;
70
- try {
71
- projectRoot = fs.realpathSync(project);
72
- }
73
- catch {
74
- return "selected project must resolve to an existing project directory";
75
- }
76
- let current = projectRoot;
77
- for (const part of parts) {
78
- current = path.join(current, part);
79
- try {
80
- if (fs.lstatSync(current).isSymbolicLink()) {
81
- return "candidate path violates the project boundary: symlink components are forbidden";
82
- }
83
- }
84
- catch {
85
- break;
86
- }
87
- }
88
- return null;
89
- }
90
- class MigrationInventoryError extends Error {
91
- failureClass;
92
- constructor(message, failureClass) {
93
- super(message);
94
- this.failureClass = failureClass;
95
- this.name = "MigrationInventoryError";
96
- }
97
- }
98
- function normalizedRelativePath(value) {
99
- return value.replaceAll("\\", "/").replace(/^\.\//, "");
100
- }
101
- function pathIsExcluded(relativePath, contract) {
102
- return contract.inventory.excludedRelativePaths.some((excluded) => relativePath === excluded || relativePath.startsWith(`${excluded}/`));
103
- }
104
- function inventoryEntry(observation, project, contract) {
105
- const artifactId = contract.fixedNames[observation.relativePath] ?? null;
106
- const entry = {
107
- candidate_id: observation.relativePath,
108
- path: observation.relativePath,
109
- artifact_id: artifactId,
110
- entry_number: null,
111
- classification: "unaddressable",
112
- detail_availability: "candidate_metadata_only",
113
- compatibility: "legacy",
114
- source: "project_local",
115
- addressable: false,
116
- size_bytes: observation.sizeBytes,
117
- };
118
- const pathError = candidatePathError(observation.relativePath, contract, project);
119
- if (observation.symbolicLink || pathError?.includes("boundary")) {
120
- entry.classification = "project_boundary";
121
- entry.compatibility = "blocked";
122
- entry.rejection = observation.symbolicLink ? "symlink_escape" : "outside_project";
123
- }
124
- else if (!observation.regularFile || pathError) {
125
- entry.classification = "unsupported";
126
- entry.compatibility = "unsupported";
127
- entry.rejection = observation.regularFile ? "unsupported_path" : "non_regular";
128
- }
129
- return entry;
130
- }
131
- function inventoryStatus(entries, omittedCount, contract) {
132
- const preferred = omittedCount > 0
133
- ? "degraded"
134
- : entries.some((entry) => entry.rejection !== undefined)
135
- ? "blocked"
136
- : "complete";
137
- return contract.resultStatuses.includes(preferred) ? preferred : contract.resultStatuses[0];
138
- }
139
- /** Inventory candidate metadata only; this function never reads bytes or mutates state. */
140
- export function inventoryCandidates(selectedProject, contract) {
141
- let project;
142
- try {
143
- project = fs.realpathSync(selectedProject);
144
- if (!fs.statSync(project).isDirectory())
145
- throw new Error("not a directory");
146
- }
147
- catch {
148
- throw new MigrationInventoryError("selected project must resolve to an existing project directory", "project_boundary");
149
- }
150
- const observations = [];
151
- const seen = new Set();
152
- const candidatePattern = new RegExp(contract.candidatePattern);
153
- const collect = (rootPath, rootRelative, maximumDepth, depth) => {
154
- let directoryEntries;
155
- try {
156
- directoryEntries = fs.readdirSync(rootPath, { withFileTypes: true });
157
- }
158
- catch {
159
- return;
160
- }
161
- for (const directoryEntry of directoryEntries) {
162
- const relativePath = normalizedRelativePath(path.join(rootRelative, directoryEntry.name));
163
- if (pathIsExcluded(relativePath, contract))
164
- continue;
165
- const absolutePath = path.join(project, relativePath);
166
- if (directoryEntry.isDirectory()) {
167
- if (depth + 1 < maximumDepth)
168
- collect(absolutePath, relativePath, maximumDepth, depth + 1);
169
- continue;
170
- }
171
- if (!candidatePattern.test(directoryEntry.name) || seen.has(relativePath))
172
- continue;
173
- seen.add(relativePath);
174
- let sizeBytes = 0;
175
- try {
176
- sizeBytes = fs.lstatSync(absolutePath).size;
177
- }
178
- catch {
179
- sizeBytes = 0;
180
- }
181
- observations.push({
182
- relativePath,
183
- sizeBytes,
184
- symbolicLink: directoryEntry.isSymbolicLink(),
185
- regularFile: directoryEntry.isFile(),
186
- });
187
- }
188
- };
189
- for (const root of contract.inventory.roots) {
190
- const rootRelative = normalizedRelativePath(root.path === "." ? "" : root.path);
191
- const rootPath = path.resolve(project, rootRelative || ".");
192
- try {
193
- const rootStat = fs.lstatSync(rootPath);
194
- if (rootStat.isSymbolicLink()) {
195
- throw new MigrationInventoryError(`declared scan root '${root.path}' violates the project boundary: symlink roots are forbidden`, "project_boundary");
196
- }
197
- if (!rootStat.isDirectory())
198
- continue;
199
- }
200
- catch (error) {
201
- if (error instanceof MigrationInventoryError)
202
- throw error;
203
- continue;
204
- }
205
- collect(rootPath, rootRelative, root.maximumDepth, 0);
206
- }
207
- observations.sort((left, right) => left.relativePath < right.relativePath ? -1 : left.relativePath > right.relativePath ? 1 : 0);
208
- const entries = [];
209
- let omittedCount = 0;
210
- let totalBytes = 0;
211
- for (const [index, observation] of observations.entries()) {
212
- if (index >= contract.inventory.maximumCandidateFiles) {
213
- omittedCount += 1;
214
- continue;
215
- }
216
- if (observation.sizeBytes > contract.inventory.maximumFileBytes) {
217
- omittedCount += 1;
218
- continue;
219
- }
220
- if (totalBytes + observation.sizeBytes > contract.inventory.maximumTotalBytes) {
221
- omittedCount += 1;
222
- continue;
223
- }
224
- totalBytes += observation.sizeBytes;
225
- entries.push(inventoryEntry(observation, project, contract));
226
- }
227
- return {
228
- project,
229
- entries,
230
- omittedCount,
231
- status: inventoryStatus(entries, omittedCount, contract),
232
- };
233
- }
234
- export function parseMigrateArgs(argv, contract = stateMigrationContract()) {
235
- const selectorFlags = new Map(Object.keys(contract.selectors).map((name) => [migrationSelectorFlag(contract, name), name]));
236
- const formatFlag = migrationSelectorFlag(contract, "format");
237
- const previewFlags = migrationModeFlags(contract, "preview");
238
- const applyFlags = migrationModeFlags(contract, "apply");
239
- const dryRunFlag = previewFlags[0];
240
- const applyFlag = applyFlags.find((flag) => !previewFlags.includes(flag)) ?? applyFlags[0];
241
- const forceFlag = applyFlags.find((flag) => flag !== applyFlag);
242
- const args = {
243
- project: null,
244
- artifact: null,
245
- dryRun: false,
246
- apply: false,
247
- force: false,
248
- format: contract.formats[0],
249
- limit: contract.defaultLimit,
250
- };
251
- const seen = new Set();
252
- for (let index = 0; index < argv.length; index += 1) {
253
- const token = argv[index];
254
- const flag = [...selectorFlags.keys()].find((candidate) => token === candidate || token.startsWith(`${candidate}=`));
255
- if (flag) {
256
- if (seen.has(flag))
257
- return { error: `${flag} may only be supplied once` };
258
- seen.add(flag);
259
- const inline = token.startsWith(`${flag}=`);
260
- const value = inline ? token.slice(flag.length + 1) : argv[++index];
261
- if (value === undefined || value === "" || (!inline && value.startsWith("--"))) {
262
- return { error: `argument ${flag}: expected a value` };
263
- }
264
- const selector = selectorFlags.get(flag);
265
- if (selector === "format") {
266
- if (!contract.formats.includes(value)) {
267
- return {
268
- error: `argument ${formatFlag}: invalid choice: '${value}' (choose from ${contract.formats.map((item) => `'${item}'`).join(", ")})`,
269
- };
270
- }
271
- args.format = value;
272
- }
273
- else if (selector === "project")
274
- args.project = value;
275
- else if (selector === "artifact")
276
- args.artifact = value;
277
- else if (selector === "path")
278
- args.path = value;
279
- else {
280
- const pattern = selector === "number" ? contract.numberPattern : undefined;
281
- const parsed = parseInteger(flag, value, pattern);
282
- if (typeof parsed === "string")
283
- return { error: parsed };
284
- if (selector === "number")
285
- args.number = parsed;
286
- else if (selector === "limit")
287
- args.limit = parsed;
288
- }
289
- }
290
- else if (token === dryRunFlag) {
291
- if (args.dryRun)
292
- return { error: `${dryRunFlag} may only be supplied once` };
293
- args.dryRun = true;
294
- }
295
- else if (token === applyFlag) {
296
- if (args.apply)
297
- return { error: `${applyFlag} may only be supplied once` };
298
- args.apply = true;
299
- }
300
- else if (token === forceFlag) {
301
- if (args.force)
302
- return { error: `${forceFlag} may only be supplied once` };
303
- args.force = true;
304
- }
305
- else {
306
- return { error: `unrecognized arguments: ${token}` };
307
- }
308
- }
309
- return args;
310
- }
311
- export function validateMigrateArgs(args, contract) {
312
- const limitFlag = migrationSelectorFlag(contract, "limit");
313
- const dryRunFlag = migrationModeFlags(contract, "preview")[0];
314
- const applyFlags = migrationModeFlags(contract, "apply");
315
- const applyFlag = applyFlags.find((flag) => ![dryRunFlag].includes(flag)) ?? applyFlags[0];
316
- const forceFlag = applyFlags.find((flag) => flag !== applyFlag);
317
- const selectorValue = (selectorName) => {
318
- if (selectorName === "project")
319
- return args.project;
320
- if (selectorName === "artifact")
321
- return args.artifact;
322
- if (selectorName === "number")
323
- return args.number;
324
- if (selectorName === "path")
325
- return args.path;
326
- if (selectorName === "limit")
327
- return args.limit;
328
- if (selectorName === "format")
329
- return args.format;
330
- return undefined;
331
- };
332
- const selectorFlag = (name) => migrationSelectorFlag(contract, name);
333
- const activeModeFlags = new Set();
334
- if (args.dryRun)
335
- activeModeFlags.add(dryRunFlag);
336
- if (args.apply)
337
- activeModeFlags.add(applyFlag);
338
- if (args.force && forceFlag)
339
- activeModeFlags.add(forceFlag);
340
- for (const combination of contract.invalidCombinations) {
341
- if (!combination.flags.every((flag) => activeModeFlags.has(flag)))
342
- continue;
343
- if (combination.requires && !activeModeFlags.has(combination.requires))
344
- return combination.message;
345
- if (!combination.requires)
346
- return combination.message;
347
- }
348
- const artifactValues = contract.selectorValidValues.artifact;
349
- if (args.artifact && !artifactValues.includes(args.artifact)) {
350
- return `unsupported artifact '${args.artifact}'`;
351
- }
352
- const numberRequires = contract.selectors.number.required_with;
353
- if (args.number !== undefined && typeof numberRequires === "string") {
354
- const requiredSelector = Object.keys(contract.selectors).find((name) => selectorFlag(name) === numberRequires);
355
- if (!requiredSelector ||
356
- selectorValue(requiredSelector) === null ||
357
- selectorValue(requiredSelector) === undefined) {
358
- return `argument ${selectorFlag("number")} requires ${numberRequires}`;
359
- }
360
- }
361
- if (args.limit !== undefined &&
362
- (args.limit < contract.minimumLimit || args.limit > contract.maximumLimit)) {
363
- return `argument ${limitFlag} must be between ${contract.minimumLimit} and ${contract.maximumLimit}`;
364
- }
365
- if (args.path) {
366
- const pathError = candidatePathError(args.path, contract, args.project ?? process.cwd());
367
- if (pathError)
368
- return pathError;
369
- }
370
- const requiredApplySelectors = contract.requiredSelectors.apply ?? [];
371
- const missingApplySelectors = requiredApplySelectors.filter((required) => {
372
- const selectorName = Object.keys(contract.selectors).find((name) => selectorFlag(name) === required);
373
- return (!selectorName ||
374
- selectorValue(selectorName) === null ||
375
- selectorValue(selectorName) === undefined);
376
- });
377
- if (args.apply && missingApplySelectors.length > 0) {
378
- return `${applyFlag} requires ${missingApplySelectors.join(" and ")} selector${missingApplySelectors.length === 1 ? "" : "s"}`;
379
- }
380
- return null;
381
- }
382
- function authorityFailure(contract, failureClass) {
383
- const failure = migrationFailure(contract, failureClass);
384
- return {
385
- example: typeof failure.example === "string" ? failure.example : undefined,
386
- recovery: typeof failure.recovery === "string" ? failure.recovery : undefined,
387
- };
388
- }
389
- function failureClassForMessage(contract, message) {
390
- const modeFailure = contract.invalidCombinations.find((combination) => combination.message === message);
391
- if (modeFailure)
392
- return modeFailure.failureClass;
393
- if (message.includes("project boundary") || message.includes("selected project"))
394
- return "project_boundary";
395
- if (message.includes("unsupported"))
396
- return "unsupported_candidate";
397
- return "invalid_selector";
398
- }
399
- function invalid(message, format, contract, validValues, failureClass = "invalid_selector") {
400
- const failure = contract ? authorityFailure(contract, failureClass) : {};
401
- return {
402
- format,
403
- body: {
404
- class: message.startsWith("unsupported artifact") ? "invalid_choice" : "invalid_request",
405
- message,
406
- ...(contract
407
- ? { syntax: contract.command, example: authorityFailure(contract, failureClass).example }
408
- : {}),
409
- ...(validValues ? { valid_values: validValues } : {}),
410
- ...(failure.recovery ? { recovery: failure.recovery } : {}),
411
- },
412
- };
413
- }
414
- export function projectedEntries(entries, args, contract) {
415
- const allowedFields = new Set(contract.resultEntryFields);
416
- const normalized = entries
417
- .map((entry) => {
418
- const projected = Object.fromEntries(Object.entries(entry).filter(([field]) => allowedFields.has(field)));
419
- for (const field of ["path", "candidate_id"]) {
420
- if (typeof projected[field] === "string") {
421
- projected[field] = normalizedRelativePath(projected[field]);
422
- }
423
- }
424
- return projected;
425
- })
426
- .sort((left, right) => {
427
- const leftPath = String(left.path ?? "").replaceAll("\\", "/");
428
- const rightPath = String(right.path ?? "").replaceAll("\\", "/");
429
- return leftPath < rightPath ? -1 : leftPath > rightPath ? 1 : 0;
430
- });
431
- const limit = args.limit ?? contract.defaultLimit;
432
- return {
433
- entries: normalized.slice(0, limit),
434
- omittedCount: Math.max(0, normalized.length - limit),
435
- };
436
- }
437
- export function resultCounts(entries, omittedCount, contract) {
438
- const matches = (entry, predicates) => predicates.every((predicate) => {
439
- if ("equals" in predicate)
440
- return entry[predicate.field] === predicate.equals;
441
- return entry[predicate.field] !== predicate.notEquals;
442
- });
443
- const counts = {};
444
- for (const field of contract.resultCountFields) {
445
- const rule = contract.resultCountRules[field];
446
- const sourceEntries = rule.source === "visible_entries" ? entries : [];
447
- if (rule.operation === "value" && rule.source === "omitted_count") {
448
- counts[field] = omittedCount;
449
- }
450
- else if (rule.operation === "count" &&
451
- rule.source === "all_candidates" &&
452
- rule.predicates.length === 0) {
453
- counts[field] = entries.length + omittedCount;
454
- }
455
- else if (rule.operation === "count" && rule.source === "visible_entries") {
456
- counts[field] = sourceEntries.filter((entry) => matches(entry, rule.predicates)).length;
457
- }
458
- else if (rule.operation === "distinct" && rule.source === "visible_entries" && rule.field) {
459
- counts[field] = new Set(sourceEntries
460
- .filter((entry) => matches(entry, rule.predicates))
461
- .map((entry) => entry[rule.field])
462
- .filter((value) => typeof value === "string" || typeof value === "number")).size;
463
- }
464
- else {
465
- counts[field] = null;
466
- }
467
- }
468
- return counts;
469
- }
470
- function omissionValues(contract, omittedCount, outputBounded = false) {
471
- const sourceValues = {
472
- has_omissions: omittedCount > 0,
473
- omitted_count: omittedCount,
474
- omission_reason: omittedCount > 0
475
- ? outputBounded
476
- ? contract.omission.outputBoundedReason
477
- : contract.omission.boundedReason
478
- : contract.omission.completeReason,
479
- retrieval: {
480
- command: contract.omission.retrieval,
481
- retry: outputBounded ? contract.omission.outputRetry : contract.omission.retry,
482
- },
483
- };
484
- return Object.fromEntries(contract.omission.fields.map((field) => {
485
- const source = contract.omission.fieldSources[field];
486
- if (!(source in sourceValues)) {
487
- throw new Error(`state migration omission source '${source}' is unavailable`);
488
- }
489
- return [field, sourceValues[source]];
490
- }));
491
- }
492
- function textResponse(response) {
493
- const diagnostics = response.diagnostics;
494
- const valueText = (value) => value !== null && typeof value === "object" ? JSON.stringify(value) : String(value);
495
- return ([
496
- ...Object.entries(response)
497
- .filter(([field]) => field !== "diagnostics")
498
- .map(([field, value]) => `${field}: ${valueText(value)}`),
499
- `diagnostic: ${diagnostics[0]?.message ?? "none"}`,
500
- `authority: ${response.source_contract.authority}`,
501
- "",
502
- ].join("\n"));
503
- }
504
- function serializedResponseBytes(response, format) {
505
- const serialized = format === "text"
506
- ? textResponse(response)
507
- : format === "yaml"
508
- ? YAML.stringify(response, { sortMapEntries: false })
509
- : JSON.stringify(response, null, 2) + "\n";
510
- return Buffer.byteLength(serialized, "utf8");
511
- }
512
- function boundedDiagnostics(diagnostics, entries, contract) {
513
- if (!Array.isArray(diagnostics))
514
- return [];
515
- const retainedIds = new Set(entries.map((entry) => String(entry.candidate_id ?? "")));
516
- const retained = [];
517
- const omitted = new Map();
518
- for (const value of diagnostics) {
519
- if (value === null || typeof value !== "object" || Array.isArray(value))
520
- continue;
521
- const diagnostic = value;
522
- const candidateId = diagnostic.candidate_id;
523
- if (candidateId === undefined || retainedIds.has(String(candidateId))) {
524
- retained.push(diagnostic);
525
- continue;
526
- }
527
- const failureClass = String(diagnostic.class ?? "unsupported_candidate");
528
- omitted.set(failureClass, (omitted.get(failureClass) ?? 0) + 1);
529
- }
530
- for (const [failureClass, count] of [...omitted.entries()].sort(([left], [right]) => left.localeCompare(right))) {
531
- retained.push({
532
- class: failureClass,
533
- message: `${count} candidate diagnostic(s) were omitted by the serialized output budget`,
534
- provenance: {
535
- failure_class: failureClass,
536
- reason: contract.omission.outputBoundedReason,
537
- omitted_count: count,
538
- },
539
- });
540
- }
541
- return retained;
542
- }
543
- function boundMigrationResponse(response, format, contract) {
544
- if (serializedResponseBytes(response, format) <= contract.outputMaxUtf8Bytes)
545
- return response;
546
- const entries = Array.isArray(response.entries)
547
- ? response.entries
548
- : [];
549
- const initialOmitted = Number(response.omitted_count ?? 0);
550
- for (let retainedCount = entries.length; retainedCount >= 0; retainedCount -= 1) {
551
- const retained = entries.slice(0, retainedCount);
552
- const omittedCount = initialOmitted + entries.length - retainedCount;
553
- const bounded = {
554
- ...response,
555
- entries: retained,
556
- diagnostics: boundedDiagnostics(response.diagnostics, retained, contract),
557
- counts: resultCounts(retained, omittedCount, contract),
558
- ...omissionValues(contract, omittedCount, true),
559
- };
560
- if (serializedResponseBytes(bounded, format) <= contract.outputMaxUtf8Bytes)
561
- return bounded;
562
- }
563
- throw new Error(`migration output requires more than the authority ${contract.outputMaxUtf8Bytes}-byte ${format} budget after required omission metadata`);
564
- }
565
- export function deferredResponse(args, contract, entries = [], inventory, options = {}, sourceRoot = resolveSourceRoot()) {
566
- const mode = args.apply ? "apply" : args.dryRun ? "preview" : "inventory";
567
- const projected = projectedEntries(entries, args, contract);
568
- const omittedCount = (inventory?.omittedCount ?? 0) + projected.omittedCount;
569
- const omission = omissionValues(contract, omittedCount);
570
- const values = {
571
- schemaVersion: contract.resultSchemaVersion,
572
- command: contract.command,
573
- status: options.status ?? inventory?.status ?? contract.resultStatuses[0],
574
- mode,
575
- project: inventory?.project ?? args.project ?? process.cwd(),
576
- read_only: !args.apply,
577
- mutation_intent: args.apply,
578
- mutation_performed: options.mutationPerformed ?? false,
579
- remote_contact: false,
580
- inventory_performed: inventory !== undefined,
581
- entries: projected.entries,
582
- counts: resultCounts(projected.entries, omittedCount, contract),
583
- ...omission,
584
- diagnostics: options.diagnostics ?? [
585
- {
586
- class: "implementation_deferred",
587
- message: `${String(contract.migration.implementation_boundary)} No state was changed.`,
588
- },
589
- ],
590
- source_contract: {
591
- authority: contract.authorityPath,
592
- schema_version: contract.schemaVersion,
593
- execution: "authority_and_dispatch_only",
594
- result: {
595
- required_fields: contract.resultRequiredFields,
596
- entry_fields: contract.resultEntryFields,
597
- count_fields: contract.resultCountFields,
598
- count_rules: contract.resultCountRules,
599
- omission: contract.omission,
600
- max_utf8_bytes: contract.outputMaxUtf8Bytes,
601
- },
602
- inventory: contract.inventory,
603
- git_required: false,
604
- remote_contact: "forbidden",
605
- optional_git_enrichment: migrationEnrichmentContract(sourceRoot),
606
- },
607
- };
608
- const response = Object.fromEntries(contract.resultRequiredFields.map((field) => [field, values[field] ?? null]));
609
- if (options.operations !== undefined)
610
- response.operations = options.operations;
611
- return boundMigrationResponse(response, args.format, contract);
612
- }
613
- export function renderText(response, out) {
614
- out(textResponse(response));
615
- }
616
- export function runMigrate(argv, io, sourceRootOverride) {
617
- if (argv[0] === "entities") {
618
- return runEntityMigrate(argv.slice(1), io, process.cwd(), sourceRootOverride ?? resolveSourceRoot());
619
- }
620
- let format = "text";
621
- const sourceRoot = sourceRootOverride ?? resolveSourceRoot();
622
- let contract;
623
- try {
624
- contract = stateMigrationContract(sourceRoot);
625
- }
626
- catch (error) {
627
- return emitInvalidInput(io, invalid(`Local migration authority could not be loaded: ${error.message}`, format));
628
- }
629
- format = requestedFormat(argv, contract.formats, migrationSelectorFlag(contract, "format"));
630
- const parsed = parseMigrateArgs(argv, contract);
631
- if ("error" in parsed) {
632
- const validValues = parsed.error.includes("invalid choice")
633
- ? contract.selectorValidValues.format
634
- : undefined;
635
- return emitInvalidInput(io, invalid(parsed.error, format, contract, validValues, "invalid_selector"));
636
- }
637
- const validation = validateMigrateArgs(parsed, contract);
638
- if (validation) {
639
- const validValues = validation.startsWith("unsupported artifact")
640
- ? contract.selectorValidValues.artifact
641
- : undefined;
642
- return emitInvalidInput(io, invalid(validation, format, contract, validValues, failureClassForMessage(contract, validation)));
643
- }
644
- let inventory;
645
- try {
646
- inventory = inventoryCandidates(parsed.project ?? process.cwd(), contract);
647
- }
648
- catch (error) {
649
- const inventoryError = error;
650
- return emitInvalidInput(io, invalid(inventoryError.message, format, contract, undefined, inventoryError.failureClass ?? "project_boundary"));
651
- }
652
- let inspection;
653
- try {
654
- inspection = inspectLegacyMigration(inventory, contract, sourceRoot, parsed);
655
- }
656
- catch (error) {
657
- return emitInvalidInput(io, invalid(`local migration inventory failed: ${error.message}`, format, contract, undefined, "corrupt_candidate"));
658
- }
659
- let applyResult;
660
- if (parsed.apply) {
661
- applyResult = applyLegacyMigration(inspection, {
662
- artifact: parsed.artifact,
663
- number: parsed.number,
664
- path: parsed.path,
665
- }, { sourceRoot });
666
- }
667
- const diagnostics = [...inspection.diagnostics, ...(applyResult?.diagnostics ?? [])].slice(0, parsed.limit ?? contract.defaultLimit);
668
- const response = deferredResponse(parsed, contract, inspection.entries, { ...inventory, status: applyResult?.status ?? inspection.status }, {
669
- status: applyResult?.status ?? inspection.status,
670
- diagnostics,
671
- operations: applyResult?.operations ?? inspection.operations,
672
- mutationPerformed: applyResult?.mutationPerformed ?? false,
673
- }, sourceRoot);
674
- const out = io.out ?? ((text) => process.stdout.write(text));
675
- if (format === "text")
676
- renderText(response, out);
677
- else
678
- emitStructured(response, format, out);
679
- return 1;
680
- }
681
- //# sourceMappingURL=migrate.js.map