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
@@ -2,27 +2,7 @@
2
2
  * Self-audit checks for artifact writing conventions. Faithful TS port of
3
3
  * `scripts/self_audit.py`. Advisory only — report but do not block writes.
4
4
  */
5
- const FULL_FILE_BUDGETS = {
6
- "PROGRESS.md": 3000,
7
- "EXPERIMENTS.md": 2500,
8
- "HEALTH.md": 2000,
9
- "DECISIONS.md": 5000,
10
- "TODO.md": 5000,
11
- "CHANGELOG.md": 5000,
12
- "PLAN.md": 2500,
13
- "VISION.md": 1500,
14
- "DESIGN.md": 2000,
15
- "DOCS.md": 2000,
16
- };
17
- const PER_ENTRY_BUDGETS = {
18
- "PROGRESS.md": 500,
19
- "EXPERIMENTS.md": 300,
20
- "HEALTH.md": 150,
21
- "DECISIONS.md": 200,
22
- "TODO.md": 100,
23
- "CHANGELOG.md": 300,
24
- "PLAN.md": 100,
25
- };
5
+ import { inspectArtifactVerbosityBudget, } from "../registries/verbosityBudgetContract.js";
26
6
  const FILE_PATH_RE = /\b(?:[A-Za-z0-9_.-]+\/)+[A-Za-z0-9_.-]+\.[A-Za-z]{1,10}\b/;
27
7
  const REPO_PATH_RE = /\b(?:internal|src|lib|pkg|cmd|app|test|tests|doc|docs|script|scripts|skill|skills|hook|hooks|fixture|fixtures|reference|references)(?:\/[A-Za-z0-9_.-]+)+\b/;
28
8
  const LINE_NUMBER_RE = /:\d{2,}\b/;
@@ -45,33 +25,56 @@ const BANNED_PATTERNS = [
45
25
  ["filler introductions", /After\s+careful\s+consideration\b/i],
46
26
  ["summary preambles", /\bIn\s+summary\b/i],
47
27
  ["summary preambles", /\bTo\s+recap\b/i],
48
- ["summary preambles", /\bOverall\b/i],
28
+ ["summary preambles", /\bOverall\b(?!\s+acceptance\b)/i],
49
29
  ["excessive justification", /I\s+chose\s+this\s+approach\s+because\b/i],
50
30
  ];
51
31
  /** Count non-whitespace tokens, matching Python's str.split(). */
52
32
  function wordCount(text) {
53
33
  return (text.match(/\S+/g) ?? []).length;
54
34
  }
55
- export function checkVerbosity(text, artifact, budgets = null) {
56
- const count = wordCount(text);
57
- const table = budgets ?? PER_ENTRY_BUDGETS;
58
- let perEntryBudget = table[artifact];
59
- if (perEntryBudget === undefined) {
60
- const fullBudget = FULL_FILE_BUDGETS[artifact];
61
- perEntryBudget = fullBudget !== undefined ? Math.floor(fullBudget / 5) : 500;
35
+ export function checkVerbosity(text, artifact, contractPath) {
36
+ return checkAuthoritativeWordBudget(text, artifact, false, contractPath);
37
+ }
38
+ export function checkFullFileVerbosity(text, artifact, contractPath) {
39
+ return checkAuthoritativeWordBudget(text, artifact, true, contractPath);
40
+ }
41
+ function authorityError(artifact, detail) {
42
+ return [
43
+ false,
44
+ `verbosity authority error for ${JSON.stringify(artifact)}: ${detail}; ` +
45
+ "repair the declared owner in references/artifacts/verbosity-budget-authority.yaml",
46
+ ];
47
+ }
48
+ function applicableDimensions(dimensions, fullArtifact) {
49
+ return dimensions.filter((dimension) => fullArtifact ? dimension.scope === "full_file" : dimension.scope !== "full_file");
50
+ }
51
+ function checkAuthoritativeWordBudget(text, artifact, fullArtifact, contractPath) {
52
+ let dimensions;
53
+ try {
54
+ dimensions = inspectArtifactVerbosityBudget(artifact, contractPath).dimensions;
55
+ }
56
+ catch (error) {
57
+ return authorityError(artifact, error.message);
58
+ }
59
+ const invalid = dimensions.filter((dimension) => dimension.classification === "invalid_declaration");
60
+ if (invalid.length > 0) {
61
+ return authorityError(artifact, invalid.map((dimension) => `${dimension.scope}: ${dimension.error ?? "invalid declaration"}`).join("; "));
62
+ }
63
+ const applicable = applicableDimensions(dimensions, fullArtifact);
64
+ if (applicable.length > 1) {
65
+ const kind = fullArtifact ? "full-file" : "per-entry";
66
+ return authorityError(artifact, `multiple ${kind} declarations apply: ${applicable.map((d) => d.scope).join(", ")}`);
62
67
  }
63
- if (count <= perEntryBudget) {
68
+ const dimension = applicable[0];
69
+ if (!dimension || dimension.classification !== "numeric_limit") {
64
70
  return [true, ""];
65
71
  }
66
- return [false, `verbosity mismatch: ${count} words exceeds ${perEntryBudget} budget`];
67
- }
68
- export function checkFullFileVerbosity(text, artifact) {
69
72
  const count = wordCount(text);
70
- const budget = FULL_FILE_BUDGETS[artifact] ?? 2500;
71
- if (count <= budget) {
73
+ if (count <= dimension.limit) {
72
74
  return [true, ""];
73
75
  }
74
- return [false, `verbosity mismatch: ${count} words exceeds ${budget} full-file budget`];
76
+ const qualifier = fullArtifact ? " full-file" : "";
77
+ return [false, `verbosity mismatch: ${count} words exceeds ${dimension.limit}${qualifier} budget`];
75
78
  }
76
79
  export function checkAbstraction(text) {
77
80
  for (const re of [
@@ -104,4 +107,37 @@ export function checkFiller(text) {
104
107
  }
105
108
  return [false, "filler: " + matched.join(", ")];
106
109
  }
107
- //# sourceMappingURL=selfAudit.js.map
110
+ /** Smoke-validate that self-audit conventions and budgets are wired. */
111
+ export function validateSelfAuditConventions() {
112
+ const errors = [];
113
+ const sample = "concrete anchor `scripts/agentera` at line 42 with 12 words total here";
114
+ const [verbosityOk] = checkVerbosity(sample, "progress");
115
+ if (!verbosityOk) {
116
+ errors.push("self-audit: verbosity check failed on smoke sample");
117
+ }
118
+ const [abstractionOk] = checkAbstraction(sample);
119
+ if (!abstractionOk) {
120
+ errors.push("self-audit: abstraction check failed to detect concrete anchor in smoke sample");
121
+ }
122
+ const [fillerOk] = checkFiller("Shipped the plan task with a concrete file path.");
123
+ if (!fillerOk) {
124
+ errors.push("self-audit: filler check false-positive on clean smoke sample");
125
+ }
126
+ const [fillerFailOk, fillerDetail] = checkFiller("In summary, the work is done.");
127
+ if (fillerFailOk || !fillerDetail.includes("filler")) {
128
+ errors.push("self-audit: filler check must flag banned summary preambles");
129
+ }
130
+ return errors;
131
+ }
132
+ export function selfAuditMain(opts = {}) {
133
+ const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
134
+ const errors = validateSelfAuditConventions();
135
+ if (errors.length > 0) {
136
+ out("self-audit validation failed:");
137
+ for (const error of errors)
138
+ out(`- ${error}`);
139
+ return 1;
140
+ }
141
+ out("self-audit conventions ok");
142
+ return 0;
143
+ }
@@ -0,0 +1,131 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import YAML from "yaml";
5
+ import { resolvePath } from "../core/paths.js";
6
+ import { confirmedVariantGuardContract } from "../registries/glossaryEntryContract.js";
7
+ import { containsGlossaryTerm } from "../registries/glossaryTermOccurrence.js";
8
+ import { loadProjectGlossaryDocument, } from "../state/write/glossaryPublication.js";
9
+ const EXCLUDED_DIRECTORIES = new Set(confirmedVariantGuardContract().excludedDirectories);
10
+ // Lowercased extensions classify ASCII path suffixes; they are not term identities.
11
+ const TEXT_EXTENSIONS = new Set([
12
+ ".cjs", ".css", ".go", ".html", ".js", ".json", ".jsonc", ".jsx",
13
+ ".md", ".mjs", ".py", ".rs", ".sh", ".toml", ".ts", ".tsx", ".txt",
14
+ ".xml", ".yaml", ".yml",
15
+ ]);
16
+ const RERUN = "pnpm -C packages/cli exec vitest run test/cli/v1LegacyCruft.test.ts";
17
+ function fixedLegacyViolations(root) {
18
+ const violations = [];
19
+ if (fs.existsSync(path.join(root, "skills/hej")))
20
+ violations.push("skills/hej/ bridge directory present");
21
+ if (fs.existsSync(path.join(root, "references/v1-section-mapping.md"))) {
22
+ violations.push("references/v1-section-mapping.md present");
23
+ }
24
+ if (fs.existsSync(path.join(root, ".opencode/commands/hej.md"))) {
25
+ violations.push(".opencode/commands/hej.md legacy bridge command present");
26
+ }
27
+ const marketplacePath = path.join(root, ".claude-plugin/marketplace.json");
28
+ if (fs.existsSync(marketplacePath)) {
29
+ const marketplace = JSON.parse(fs.readFileSync(marketplacePath, "utf8"));
30
+ const names = (marketplace.plugins ?? []).map((item) => item.name);
31
+ if (names.includes("status"))
32
+ violations.push(".claude-plugin/marketplace.json still lists hej plugin");
33
+ }
34
+ const codexPath = path.join(root, ".codex-plugin/plugin.json");
35
+ if (fs.existsSync(codexPath)) {
36
+ const codex = JSON.parse(fs.readFileSync(codexPath, "utf8"));
37
+ const names = (codex.skillMetadata ?? []).map((item) => item.name);
38
+ if (names.includes("status"))
39
+ violations.push(".codex-plugin/plugin.json still lists hej skillMetadata");
40
+ }
41
+ const packageRegistryPath = path.join(root, "references/adapters/package-registry.yaml");
42
+ if (fs.existsSync(packageRegistryPath)) {
43
+ const registry = YAML.parse(fs.readFileSync(packageRegistryPath, "utf8"));
44
+ const versionFiles = registry.records?.[0]?.docs_targets?.version_files ?? [];
45
+ if (versionFiles.includes("skills/hej/SKILL.md")) {
46
+ violations.push("package-registry docs_targets still lists skills/hej/SKILL.md");
47
+ }
48
+ }
49
+ return violations;
50
+ }
51
+ function confirmedVariants(document) {
52
+ return document.approvals.flatMap((approval, index) => {
53
+ const entry = document.entries[index];
54
+ const canonical = String(entry.term);
55
+ // Project-glossary validation already rejects every canonical/variant
56
+ // identity collision. Preserve all validated variants for guard scanning.
57
+ return approval.proposal.variants
58
+ .map(({ term, evidence }) => ({
59
+ variant: term,
60
+ canonical,
61
+ approvalDigest: approval.proposal_digest,
62
+ evidence,
63
+ }));
64
+ });
65
+ }
66
+ function projectTextFiles(root) {
67
+ const files = [];
68
+ const visit = (directory) => {
69
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
70
+ if (entry.isSymbolicLink())
71
+ continue;
72
+ const target = path.join(directory, entry.name);
73
+ if (entry.isDirectory()) {
74
+ if (!EXCLUDED_DIRECTORIES.has(entry.name))
75
+ visit(target);
76
+ }
77
+ else if (entry.isFile() && TEXT_EXTENSIONS.has(path.extname(entry.name).toLocaleLowerCase())) {
78
+ files.push(target);
79
+ }
80
+ }
81
+ };
82
+ visit(root);
83
+ return files;
84
+ }
85
+ function lineDigest(line) {
86
+ return crypto.createHash("sha256").update(line).digest("hex");
87
+ }
88
+ function isApprovedEvidence(variant, sourcePath, line, text) {
89
+ const digest = lineDigest(text);
90
+ return variant.evidence.some((item) => item.source_path === sourcePath && item.line === line && item.source_record_sha256 === digest);
91
+ }
92
+ function variantViolations(root, document, glossaryPath) {
93
+ const violations = [];
94
+ const seen = new Set();
95
+ for (const file of projectTextFiles(root)) {
96
+ if (path.resolve(file) === path.resolve(glossaryPath))
97
+ continue;
98
+ const sourcePath = path.relative(root, file).split(path.sep).join(path.posix.sep);
99
+ const lines = fs.readFileSync(file, "utf8").split(/\r?\n/);
100
+ for (const variant of confirmedVariants(document)) {
101
+ for (const [index, text] of lines.entries()) {
102
+ const line = index + 1;
103
+ if (!containsGlossaryTerm(text, variant.variant) || isApprovedEvidence(variant, sourcePath, line, text))
104
+ continue;
105
+ const identity = `${variant.approvalDigest}\0${variant.variant}\0${sourcePath}\0${line}`;
106
+ if (seen.has(identity))
107
+ continue;
108
+ seen.add(identity);
109
+ const evidence = variant.evidence.map((item) => `${item.source_path}:${item.line}`).join(", ");
110
+ violations.push(`confirmed variant '${variant.variant}' reintroduced at ${sourcePath}:${line}; canonical term '${variant.canonical}' ` +
111
+ `from approval ${variant.approvalDigest} (confirmed variant evidence: ${evidence}). ` +
112
+ `Correction: replace '${variant.variant}' with '${variant.canonical}' at ${sourcePath}:${line}; rerun: ${RERUN}`);
113
+ }
114
+ }
115
+ }
116
+ return violations.sort();
117
+ }
118
+ export function scanPost30CruftViolations(root) {
119
+ const resolved = resolvePath(root);
120
+ const violations = fixedLegacyViolations(resolved);
121
+ try {
122
+ const loaded = loadProjectGlossaryDocument(resolved);
123
+ if (loaded)
124
+ violations.push(...variantViolations(resolved, loaded.document, loaded.path));
125
+ }
126
+ catch (error) {
127
+ violations.push(`project glossary is malformed: ${error.message}. ` +
128
+ `Correction: restore a valid confirmed document or rerun agentera state glossary publish --input REQUEST.yaml --format json; rerun: ${RERUN}`);
129
+ }
130
+ return violations.sort();
131
+ }
@@ -0,0 +1,303 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolvePath } from "../core/paths.js";
4
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
5
+ import { loadYamlMappingFile } from "../core/yaml.js";
6
+ import { APP_MANUAL_REVIEW_NEEDED, APP_MIGRATION_NEEDED, APP_OUTDATED, APP_REPAIR_NEEDED, APP_UP_TO_DATE, } from "../upgrade/doctor.js";
7
+ import { validateGlossaryEntryContract } from "../registries/glossaryEntryContract.js";
8
+ /**
9
+ * Validate vocabulary authority YAML contracts (Decision 54 lifecycle status
10
+ * vocabulary, Decision 57 first_invocation_read, update channels, index order).
11
+ * Emits the same delegated validate envelope shape as lifecycle-adapters.
12
+ */
13
+ const EXPECTED_STATUSES = [
14
+ "up_to_date",
15
+ "outdated",
16
+ "repair_needed",
17
+ "migration_needed",
18
+ "manual_review_needed",
19
+ "ready_to_apply",
20
+ "applied",
21
+ "no_changes_needed",
22
+ ];
23
+ const EXPECTED_VERBS = ["install", "repair", "update", "migrate", "upgrade", "refresh"];
24
+ const EXPECTED_LIFECYCLE_CONSUMERS = ["doctor", "status", "upgrade", "docs", "tests"];
25
+ const EXPECTED_CHANNELS = ["stable", "development"];
26
+ const EXPECTED_CHANNEL_CONSUMERS = ["upgrade", "doctor", "prime", "docs", "tests"];
27
+ function rootDefault() {
28
+ return resolveSourceRoot();
29
+ }
30
+ function authorityPath(root, relative) {
31
+ return path.join(root, relative);
32
+ }
33
+ function canonicalStatuses(authority) {
34
+ return new Set(Object.keys(authority.canonical_statuses));
35
+ }
36
+ function rejectedLifecycleStatusValues(authority) {
37
+ const statuses = authority.canonical_statuses;
38
+ const verbs = authority.operation_verbs;
39
+ const deprecated = Object.values(statuses).flatMap((entry) => {
40
+ const aliases = entry.deprecated_aliases;
41
+ return Array.isArray(aliases) ? aliases : [];
42
+ });
43
+ const nonLifecycleVerbs = Object.entries(verbs)
44
+ .filter(([, entry]) => entry.lifecycle_allowed === false)
45
+ .map(([name]) => name);
46
+ return new Set([...deprecated, ...nonLifecycleVerbs].map(String));
47
+ }
48
+ function validateLifecycleAuthority(root) {
49
+ const errors = [];
50
+ const p = authorityPath(root, "references/cli/app-lifecycle-vocabulary.yaml");
51
+ let authority;
52
+ try {
53
+ authority = loadYamlMappingFile(p); // cast: YAML parse IO boundary
54
+ }
55
+ catch (exc) {
56
+ return [`app-lifecycle-vocabulary.yaml: ${exc.message}`];
57
+ }
58
+ if (!Array.isArray(authority.canonical_status_order) || authority.canonical_status_order.length === 0) {
59
+ errors.push("app-lifecycle-vocabulary.yaml: canonical_status_order is required");
60
+ }
61
+ else if (JSON.stringify(authority.canonical_status_order) !== JSON.stringify([...EXPECTED_STATUSES])) {
62
+ errors.push("app-lifecycle-vocabulary.yaml: canonical_status_order drifted from Decision 54 pin");
63
+ }
64
+ const statusKeys = Object.keys(authority.canonical_statuses);
65
+ if (JSON.stringify(statusKeys) !== JSON.stringify([...EXPECTED_STATUSES])) {
66
+ errors.push("app-lifecycle-vocabulary.yaml: canonical_statuses keys drifted from Decision 54 pin");
67
+ }
68
+ for (const status of EXPECTED_STATUSES) {
69
+ const entry = authority.canonical_statuses[status];
70
+ if (!entry || !String(entry.concept ?? "").trim() || !String(entry.definition ?? "").trim()) {
71
+ errors.push(`app-lifecycle-vocabulary.yaml: canonical status '${status}' is incomplete`);
72
+ }
73
+ }
74
+ const aliasToStatus = new Map();
75
+ for (const [status, raw] of Object.entries(authority.canonical_statuses)) {
76
+ for (const alias of raw.deprecated_aliases) {
77
+ aliasToStatus.set(alias, status);
78
+ }
79
+ }
80
+ const expectedAliases = {
81
+ fresh: "up_to_date",
82
+ stale: "outdated",
83
+ refresh_required: "repair_needed",
84
+ fixed: "applied",
85
+ noop: "no_changes_needed",
86
+ };
87
+ for (const [alias, status] of Object.entries(expectedAliases)) {
88
+ if (aliasToStatus.get(alias) !== status) {
89
+ errors.push(`app-lifecycle-vocabulary.yaml: deprecated alias '${alias}' must map to '${status}'`);
90
+ }
91
+ }
92
+ const doctorAllowed = new Set(authority.consumers.doctor.may_emit_statuses);
93
+ const observed = [
94
+ APP_UP_TO_DATE,
95
+ APP_OUTDATED,
96
+ APP_REPAIR_NEEDED,
97
+ APP_MIGRATION_NEEDED,
98
+ APP_MANUAL_REVIEW_NEEDED,
99
+ ];
100
+ for (const status of observed) {
101
+ if (!canonicalStatuses(authority).has(status)) {
102
+ errors.push(`doctor constant '${status}' is not a canonical lifecycle status`);
103
+ }
104
+ else if (!doctorAllowed.has(status)) {
105
+ errors.push(`doctor consumer may not emit canonical status '${status}'`);
106
+ }
107
+ else if (rejectedLifecycleStatusValues(authority).has(status)) {
108
+ errors.push(`doctor constant '${status}' is a rejected lifecycle alias or verb`);
109
+ }
110
+ }
111
+ if (!Array.isArray(authority.consumer_order) || authority.consumer_order.length === 0) {
112
+ errors.push("app-lifecycle-vocabulary.yaml: consumer_order is required");
113
+ }
114
+ else if (JSON.stringify(authority.consumer_order) !== JSON.stringify([...EXPECTED_LIFECYCLE_CONSUMERS])) {
115
+ errors.push("app-lifecycle-vocabulary.yaml: consumer_order drifted from Decision 54 pin");
116
+ }
117
+ const allowedStatuses = new Set(EXPECTED_STATUSES);
118
+ const allowedVerbs = new Set(EXPECTED_VERBS);
119
+ for (const consumer of EXPECTED_LIFECYCLE_CONSUMERS) {
120
+ const entry = authority.consumers[consumer];
121
+ if (!entry) {
122
+ errors.push(`app-lifecycle-vocabulary.yaml: missing consumer '${consumer}'`);
123
+ continue;
124
+ }
125
+ if (entry.may_define_new_statuses !== false) {
126
+ errors.push(`app-lifecycle-vocabulary.yaml: consumer '${consumer}' must not define new statuses`);
127
+ }
128
+ for (const status of entry.may_emit_statuses ?? []) {
129
+ if (!allowedStatuses.has(status)) {
130
+ errors.push(`app-lifecycle-vocabulary.yaml: consumer '${consumer}' emits unknown status '${status}'`);
131
+ }
132
+ }
133
+ for (const verb of entry.may_use_verbs ?? []) {
134
+ if (!allowedVerbs.has(verb)) {
135
+ errors.push(`app-lifecycle-vocabulary.yaml: consumer '${consumer}' uses unknown verb '${verb}'`);
136
+ }
137
+ }
138
+ }
139
+ const delegation = authority.docs_delegation;
140
+ if (delegation?.document !== "references/cli/vocabulary.md" ||
141
+ delegation?.required_anchor !== "App lifecycle status vocabulary" ||
142
+ delegation?.authority_path !== "references/cli/app-lifecycle-vocabulary.yaml") {
143
+ errors.push("app-lifecycle-vocabulary.yaml: docs_delegation contract drifted");
144
+ }
145
+ return errors;
146
+ }
147
+ function validateUpdateChannelsAuthority(root) {
148
+ const errors = [];
149
+ const p = authorityPath(root, "references/cli/update-channels.yaml");
150
+ let authority;
151
+ try {
152
+ authority = loadYamlMappingFile(p); // cast: YAML parse IO boundary
153
+ }
154
+ catch (exc) {
155
+ return [`update-channels.yaml: ${exc.message}`];
156
+ }
157
+ if (authority.default_channel !== "stable") {
158
+ errors.push("update-channels.yaml: default_channel must be stable");
159
+ }
160
+ if (JSON.stringify(authority.channel_order) !== JSON.stringify([...EXPECTED_CHANNELS])) {
161
+ errors.push("update-channels.yaml: channel_order drifted");
162
+ }
163
+ const stable = authority.channels.stable;
164
+ const development = authority.channels.development;
165
+ if (!stable || !development) {
166
+ errors.push("update-channels.yaml: stable and development channels are required");
167
+ }
168
+ else {
169
+ const stableNpm = stable.resolution?.npm;
170
+ const devNpm = development.resolution?.npm;
171
+ if (stableNpm?.dist_tag !== "latest" || devNpm?.dist_tag !== "next") {
172
+ errors.push("update-channels.yaml: npm dist_tag pins drifted");
173
+ }
174
+ if (!String(stableNpm?.update_command ?? "").includes("@latest")) {
175
+ errors.push("update-channels.yaml: stable npm update_command must reference @latest");
176
+ }
177
+ if (!String(devNpm?.update_command ?? "").includes("@next")) {
178
+ errors.push("update-channels.yaml: development npm update_command must reference @next");
179
+ }
180
+ if (development.resolution?.git && development.resolution.git) {
181
+ const devGit = development.resolution.git;
182
+ if (devGit.supported !== false) {
183
+ errors.push("update-channels.yaml: development git resolution must be unsupported");
184
+ }
185
+ }
186
+ }
187
+ if (!Array.isArray(authority.consumer_order)) {
188
+ errors.push("update-channels.yaml: consumer_order is required");
189
+ }
190
+ else if (JSON.stringify(authority.consumer_order) !== JSON.stringify([...EXPECTED_CHANNEL_CONSUMERS])) {
191
+ errors.push("update-channels.yaml: consumer_order drifted");
192
+ }
193
+ const delegation = authority.docs_delegation;
194
+ if (delegation?.document !== "references/cli/vocabulary.md" ||
195
+ delegation?.required_anchor !== "Update channels" ||
196
+ delegation?.authority_path !== "references/cli/update-channels.yaml") {
197
+ errors.push("update-channels.yaml: docs_delegation contract drifted");
198
+ }
199
+ return errors;
200
+ }
201
+ function validateInstructionContract(root) {
202
+ const errors = [];
203
+ const p = authorityPath(root, "references/cli/capability-instruction-contract.yaml");
204
+ let authority;
205
+ try {
206
+ authority = loadYamlMappingFile(p); // cast: YAML parse IO boundary
207
+ }
208
+ catch (exc) {
209
+ return [`capability-instruction-contract.yaml: ${exc.message}`];
210
+ }
211
+ const firstRead = authority.first_invocation_read;
212
+ if (!firstRead) {
213
+ errors.push("capability-instruction-contract.yaml: first_invocation_read block is required");
214
+ return errors;
215
+ }
216
+ const allowed = firstRead.allowed_values;
217
+ if (!allowed || typeof allowed.prime_context !== "object") {
218
+ errors.push("capability-instruction-contract.yaml: first_invocation_read.allowed_values.prime_context is required");
219
+ }
220
+ else {
221
+ const meaning = String(allowed.prime_context.meaning ?? "");
222
+ if (!meaning.includes("npx -y agentera@next prime --context")) {
223
+ errors.push("capability-instruction-contract.yaml: prime_context obligation must reference npx -y agentera@next prime --context");
224
+ }
225
+ }
226
+ if (firstRead.default_rule !== "prime_context") {
227
+ errors.push("capability-instruction-contract.yaml: first_invocation_read.default_rule must be prime_context");
228
+ }
229
+ const cliMeta = authority.current_state?.cli_metadata;
230
+ if (cliMeta?.field !== "first_invocation_read") {
231
+ errors.push("capability-instruction-contract.yaml: cli_metadata.field must be first_invocation_read");
232
+ }
233
+ const delegation = authority.docs_delegation;
234
+ if (delegation?.document !== "references/cli/vocabulary.md" ||
235
+ delegation?.required_anchor !== "Capability instruction contract" ||
236
+ delegation?.authority_path !== "references/cli/capability-instruction-contract.yaml") {
237
+ errors.push("capability-instruction-contract.yaml: docs_delegation contract drifted");
238
+ }
239
+ return errors;
240
+ }
241
+ function validateVocabularyIndex(root) {
242
+ const errors = [];
243
+ const p = authorityPath(root, "references/cli/vocabulary-index.yaml");
244
+ let index;
245
+ try {
246
+ index = loadYamlMappingFile(p); // cast: YAML parse IO boundary
247
+ }
248
+ catch (exc) {
249
+ return [`vocabulary-index.yaml: ${exc.message}`];
250
+ }
251
+ const order = index.authority_order;
252
+ if (!Array.isArray(order)) {
253
+ return ["vocabulary-index.yaml: authority_order is required"];
254
+ }
255
+ const lifecycleIdx = order.indexOf("references/cli/app-lifecycle-vocabulary.yaml");
256
+ const channelsIdx = order.indexOf("references/cli/update-channels.yaml");
257
+ if (lifecycleIdx < 0 || channelsIdx < 0) {
258
+ errors.push("vocabulary-index.yaml: authority_order missing required vocabulary authorities");
259
+ }
260
+ else if (!(lifecycleIdx < channelsIdx)) {
261
+ errors.push("vocabulary-index.yaml: authority_order must place lifecycle before channels");
262
+ }
263
+ const vocabularyMd = authorityPath(root, "references/cli/vocabulary.md");
264
+ if (!fs.existsSync(vocabularyMd)) {
265
+ errors.push("references/cli/vocabulary.md: missing vocabulary prose delegation surface");
266
+ return errors;
267
+ }
268
+ const vocabulary = fs.readFileSync(vocabularyMd, "utf8");
269
+ const lifecycleSection = vocabulary.split("### App lifecycle status vocabulary")[1]?.split("### Update channels", 1)[0] ?? "";
270
+ if (!lifecycleSection.includes("references/cli/app-lifecycle-vocabulary.yaml") ||
271
+ !lifecycleSection.includes("machine-readable authority")) {
272
+ errors.push("references/cli/vocabulary.md: app lifecycle section must delegate to YAML authority");
273
+ }
274
+ const channelsSection = vocabulary.split("### Update channels")[1]?.split("## Evaluation and evidence grammar", 1)[0] ?? "";
275
+ if (!channelsSection.includes("references/cli/update-channels.yaml") ||
276
+ !channelsSection.includes("machine-readable authority")) {
277
+ errors.push("references/cli/vocabulary.md: update channels section must delegate to YAML authority");
278
+ }
279
+ return errors;
280
+ }
281
+ export function validateVocabularyAuthority(root = rootDefault()) {
282
+ const resolved = resolvePath(root);
283
+ return [
284
+ ...validateLifecycleAuthority(resolved),
285
+ ...validateUpdateChannelsAuthority(resolved),
286
+ ...validateInstructionContract(resolved),
287
+ ...validateVocabularyIndex(resolved),
288
+ ...validateGlossaryEntryContract(authorityPath(resolved, "references/artifacts/glossary-entry-contract.yaml")),
289
+ ];
290
+ }
291
+ export function vocabularyAuthorityMain(opts = {}) {
292
+ const root = resolvePath(opts.root ?? rootDefault());
293
+ const out = opts.out ?? ((line) => process.stdout.write(line + "\n"));
294
+ const errors = validateVocabularyAuthority(root);
295
+ if (errors.length > 0) {
296
+ out("vocabulary authority validation failed:");
297
+ for (const error of errors)
298
+ out(`- ${error}`);
299
+ return 1;
300
+ }
301
+ out("vocabulary authority ok");
302
+ return 0;
303
+ }