agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +236 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +191 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3022 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +224 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +56 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +272 -223
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +229 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +385 -0
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -0
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +982 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  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/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,263 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { canonicalTerminologyJson, validateTerminologyProposal, } from "../../audit/terminologyDrift.js";
5
+ import { dumpYamlMapping, loadYamlMapping } from "../../core/yaml.js";
6
+ import { loadArtifactRecord, resolveArtifactPath, } from "../../registries/artifactRegistry.js";
7
+ import { GlossaryEntryBoundError, validateGlossaryEntry } from "../../registries/glossaryEntryContract.js";
8
+ import { unicodeCaselessExact } from "../../registries/glossaryTermIdentity.js";
9
+ import { containsGlossaryTerm } from "../../registries/glossaryTermOccurrence.js";
10
+ import { assertValidatedProjectRoot } from "../projectRoot.js";
11
+ import { reject } from "./errors.js";
12
+ import { withStateMutation } from "./mutation.js";
13
+ const REQUEST_VERSION = "agentera.glossaryPublicationRequest.v1";
14
+ const DOCUMENT_VERSION = "agentera.projectGlossary.v1";
15
+ const REQUEST_FIELDS = ["schema_version", "proposal", "confirmation"];
16
+ function mapping(value) {
17
+ return value !== null && typeof value === "object" && !Array.isArray(value);
18
+ }
19
+ function exactFields(value, allowed) {
20
+ return Object.keys(value).every((field) => allowed.includes(field));
21
+ }
22
+ function validTimestamp(value) {
23
+ if (typeof value !== "string")
24
+ return false;
25
+ const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-](\d{2}):(\d{2}))$/.exec(value);
26
+ if (!match || Number.isNaN(Date.parse(value)))
27
+ return false;
28
+ const [, year, month, day, hour, minute, second, offsetHour = "00", offsetMinute = "00"] = match;
29
+ const calendar = new Date(Date.UTC(Number(year), Number(month) - 1, Number(day)));
30
+ return calendar.getUTCFullYear() === Number(year)
31
+ && calendar.getUTCMonth() + 1 === Number(month)
32
+ && calendar.getUTCDate() === Number(day)
33
+ && Number(hour) <= 23
34
+ && Number(minute) <= 59
35
+ && Number(second) <= 59
36
+ && Number(offsetHour) <= 23
37
+ && Number(offsetMinute) <= 59;
38
+ }
39
+ function correction(message, classification = "schema_violation", recovery = "Rerun audit against current project files, obtain explicit user confirmation for the returned proposal_digest, and retry the same glossary publish command.") {
40
+ reject({
41
+ class: classification,
42
+ message,
43
+ recovery,
44
+ example: "agentera state glossary publish --input glossary-publication.yaml --format json",
45
+ });
46
+ }
47
+ function proposal(value) {
48
+ const validated = validateTerminologyProposal(value);
49
+ if (!validated.proposal) {
50
+ correction(`proposal is not canonical Audit output: ${validated.violations.join("; ")}`);
51
+ }
52
+ return validated.proposal;
53
+ }
54
+ function confirmation(value, digest) {
55
+ if (!mapping(value) || !exactFields(value, ["proposal_digest", "confirmed_by", "confirmed_at"])) {
56
+ correction("confirmation must contain only proposal_digest, confirmed_by, and confirmed_at");
57
+ }
58
+ if (value.confirmed_by !== "user") {
59
+ correction("confirmation.confirmed_by must be 'user'; generic consent or agent attribution is not approval");
60
+ }
61
+ if (!validTimestamp(value.confirmed_at)) {
62
+ correction("confirmation.confirmed_at must be a valid ISO 8601 timestamp with timezone");
63
+ }
64
+ if (value.proposal_digest !== digest) {
65
+ correction("confirmation.proposal_digest does not bind the submitted proposal");
66
+ }
67
+ return value;
68
+ }
69
+ function revalidateEvidence(root, proposalValue) {
70
+ const groups = [
71
+ { term: proposalValue.proposed_canonical_term, evidence: proposalValue.canonical_evidence },
72
+ ...proposalValue.variants,
73
+ ];
74
+ for (const group of groups) {
75
+ for (const record of group.evidence) {
76
+ assertValidatedProjectRoot(root);
77
+ const candidate = path.resolve(root.path, record.source_path);
78
+ let resolved;
79
+ try {
80
+ resolved = fs.realpathSync(candidate);
81
+ }
82
+ catch {
83
+ correction(`source evidence '${record.source_path}:${record.line}' is missing or unreadable`);
84
+ }
85
+ if (!resolved.startsWith(`${root.path}${path.sep}`) || !fs.statSync(resolved).isFile()) {
86
+ correction(`source evidence '${record.source_path}:${record.line}' escapes the project or is not a file`);
87
+ }
88
+ const canonicalPath = path.relative(root.path, resolved).split(path.sep).join(path.posix.sep);
89
+ if (canonicalPath !== record.source_path) {
90
+ correction(`source evidence '${record.source_path}:${record.line}' is not the canonical Audit-emitted project identity '${canonicalPath}:${record.line}'`);
91
+ }
92
+ const line = fs.readFileSync(resolved, "utf8").split(/\r?\n/)[record.line - 1];
93
+ const digest = line === undefined ? "" : crypto.createHash("sha256").update(line).digest("hex");
94
+ if (line === undefined || digest !== record.source_record_sha256 || !containsGlossaryTerm(line, group.term)) {
95
+ correction(`source evidence '${record.source_path}:${record.line}' is stale or no longer identifies '${group.term}'`);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ function deriveEntry(proposalValue, confirmed) {
101
+ const source = proposalValue.canonical_evidence[0];
102
+ const date = confirmed.confirmed_at.slice(0, 10);
103
+ const entry = {
104
+ term: proposalValue.proposed_canonical_term,
105
+ meaning: proposalValue.concept,
106
+ confidence: proposalValue.confidence,
107
+ permanence: "stable",
108
+ temporal: { observed_at: date, last_confirmed_at: date },
109
+ provenance: {
110
+ kind: "project_file",
111
+ evidence: [{ source_path: source.source_path, source_record_sha256: source.source_record_sha256 }],
112
+ },
113
+ };
114
+ const violations = validateGlossaryEntry(entry, "project");
115
+ if (violations.length > 0)
116
+ correction(`derived project glossary entry is invalid: ${violations.join("; ")}`);
117
+ return entry;
118
+ }
119
+ function same(left, right) {
120
+ return canonicalTerminologyJson(left) === canonicalTerminologyJson(right);
121
+ }
122
+ function parseApproval(value, index) {
123
+ if (!mapping(value) || !exactFields(value, ["proposal_digest", "proposal", "confirmation"])) {
124
+ correction(`existing approvals[${index}] is malformed`, "conflict");
125
+ }
126
+ const proposed = proposal(value.proposal);
127
+ const confirmed = confirmation(value.confirmation, proposed.proposal_digest);
128
+ if (value.proposal_digest !== proposed.proposal_digest) {
129
+ correction(`existing approvals[${index}] has conflicting digest identity`, "conflict");
130
+ }
131
+ return {
132
+ approval: { proposal_digest: proposed.proposal_digest, proposal: proposed, confirmation: confirmed },
133
+ entry: deriveEntry(proposed, confirmed),
134
+ };
135
+ }
136
+ export function parseProjectGlossaryDocument(bytes, maxEntries = Number.POSITIVE_INFINITY) {
137
+ let value;
138
+ try {
139
+ value = loadYamlMapping(bytes);
140
+ }
141
+ catch (error) {
142
+ correction(`existing glossary document is malformed: ${error.message}`, "conflict");
143
+ }
144
+ if (!exactFields(value, ["schema_version", "approvals", "entries"]) || value.schema_version !== DOCUMENT_VERSION || !Array.isArray(value.approvals) || !Array.isArray(value.entries)) {
145
+ correction(`existing glossary document must use ${DOCUMENT_VERSION} with approvals and entries lists`, "conflict");
146
+ }
147
+ if (value.entries.length > maxEntries || value.approvals.length > maxEntries)
148
+ throw new GlossaryEntryBoundError("project glossary exceeds the consumer entry bound");
149
+ const approvals = value.approvals.map((item, index) => parseApproval(item, index));
150
+ const entries = value.entries;
151
+ if (entries.length !== approvals.length)
152
+ correction("existing glossary approvals and entries do not form complete publication pairs", "conflict");
153
+ const terminologyIdentities = [];
154
+ const digestIdentities = new Set();
155
+ for (const [index, item] of entries.entries()) {
156
+ if (!mapping(item))
157
+ correction(`existing entries[${index}] is malformed`, "conflict");
158
+ const violations = validateGlossaryEntry(item, "project");
159
+ if (violations.length > 0)
160
+ correction(`existing entries[${index}] is malformed: ${violations.join("; ")}`, "conflict");
161
+ if (!same(item, approvals[index].entry))
162
+ correction(`existing approval and entry at index ${index} do not match`, "conflict");
163
+ const canonical = String(item.term);
164
+ const digest = approvals[index].approval.proposal_digest;
165
+ if (digestIdentities.has(digest))
166
+ correction("existing glossary contains duplicate term or approval identity", "conflict");
167
+ digestIdentities.add(digest);
168
+ const terms = [canonical, ...approvals[index].approval.proposal.variants.map(({ term }) => term)];
169
+ for (const term of terms) {
170
+ const existing = terminologyIdentities.find((identity) => unicodeCaselessExact(identity.term, term));
171
+ if (existing) {
172
+ correction(`terminology identity collision for '${term}' between canonical sets '${existing.canonical}' and '${canonical}'`, "conflict", `Choose distinct canonical and variant terms for '${existing.canonical}' and '${canonical}', rerun audit, obtain confirmation for the corrected proposal, and retry the same glossary publish command.`);
173
+ }
174
+ terminologyIdentities.push({ term, canonical });
175
+ }
176
+ }
177
+ return {
178
+ schema_version: DOCUMENT_VERSION,
179
+ approvals: approvals.map(({ approval }) => approval),
180
+ entries: entries,
181
+ };
182
+ }
183
+ function validateCandidateBytes(bytes) {
184
+ return parseProjectGlossaryDocument(bytes);
185
+ }
186
+ export function loadProjectGlossaryDocument(projectRoot) {
187
+ const record = loadArtifactRecord("glossary");
188
+ if (!record)
189
+ correction("registered glossary artifact is unavailable");
190
+ const target = resolveArtifactPath(record, projectRoot);
191
+ if (!fs.existsSync(target))
192
+ return null;
193
+ return { path: target, document: parseProjectGlossaryDocument(fs.readFileSync(target, "utf8")) };
194
+ }
195
+ export function publishGlossary(req, root, options = {}) {
196
+ if (!req.input || !exactFields(req.input, REQUEST_FIELDS) || req.input.schema_version !== REQUEST_VERSION) {
197
+ correction(`publication request must use ${REQUEST_VERSION} and contain only proposal and confirmation`);
198
+ }
199
+ const proposed = proposal(req.input.proposal);
200
+ const confirmed = confirmation(req.input.confirmation, proposed.proposal_digest);
201
+ const entry = deriveEntry(proposed, confirmed);
202
+ const approval = {
203
+ proposal_digest: proposed.proposal_digest,
204
+ proposal: proposed,
205
+ confirmation: confirmed,
206
+ };
207
+ const record = loadArtifactRecord("glossary");
208
+ if (!record)
209
+ correction("registered glossary artifact is unavailable");
210
+ return withStateMutation(root.path, (transaction) => {
211
+ assertValidatedProjectRoot(root);
212
+ const target = resolveArtifactPath(record, root.path, { strictWrite: true });
213
+ const relativePath = path.relative(root.path, target).split(path.sep).join("/");
214
+ revalidateEvidence(root, proposed);
215
+ const previousBytes = fs.existsSync(target) ? fs.readFileSync(target, "utf8") : "";
216
+ const current = previousBytes
217
+ ? parseProjectGlossaryDocument(previousBytes)
218
+ : { schema_version: DOCUMENT_VERSION, approvals: [], entries: [] };
219
+ const approvalIndex = current.approvals.findIndex((item) => item.proposal_digest === proposed.proposal_digest);
220
+ const termIndex = current.entries.findIndex((item) => unicodeCaselessExact(String(item.term), proposed.proposed_canonical_term));
221
+ if (approvalIndex >= 0 || termIndex >= 0) {
222
+ if (approvalIndex === termIndex && approvalIndex >= 0 && same(current.approvals[approvalIndex], approval) && same(current.entries[termIndex], entry)) {
223
+ return {
224
+ schemaVersion: "agentera.stateWrite.v1",
225
+ status: "pass",
226
+ command: "state glossary publish",
227
+ artifact: "glossary",
228
+ path: relativePath,
229
+ operation: { dry_run: req.dryRun, changed: false, idempotent_replay: true },
230
+ candidate: current,
231
+ };
232
+ }
233
+ correction(`confirmed term '${proposed.proposed_canonical_term}' conflicts with existing approval or entry state`, "conflict");
234
+ }
235
+ const candidate = {
236
+ schema_version: DOCUMENT_VERSION,
237
+ approvals: [...current.approvals, approval],
238
+ entries: [...current.entries, entry],
239
+ };
240
+ const bytes = dumpYamlMapping(candidate);
241
+ validateCandidateBytes(bytes);
242
+ if (!req.dryRun) {
243
+ const stage = transaction.stageProjection(target, bytes);
244
+ try {
245
+ transaction.syncStaged(stage);
246
+ assertValidatedProjectRoot(root);
247
+ transaction.publishProjection(stage, target, previousBytes);
248
+ }
249
+ finally {
250
+ transaction.removeStage(stage);
251
+ }
252
+ }
253
+ return {
254
+ schemaVersion: "agentera.stateWrite.v1",
255
+ status: "pass",
256
+ command: "state glossary publish",
257
+ artifact: "glossary",
258
+ path: relativePath,
259
+ operation: { dry_run: req.dryRun, changed: true, idempotent_replay: false },
260
+ candidate,
261
+ };
262
+ }, options, root);
263
+ }
@@ -0,0 +1,285 @@
1
+ import crypto from "node:crypto";
2
+ import { projectRuntimeOperationExamples, projectRuntimeOperationRecovery, } from "../../core/developmentInvocation.js";
3
+ import { resolveSourceRoot } from "../../core/sourceRoot.js";
4
+ import { loadStateStorageAuthority } from "../stateStorageAuthority.js";
5
+ import { runtimeOperationSpec, runtimeOperationSpecs } from "./runtimeOperations.js";
6
+ export const MUTATION_CLASSES = [
7
+ "record_payload",
8
+ "simple_transition",
9
+ "batch_transaction",
10
+ ];
11
+ export const MUTATION_INPUT_MODES = [
12
+ "none",
13
+ "structured",
14
+ "flags_until_conversion",
15
+ ];
16
+ let cache;
17
+ function mapping(value) {
18
+ return value !== null && typeof value === "object" && !Array.isArray(value);
19
+ }
20
+ function requiredString(value, path) {
21
+ if (typeof value !== "string" || value.length === 0)
22
+ throw new Error(`invalid mutation grammar: ${path} must be a non-empty string`);
23
+ return value;
24
+ }
25
+ function strings(value, path) {
26
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string"))
27
+ throw new Error(`invalid mutation grammar: ${path} must be a string list`);
28
+ return [...value];
29
+ }
30
+ function clonePlain(value) {
31
+ if (Array.isArray(value))
32
+ return value.map(clonePlain);
33
+ if (mapping(value))
34
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, clonePlain(item)]));
35
+ return value;
36
+ }
37
+ function fields(value, path) {
38
+ if (!Array.isArray(value))
39
+ throw new Error(`invalid mutation grammar: ${path} must be a list`);
40
+ const seenFlags = new Set();
41
+ const seenFields = new Set();
42
+ return value.map((raw, index) => {
43
+ const fieldPath = `${path}[${index}]`;
44
+ if (!mapping(raw))
45
+ throw new Error(`invalid mutation grammar: ${fieldPath} must be a mapping`);
46
+ const flag = requiredString(raw.flag, `${fieldPath}.flag`);
47
+ const field = requiredString(raw.field, `${fieldPath}.field`);
48
+ const kind = requiredString(raw.kind, `${fieldPath}.kind`);
49
+ if (!["string", "boolean", "integer", "string_list", "date", "datetime"].includes(kind))
50
+ throw new Error(`invalid mutation grammar: ${fieldPath}.kind '${kind}' is unsupported`);
51
+ if (seenFlags.has(flag) || seenFields.has(field))
52
+ throw new Error(`invalid mutation grammar: duplicate field ${flag}/${field} in ${path}`);
53
+ seenFlags.add(flag);
54
+ seenFields.add(field);
55
+ const validValues = raw.valid_values === undefined ? undefined : strings(raw.valid_values, `${fieldPath}.valid_values`);
56
+ const validValuesSource = raw.valid_values_source === undefined ? undefined : requiredString(raw.valid_values_source, `${fieldPath}.valid_values_source`);
57
+ if (validValues && validValuesSource)
58
+ throw new Error(`invalid mutation grammar: ${fieldPath} cannot declare both valid_values and valid_values_source`);
59
+ return {
60
+ flag,
61
+ field,
62
+ kind,
63
+ required: raw.required === true,
64
+ ...(raw.repeatable === true ? { repeatable: true } : {}),
65
+ ...(validValues ? { validValues } : {}),
66
+ ...(validValuesSource ? { validValuesSource } : {}),
67
+ ...(typeof raw.description === "string" ? { description: raw.description } : {}),
68
+ };
69
+ });
70
+ }
71
+ export function canonicalJson(value) {
72
+ if (Array.isArray(value))
73
+ return `[${value.map(canonicalJson).join(",")}]`;
74
+ if (mapping(value)) {
75
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
76
+ }
77
+ return JSON.stringify(value);
78
+ }
79
+ function digest(value) {
80
+ return crypto.createHash("sha256").update(canonicalJson(value)).digest("hex");
81
+ }
82
+ function parseOperation(raw, index) {
83
+ const p = `mutation_grammar.operations[${index}]`;
84
+ if (!mapping(raw))
85
+ throw new Error(`invalid mutation grammar: ${p} must be a mapping`);
86
+ const artifact = requiredString(raw.artifact, `${p}.artifact`);
87
+ const verb = requiredString(raw.verb, `${p}.verb`);
88
+ const runtime = runtimeOperationSpec(artifact, verb);
89
+ if (!runtime)
90
+ throw new Error(`invalid mutation grammar: ${p} operation '${artifact}.${verb}' is not code-owned`);
91
+ const mutationClass = requiredString(raw.class, `${p}.class`);
92
+ if (!MUTATION_CLASSES.includes(mutationClass))
93
+ throw new Error(`invalid mutation grammar: ${p}.class '${mutationClass}' is unsupported`);
94
+ if (!mapping(raw.input))
95
+ throw new Error(`invalid mutation grammar: ${p}.input must be a mapping`);
96
+ const inputMode = requiredString(raw.input.mode, `${p}.input.mode`);
97
+ if (!MUTATION_INPUT_MODES.includes(inputMode))
98
+ throw new Error(`invalid mutation grammar: ${p}.input.mode '${inputMode}' is unsupported`);
99
+ const input = {
100
+ mode: inputMode,
101
+ ...(raw.input.root === undefined ? {} : { root: requiredString(raw.input.root, `${p}.input.root`) }),
102
+ ...(raw.input.optional === true ? { optional: true } : {}),
103
+ sources: strings(raw.input.sources, `${p}.input.sources`),
104
+ ...(raw.input.structured_sources === undefined
105
+ ? (inputMode === "structured" ? { structuredSources: strings(raw.input.sources, `${p}.input.sources`) } : {})
106
+ : { structuredSources: strings(raw.input.structured_sources, `${p}.input.structured_sources`) }),
107
+ cliOwnedFields: strings(raw.input.cli_owned_fields, `${p}.input.cli_owned_fields`),
108
+ };
109
+ if (raw.input.optional !== undefined && raw.input.optional !== true)
110
+ throw new Error(`invalid mutation grammar: ${p}.input.optional must be true when present`);
111
+ if (inputMode === "structured" && (!input.root || input.sources.length === 0))
112
+ throw new Error(`invalid mutation grammar: ${p} structured input needs a root and source`);
113
+ if (inputMode === "none" && (input.sources.length > 0 || input.root !== undefined))
114
+ throw new Error(`invalid mutation grammar: ${p} none input cannot declare sources or a root`);
115
+ const operation = {
116
+ artifact,
117
+ verb,
118
+ mutationClass,
119
+ selectors: strings(raw.selectors, `${p}.selectors`),
120
+ preconditions: strings(raw.preconditions, `${p}.preconditions`),
121
+ ownedFields: strings(raw.owned_fields, `${p}.owned_fields`),
122
+ input,
123
+ recovery: projectRuntimeOperationRecovery(raw.recovery, artifact, verb),
124
+ examples: projectRuntimeOperationExamples(raw.examples, artifact, verb),
125
+ bounds: mapping(raw.bounds) ? clonePlain(raw.bounds) : (() => { throw new Error(`invalid mutation grammar: ${p}.bounds must be a mapping`); })(),
126
+ fields: fields(raw.fields, `${p}.fields`),
127
+ allowForce: raw.allow_force === true,
128
+ compacts: raw.compacts === true,
129
+ };
130
+ if (operation.examples.length === 0)
131
+ throw new Error(`invalid mutation grammar: ${p}.examples must not be empty`);
132
+ const selectors = new Set(operation.selectors);
133
+ for (const selector of selectors) {
134
+ if (!selector.startsWith("--"))
135
+ throw new Error(`invalid mutation grammar: ${p}.selectors must contain flags`);
136
+ }
137
+ return operation;
138
+ }
139
+ function runtimeFieldProjection(field) {
140
+ return {
141
+ flag: field.flag,
142
+ field: field.field,
143
+ kind: field.kind,
144
+ required: field.required === true,
145
+ repeatable: field.repeatable === true,
146
+ ...(field.validValuesSource
147
+ ? { valid_values_source: field.validValuesSource }
148
+ : field.validValues
149
+ ? { valid_values: field.validValues }
150
+ : {}),
151
+ };
152
+ }
153
+ function declaredFieldProjection(field) {
154
+ return runtimeFieldProjection(field);
155
+ }
156
+ function operationParityProjection(operation) {
157
+ return {
158
+ artifact: operation.artifact,
159
+ verb: operation.verb,
160
+ selectors: operation.selectors,
161
+ owned_fields: operation.ownedFields,
162
+ input: {
163
+ mode: operation.input.mode,
164
+ ...(operation.input.root ? { root: operation.input.root } : {}),
165
+ ...(operation.input.optional ? { optional: true } : {}),
166
+ sources: operation.input.sources,
167
+ structured_sources: operation.input.structuredSources ?? [],
168
+ cli_owned_fields: operation.input.cliOwnedFields,
169
+ },
170
+ fields: operation.fields.map(declaredFieldProjection),
171
+ recovery: operation.recovery,
172
+ examples: operation.examples,
173
+ projection: { format_values: runtimeOperationSpec(operation.artifact, operation.verb)?.projection.formatValues ?? [] },
174
+ allow_force: operation.allowForce,
175
+ compacts: operation.compacts,
176
+ bounds: operation.input.mode === "structured"
177
+ ? { max_input_utf8_bytes: operation.bounds.max_input_utf8_bytes }
178
+ : { max_input_utf8_bytes: 0 },
179
+ };
180
+ }
181
+ function runtimeParityProjection(operation) {
182
+ return {
183
+ artifact: operation.artifact,
184
+ verb: operation.verb,
185
+ selectors: operation.selectors,
186
+ owned_fields: operation.ownedFields,
187
+ input: {
188
+ mode: operation.inputMode,
189
+ ...(operation.inputRoot ? { root: operation.inputRoot } : {}),
190
+ ...(operation.inputOptional ? { optional: true } : {}),
191
+ sources: operation.inputSources,
192
+ structured_sources: operation.structuredInputSources,
193
+ cli_owned_fields: operation.cliOwnedFields,
194
+ },
195
+ fields: operation.fields.map(runtimeFieldProjection),
196
+ recovery: operation.projection.recovery.runtime,
197
+ examples: operation.projection.examples.map(({ runtime }) => runtime),
198
+ projection: { format_values: operation.projection.formatValues },
199
+ allow_force: operation.allowForce,
200
+ compacts: operation.compacts,
201
+ bounds: { max_input_utf8_bytes: operation.inputMaxBytes },
202
+ };
203
+ }
204
+ export function validateMutationGrammarParity(operations, authorityPath = "references/artifacts/state-storage-authority.yaml") {
205
+ const runtime = runtimeOperationSpecs();
206
+ const runtimeByKey = new Map(runtime.map((operation) => [`${operation.artifact}.${operation.verb}`, operation]));
207
+ const declaredByKey = new Map(operations.map((operation) => [`${operation.artifact}.${operation.verb}`, operation]));
208
+ const keys = [...new Set([...runtimeByKey.keys(), ...declaredByKey.keys()])].sort();
209
+ const mismatches = [];
210
+ for (const key of keys) {
211
+ const code = runtimeByKey.get(key);
212
+ const declared = declaredByKey.get(key);
213
+ if (!code || !declared) {
214
+ mismatches.push(`${key}: operation is ${code ? "missing from discovery" : "not code-owned"}`);
215
+ continue;
216
+ }
217
+ const expected = canonicalJson(runtimeParityProjection(code));
218
+ const actual = canonicalJson(operationParityProjection(declared));
219
+ if (expected !== actual)
220
+ mismatches.push(`${key}: discovery does not match code-owned runtime grammar`);
221
+ }
222
+ if (mismatches.length) {
223
+ throw new Error(`mutation grammar parity failure for '${authorityPath}': ${mismatches.join("; ")}`);
224
+ }
225
+ }
226
+ function parseGrammar(document, authority) {
227
+ const raw = document.mutation_grammar;
228
+ if (!mapping(raw))
229
+ throw new Error(`invalid mutation grammar in '${authority}': mutation_grammar is missing`);
230
+ const schemaVersion = requiredString(raw.schema_version, "mutation_grammar.schema_version");
231
+ if (schemaVersion !== "agentera.stateMutationGrammar.v1")
232
+ throw new Error(`invalid mutation grammar: unsupported schema version '${schemaVersion}'`);
233
+ const operationClasses = strings(raw.operation_classes, "mutation_grammar.operation_classes");
234
+ if (operationClasses.some((value) => !MUTATION_CLASSES.includes(value)))
235
+ throw new Error("invalid mutation grammar: operation_classes contains an unsupported class");
236
+ if (!mapping(raw.structured_input))
237
+ throw new Error("invalid mutation grammar: structured_input must be a mapping");
238
+ if (!Array.isArray(raw.operations))
239
+ throw new Error("invalid mutation grammar: operations must be a list");
240
+ const operations = raw.operations.map(parseOperation);
241
+ const seen = new Set();
242
+ for (const operation of operations) {
243
+ const key = `${operation.artifact}.${operation.verb}`;
244
+ if (seen.has(key))
245
+ throw new Error(`invalid mutation grammar: duplicate public mutation '${key}'`);
246
+ seen.add(key);
247
+ }
248
+ validateMutationGrammarParity(operations, authority);
249
+ const contract = {
250
+ schema_version: schemaVersion,
251
+ operation_classes: operationClasses,
252
+ structured_input: raw.structured_input,
253
+ operations,
254
+ };
255
+ return {
256
+ schemaVersion,
257
+ authority: "references/artifacts/state-storage-authority.yaml",
258
+ operationClasses,
259
+ structuredInput: clonePlain(raw.structured_input),
260
+ operations,
261
+ contractDigest: digest(contract),
262
+ };
263
+ }
264
+ export function loadMutationGrammar(sourceRoot = resolveSourceRoot()) {
265
+ const authority = loadStateStorageAuthority(sourceRoot);
266
+ if (cache?.revision === authority.revision)
267
+ return cache.grammar;
268
+ const grammar = parseGrammar(authority.document, authority.authorityPath);
269
+ cache = { revision: authority.revision, grammar };
270
+ return grammar;
271
+ }
272
+ export function mutationOperationsForArtifact(artifact, sourceRoot = resolveSourceRoot()) {
273
+ return loadMutationGrammar(sourceRoot).operations.filter((operation) => operation.artifact === artifact);
274
+ }
275
+ export function mutationGrammarPayload(sourceRoot = resolveSourceRoot()) {
276
+ const grammar = loadMutationGrammar(sourceRoot);
277
+ return {
278
+ schemaVersion: grammar.schemaVersion,
279
+ authority: grammar.authority,
280
+ contract_digest: grammar.contractDigest,
281
+ operation_classes: grammar.operationClasses,
282
+ structured_input: grammar.structuredInput,
283
+ operations: grammar.operations,
284
+ };
285
+ }
@@ -0,0 +1,29 @@
1
+ import { reject } from "./errors.js";
2
+ export function schemaViolation(violations) {
3
+ reject({ class: "schema_violation", message: violations[0], violations });
4
+ }
5
+ export function findByNumber(entries, number) {
6
+ return entries.find((entry) => Number(entry.number) === number);
7
+ }
8
+ /** Coerce an unknown value into a plain mapping, returning `{}` for non-objects. */
9
+ export function mapping(value) {
10
+ return value && typeof value === "object" && !Array.isArray(value)
11
+ ? value
12
+ : {};
13
+ }
14
+ /** Return the object-valued elements of `doc[key]`, dropping non-mapping entries. */
15
+ export function array(doc, key) {
16
+ return Array.isArray(doc[key])
17
+ ? doc[key].filter((v) => Boolean(v && typeof v === "object" && !Array.isArray(v)))
18
+ : [];
19
+ }
20
+ /** Traverse a dotted field path into a nested mapping, returning `undefined` on miss. */
21
+ export function mappingPath(entry, field) {
22
+ let value = entry;
23
+ for (const part of field.split(".")) {
24
+ if (!value || typeof value !== "object" || Array.isArray(value))
25
+ return undefined;
26
+ value = value[part];
27
+ }
28
+ return value;
29
+ }
@@ -0,0 +1,12 @@
1
+ export * from "./operations.js";
2
+ export * from "./fields.js";
3
+ export * from "./input.js";
4
+ export * from "./assign.js";
5
+ export * from "./explain.js";
6
+ export * from "./lock.js";
7
+ export * from "./mutation.js";
8
+ export * from "./transaction.js";
9
+ export * from "./validate.js";
10
+ export * from "./serialize.js";
11
+ export * from "./errors.js";
12
+ export * from "./glossaryPublication.js";