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,205 @@
1
+ import path from "node:path";
2
+ import { loadYamlMappingFile } from "../core/yaml.js";
3
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
4
+ import { ARTIFACT_PROTOCOL_PATHS, normalizeArtifactProtocolId, } from "./artifactProtocolIds.js";
5
+ export class VerbosityBudgetContractError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = "VerbosityBudgetContractError";
9
+ }
10
+ }
11
+ export function verbosityBudgetAuthorityPath() {
12
+ return path.join(resolveSourceRoot(), "references", "artifacts", "verbosity-budget-authority.yaml");
13
+ }
14
+ function mapping(value) {
15
+ return value !== null && typeof value === "object" && !Array.isArray(value)
16
+ ? value
17
+ : null;
18
+ }
19
+ function positiveNumber(value) {
20
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
21
+ }
22
+ function readMapping(filePath, label) {
23
+ try {
24
+ return loadYamlMappingFile(filePath);
25
+ }
26
+ catch (error) {
27
+ throw new VerbosityBudgetContractError(`${label} ${filePath} is unreadable or malformed: ${error.message}`);
28
+ }
29
+ }
30
+ function loadContract(contractPath) {
31
+ const contract = readMapping(contractPath, "verbosity budget authority");
32
+ if (contract.schema_version !== "agentera.verbosityBudgetAuthority.v1") {
33
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} has unsupported schema_version`);
34
+ }
35
+ const authority = mapping(contract.authority);
36
+ const scope = mapping(contract.scope);
37
+ const supported = scope?.supported_artifacts;
38
+ if (!authority || typeof authority.schema_directory !== "string" || !Array.isArray(supported)) {
39
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} must declare authority.schema_directory and scope.supported_artifacts`);
40
+ }
41
+ const schemaDirectory = path.resolve(path.dirname(contractPath), authority.schema_directory);
42
+ const owners = new Map();
43
+ for (const raw of supported) {
44
+ const entry = mapping(raw);
45
+ const artifactId = entry?.artifact_id;
46
+ const schema = entry?.schema;
47
+ if (typeof artifactId !== "string" || normalizeArtifactProtocolId(artifactId) !== artifactId) {
48
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} contains an invalid artifact_id`);
49
+ }
50
+ if (typeof schema !== "string" || !schema.endsWith(".yaml") || path.basename(schema) !== schema) {
51
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} contains an invalid schema owner for ${artifactId}`);
52
+ }
53
+ if (owners.has(artifactId)) {
54
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} declares ambiguous owners for ${artifactId}`);
55
+ }
56
+ owners.set(artifactId, {
57
+ artifactId,
58
+ authorityPath: contractPath,
59
+ schemaPath: path.join(schemaDirectory, schema),
60
+ });
61
+ }
62
+ if (owners.size === 0) {
63
+ throw new VerbosityBudgetContractError(`verbosity budget authority ${contractPath} declares no supported artifacts`);
64
+ }
65
+ return { contractPath, owners };
66
+ }
67
+ function protocolIdForOwner(input) {
68
+ const normalized = normalizeArtifactProtocolId(input);
69
+ if (normalized)
70
+ return normalized;
71
+ const comparable = input.trim().replaceAll("\\", "/").toLowerCase();
72
+ for (const [artifactId, artifactPath] of Object.entries(ARTIFACT_PROTOCOL_PATHS)) {
73
+ const canonicalPath = artifactPath.toLowerCase();
74
+ if (comparable === canonicalPath || comparable === path.posix.basename(canonicalPath)) {
75
+ return artifactId;
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ export function resolveVerbosityBudgetOwner(artifact, contractPath = verbosityBudgetAuthorityPath()) {
81
+ const contract = loadContract(contractPath);
82
+ const artifactId = protocolIdForOwner(artifact);
83
+ const owner = artifactId ? contract.owners.get(artifactId) : undefined;
84
+ if (!owner) {
85
+ throw new VerbosityBudgetContractError(`unsupported artifact ${JSON.stringify(artifact)} in verbosity budget authority; ` +
86
+ `valid artifact_id values: ${[...contract.owners.keys()].sort().join(", ")}`);
87
+ }
88
+ return owner;
89
+ }
90
+ function invalidDimension(scope, declarationId, error) {
91
+ return {
92
+ scope,
93
+ classification: "invalid_declaration",
94
+ unit: null,
95
+ limit: null,
96
+ declarationId,
97
+ error,
98
+ };
99
+ }
100
+ function classifyDeclaration(raw, index) {
101
+ const declaration = mapping(raw);
102
+ if (!declaration)
103
+ return invalidDimension(`<entry:${index}>`, null, "budget declaration must be a mapping");
104
+ const scope = typeof declaration.scope === "string" && declaration.scope.trim()
105
+ ? declaration.scope.trim()
106
+ : `<entry:${index}>`;
107
+ const declarationId = typeof declaration.id === "string" ? declaration.id : null;
108
+ if (scope.startsWith("<entry:")) {
109
+ return invalidDimension(scope, declarationId, "budget declaration must define a non-empty scope");
110
+ }
111
+ const hasWords = Object.hasOwn(declaration, "max_words");
112
+ const hasTokens = Object.hasOwn(declaration, "token_budget");
113
+ if (Number(hasWords) + Number(hasTokens) !== 1) {
114
+ return invalidDimension(scope, declarationId, "budget declaration must define exactly one of max_words or token_budget");
115
+ }
116
+ if (hasWords) {
117
+ if (declaration.max_words === null) {
118
+ return { scope, classification: "explicit_no_limit", unit: "words", limit: null, declarationId };
119
+ }
120
+ if (positiveNumber(declaration.max_words)) {
121
+ return {
122
+ scope,
123
+ classification: "numeric_limit",
124
+ unit: "words",
125
+ limit: declaration.max_words,
126
+ declarationId,
127
+ };
128
+ }
129
+ return invalidDimension(scope, declarationId, "max_words must be a positive number or null");
130
+ }
131
+ if (positiveNumber(declaration.token_budget)) {
132
+ return {
133
+ scope,
134
+ classification: "non_word_unit",
135
+ unit: "tokens",
136
+ limit: declaration.token_budget,
137
+ declarationId,
138
+ };
139
+ }
140
+ return invalidDimension(scope, declarationId, "token_budget must be a positive number");
141
+ }
142
+ function isNonVerbosityBudgetEntry(raw) {
143
+ const declaration = mapping(raw);
144
+ return Boolean(declaration &&
145
+ typeof declaration.rule === "string" &&
146
+ !Object.hasOwn(declaration, "max_words") &&
147
+ !Object.hasOwn(declaration, "token_budget"));
148
+ }
149
+ export function inspectArtifactVerbosityBudget(artifact, contractPath = verbosityBudgetAuthorityPath()) {
150
+ const owner = resolveVerbosityBudgetOwner(artifact, contractPath);
151
+ let schema;
152
+ try {
153
+ schema = readMapping(owner.schemaPath, `verbosity budget owner for ${owner.artifactId}`);
154
+ }
155
+ catch (error) {
156
+ return {
157
+ ...owner,
158
+ dimensions: [invalidDimension("<authority>", null, error.message)],
159
+ };
160
+ }
161
+ const budget = mapping(schema.BUDGET);
162
+ if (!budget || Object.keys(budget).length === 0) {
163
+ return {
164
+ ...owner,
165
+ dimensions: [invalidDimension("<authority>", null, "owning schema must define a non-empty BUDGET mapping")],
166
+ };
167
+ }
168
+ const dimensions = Object.entries(budget)
169
+ .filter(([, declaration]) => !isNonVerbosityBudgetEntry(declaration))
170
+ .map(([index, declaration]) => classifyDeclaration(declaration, index));
171
+ if (dimensions.length === 0) {
172
+ return {
173
+ ...owner,
174
+ dimensions: [invalidDimension("<authority>", null, "owning schema defines no verbosity budget declarations")],
175
+ };
176
+ }
177
+ const counts = new Map();
178
+ for (const dimension of dimensions)
179
+ counts.set(dimension.scope, (counts.get(dimension.scope) ?? 0) + 1);
180
+ return {
181
+ ...owner,
182
+ dimensions: dimensions.map((dimension) => (counts.get(dimension.scope) ?? 0) > 1
183
+ ? invalidDimension(dimension.scope, dimension.declarationId, `duplicate budget scope ${dimension.scope}`)
184
+ : dimension),
185
+ };
186
+ }
187
+ export function validateVerbosityBudgetContract(contractPath = verbosityBudgetAuthorityPath()) {
188
+ let contract;
189
+ try {
190
+ contract = loadContract(contractPath);
191
+ }
192
+ catch (error) {
193
+ return [error.message];
194
+ }
195
+ const errors = [];
196
+ for (const artifactId of contract.owners.keys()) {
197
+ const inspected = inspectArtifactVerbosityBudget(artifactId, contractPath);
198
+ for (const dimension of inspected.dimensions) {
199
+ if (dimension.classification === "invalid_declaration") {
200
+ errors.push(`${artifactId}:${dimension.scope}: ${dimension.error}`);
201
+ }
202
+ }
203
+ }
204
+ return errors;
205
+ }
@@ -0,0 +1,385 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { isDeepStrictEqual } from "node:util";
5
+ import { resolvePath } from "../core/paths.js";
6
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
7
+ import { loadYamlMappingFile } from "../core/yaml.js";
8
+ export const RELEASE_METADATA_AUTHORITY_FILES = [
9
+ "registry.json",
10
+ "packages/cli/package.json",
11
+ "references/cli/update-channels.yaml",
12
+ ];
13
+ export const RELEASE_METADATA_ADVISORY_FILES = [
14
+ "packages/cli/bundle/.agentera-npx-bundle.json",
15
+ ];
16
+ export const RELEASE_PROVENANCE_PATHS = [
17
+ "packages/cli/src",
18
+ "packages/cli/scripts",
19
+ "packages/cli/README.md",
20
+ "packages/cli/tsconfig.json",
21
+ "skills",
22
+ "references",
23
+ "README.md",
24
+ "UPGRADE.md",
25
+ "CHANGELOG.md",
26
+ "DESIGN.md",
27
+ "LICENSE",
28
+ "registry.json",
29
+ "fixtures/routing/hybrid-corpus.yaml",
30
+ ];
31
+ export const RELEASE_PROVENANCE_EXCLUSIONS = [
32
+ "packages/cli/src/release/releaseMetadata.ts",
33
+ "references/adapters/package-surface-characterization.md",
34
+ ];
35
+ export const STABLE_SHIM_PROVENANCE_PATHS = [
36
+ "packages/cli/shim/bin",
37
+ "packages/cli/shim/lib",
38
+ "packages/cli/shim/README.md",
39
+ "packages/cli/shim/LICENSE",
40
+ ];
41
+ const SEMVER_CORE_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
42
+ const SEMVER_STRICT_RE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
43
+ const PRE_RELEASE_RE = /-(.+)$/;
44
+ const GIT_REF_HEX_RE = /^[0-9a-f]{40}$/i;
45
+ function rootDefault() {
46
+ return resolveSourceRoot();
47
+ }
48
+ function readJson(pathname) {
49
+ try {
50
+ return JSON.parse(fs.readFileSync(pathname, "utf8"));
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function runGit(root, args) {
57
+ return spawnSync("git", ["-C", root, ...args], {
58
+ encoding: "utf8",
59
+ stdio: ["ignore", "pipe", "pipe"],
60
+ });
61
+ }
62
+ function normalizedPackageMetadata(value) {
63
+ const normalized = structuredClone(value);
64
+ delete normalized.version;
65
+ if (normalized.agentera && typeof normalized.agentera === "object" && !Array.isArray(normalized.agentera)) {
66
+ delete normalized.agentera.gitRef;
67
+ }
68
+ return normalized;
69
+ }
70
+ function validateGitRefProvenance(root, gitRef) {
71
+ const inside = runGit(root, ["rev-parse", "--is-inside-work-tree"]);
72
+ if (inside.status !== 0 || String(inside.stdout).trim() !== "true")
73
+ return [];
74
+ const commit = runGit(root, ["cat-file", "-e", `${gitRef}^{commit}`]);
75
+ if (commit.status !== 0) {
76
+ return [`packages/cli/package.json: agentera.gitRef ${JSON.stringify(gitRef)} is not a commit in the local repository`];
77
+ }
78
+ const pathspec = [
79
+ ...RELEASE_PROVENANCE_PATHS,
80
+ ...RELEASE_PROVENANCE_EXCLUSIONS.map((entry) => `:(exclude)${entry}`),
81
+ ];
82
+ const diff = runGit(root, ["diff", "--quiet", gitRef, "--", ...pathspec]);
83
+ if (diff.status !== 0) {
84
+ if (diff.status === 1) {
85
+ return [
86
+ `packages/cli/package.json: agentera.gitRef ${JSON.stringify(gitRef)} does not match the governed package source tree; ` +
87
+ "select the last substantive package-source commit, excluding approved release metadata",
88
+ ];
89
+ }
90
+ return [`packages/cli/package.json: unable to compare agentera.gitRef ${JSON.stringify(gitRef)} with the governed package source tree`];
91
+ }
92
+ const status = runGit(root, ["status", "--porcelain=v1", "--untracked-files=all", "--", ...pathspec]);
93
+ if (status.status !== 0 || String(status.stdout).trim() !== "") {
94
+ return [
95
+ "packages/cli/package.json: governed package source has uncommitted or untracked changes outside approved release metadata",
96
+ ];
97
+ }
98
+ const selectedPackage = runGit(root, ["show", `${gitRef}:packages/cli/package.json`]);
99
+ const currentPackage = readPackageJson(root);
100
+ try {
101
+ const selected = JSON.parse(String(selectedPackage.stdout));
102
+ if (selectedPackage.status !== 0 ||
103
+ currentPackage === null ||
104
+ !isDeepStrictEqual(normalizedPackageMetadata(selected), normalizedPackageMetadata(currentPackage))) {
105
+ return [
106
+ `packages/cli/package.json: package contract differs from agentera.gitRef ${JSON.stringify(gitRef)} ` +
107
+ "outside the permitted version and gitRef fields",
108
+ ];
109
+ }
110
+ }
111
+ catch {
112
+ return [`packages/cli/package.json: unable to read package contract from agentera.gitRef ${JSON.stringify(gitRef)}`];
113
+ }
114
+ return [];
115
+ }
116
+ export function validateStableShimGitRefProvenance(root, gitRef) {
117
+ const manifestPath = "packages/cli/shim/package.json";
118
+ const inside = runGit(root, ["rev-parse", "--is-inside-work-tree"]);
119
+ if (inside.status !== 0 || String(inside.stdout).trim() !== "true")
120
+ return [];
121
+ const commit = runGit(root, ["cat-file", "-e", `${gitRef}^{commit}`]);
122
+ if (commit.status !== 0) {
123
+ return [`${manifestPath}: agentera.gitRef ${JSON.stringify(gitRef)} is not a commit in the local repository`];
124
+ }
125
+ const diff = runGit(root, ["diff", "--quiet", gitRef, "--", ...STABLE_SHIM_PROVENANCE_PATHS]);
126
+ if (diff.status !== 0) {
127
+ return [
128
+ `${manifestPath}: agentera.gitRef ${JSON.stringify(gitRef)} does not match the stable shim packaged inputs; ` +
129
+ "select the last substantive shim-source commit",
130
+ ];
131
+ }
132
+ const status = runGit(root, [
133
+ "status",
134
+ "--porcelain=v1",
135
+ "--untracked-files=all",
136
+ "--",
137
+ manifestPath,
138
+ ...STABLE_SHIM_PROVENANCE_PATHS,
139
+ ]);
140
+ if (status.status !== 0 || String(status.stdout).trim() !== "") {
141
+ return [
142
+ `${manifestPath}: stable shim packaged inputs have uncommitted or untracked changes outside approved release metadata`,
143
+ ];
144
+ }
145
+ const selected = runGit(root, ["show", `${gitRef}:${manifestPath}`]);
146
+ const current = readJson(path.join(root, manifestPath));
147
+ try {
148
+ const selectedManifest = JSON.parse(String(selected.stdout));
149
+ if (selected.status !== 0 ||
150
+ current === null ||
151
+ !isDeepStrictEqual(normalizedPackageMetadata(selectedManifest), normalizedPackageMetadata(current))) {
152
+ return [
153
+ `${manifestPath}: package contract differs from agentera.gitRef ${JSON.stringify(gitRef)} ` +
154
+ "outside the permitted version and gitRef fields",
155
+ ];
156
+ }
157
+ }
158
+ catch {
159
+ return [`${manifestPath}: unable to read package contract from agentera.gitRef ${JSON.stringify(gitRef)}`];
160
+ }
161
+ return [];
162
+ }
163
+ function readRegistryVersion(root) {
164
+ const source = "registry.json";
165
+ const data = readJson(path.join(root, source));
166
+ if (data === null) {
167
+ return { version: null, source };
168
+ }
169
+ const skills = data.skills;
170
+ if (!Array.isArray(skills) || skills.length === 0) {
171
+ return { version: null, source };
172
+ }
173
+ const first = skills[0];
174
+ if (!first || typeof first !== "object") {
175
+ return { version: null, source };
176
+ }
177
+ const version = first.version;
178
+ return { version: typeof version === "string" ? version : null, source };
179
+ }
180
+ function readPackageJson(root) {
181
+ const candidate = path.join(root, "packages/cli/package.json");
182
+ if (!fs.existsSync(candidate)) {
183
+ return null;
184
+ }
185
+ return readJson(candidate);
186
+ }
187
+ function readUpdateChannels(root) {
188
+ const candidate = path.join(root, "references/cli/update-channels.yaml");
189
+ if (!fs.existsSync(candidate)) {
190
+ return null;
191
+ }
192
+ try {
193
+ return loadYamlMappingFile(candidate); // cast: YAML parse IO boundary
194
+ }
195
+ catch {
196
+ return null;
197
+ }
198
+ }
199
+ function readBundleSentinel(root) {
200
+ const source = "packages/cli/bundle/.agentera-npx-bundle.json";
201
+ const candidate = path.join(root, source);
202
+ if (!fs.existsSync(candidate)) {
203
+ return { version: null, source };
204
+ }
205
+ const data = readJson(candidate);
206
+ if (data === null) {
207
+ return { version: null, source };
208
+ }
209
+ const version = data.suiteVersion;
210
+ return { version: typeof version === "string" ? version : null, source };
211
+ }
212
+ /** Parse `X.Y.Z` core (ignore pre-release and build metadata). */
213
+ export function parseSemverCore(version) {
214
+ const match = SEMVER_CORE_RE.exec(version);
215
+ if (!match) {
216
+ return null;
217
+ }
218
+ const core = `${match[1]}.${match[2]}.${match[3]}`;
219
+ const preMatch = PRE_RELEASE_RE.exec(version);
220
+ return { core, preRelease: preMatch ? preMatch[1] : null };
221
+ }
222
+ function pickChannelDefaults(authority) {
223
+ if (authority === null) {
224
+ return { development: null, stable: null };
225
+ }
226
+ const versionResolution = authority.version_resolution;
227
+ const latestOnChannel = versionResolution?.latest_on_channel;
228
+ const defaults = (latestOnChannel?.offline_defaults ?? {});
229
+ return {
230
+ development: typeof defaults.development === "string" ? defaults.development : null,
231
+ stable: typeof defaults.stable === "string" ? defaults.stable : null,
232
+ };
233
+ }
234
+ export function readReleaseMetadata(root = rootDefault()) {
235
+ const resolved = resolvePath(root);
236
+ const registry = readRegistryVersion(resolved);
237
+ const pkg = readPackageJson(resolved);
238
+ const channels = readUpdateChannels(resolved);
239
+ const bundle = readBundleSentinel(resolved);
240
+ const topVersion = pkg && typeof pkg.version === "string" ? pkg.version : null;
241
+ const agenteraBlock = pkg && typeof pkg.agentera === "object" && pkg.agentera !== null
242
+ ? pkg.agentera
243
+ : null;
244
+ const suiteVersion = agenteraBlock && typeof agenteraBlock.suiteVersion === "string"
245
+ ? agenteraBlock.suiteVersion
246
+ : null;
247
+ const gitRef = agenteraBlock && typeof agenteraBlock.gitRef === "string"
248
+ ? agenteraBlock.gitRef
249
+ : null;
250
+ const { development, stable } = pickChannelDefaults(channels);
251
+ return {
252
+ authoritativeVersion: registry.version,
253
+ authoritativeSource: registry.source,
254
+ packageVersion: topVersion,
255
+ packageSuiteVersion: suiteVersion,
256
+ packageGitRef: gitRef,
257
+ developmentChannelDefault: development,
258
+ stableChannelDefault: stable,
259
+ bundleSuiteVersion: bundle.version,
260
+ };
261
+ }
262
+ /**
263
+ * Validate release-metadata coherence. Returns an empty array when the
264
+ * source-tree version surfaces agree on a single release train.
265
+ */
266
+ export function validateReleaseMetadata(root = rootDefault(), adapter = "development") {
267
+ if (adapter === "stable") {
268
+ const manifestPath = "packages/cli/shim/package.json";
269
+ const shim = readJson(path.join(resolvePath(root), manifestPath));
270
+ if (shim === null)
271
+ return [`${manifestPath}: missing or unreadable; cannot validate release-metadata`];
272
+ const agentera = shim.agentera;
273
+ const gitRef = agentera && typeof agentera === "object" && !Array.isArray(agentera)
274
+ ? agentera.gitRef
275
+ : null;
276
+ if (typeof gitRef !== "string" || !GIT_REF_HEX_RE.test(gitRef)) {
277
+ return [`${manifestPath}: agentera.gitRef must be a 40-character hex SHA for stable shim provenance`];
278
+ }
279
+ return validateStableShimGitRefProvenance(resolvePath(root), gitRef);
280
+ }
281
+ const errors = [];
282
+ const snap = readReleaseMetadata(root);
283
+ const rootLabel = path.basename(resolvePath(root)) || "repo root";
284
+ // 1. registry.json must publish a valid semver `skills[0].version`.
285
+ if (snap.authoritativeVersion === null) {
286
+ errors.push("registry.json: skills[0].version is required for release-metadata validation");
287
+ }
288
+ else {
289
+ const parsed = parseSemverCore(snap.authoritativeVersion);
290
+ if (parsed === null) {
291
+ errors.push(`registry.json: skills[0].version ${JSON.stringify(snap.authoritativeVersion)} is not a valid semver`);
292
+ }
293
+ else if (parsed.preRelease !== null) {
294
+ // registry.json is the suite authority and stays on the released core;
295
+ // pre-release suffixes belong only to packages/cli/package.json.
296
+ errors.push(`registry.json: skills[0].version must be a released core version (no pre-release suffix); got ${JSON.stringify(snap.authoritativeVersion)}`);
297
+ }
298
+ }
299
+ // 2. packages/cli/package.json must exist and parse.
300
+ if (snap.packageVersion === null && snap.packageSuiteVersion === null && snap.packageGitRef === null) {
301
+ errors.push("packages/cli/package.json: missing or unreadable; cannot validate release-metadata");
302
+ }
303
+ else {
304
+ // 2a. top-level `version` must be valid semver and share its core with registry.
305
+ if (snap.packageVersion === null) {
306
+ errors.push("packages/cli/package.json: top-level `version` is required");
307
+ }
308
+ else {
309
+ const parsed = parseSemverCore(snap.packageVersion);
310
+ if (parsed === null) {
311
+ errors.push(`packages/cli/package.json: top-level version ${JSON.stringify(snap.packageVersion)} is not a valid semver`);
312
+ }
313
+ else if (snap.authoritativeVersion !== null &&
314
+ parseSemverCore(snap.authoritativeVersion)?.core !== parsed.core) {
315
+ errors.push(`release-metadata divergence: registry.json skills[0].version core is ${JSON.stringify(parseSemverCore(snap.authoritativeVersion)?.core)} ` +
316
+ `but packages/cli/package.json top-level version core is ${JSON.stringify(parsed.core)}; ` +
317
+ `the npm package version must share its major.minor.patch with the registry suite version`);
318
+ }
319
+ }
320
+ // 2b. `agentera.suiteVersion` must match registry exactly.
321
+ if (snap.packageSuiteVersion === null) {
322
+ errors.push("packages/cli/package.json: `agentera.suiteVersion` is required");
323
+ }
324
+ else if (snap.authoritativeVersion !== null &&
325
+ snap.packageSuiteVersion !== snap.authoritativeVersion) {
326
+ errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
327
+ `but packages/cli/package.json agentera.suiteVersion is ${JSON.stringify(snap.packageSuiteVersion)}; ` +
328
+ `the agentera.suiteVersion mirror must equal the registry version exactly`);
329
+ }
330
+ else if (!SEMVER_STRICT_RE.test(snap.packageSuiteVersion)) {
331
+ errors.push(`packages/cli/package.json: agentera.suiteVersion ${JSON.stringify(snap.packageSuiteVersion)} is not a released core semver`);
332
+ }
333
+ // 2c. `agentera.gitRef` must identify the governed package source tree.
334
+ if (snap.packageGitRef === null || snap.packageGitRef === "") {
335
+ errors.push("packages/cli/package.json: `agentera.gitRef` is required for release-metadata validation");
336
+ }
337
+ else if (!GIT_REF_HEX_RE.test(snap.packageGitRef)) {
338
+ errors.push(`packages/cli/package.json: agentera.gitRef ${JSON.stringify(snap.packageGitRef)} must be a 40-character hex SHA; ` +
339
+ `short SHAs and branch names are not reproducible release references`);
340
+ }
341
+ else {
342
+ errors.push(...validateGitRefProvenance(resolvePath(root), snap.packageGitRef));
343
+ }
344
+ }
345
+ // 3. update-channels.yaml development default must equal the registry version.
346
+ if (snap.developmentChannelDefault === null) {
347
+ errors.push("references/cli/update-channels.yaml: version_resolution.latest_on_channel.offline_defaults.development is required");
348
+ }
349
+ else if (snap.authoritativeVersion !== null &&
350
+ snap.developmentChannelDefault !== snap.authoritativeVersion) {
351
+ errors.push(`release-metadata divergence: registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)} ` +
352
+ `but update-channels.yaml offline_defaults.development is ${JSON.stringify(snap.developmentChannelDefault)}; ` +
353
+ `the development channel default must match the registry version exactly`);
354
+ }
355
+ // 4. Stable channel default is informational on the @next branch; the
356
+ // validator surfaces it so maintainers can confirm the stable line still
357
+ // resolves to its declared 2.x version. A drift on the stable channel
358
+ // alone is not an error here — that lane is owned by the `main` branch
359
+ // compatibility boundary per `references/cli/update-channels.yaml`.
360
+ void snap.stableChannelDefault;
361
+ // 5. Advisory check on the local bundle sentinel.
362
+ if (snap.bundleSuiteVersion !== null) {
363
+ if (snap.authoritativeVersion !== null &&
364
+ snap.bundleSuiteVersion !== snap.authoritativeVersion) {
365
+ errors.push(`release-metadata drift (advisory): packages/cli/bundle/.agentera-npx-bundle.json suiteVersion is ${JSON.stringify(snap.bundleSuiteVersion)} ` +
366
+ `but registry.json skills[0].version is ${JSON.stringify(snap.authoritativeVersion)}; ` +
367
+ `run \`npm run bundle:data\` (or \`pnpm -C packages/cli run bundle:data\`) at ${rootLabel} to refresh the local bundle copy before publishing`);
368
+ }
369
+ }
370
+ return errors;
371
+ }
372
+ export function releaseMetadataMain(opts = {}) {
373
+ const root = resolvePath(opts.root ?? rootDefault());
374
+ const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
375
+ const err = opts.err ?? ((line) => process.stderr.write(line + "\n"));
376
+ const errors = validateReleaseMetadata(root, opts.adapter);
377
+ if (errors.length > 0) {
378
+ out("release-metadata validation failed:");
379
+ for (const message of errors)
380
+ out(`- ${message}`);
381
+ return 1;
382
+ }
383
+ out("release-metadata ok");
384
+ return 0;
385
+ }