agentera 3.0.0-dev.4 → 3.0.0-dev.46

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 (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,499 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import { StringDecoder } from "node:string_decoder";
4
+ import path from "node:path";
5
+ import YAML from "yaml";
6
+ import { truncateCodePoints } from "../core/text.js";
7
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
8
+ import { fullEntityUpgradePreviewCommand } from "../upgrade/upgradeCommands.js";
9
+ import { canonicalRecordJson, discoverNumberedArchives, numberedArchiveContract, stateCurrentProjectionPath, } from "./archiveDiscovery.js";
10
+ import { legacyIdentity } from "./legacyIdentity.js";
11
+ import { classifyStateRows } from "./listClassification.js";
12
+ const READ_CHUNK_BYTES = 64 * 1024;
13
+ const MAX_CAPTURED_VALUE_CHARS = 512;
14
+ const MAX_LINE_BUFFER_BYTES = 16 * 1024;
15
+ export const STARTUP_ARRAY_LIMIT = 20;
16
+ const ROOT_ITEM = /^ -(?:\s+(.*))?$/;
17
+ const ROOT_FIELD = /^ ([A-Za-z0-9_-]+):(?:\s*(.*))?$/;
18
+ const NESTED_FIELD = /^\s{6,}([A-Za-z0-9_-]+):(?:\s*(.*))?$/;
19
+ const CAPTURED_FIELDS = new Set([
20
+ "number",
21
+ "date",
22
+ "timestamp",
23
+ "status",
24
+ "type",
25
+ "phase",
26
+ "summary",
27
+ "what",
28
+ "question",
29
+ "choice",
30
+ "trajectory",
31
+ "name",
32
+ "title",
33
+ "review_needed",
34
+ "state",
35
+ "source",
36
+ "review_date",
37
+ "review_by",
38
+ "review_due",
39
+ ]);
40
+ const BLOCK_SECTIONS = new Set(["grades", "satisfaction"]);
41
+ const PRESERVED_STARTUP_KEYS = new Set([
42
+ "number",
43
+ "entry_number",
44
+ "stable_id",
45
+ "artifact_id",
46
+ "status",
47
+ "mode",
48
+ "capability",
49
+ "command",
50
+ "get",
51
+ "list",
52
+ "fallback_command",
53
+ "next_cursor",
54
+ "field",
55
+ ]);
56
+ /** Bound optional capability startup detail without touching identity or routes. */
57
+ export function boundStartupValue(value, key = "", depth = 0) {
58
+ if (typeof value === "string")
59
+ return PRESERVED_STARTUP_KEYS.has(key) ? value : truncateCodePoints(value, 200, "\u2026");
60
+ if (Array.isArray(value)) {
61
+ const bounded = value.slice(0, STARTUP_ARRAY_LIMIT).map((item) => boundStartupValue(item, key, depth + 1));
62
+ return bounded;
63
+ }
64
+ if (!isMapping(value) || depth > 8)
65
+ return value;
66
+ const result = {};
67
+ for (const [childKey, child] of Object.entries(value)) {
68
+ result[childKey] = boundStartupValue(child, childKey, depth + 1);
69
+ }
70
+ return result;
71
+ }
72
+ function isMapping(value) {
73
+ return value !== null && typeof value === "object" && !Array.isArray(value);
74
+ }
75
+ function capturedString(value) {
76
+ return truncateCodePoints(value, MAX_CAPTURED_VALUE_CHARS, "\u2026");
77
+ }
78
+ function hashValue(value) {
79
+ return createHash("sha256").update(canonicalRecordJson(value), "utf8").digest("hex");
80
+ }
81
+ function scalar(value) {
82
+ if (value === undefined)
83
+ return undefined;
84
+ const text = value.trim();
85
+ if (!text || text === "|" || text === ">" || text === "|-" || text === ">-")
86
+ return undefined;
87
+ const bounded = capturedString(text);
88
+ try {
89
+ const parsed = YAML.parse(bounded);
90
+ if (parsed === null || typeof parsed === "string" || typeof parsed === "number" || typeof parsed === "boolean") {
91
+ return parsed;
92
+ }
93
+ }
94
+ catch {
95
+ // A bounded prefix can be an incomplete quoted scalar; identity metadata is
96
+ // still useful as a plain string in that case.
97
+ }
98
+ return bounded.replace(/^['"]|['"]$/g, "");
99
+ }
100
+ function setCaptured(fields, key, value) {
101
+ if (key === "review_needed") {
102
+ const parsed = scalar(value);
103
+ if (parsed !== undefined)
104
+ fields.review_needed = parsed;
105
+ return;
106
+ }
107
+ if (!CAPTURED_FIELDS.has(key))
108
+ return;
109
+ const parsed = scalar(value);
110
+ if (parsed !== undefined)
111
+ fields[key] = parsed;
112
+ }
113
+ function setNested(fields, section, key, value) {
114
+ if (section === "grades") {
115
+ const parsed = scalar(value);
116
+ if (parsed === undefined)
117
+ return;
118
+ const grades = isMapping(fields.grades) ? fields.grades : {};
119
+ grades[key] = parsed;
120
+ fields.grades = grades;
121
+ return;
122
+ }
123
+ if (section !== "satisfaction" || !["review_needed", "state", "source", "review_date", "review_by", "review_due"].includes(key))
124
+ return;
125
+ const parsed = scalar(value);
126
+ if (parsed === undefined)
127
+ return;
128
+ const satisfaction = isMapping(fields.satisfaction) ? fields.satisfaction : {};
129
+ satisfaction[key] = parsed;
130
+ fields.satisfaction = satisfaction;
131
+ }
132
+ function finalizeEntry(entries, fields, artifactId, entryNumberField, filePath, origin) {
133
+ entries.push({
134
+ index: entries.length,
135
+ path: filePath,
136
+ fields,
137
+ identity: legacyIdentity(fields, artifactId, entryNumberField),
138
+ origin,
139
+ projectionHash: hashValue(fields),
140
+ });
141
+ }
142
+ /**
143
+ * Read only the bounded metadata needed by startup consumers. The scanner
144
+ * never constructs a full YAML record, so a large verification or transcript
145
+ * field cannot become a retained prime payload or heap-sized object graph.
146
+ */
147
+ export function scanYamlCollection(filePath, collection, artifactId, entryNumberField, origin = collection === "archive" ? "summary" : "active") {
148
+ if (!fs.existsSync(filePath))
149
+ return { path: filePath, exists: false, collection_found: false, bytes_scanned: 0, entries: [] };
150
+ try {
151
+ const stat = fs.lstatSync(filePath);
152
+ if (stat.isSymbolicLink() || !stat.isFile()) {
153
+ return { path: filePath, exists: true, collection_found: false, bytes_scanned: 0, entries: [] };
154
+ }
155
+ }
156
+ catch {
157
+ return { path: filePath, exists: true, collection_found: false, bytes_scanned: 0, entries: [] };
158
+ }
159
+ let fd;
160
+ try {
161
+ fd = fs.openSync(filePath, "r");
162
+ }
163
+ catch {
164
+ return { path: filePath, exists: true, collection_found: false, bytes_scanned: 0, entries: [] };
165
+ }
166
+ const decoder = new StringDecoder("utf8");
167
+ const buffer = Buffer.allocUnsafe(READ_CHUNK_BYTES);
168
+ const entries = [];
169
+ let bytesScanned = 0;
170
+ let line = "";
171
+ let lineBytes = 0;
172
+ let droppingLongLine = false;
173
+ let inCollection = false;
174
+ let collectionFound = false;
175
+ let fields = null;
176
+ let section = null;
177
+ let blockField = null;
178
+ const finish = () => {
179
+ if (fields !== null)
180
+ finalizeEntry(entries, fields, artifactId, entryNumberField, filePath, origin);
181
+ fields = null;
182
+ section = null;
183
+ blockField = null;
184
+ };
185
+ const processLine = (rawLine) => {
186
+ const text = rawLine.replace(/\r$/, "");
187
+ if (!inCollection) {
188
+ if (text === `${collection}:`) {
189
+ inCollection = true;
190
+ collectionFound = true;
191
+ }
192
+ return;
193
+ }
194
+ if (text && !/^\s/.test(text)) {
195
+ finish();
196
+ inCollection = text === `${collection}:`;
197
+ if (inCollection)
198
+ collectionFound = true;
199
+ return;
200
+ }
201
+ const item = ROOT_ITEM.exec(text);
202
+ if (item) {
203
+ finish();
204
+ fields = {};
205
+ const inline = item[1] ?? "";
206
+ const pair = /^([A-Za-z0-9_-]+):(?:\s*(.*))?$/.exec(inline);
207
+ if (pair) {
208
+ setCaptured(fields, pair[1], pair[2]);
209
+ section = BLOCK_SECTIONS.has(pair[1]) && !pair[2] ? pair[1] : null;
210
+ blockField = pair[1] === "summary" && !pair[2] ? "summary" : null;
211
+ }
212
+ else if (inline) {
213
+ fields.summary = scalar(inline) ?? capturedString(inline);
214
+ }
215
+ return;
216
+ }
217
+ if (fields === null)
218
+ return;
219
+ const root = ROOT_FIELD.exec(text);
220
+ if (root) {
221
+ section = BLOCK_SECTIONS.has(root[1]) && !root[2] ? root[1] : null;
222
+ blockField = root[1] === "summary" && !root[2] ? "summary" : null;
223
+ if (root[1] === "verified" && (root[2] === undefined || scalar(root[2]) !== undefined))
224
+ fields.verified_present = true;
225
+ setCaptured(fields, root[1], root[2]);
226
+ return;
227
+ }
228
+ const nested = NESTED_FIELD.exec(text);
229
+ if (nested) {
230
+ if (section)
231
+ setNested(fields, section, nested[1], nested[2]);
232
+ if (blockField && fields[blockField] === undefined && nested[2]) {
233
+ fields[blockField] = capturedString(nested[2].trim());
234
+ }
235
+ return;
236
+ }
237
+ if (blockField && text.trim() && fields[blockField] === undefined) {
238
+ fields[blockField] = capturedString(text.trim());
239
+ }
240
+ };
241
+ try {
242
+ let bytesRead = fs.readSync(fd, buffer, 0, buffer.length, null);
243
+ while (bytesRead > 0) {
244
+ bytesScanned += bytesRead;
245
+ const chunk = decoder.write(buffer.subarray(0, bytesRead));
246
+ for (const char of chunk) {
247
+ if (char === "\n") {
248
+ processLine(line);
249
+ line = "";
250
+ lineBytes = 0;
251
+ droppingLongLine = false;
252
+ }
253
+ else if (!droppingLongLine) {
254
+ line += char;
255
+ lineBytes += Buffer.byteLength(char, "utf8");
256
+ if (lineBytes > MAX_LINE_BUFFER_BYTES) {
257
+ processLine(line);
258
+ line = "";
259
+ lineBytes = 0;
260
+ droppingLongLine = true;
261
+ }
262
+ }
263
+ }
264
+ bytesRead = fs.readSync(fd, buffer, 0, buffer.length, null);
265
+ }
266
+ const remainder = decoder.end();
267
+ for (const char of remainder) {
268
+ if (char === "\n") {
269
+ processLine(line);
270
+ line = "";
271
+ lineBytes = 0;
272
+ droppingLongLine = false;
273
+ }
274
+ else if (!droppingLongLine) {
275
+ line += char;
276
+ lineBytes += Buffer.byteLength(char, "utf8");
277
+ }
278
+ }
279
+ if (line)
280
+ processLine(line);
281
+ finish();
282
+ }
283
+ finally {
284
+ fs.closeSync(fd);
285
+ }
286
+ return { path: filePath, exists: true, collection_found: collectionFound, bytes_scanned: bytesScanned, entries };
287
+ }
288
+ function scanLegacyStartupArtifact(projectRoot, artifactId, sourceRoot = resolveSourceRoot()) {
289
+ const contract = numberedArchiveContract(artifactId, sourceRoot);
290
+ const currentPath = stateCurrentProjectionPath(projectRoot, artifactId, sourceRoot);
291
+ return {
292
+ contract,
293
+ active: scanYamlCollection(currentPath, contract.entryCollection, artifactId, contract.entryNumberField, "active"),
294
+ archive: scanYamlCollection(currentPath, "archive", artifactId, contract.entryNumberField, "summary"),
295
+ };
296
+ }
297
+ export const scanStartupArtifact = scanLegacyStartupArtifact;
298
+ function archiveNumber(rejection, artifactId) {
299
+ if (!rejection.path.includes(path.join(`${path.sep}${artifactId}`, "")))
300
+ return null;
301
+ const match = /(?:^|[\\/])([1-9][0-9]*)\.yaml$/.exec(rejection.path);
302
+ return match ? Number(match[1]) : null;
303
+ }
304
+ function classificationRow(entry, artifactId) {
305
+ if ("path" in entry && "reason" in entry) {
306
+ const number = archiveNumber(entry, artifactId);
307
+ return {
308
+ source: "archive",
309
+ origin: "rejected_archive",
310
+ identity: number === null ? "unaddressable" : "canonical_number",
311
+ entryNumber: number,
312
+ representation: "unavailable",
313
+ projectionHash: hashValue({ path: entry.path, reason: entry.reason, message: entry.message }),
314
+ rejection: { reason: entry.reason },
315
+ };
316
+ }
317
+ if ("entryNumber" in entry) {
318
+ return {
319
+ source: "archive",
320
+ origin: "numbered_archive",
321
+ identity: "canonical_number",
322
+ entryNumber: entry.entryNumber,
323
+ representation: "summary",
324
+ projectionHash: entry.recordSha256,
325
+ };
326
+ }
327
+ return {
328
+ source: "current_projection",
329
+ origin: entry.origin,
330
+ identity: entry.identity.kind,
331
+ entryNumber: entry.identity.number,
332
+ // The bounded scanner retains a startup summary, not the full record. Keep
333
+ // it comparable for duplicate/conflict detection without retaining YAML.
334
+ representation: "full",
335
+ projectionHash: entry.projectionHash,
336
+ };
337
+ }
338
+ function classifyNumber(artifactId, number, current, archives, rejected) {
339
+ const rows = [
340
+ ...current.filter((entry) => entry.identity.number === number).map((entry) => classificationRow(entry, artifactId)),
341
+ ...archives.filter((entry) => entry.entryNumber === number).map((entry) => classificationRow(entry, artifactId)),
342
+ ...rejected.filter((entry) => archiveNumber(entry, artifactId) === number).map((entry) => classificationRow(entry, artifactId)),
343
+ ];
344
+ return classifyStateRows(rows);
345
+ }
346
+ function classifyUnaddressable(entry, artifactId) {
347
+ return classifyStateRows([classificationRow(entry, artifactId)]);
348
+ }
349
+ function entrySummary(artifactId, entry, classification) {
350
+ const number = "entryNumber" in entry ? entry.entryNumber : entry.identity.number;
351
+ const fields = "fields" in entry ? entry.fields : {};
352
+ const summary = {};
353
+ for (const key of ["summary", "status", "date", "timestamp", "trajectory", "type", "phase", "review_needed"]) {
354
+ if (key in fields) {
355
+ const value = fields[key];
356
+ summary[key] = typeof value === "string" ? truncateCodePoints(value, 160, "\u2026") : value;
357
+ }
358
+ }
359
+ return {
360
+ stable_id: number === null ? null : `${artifactId}:${number}`,
361
+ artifact_id: artifactId,
362
+ entry_number: number,
363
+ addressable: number !== null,
364
+ classification,
365
+ detail_availability: "entryNumber" in entry ? "full" : "summary",
366
+ source: "entryNumber" in entry ? "archive" : "current_projection",
367
+ provenance: {
368
+ source: "entryNumber" in entry ? "archive" : "current_projection",
369
+ origin: "entryNumber" in entry ? "numbered_archive" : entry.origin,
370
+ path: "entryNumber" in entry ? entry.path : entry.path,
371
+ },
372
+ ...(Object.keys(summary).length > 0 ? { summary } : {}),
373
+ };
374
+ }
375
+ function countsFor(artifactId, current, archives, rejected, returned) {
376
+ const currentByNumber = new Map();
377
+ const archiveByNumber = new Map();
378
+ let unaddressable = 0;
379
+ let ambiguous = 0;
380
+ for (const entry of current) {
381
+ if (entry.identity.kind === "ambiguous")
382
+ ambiguous += 1;
383
+ else if (entry.identity.number === null)
384
+ unaddressable += 1;
385
+ else
386
+ currentByNumber.set(entry.identity.number, (currentByNumber.get(entry.identity.number) ?? 0) + 1);
387
+ }
388
+ for (const entry of archives)
389
+ archiveByNumber.set(entry.entryNumber, (archiveByNumber.get(entry.entryNumber) ?? 0) + 1);
390
+ for (const item of rejected) {
391
+ if (!item.path.includes(path.join(`${path.sep}${artifactId}`, "")))
392
+ continue;
393
+ const number = archiveNumber(item, artifactId);
394
+ if (number === null)
395
+ unaddressable += 1;
396
+ else
397
+ archiveByNumber.set(number, (archiveByNumber.get(number) ?? 0) + 1);
398
+ }
399
+ const ids = new Set([...currentByNumber.keys(), ...archiveByNumber.keys()]);
400
+ let mirrored = 0;
401
+ let duplicate = 0;
402
+ let conflict = 0;
403
+ for (const number of ids) {
404
+ const classification = classifyNumber(artifactId, number, current, archives, rejected);
405
+ if (classification === "mirrored")
406
+ mirrored += 1;
407
+ if (classification === "duplicate")
408
+ duplicate += 1;
409
+ if (classification === "conflict")
410
+ conflict += 1;
411
+ }
412
+ const physical = current.length + archives.length + rejected.filter((item) => item.path.includes(path.join(`${path.sep}${artifactId}`, ""))).length;
413
+ return {
414
+ physical,
415
+ addressable: physical - unaddressable - ambiguous,
416
+ addressable_ids: ids.size,
417
+ unaddressable,
418
+ ambiguous,
419
+ mirrored,
420
+ duplicate,
421
+ conflict,
422
+ omitted: Math.max(0, physical - returned),
423
+ };
424
+ }
425
+ function sourceRows(current, archives, rejected, artifactId) {
426
+ const rows = [];
427
+ for (const entry of current) {
428
+ const number = entry.identity.number;
429
+ const classification = number === null
430
+ ? classifyUnaddressable(entry, artifactId)
431
+ : classifyNumber(artifactId, number, current, archives, rejected);
432
+ rows.push(entrySummary(artifactId, entry, classification));
433
+ }
434
+ for (const entry of archives) {
435
+ rows.push(entrySummary(artifactId, entry, classifyNumber(artifactId, entry.entryNumber, current, archives, rejected)));
436
+ }
437
+ for (const item of rejected.filter((candidate) => candidate.path.includes(path.join(`${path.sep}${artifactId}`, "")))) {
438
+ const number = archiveNumber(item, artifactId);
439
+ const classification = number === null
440
+ ? classifyUnaddressable(item, artifactId)
441
+ : classifyNumber(artifactId, number, current, archives, rejected);
442
+ rows.push({
443
+ stable_id: number === null ? null : `${artifactId}:${number}`,
444
+ artifact_id: artifactId,
445
+ entry_number: number,
446
+ addressable: number !== null,
447
+ classification,
448
+ detail_availability: "unavailable",
449
+ source: "archive",
450
+ provenance: { source: "archive", origin: "rejected_archive", path: item.path },
451
+ compatibility: "blocked",
452
+ rejection: item.reason,
453
+ });
454
+ }
455
+ return rows.sort((left, right) => Number(right.entry_number ?? 0) - Number(left.entry_number ?? 0)).slice(0, 2);
456
+ }
457
+ export function startupHistorySummary(projectRoot, artifactId, sourceRoot = resolveSourceRoot()) {
458
+ const scans = scanLegacyStartupArtifact(projectRoot, artifactId, sourceRoot);
459
+ const currentPath = scans.active.path;
460
+ const scan = {
461
+ ...scans.active,
462
+ bytes_scanned: scans.active.bytes_scanned + scans.archive.bytes_scanned,
463
+ entries: [...scans.active.entries, ...scans.archive.entries],
464
+ };
465
+ const discovery = discoverNumberedArchives(projectRoot, { sourceRoot, artifactId, retainRecords: false });
466
+ const rejected = discovery.rejected;
467
+ const entries = sourceRows(scan.entries, discovery.entries, rejected, artifactId);
468
+ const counts = countsFor(artifactId, scan.entries, discovery.entries, rejected, entries.length);
469
+ const retrieval = {
470
+ upgrade_preview: fullEntityUpgradePreviewCommand(path.resolve(projectRoot)),
471
+ };
472
+ const status = !scan.exists && discovery.entries.length === 0 && rejected.length === 0
473
+ ? "absent"
474
+ : rejected.length > 0 || (scan.exists && !scans.active.collection_found)
475
+ ? "degraded"
476
+ : "available";
477
+ return {
478
+ artifact: artifactId,
479
+ status,
480
+ counts,
481
+ entries,
482
+ source: {
483
+ current_projection: { path: currentPath, present: scan.exists, entries: scan.entries.length },
484
+ archive: { root: discovery.archiveRoot, validated_entries: discovery.entries.length, rejected_count: rejected.length },
485
+ input_scan: {
486
+ current_entries: scan.entries.length,
487
+ current_bytes: scan.bytes_scanned,
488
+ archive_files: discovery.entries.length + rejected.length,
489
+ },
490
+ },
491
+ retrieval,
492
+ omission: {
493
+ omitted: counts.omitted > 0,
494
+ omitted_count: counts.omitted,
495
+ omission_reason: counts.omitted > 0 ? "startup_detail_capacity" : "none",
496
+ retrieval,
497
+ },
498
+ };
499
+ }
@@ -0,0 +1,85 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
4
+ import { loadYamlMapping } from "../core/yaml.js";
5
+ import { EntityPublicationContext } from "./entityPublicationContext.js";
6
+ import { validateRealProjectRoot } from "./projectRoot.js";
7
+ import { readProjectFileSnapshot } from "./safeProjectFile.js";
8
+ function mapping(value) {
9
+ return value !== null && typeof value === "object" && !Array.isArray(value);
10
+ }
11
+ function contract(sourceRoot = resolveSourceRoot()) {
12
+ const authorityPath = path.join(sourceRoot, "references", "artifacts", "state-storage-authority.yaml");
13
+ const authority = loadYamlMapping(fs.readFileSync(authorityPath, "utf8"));
14
+ const migration = authority.entity_migration;
15
+ const marker = mapping(migration) ? migration.cutover_marker : null;
16
+ const entityMode = mapping(marker) ? marker.entity_mode : null;
17
+ if (!mapping(marker) ||
18
+ typeof marker.path !== "string" ||
19
+ typeof marker.schema_version !== "string" ||
20
+ !mapping(entityMode) ||
21
+ typeof entityMode.mode !== "string") {
22
+ throw new Error(`state storage authority '${authorityPath}' has no executable cutover marker contract`);
23
+ }
24
+ if (path.isAbsolute(marker.path) || marker.path.split(/[\\/]/).includes("..")) {
25
+ throw new Error(`state storage authority declares unsafe cutover marker path '${marker.path}'`);
26
+ }
27
+ return { markerPath: marker.path, schemaVersion: marker.schema_version, mode: entityMode.mode };
28
+ }
29
+ function readStableMarker(root, markerPath) {
30
+ const snapshot = readProjectFileSnapshot(root, markerPath);
31
+ if (snapshot.kind === "missing") {
32
+ if (path.resolve(snapshot.absolute) === root.path) {
33
+ throw new Error(`project root '${root.path}' changed while the state mode marker was inspected; restore the real directory and retry`);
34
+ }
35
+ return null;
36
+ }
37
+ if (snapshot.kind === "unsafe") {
38
+ const detail = snapshot.reason === "type"
39
+ ? "is not a regular file"
40
+ : snapshot.reason === "symlink"
41
+ ? "has an unsafe path"
42
+ : "changed or became unsafe while being read";
43
+ throw new Error(`state mode marker '${markerPath}' ${detail}; restore a stable project-local marker and retry`);
44
+ }
45
+ return snapshot.bytes;
46
+ }
47
+ function detectValidatedStateMode(projectRoot, sourceRoot) {
48
+ const root = validateRealProjectRoot(projectRoot);
49
+ const declared = contract(sourceRoot);
50
+ const bytes = readStableMarker(root, declared.markerPath);
51
+ if (bytes === null)
52
+ return { mode: "legacy", root };
53
+ let document;
54
+ try {
55
+ document = loadYamlMapping(bytes.toString("utf8"));
56
+ }
57
+ catch (error) {
58
+ throw new Error(`state mode marker '${declared.markerPath}' is corrupt: ${error.message}; restore the durable migration marker before retrying`);
59
+ }
60
+ if (document.schemaVersion !== declared.schemaVersion || document.mode !== declared.mode) {
61
+ throw new Error(`state mode marker '${declared.markerPath}' must declare schemaVersion '${declared.schemaVersion}' and mode '${declared.mode}'; restore the durable migration marker before retrying`);
62
+ }
63
+ return { mode: "entities", root, markerPath: declared.markerPath, markerBytes: bytes };
64
+ }
65
+ /** Read the authority-owned cutover marker without creating or repairing state. */
66
+ export function detectStateModeBinding(projectRoot, sourceRoot = resolveSourceRoot()) {
67
+ const detected = detectValidatedStateMode(projectRoot, sourceRoot);
68
+ if (detected.mode === "legacy")
69
+ return detected;
70
+ return {
71
+ mode: "entities",
72
+ root: detected.root,
73
+ publicationContext: EntityPublicationContext.open(detected.root, detected.markerPath, detected.markerBytes),
74
+ };
75
+ }
76
+ export function detectStateMode(projectRoot, sourceRoot = resolveSourceRoot()) {
77
+ return detectValidatedStateMode(projectRoot, sourceRoot).mode;
78
+ }
79
+ export function requireEntityStateBinding(projectRoot, sourceRoot = resolveSourceRoot()) {
80
+ const binding = detectStateModeBinding(projectRoot, sourceRoot);
81
+ if (binding.mode === "legacy") {
82
+ throw new Error("state writes require the durable entity-state marker; legacy aggregates are read-only migration input");
83
+ }
84
+ return binding;
85
+ }
@@ -0,0 +1,47 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { loadYamlMapping } from "../core/yaml.js";
4
+ const AUTHORITY_RELATIVE_PATH = path.join("references", "artifacts", "state-storage-authority.yaml");
5
+ let cache;
6
+ function immutableGraph(root) {
7
+ const proxies = new WeakMap();
8
+ const immutable = (value) => {
9
+ if (value === null || typeof value !== "object")
10
+ return value;
11
+ const existing = proxies.get(value);
12
+ if (existing)
13
+ return existing;
14
+ const proxy = new Proxy(value, {
15
+ get: (target, property, receiver) => immutable(Reflect.get(target, property, receiver)),
16
+ getOwnPropertyDescriptor: (target, property) => {
17
+ const descriptor = Reflect.getOwnPropertyDescriptor(target, property);
18
+ return descriptor && "value" in descriptor
19
+ ? { ...descriptor, value: immutable(descriptor.value) }
20
+ : descriptor;
21
+ },
22
+ set: () => { throw new TypeError("state storage authority is immutable"); },
23
+ defineProperty: () => { throw new TypeError("state storage authority is immutable"); },
24
+ deleteProperty: () => { throw new TypeError("state storage authority is immutable"); },
25
+ preventExtensions: () => { throw new TypeError("state storage authority is immutable"); },
26
+ setPrototypeOf: () => { throw new TypeError("state storage authority is immutable"); },
27
+ });
28
+ proxies.set(value, proxy);
29
+ return proxy;
30
+ };
31
+ return immutable(root);
32
+ }
33
+ /**
34
+ * Read the state-storage authority on every call and reuse its immutable parsed
35
+ * graph only while the canonical path and exact file bytes remain unchanged.
36
+ */
37
+ export function loadStateStorageAuthority(sourceRoot) {
38
+ const authorityPath = path.resolve(sourceRoot, AUTHORITY_RELATIVE_PATH);
39
+ const bytes = fs.readFileSync(authorityPath);
40
+ if (cache?.authorityPath === authorityPath && cache.bytes.equals(bytes)) {
41
+ return { authorityPath, document: cache.document, revision: cache.revision };
42
+ }
43
+ const document = immutableGraph(loadYamlMapping(bytes.toString("utf8")));
44
+ const revision = Symbol(authorityPath);
45
+ cache = { authorityPath, bytes, document, revision };
46
+ return { authorityPath, document, revision };
47
+ }
@@ -0,0 +1,25 @@
1
+ export function isSummaryEntity(entity) {
2
+ return entity.boundary === "progress_summary" || entity.boundary === "decision_summary" || entity.boundary === "health_summary";
3
+ }
4
+ export function summaryCaveat(artifact) {
5
+ return `${artifact} summary is immutable migrated history: incomplete historical evidence is read-only and full record detail is unavailable.`;
6
+ }
7
+ export function detailMetadata(entity) {
8
+ const summary = isSummaryEntity(entity);
9
+ return {
10
+ boundary: entity.boundary,
11
+ detail_availability: summary ? "summary" : "full",
12
+ compatibility: summary ? "degraded" : "current",
13
+ ...(summary ? { caveats: [summaryCaveat(entity.artifact)] } : {}),
14
+ };
15
+ }
16
+ export function detailProvenance(projectRelativePath, entity) {
17
+ const summary = isSummaryEntity(entity);
18
+ return {
19
+ storage: "canonical_entity_file",
20
+ path: projectRelativePath,
21
+ boundary: entity.boundary,
22
+ detail: summary ? "summary" : "full",
23
+ ...(summary ? { migration_provenance: entity.record.migration_provenance } : {}),
24
+ };
25
+ }