agentera 3.0.0-dev.6 → 3.0.0-dev.69

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 (696) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +118 -22
  3. package/bundle/CHANGELOG.md +1361 -0
  4. package/bundle/DESIGN.md +229 -0
  5. package/bundle/LICENSE +201 -0
  6. package/bundle/README.md +143 -0
  7. package/bundle/UPGRADE.md +252 -0
  8. package/bundle/extract-corpus-parity.json +21 -0
  9. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  10. package/bundle/references/adapters/package-publication.json +488 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -188
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -34
  13. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  14. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  15. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  16. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  17. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  18. package/bundle/references/analysis/verification-policy.yaml +266 -0
  19. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  20. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  21. package/bundle/references/artifacts/state-storage-authority.yaml +3061 -0
  22. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  23. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  24. package/bundle/references/cli/capability-instruction-contract.yaml +11 -14
  25. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  26. package/bundle/references/cli/routing-model.md +155 -0
  27. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  28. package/bundle/references/cli/update-channels.yaml +19 -2
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +325 -362
  31. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  32. package/bundle/registry.json +13 -13
  33. package/bundle/skills/agentera/SKILL.md +226 -422
  34. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  35. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  36. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  37. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  38. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +103 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +8 -6
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +184 -0
  42. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  44. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  45. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  46. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  47. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  48. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  50. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  52. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  53. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  55. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  56. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  57. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  58. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  59. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  61. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  62. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  63. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  64. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  65. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  66. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  67. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  68. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  69. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  71. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  72. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  73. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  74. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  75. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  77. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  78. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  79. package/bundle/skills/agentera/capability_schema_contract.yaml +178 -34
  80. package/bundle/skills/agentera/protocol.yaml +31 -31
  81. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  82. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  83. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +39 -21
  84. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  85. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  86. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  87. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  88. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  89. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  90. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +461 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +133 -20
  92. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +342 -42
  93. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  94. package/dist/analytics/extractCorpus/cli.js +101 -12
  95. package/dist/analytics/extractCorpus/copilotSessions.js +53 -9
  96. package/dist/analytics/extractCorpus/core.js +59 -24
  97. package/dist/analytics/extractCorpus/corpus.js +58 -23
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +12 -7
  100. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  101. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  102. package/dist/analytics/extractCorpus/filesystemSources.js +1 -5
  103. package/dist/analytics/extractCorpus/index.js +6 -1
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +24 -5
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +98 -6
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +0 -1
  109. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  110. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  111. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  112. package/dist/analytics/personalGlossaryProfile.js +219 -0
  113. package/dist/analytics/profileSignals.js +211 -0
  114. package/dist/analytics/usageStats.js +169 -42
  115. package/dist/audit/terminologyDrift.js +281 -0
  116. package/dist/bin/agentera.js +3 -2
  117. package/dist/capabilities/audit/instructions.js +16 -0
  118. package/dist/capabilities/build/instructions.js +59 -0
  119. package/dist/capabilities/design/instructions.js +4 -0
  120. package/dist/capabilities/discuss/instructions.js +29 -0
  121. package/dist/capabilities/document/instructions.js +11 -0
  122. package/dist/capabilities/index.js +29 -27
  123. package/dist/capabilities/optimize/instructions.js +14 -0
  124. package/dist/capabilities/orchestrate/instructions.js +42 -0
  125. package/dist/capabilities/plan/instructions.js +33 -0
  126. package/dist/capabilities/profile/instructions.js +70 -0
  127. package/dist/capabilities/research/instructions.js +5 -0
  128. package/dist/capabilities/status/instructions.js +15 -0
  129. package/dist/capabilities/status/startupInstructions.js +34 -0
  130. package/dist/capabilities/vision/instructions.js +4 -0
  131. package/dist/cli/appContext.js +30 -24
  132. package/dist/cli/argvalidate.js +0 -1
  133. package/dist/cli/capabilityContext/benchmark.js +25 -17
  134. package/dist/cli/capabilityContext/bespoke.js +31 -12
  135. package/dist/cli/capabilityContext/build.js +251 -0
  136. package/dist/cli/capabilityContext/closeout.js +33 -30
  137. package/dist/cli/capabilityContext/contract.js +39 -46
  138. package/dist/cli/capabilityContext/evidence.js +90 -73
  139. package/dist/cli/capabilityContext/index.js +1 -2
  140. package/dist/cli/capabilityContext/orchestration.js +45 -21
  141. package/dist/cli/capabilityContext/planState.js +93 -100
  142. package/dist/cli/capabilityContext/progress.js +60 -14
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +9 -20
  145. package/dist/cli/capabilityContext/slim.js +56 -10
  146. package/dist/cli/capabilityContext/startup.js +57 -115
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +37 -24
  149. package/dist/cli/capabilityContext.js +1 -2
  150. package/dist/cli/commands/appHome.js +22 -0
  151. package/dist/cli/commands/capability.js +4 -4
  152. package/dist/cli/commands/compact.js +163 -13
  153. package/dist/cli/commands/doctor.js +122 -114
  154. package/dist/cli/commands/durability.js +81 -0
  155. package/dist/cli/commands/glossaryAdvice.js +138 -0
  156. package/dist/cli/commands/lint.js +22 -8
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +746 -0
  159. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  160. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  161. package/dist/cli/commands/prime/collectEntityOrientation.js +326 -0
  162. package/dist/cli/commands/prime/collectOrientationState.js +219 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +421 -0
  164. package/dist/cli/commands/prime/types.js +1 -0
  165. package/dist/cli/commands/prime/v1Migration.js +38 -0
  166. package/dist/cli/commands/prime.js +80 -558
  167. package/dist/cli/commands/profileGrounding.js +55 -0
  168. package/dist/cli/commands/query.js +77 -52
  169. package/dist/cli/commands/report.js +88 -26
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -142
  172. package/dist/cli/commands/state/decisions.js +51 -61
  173. package/dist/cli/commands/state/docs.js +63 -86
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +11 -64
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +11 -111
  178. package/dist/cli/commands/state/index.js +6 -41
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +21 -64
  181. package/dist/cli/commands/state/plan.js +11 -169
  182. package/dist/cli/commands/state/planTasks.js +154 -0
  183. package/dist/cli/commands/state/plans.js +154 -0
  184. package/dist/cli/commands/state/progress.js +11 -45
  185. package/dist/cli/commands/state/shared.js +0 -1
  186. package/dist/cli/commands/state/todo.js +29 -108
  187. package/dist/cli/commands/state/write.js +433 -0
  188. package/dist/cli/commands/upgrade.js +146 -5
  189. package/dist/cli/commands/upgradeVerify.js +118 -0
  190. package/dist/cli/commands/validate.js +246 -211
  191. package/dist/cli/commands/verify.js +24 -9
  192. package/dist/cli/contracts/bundleStatus.js +1 -0
  193. package/dist/cli/contracts/orientationState.js +1 -0
  194. package/dist/cli/dispatch/argvParser.js +32 -0
  195. package/dist/cli/dispatch/check.js +94 -50
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +82 -52
  198. package/dist/cli/dispatch/lifecycle.js +268 -108
  199. package/dist/cli/dispatch/prime.js +68 -29
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +1 -2
  202. package/dist/cli/dispatch/state.js +68 -77
  203. package/dist/cli/dispatch.js +0 -1
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +395 -41
  206. package/dist/cli/migrationRequired.js +122 -0
  207. package/dist/cli/orientation/attention.js +61 -0
  208. package/dist/cli/orientation/corpusCoverage.js +102 -0
  209. package/dist/cli/orientation.js +438 -170
  210. package/dist/cli/planArtifacts.js +350 -0
  211. package/dist/cli/planEvidence.js +157 -0
  212. package/dist/cli/planLifecycleState.js +36 -0
  213. package/dist/cli/planTaskIndex.js +11 -0
  214. package/dist/cli/preCutoverCommand.js +32 -0
  215. package/dist/cli/prime-blob.js +71 -3
  216. package/dist/cli/profileAcquisition.js +167 -0
  217. package/dist/cli/startupCompletenessContract.js +59 -0
  218. package/dist/cli/stateQuery.js +56 -14
  219. package/dist/cli/structured.js +0 -1
  220. package/dist/cli/todoMarkdown.js +25 -12
  221. package/dist/cli/todoReadinessSelection.js +192 -0
  222. package/dist/cli/todoSeverity.js +18 -0
  223. package/dist/core/atomicWriter.js +20 -0
  224. package/dist/core/developmentChannel.js +1 -0
  225. package/dist/core/developmentInvocation.js +374 -0
  226. package/dist/core/difflib.js +0 -1
  227. package/dist/core/envPaths.js +20 -0
  228. package/dist/core/jsonValue.js +5 -0
  229. package/dist/core/paths.js +0 -1
  230. package/dist/core/pyjson.js +67 -3
  231. package/dist/core/shell.js +4 -0
  232. package/dist/core/skillIdentity.js +23 -0
  233. package/dist/core/sourceRoot.js +9 -12
  234. package/dist/core/text.js +10 -0
  235. package/dist/core/toml.js +0 -1
  236. package/dist/core/yaml.js +8 -1
  237. package/dist/eval/evalSkills.js +30 -26
  238. package/dist/eval/hybridRouteEvaluation.js +155 -0
  239. package/dist/eval/semanticEval.js +43 -20
  240. package/dist/eval/semanticFixtures.js +16 -5
  241. package/dist/hooks/common.js +3 -56
  242. package/dist/hooks/compaction/apply.js +252 -50
  243. package/dist/hooks/compaction/dryRun.js +7 -4
  244. package/dist/hooks/compaction/index.js +5 -6
  245. package/dist/hooks/compaction/parse.js +201 -5
  246. package/dist/hooks/compaction/retention.js +30 -25
  247. package/dist/hooks/compaction/status.js +149 -32
  248. package/dist/hooks/compaction/types.js +0 -1
  249. package/dist/hooks/validateArtifact/agentFacing.js +0 -1
  250. package/dist/hooks/validateArtifact/index.js +7 -64
  251. package/dist/hooks/validateArtifact/markdown.js +57 -7
  252. package/dist/hooks/validateArtifact/schema.js +110 -19
  253. package/dist/hooks/validateArtifact/traversal.js +13 -11
  254. package/dist/hooks/validateArtifact/violations.js +7 -5
  255. package/dist/migrate/v2HandoffManifest.js +127 -8
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +108 -0
  258. package/dist/registries/artifactProtocolIds.js +2 -1
  259. package/dist/registries/artifactRegistry.js +224 -63
  260. package/dist/registries/artifactSchemaProjection.js +45 -0
  261. package/dist/registries/capabilityContract.js +129 -2
  262. package/dist/registries/evaluatorHandoffContract.js +2 -3
  263. package/dist/registries/evidenceTierContract.js +371 -0
  264. package/dist/registries/glossaryAdviceContract.js +79 -0
  265. package/dist/registries/glossaryCaveatContract.js +67 -0
  266. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  267. package/dist/registries/glossaryEntryContract.js +757 -0
  268. package/dist/registries/glossaryTermIdentity.js +17 -0
  269. package/dist/registries/glossaryTermOccurrence.js +20 -0
  270. package/dist/registries/hybridRoute.js +274 -0
  271. package/dist/registries/hybridRouteReceipt.js +221 -0
  272. package/dist/registries/packagePublication.js +273 -0
  273. package/dist/registries/packageRegistry.js +187 -211
  274. package/dist/registries/todoReadinessContract.js +448 -0
  275. package/dist/registries/triggerLoader.js +174 -0
  276. package/dist/registries/verbosityBudgetContract.js +205 -0
  277. package/dist/release/releaseMetadata.js +156 -6
  278. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  279. package/dist/runtime/lifecycleAdapters.js +777 -0
  280. package/dist/runtime/lifecycleAuthority.js +453 -0
  281. package/dist/runtime/lifecycleOperationContract.js +123 -0
  282. package/dist/runtime/lifecycleOperations.js +634 -0
  283. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  284. package/dist/runtime/lifecyclePublication.js +415 -0
  285. package/dist/runtime/lifecycleSnapshot.js +438 -0
  286. package/dist/runtime/nativeResourceCleanup.js +502 -0
  287. package/dist/setup/opencode.js +20 -13
  288. package/dist/setup/opencodeConstants.js +1 -0
  289. package/dist/setup/sharedSkill.js +45 -0
  290. package/dist/setup/smokeChecks.js +21 -82
  291. package/dist/state/archiveDiscovery.js +580 -0
  292. package/dist/state/archivePublication.js +225 -0
  293. package/dist/state/archiveRecovery.js +237 -0
  294. package/dist/state/archiveReplay.js +53 -0
  295. package/dist/state/canonicalMigrationRecord.js +36 -0
  296. package/dist/state/changelog.js +221 -0
  297. package/dist/state/decisionEntities.js +367 -0
  298. package/dist/state/decisionLegacyValidation.js +215 -0
  299. package/dist/state/decisionMigrationProvenance.js +199 -0
  300. package/dist/state/decisionOverlay.js +254 -0
  301. package/dist/state/decisionRevision.js +256 -0
  302. package/dist/state/decisionRevisionMigration.js +89 -0
  303. package/dist/state/directRetrieval.js +323 -0
  304. package/dist/state/durability.js +324 -0
  305. package/dist/state/entityCutover.js +459 -0
  306. package/dist/state/entityCutoverGit.js +127 -0
  307. package/dist/state/entityGlossaryAuthority.js +13 -0
  308. package/dist/state/entityListProjection.js +187 -0
  309. package/dist/state/entityListRuntimeRegistry.js +85 -0
  310. package/dist/state/entityMigrationCausality.js +97 -0
  311. package/dist/state/entityMigrationIdentity.js +5 -0
  312. package/dist/state/entityMigrationPreview.js +840 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +859 -0
  315. package/dist/state/entityRetrievalHelp.js +506 -0
  316. package/dist/state/entityStorage.js +899 -0
  317. package/dist/state/exactReplacementRecovery.js +18 -0
  318. package/dist/state/experimentArchive.js +63 -0
  319. package/dist/state/experimentIdentity.js +202 -0
  320. package/dist/state/healthEntities.js +262 -0
  321. package/dist/state/healthEntityValidation.js +18 -0
  322. package/dist/state/healthRepair.js +69 -0
  323. package/dist/state/installRoot.js +64 -25
  324. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  325. package/dist/state/legacyIdentity.js +47 -0
  326. package/dist/state/legacySummaryRecord.js +6 -0
  327. package/dist/state/listAccounting.js +54 -0
  328. package/dist/state/listClassification.js +17 -0
  329. package/dist/state/listCursor.js +42 -0
  330. package/dist/state/listRetrieval.js +781 -0
  331. package/dist/state/migrationSourceBinding.js +30 -0
  332. package/dist/state/objectiveExperimentEntities.js +322 -0
  333. package/dist/state/planEntities.js +1027 -0
  334. package/dist/state/planIdentity.js +47 -0
  335. package/dist/state/planLineageValidation.js +52 -0
  336. package/dist/state/planReplacementTransaction.js +475 -0
  337. package/dist/state/planRetrieval.js +313 -0
  338. package/dist/state/planTaskRetrieval.js +294 -0
  339. package/dist/state/progressEntities.js +512 -0
  340. package/dist/state/progressGlossaryCaveat.js +168 -0
  341. package/dist/state/progressPublicationOrder.js +19 -0
  342. package/dist/state/progressWritePolicy.js +33 -0
  343. package/dist/state/projectRoot.js +62 -0
  344. package/dist/state/projectionPolicy.js +190 -0
  345. package/dist/state/retrievalAuthority.js +156 -0
  346. package/dist/state/safeProjectFile.js +155 -0
  347. package/dist/state/startupAnalysis/benchmark.js +92 -27
  348. package/dist/state/startupAnalysis/contract.js +48 -10
  349. package/dist/state/startupAnalysis/helpers.js +27 -73
  350. package/dist/state/startupAnalysis/index.js +0 -1
  351. package/dist/state/startupAnalysis/metrics.js +25 -19
  352. package/dist/state/startupAnalysis/records.js +13 -10
  353. package/dist/state/startupAnalysis/report.js +26 -38
  354. package/dist/state/startupAnalysis/threshold.js +19 -7
  355. package/dist/state/startupAnalysis.js +0 -1
  356. package/dist/state/startupProjection.js +499 -0
  357. package/dist/state/stateMode.js +222 -0
  358. package/dist/state/stateStorageAuthority.js +47 -0
  359. package/dist/state/summaryEntityRead.js +25 -0
  360. package/dist/state/summaryMigrationProvenance.js +66 -0
  361. package/dist/state/summarySourceRowAuthority.js +36 -0
  362. package/dist/state/todoActivationSafety.js +58 -0
  363. package/dist/state/todoDocsEntities.js +1124 -0
  364. package/dist/state/todoDocsEntityValidation.js +158 -0
  365. package/dist/state/todoMarkdownProjection.js +51 -0
  366. package/dist/state/todoReconciliationActivation.js +182 -0
  367. package/dist/state/todoReconciliationInspection.js +171 -0
  368. package/dist/state/todoReconciliationRepair.js +318 -0
  369. package/dist/state/todoReconciliationTransaction.js +595 -0
  370. package/dist/state/write/assign.js +20 -0
  371. package/dist/state/write/candidateMutation.js +269 -0
  372. package/dist/state/write/errors.js +11 -0
  373. package/dist/state/write/experimentPublication.js +192 -0
  374. package/dist/state/write/explain.js +377 -0
  375. package/dist/state/write/fields.js +61 -0
  376. package/dist/state/write/glossaryPublication.js +263 -0
  377. package/dist/state/write/grammar.js +285 -0
  378. package/dist/state/write/helpers.js +29 -0
  379. package/dist/state/write/index.js +12 -0
  380. package/dist/state/write/input.js +391 -0
  381. package/dist/state/write/lock.js +837 -0
  382. package/dist/state/write/mutation.js +234 -0
  383. package/dist/state/write/operations.js +170 -0
  384. package/dist/state/write/planEvaluation.js +128 -0
  385. package/dist/state/write/planPublication.js +179 -0
  386. package/dist/state/write/runtimeOperations.js +146 -0
  387. package/dist/state/write/serialize.js +1 -0
  388. package/dist/state/write/transaction.js +57 -0
  389. package/dist/state/write/validate.js +7 -0
  390. package/dist/upgrade/appContentRefresh.js +383 -0
  391. package/dist/upgrade/appModel.js +8 -7
  392. package/dist/upgrade/atomicWriter.js +1 -0
  393. package/dist/upgrade/bundleEvidence.js +33 -0
  394. package/dist/upgrade/channels.js +12 -8
  395. package/dist/upgrade/compatibility.js +56 -21
  396. package/dist/upgrade/doctor.js +165 -199
  397. package/dist/upgrade/doctorClassifier.js +187 -0
  398. package/dist/upgrade/installedHooksRetirement.js +196 -0
  399. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  400. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  401. package/dist/upgrade/migrateArtifactsV2ToV3.js +375 -79
  402. package/dist/upgrade/migrationPublication.js +122 -0
  403. package/dist/upgrade/nextMajorDoctor.js +29 -10
  404. package/dist/upgrade/npxPlatformStatus.js +22 -0
  405. package/dist/upgrade/projectIntegration.js +145 -189
  406. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  407. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  408. package/dist/upgrade/runtimeMigration.js +272 -373
  409. package/dist/upgrade/upgradeCommands.js +14 -1
  410. package/dist/upgrade/upgradeLock.js +85 -0
  411. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  412. package/dist/upgrade/v3CapabilitySurface.js +2 -3
  413. package/dist/upgrade/versionResolution.js +2 -3
  414. package/dist/validate/activationArtifactEvidence.js +852 -0
  415. package/dist/validate/activationArtifactEvidenceTypes.js +12 -0
  416. package/dist/validate/activationConjunction.js +816 -0
  417. package/dist/validate/activationEvidenceManifest.js +531 -0
  418. package/dist/validate/activationPackageSemantics.js +29 -0
  419. package/dist/validate/appHomeContract.js +2 -8
  420. package/dist/validate/bootstrapAuthority.js +44 -0
  421. package/dist/validate/capability.js +133 -12
  422. package/dist/validate/crossCapability.js +15 -10
  423. package/dist/validate/retainedReferenceAuthority.js +879 -0
  424. package/dist/validate/selfAudit.js +39 -45
  425. package/dist/validate/v1LegacyCruft.js +131 -0
  426. package/dist/validate/vocabularyAuthority.js +18 -13
  427. package/package.json +60 -29
  428. package/bundle/references/adapters/cursor.md +0 -213
  429. package/bundle/references/adapters/opencode.md +0 -530
  430. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  431. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  432. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  433. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  434. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  435. package/bundle/references/analysis/benchmark.md +0 -267
  436. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  437. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  438. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -369
  439. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -250
  440. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  441. package/bundle/references/cli/coexistence-probe.yaml +0 -9
  442. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  443. package/bundle/references/cli/single-name-protocol.yaml +0 -42
  444. package/bundle/references/cli/upgrade-repair-wording.md +0 -31
  445. package/bundle/references/cli/v3-handoff-manifest.schema.yaml +0 -98
  446. package/bundle/references/meta/documentation-inventory.md +0 -49
  447. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  448. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  449. package/bundle/skills/agentera/agents/hej.toml +0 -6
  450. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  451. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  452. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  453. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  454. package/bundle/skills/agentera/agents/planera.toml +0 -6
  455. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  456. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  457. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  458. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  459. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  460. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  461. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  462. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  463. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  464. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  465. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  466. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  467. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  468. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  471. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  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/schemas/artifacts.yaml +0 -18
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  478. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  479. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  481. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  482. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  483. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  484. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  485. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  486. package/bundle/skills/agentera/references/contract.md +0 -1039
  487. package/dist/analytics/extractCorpus/cli.js.map +0 -1
  488. package/dist/analytics/extractCorpus/copilotSessions.js.map +0 -1
  489. package/dist/analytics/extractCorpus/core.js.map +0 -1
  490. package/dist/analytics/extractCorpus/corpus.js.map +0 -1
  491. package/dist/analytics/extractCorpus/cursorSessions.js.map +0 -1
  492. package/dist/analytics/extractCorpus/filesystemSources.js.map +0 -1
  493. package/dist/analytics/extractCorpus/index.js.map +0 -1
  494. package/dist/analytics/extractCorpus/jsonlSessions.js.map +0 -1
  495. package/dist/analytics/extractCorpus/sqliteSessions.js.map +0 -1
  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/capabilities/dokumentera/instructions.js +0 -6
  500. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  501. package/dist/capabilities/hej/instructions.js +0 -6
  502. package/dist/capabilities/hej/instructions.js.map +0 -1
  503. package/dist/capabilities/index.js.map +0 -1
  504. package/dist/capabilities/inspektera/instructions.js +0 -6
  505. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  506. package/dist/capabilities/inspirera/instructions.js +0 -6
  507. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  508. package/dist/capabilities/optimera/instructions.js +0 -6
  509. package/dist/capabilities/optimera/instructions.js.map +0 -1
  510. package/dist/capabilities/orkestrera/instructions.js +0 -6
  511. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  512. package/dist/capabilities/planera/instructions.js +0 -6
  513. package/dist/capabilities/planera/instructions.js.map +0 -1
  514. package/dist/capabilities/profilera/instructions.js +0 -6
  515. package/dist/capabilities/profilera/instructions.js.map +0 -1
  516. package/dist/capabilities/realisera/instructions.js +0 -6
  517. package/dist/capabilities/realisera/instructions.js.map +0 -1
  518. package/dist/capabilities/resonera/instructions.js +0 -6
  519. package/dist/capabilities/resonera/instructions.js.map +0 -1
  520. package/dist/capabilities/visionera/instructions.js +0 -6
  521. package/dist/capabilities/visionera/instructions.js.map +0 -1
  522. package/dist/capabilities/visualisera/instructions.js +0 -6
  523. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  524. package/dist/cli/appContext.js.map +0 -1
  525. package/dist/cli/argvalidate.js.map +0 -1
  526. package/dist/cli/capabilityContext/benchmark.js.map +0 -1
  527. package/dist/cli/capabilityContext/bespoke.js.map +0 -1
  528. package/dist/cli/capabilityContext/closeout.js.map +0 -1
  529. package/dist/cli/capabilityContext/contract.js.map +0 -1
  530. package/dist/cli/capabilityContext/evidence.js.map +0 -1
  531. package/dist/cli/capabilityContext/index.js.map +0 -1
  532. package/dist/cli/capabilityContext/orchestration.js.map +0 -1
  533. package/dist/cli/capabilityContext/planState.js.map +0 -1
  534. package/dist/cli/capabilityContext/progress.js.map +0 -1
  535. package/dist/cli/capabilityContext/realisera.js +0 -174
  536. package/dist/cli/capabilityContext/realisera.js.map +0 -1
  537. package/dist/cli/capabilityContext/shared.js.map +0 -1
  538. package/dist/cli/capabilityContext/slim.js.map +0 -1
  539. package/dist/cli/capabilityContext/startup.js.map +0 -1
  540. package/dist/cli/capabilityContext/types.js.map +0 -1
  541. package/dist/cli/capabilityContext.js.map +0 -1
  542. package/dist/cli/commands/backfill.js +0 -84
  543. package/dist/cli/commands/backfill.js.map +0 -1
  544. package/dist/cli/commands/capability.js.map +0 -1
  545. package/dist/cli/commands/compact.js.map +0 -1
  546. package/dist/cli/commands/doctor.js.map +0 -1
  547. package/dist/cli/commands/lint.js.map +0 -1
  548. package/dist/cli/commands/prime.js.map +0 -1
  549. package/dist/cli/commands/query.js.map +0 -1
  550. package/dist/cli/commands/report.js.map +0 -1
  551. package/dist/cli/commands/schema.js.map +0 -1
  552. package/dist/cli/commands/state/decisions.js.map +0 -1
  553. package/dist/cli/commands/state/docs.js.map +0 -1
  554. package/dist/cli/commands/state/experiments.js.map +0 -1
  555. package/dist/cli/commands/state/health.js.map +0 -1
  556. package/dist/cli/commands/state/index.js.map +0 -1
  557. package/dist/cli/commands/state/objective.js.map +0 -1
  558. package/dist/cli/commands/state/plan.js.map +0 -1
  559. package/dist/cli/commands/state/progress.js.map +0 -1
  560. package/dist/cli/commands/state/shared.js.map +0 -1
  561. package/dist/cli/commands/state/todo.js.map +0 -1
  562. package/dist/cli/commands/state.js +0 -1023
  563. package/dist/cli/commands/state.js.map +0 -1
  564. package/dist/cli/commands/upgrade.js.map +0 -1
  565. package/dist/cli/commands/validate.js.map +0 -1
  566. package/dist/cli/commands/verify.js.map +0 -1
  567. package/dist/cli/dispatch/check.js.map +0 -1
  568. package/dist/cli/dispatch/index.js.map +0 -1
  569. package/dist/cli/dispatch/lifecycle.js.map +0 -1
  570. package/dist/cli/dispatch/prime.js.map +0 -1
  571. package/dist/cli/dispatch/shared.js.map +0 -1
  572. package/dist/cli/dispatch/state.js.map +0 -1
  573. package/dist/cli/dispatch.js.map +0 -1
  574. package/dist/cli/errors.js.map +0 -1
  575. package/dist/cli/help.js.map +0 -1
  576. package/dist/cli/orientation.js.map +0 -1
  577. package/dist/cli/prime-blob.js.map +0 -1
  578. package/dist/cli/stateQuery.js.map +0 -1
  579. package/dist/cli/structured.js.map +0 -1
  580. package/dist/cli/todoMarkdown.js.map +0 -1
  581. package/dist/core/difflib.js.map +0 -1
  582. package/dist/core/git.js +0 -43
  583. package/dist/core/git.js.map +0 -1
  584. package/dist/core/paths.js.map +0 -1
  585. package/dist/core/pyjson.js.map +0 -1
  586. package/dist/core/sourceRoot.js.map +0 -1
  587. package/dist/core/toml.js.map +0 -1
  588. package/dist/core/yaml.js.map +0 -1
  589. package/dist/eval/evalSkills.js.map +0 -1
  590. package/dist/eval/semanticEval.js.map +0 -1
  591. package/dist/eval/semanticFixtures.js.map +0 -1
  592. package/dist/hooks/common.js.map +0 -1
  593. package/dist/hooks/compaction/apply.js.map +0 -1
  594. package/dist/hooks/compaction/dryRun.js.map +0 -1
  595. package/dist/hooks/compaction/index.js.map +0 -1
  596. package/dist/hooks/compaction/parse.js.map +0 -1
  597. package/dist/hooks/compaction/retention.js.map +0 -1
  598. package/dist/hooks/compaction/status.js.map +0 -1
  599. package/dist/hooks/compaction/types.js.map +0 -1
  600. package/dist/hooks/compaction.js +0 -935
  601. package/dist/hooks/compaction.js.map +0 -1
  602. package/dist/hooks/cursorPreToolUse.js +0 -19
  603. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  604. package/dist/hooks/cursorSessionStart.js +0 -71
  605. package/dist/hooks/cursorSessionStart.js.map +0 -1
  606. package/dist/hooks/sessionStart.js +0 -209
  607. package/dist/hooks/sessionStart.js.map +0 -1
  608. package/dist/hooks/sessionStop.js +0 -203
  609. package/dist/hooks/sessionStop.js.map +0 -1
  610. package/dist/hooks/validateArtifact/agentFacing.js.map +0 -1
  611. package/dist/hooks/validateArtifact/index.js.map +0 -1
  612. package/dist/hooks/validateArtifact/markdown.js.map +0 -1
  613. package/dist/hooks/validateArtifact/runtime.js +0 -83
  614. package/dist/hooks/validateArtifact/runtime.js.map +0 -1
  615. package/dist/hooks/validateArtifact/schema.js.map +0 -1
  616. package/dist/hooks/validateArtifact/traversal.js.map +0 -1
  617. package/dist/hooks/validateArtifact/violations.js.map +0 -1
  618. package/dist/hooks/validateArtifact.js +0 -924
  619. package/dist/hooks/validateArtifact.js.map +0 -1
  620. package/dist/migrate/v2HandoffManifest.js.map +0 -1
  621. package/dist/registries/artifactProtocolIds.js.map +0 -1
  622. package/dist/registries/artifactRegistry.js.map +0 -1
  623. package/dist/registries/capabilityContract.js.map +0 -1
  624. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  625. package/dist/registries/packageRegistry.js.map +0 -1
  626. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  627. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  628. package/dist/release/releaseMetadata.js.map +0 -1
  629. package/dist/setup/codex/agents.js +0 -96
  630. package/dist/setup/codex/agents.js.map +0 -1
  631. package/dist/setup/codex/cli.js +0 -161
  632. package/dist/setup/codex/cli.js.map +0 -1
  633. package/dist/setup/codex/configToml.js +0 -644
  634. package/dist/setup/codex/configToml.js.map +0 -1
  635. package/dist/setup/codex/constants.js +0 -29
  636. package/dist/setup/codex/constants.js.map +0 -1
  637. package/dist/setup/codex/installRoot.js +0 -64
  638. package/dist/setup/codex/installRoot.js.map +0 -1
  639. package/dist/setup/codex/state.js +0 -270
  640. package/dist/setup/codex/state.js.map +0 -1
  641. package/dist/setup/codex.js +0 -12
  642. package/dist/setup/codex.js.map +0 -1
  643. package/dist/setup/copilot.js +0 -227
  644. package/dist/setup/copilot.js.map +0 -1
  645. package/dist/setup/cursor.js +0 -127
  646. package/dist/setup/cursor.js.map +0 -1
  647. package/dist/setup/doctor/core.js +0 -300
  648. package/dist/setup/doctor/core.js.map +0 -1
  649. package/dist/setup/doctor/diagnostics.js +0 -247
  650. package/dist/setup/doctor/diagnostics.js.map +0 -1
  651. package/dist/setup/doctor/opencode.js +0 -281
  652. package/dist/setup/doctor/opencode.js.map +0 -1
  653. package/dist/setup/doctor/report.js +0 -474
  654. package/dist/setup/doctor/report.js.map +0 -1
  655. package/dist/setup/doctor.js +0 -10
  656. package/dist/setup/doctor.js.map +0 -1
  657. package/dist/setup/opencode.js.map +0 -1
  658. package/dist/setup/smokeChecks.js.map +0 -1
  659. package/dist/state/installRoot.js.map +0 -1
  660. package/dist/state/progressCommit.js +0 -289
  661. package/dist/state/progressCommit.js.map +0 -1
  662. package/dist/state/startupAnalysis/benchmark.js.map +0 -1
  663. package/dist/state/startupAnalysis/contract.js.map +0 -1
  664. package/dist/state/startupAnalysis/helpers.js.map +0 -1
  665. package/dist/state/startupAnalysis/index.js.map +0 -1
  666. package/dist/state/startupAnalysis/metrics.js.map +0 -1
  667. package/dist/state/startupAnalysis/records.js.map +0 -1
  668. package/dist/state/startupAnalysis/report.js.map +0 -1
  669. package/dist/state/startupAnalysis/threshold.js.map +0 -1
  670. package/dist/state/startupAnalysis.js.map +0 -1
  671. package/dist/upgrade/appModel.js.map +0 -1
  672. package/dist/upgrade/channels.js.map +0 -1
  673. package/dist/upgrade/coexistenceProbe.js +0 -83
  674. package/dist/upgrade/coexistenceProbe.js.map +0 -1
  675. package/dist/upgrade/compatibility.js.map +0 -1
  676. package/dist/upgrade/doctor.js.map +0 -1
  677. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  678. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  679. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  680. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  681. package/dist/upgrade/projectIntegration.js.map +0 -1
  682. package/dist/upgrade/runtimeMigration.js.map +0 -1
  683. package/dist/upgrade/upgradeCommands.js.map +0 -1
  684. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  685. package/dist/upgrade/v3CapabilitySurface.js.map +0 -1
  686. package/dist/upgrade/versionResolution.js.map +0 -1
  687. package/dist/validate/appHomeContract.js.map +0 -1
  688. package/dist/validate/capability.js.map +0 -1
  689. package/dist/validate/crossCapability.js.map +0 -1
  690. package/dist/validate/lifecycleAdapters.js +0 -772
  691. package/dist/validate/lifecycleAdapters.js.map +0 -1
  692. package/dist/validate/selfAudit.js.map +0 -1
  693. package/dist/validate/vocabularyAuthority.js.map +0 -1
  694. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  695. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  696. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -1,924 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { loadYamlMapping, parseYaml } from "../core/yaml.js";
4
- import { resolvePath } from "../core/paths.js";
5
- import { resolveSourceRoot } from "../core/sourceRoot.js";
6
- import { ARTIFACT_PROTOCOL_PATHS, HUMAN_FACING_ARTIFACT_IDS, normalizeArtifactProtocolId, } from "../registries/artifactProtocolIds.js";
7
- import { DEFAULT_ARTIFACT_PATHS } from "./common.js";
8
- import { COMPACTABLE_YAML_ARTIFACTS, compactFile, compactYamlFile } from "./compaction.js";
9
- function schemasDirDefault() {
10
- return path.join(resolveSourceRoot(), "skills", "agentera", "schemas", "artifacts");
11
- }
12
- const AGENT_YAML_RE = /\.agentera\/([a-z_]+)\.yaml$/;
13
- const AGENT_FACING_ARTIFACT_IDS = new Set(Object.keys(ARTIFACT_PROTOCOL_PATHS).filter((id) => !HUMAN_FACING_ARTIFACT_IDS.has(id)));
14
- const SKIP_META = new Set(["meta", "GROUP_PREFIXES", "BUDGET", "COMPACTION", "VALIDATION", "CONVENTION"]);
15
- const LIST_INDICATORS = new Set(["number", "entry", "summary"]);
16
- const SEQUENCE_KEYS_BY_ARTIFACT = {
17
- decisions: { DECISION: "decisions", ARCHIVE: "archive" },
18
- docs: { MAPPING: "mapping", INDEX: "index", AUDIT_LOG: "audit_log" },
19
- experiments: { EXPERIMENT: "experiments", ARCHIVE: "archive" },
20
- plan: { TASK: "tasks" },
21
- progress: { CYCLE: "cycles", ARCHIVE: "archive" },
22
- session: { BOOKMARK: "bookmarks" },
23
- vision: { PERSONA: "personas", PRINCIPLE: "principles" },
24
- };
25
- const NESTED_SEQUENCE_KEYS = [[["DECISION", "ALTERNATIVE"], "alternatives"]];
26
- const SEQUENCE_ORDER_BY_ARTIFACT = { "progress\0cycles": "descending" };
27
- function isMapping(v) {
28
- return v !== null && typeof v === "object" && !Array.isArray(v);
29
- }
30
- function pyTypeName(v) {
31
- if (v === null || v === undefined)
32
- return "NoneType";
33
- if (typeof v === "boolean")
34
- return "bool";
35
- if (typeof v === "number")
36
- return Number.isInteger(v) ? "int" : "float";
37
- if (typeof v === "string")
38
- return "str";
39
- if (Array.isArray(v))
40
- return "list";
41
- if (typeof v === "object")
42
- return "dict";
43
- return typeof v;
44
- }
45
- function wordCount(text) {
46
- return (text.match(/\S+/g) ?? []).length;
47
- }
48
- // ── Runtime event parsing ──────────────────────────────────────────
49
- export class ArtifactWrite {
50
- file_path;
51
- content;
52
- constructor(filePath, content = null) {
53
- this.file_path = filePath;
54
- this.content = content;
55
- }
56
- }
57
- export class RuntimeEventParser {
58
- parseClaude(data) {
59
- const ti = data.tool_input;
60
- if (!isMapping(ti))
61
- return null;
62
- const fp = ti.file_path;
63
- if (fp)
64
- return new ArtifactWrite(String(fp), ti.content ?? null);
65
- return null;
66
- }
67
- parseOpencode(data) {
68
- const inp = data.input;
69
- if (!isMapping(inp))
70
- return null;
71
- const fp = inp.path;
72
- if (fp)
73
- return new ArtifactWrite(String(fp), inp.content ?? null);
74
- return null;
75
- }
76
- parseCodex(data) {
77
- const ti = data.tool_input;
78
- if (!isMapping(ti))
79
- return null;
80
- const fp = ti.path;
81
- const patchBody = ti.patch || ti.command || "";
82
- if (fp)
83
- return new ArtifactWrite(String(fp));
84
- if (typeof patchBody === "string") {
85
- const headers = [...patchBody.matchAll(/^\*\*\*\s+(?:Add File|Update File):\s+(.+?)\s*$/gm)];
86
- if (headers.length > 0)
87
- return new ArtifactWrite(headers[0][1]);
88
- }
89
- return null;
90
- }
91
- parseCopilot(data) {
92
- const inp = data.input;
93
- if (!isMapping(inp))
94
- return null;
95
- const fp = inp.filePath || inp.file_path;
96
- if (fp)
97
- return new ArtifactWrite(String(fp), inp.content ?? null);
98
- return null;
99
- }
100
- parse(data) {
101
- const tn = data.tool_name ?? "";
102
- if (tn === "apply_patch") {
103
- const candidate = this.parseCodex(data);
104
- if (candidate)
105
- return candidate;
106
- }
107
- if (tn === "Edit" || tn === "Write" || (isMapping(data.tool_input) && "file_path" in data.tool_input)) {
108
- const candidate = this.parseClaude(data);
109
- if (candidate)
110
- return candidate;
111
- }
112
- if (isMapping(data.input)) {
113
- const inp = data.input;
114
- if ("filePath" in inp || "file_path" in inp)
115
- return this.parseCopilot(data);
116
- if ("path" in inp)
117
- return this.parseOpencode(data);
118
- }
119
- return null;
120
- }
121
- }
122
- // ── Validation helpers ─────────────────────────────────────────────
123
- function collectSingletonGroups(schema) {
124
- const result = [];
125
- for (const [gk, gv] of Object.entries(schema)) {
126
- if (SKIP_META.has(gk) || !isMapping(gv))
127
- continue;
128
- let isListOrSub = false;
129
- for (const e of Object.values(gv)) {
130
- if (isMapping(e) && (LIST_INDICATORS.has(e.field) || e.parent)) {
131
- isListOrSub = true;
132
- break;
133
- }
134
- }
135
- if (isListOrSub)
136
- continue;
137
- const fields = [];
138
- for (const e of Object.values(gv)) {
139
- if (isMapping(e) && e.required && "field" in e)
140
- fields.push(e.field);
141
- }
142
- if (fields.length > 0)
143
- result.push([gk, gk.toLowerCase(), fields]);
144
- }
145
- return result;
146
- }
147
- function isEmptyRequired(value) {
148
- if (value === null || value === undefined)
149
- return true;
150
- if (typeof value === "string")
151
- return !value.trim();
152
- if (Array.isArray(value))
153
- return value.length === 0;
154
- if (typeof value === "object")
155
- return Object.keys(value).length === 0;
156
- return false;
157
- }
158
- function* iterGroupEntries(schema, group) {
159
- const gv = schema[group];
160
- if (!isMapping(gv))
161
- return;
162
- for (const entry of Object.values(gv)) {
163
- if (isMapping(entry) && "field" in entry)
164
- yield entry;
165
- }
166
- }
167
- function validateField(violations, name, scope, field, p) {
168
- const fullPath = p ? `${p}.${field}` : field;
169
- if (!(field in scope)) {
170
- violations.push(`${name}: missing required field '${fullPath}'`);
171
- }
172
- else if (isEmptyRequired(scope[field])) {
173
- violations.push(`${name}: empty required field '${fullPath}'`);
174
- }
175
- }
176
- function allowedValues(entry) {
177
- for (const rule of entry.validation ?? []) {
178
- if (typeof rule === "string" && rule.startsWith("Must be one of: ")) {
179
- return rule.slice("Must be one of: ".length).split(",").map((v) => v.trim());
180
- }
181
- }
182
- return [];
183
- }
184
- function validateAllowedValue(violations, name, scope, entry, p) {
185
- const field = entry.field;
186
- const allowed = allowedValues(entry);
187
- if (!field || allowed.length === 0 || !(field in scope) || isEmptyRequired(scope[field]))
188
- return;
189
- const value = scope[field];
190
- if (typeof value === "string" && !allowed.includes(value)) {
191
- violations.push(`${name}: invalid value '${value}' for '${p}.${field}' (expected one of: ${allowed.join(", ")})`);
192
- }
193
- }
194
- function validateFieldType(violations, name, scope, entry, p) {
195
- const field = entry.field;
196
- if (!field || !(field in scope))
197
- return true;
198
- const value = scope[field];
199
- const expectedType = entry.type;
200
- if (!expectedType || isEmptyRequired(value))
201
- return true;
202
- const fullPath = p ? `${p}.${field}` : field;
203
- let isValid = true;
204
- if (expectedType === "integer") {
205
- if (typeof value === "boolean" || !(typeof value === "number" && Number.isInteger(value))) {
206
- violations.push(`${name}: '${fullPath}' must be an integer, got ${pyTypeName(value)}`);
207
- isValid = false;
208
- }
209
- }
210
- else if (expectedType === "string") {
211
- if (typeof value !== "string") {
212
- violations.push(`${name}: '${fullPath}' must be a string, got ${pyTypeName(value)}`);
213
- isValid = false;
214
- }
215
- }
216
- else if (expectedType === "map") {
217
- if (!isMapping(value)) {
218
- violations.push(`${name}: '${fullPath}' must be a mapping, got ${pyTypeName(value)}`);
219
- isValid = false;
220
- }
221
- }
222
- else if (expectedType === "list[string]") {
223
- if (!Array.isArray(value) || !value.every((x) => typeof x === "string")) {
224
- violations.push(`${name}: '${fullPath}' must be a list of strings`);
225
- isValid = false;
226
- }
227
- }
228
- else if (expectedType === "list[map]") {
229
- if (!Array.isArray(value) || !value.every((x) => isMapping(x))) {
230
- violations.push(`${name}: '${fullPath}' must be a list of mappings`);
231
- isValid = false;
232
- }
233
- }
234
- return isValid;
235
- }
236
- function validateFieldConstraints(violations, name, scope, entry, p) {
237
- const field = entry.field;
238
- if (!field || !(field in scope))
239
- return;
240
- const value = scope[field];
241
- for (const rule of entry.validation ?? []) {
242
- if (typeof rule !== "string")
243
- continue;
244
- if (rule === "Must be a positive integer") {
245
- if (typeof value === "boolean" || !(typeof value === "number" && Number.isInteger(value)) || value <= 0) {
246
- const fullPath = p ? `${p}.${field}` : field;
247
- violations.push(`${name}: '${fullPath}' must be a positive integer`);
248
- }
249
- }
250
- }
251
- }
252
- function validateRequiredFields(violations, name, schema, group, scope, p) {
253
- for (const entry of iterGroupEntries(schema, group)) {
254
- const field = entry.field;
255
- if (entry.parent || field === "entry")
256
- continue;
257
- if (entry.required)
258
- validateField(violations, name, scope, field, p);
259
- if (field in scope && !isEmptyRequired(scope[field])) {
260
- if (validateFieldType(violations, name, scope, entry, p)) {
261
- validateAllowedValue(violations, name, scope, entry, p);
262
- validateFieldConstraints(violations, name, scope, entry, p);
263
- }
264
- }
265
- const value = scope[field];
266
- if (isMapping(value)) {
267
- for (const child of entry.children ?? []) {
268
- if (isMapping(child) && child.field) {
269
- const childField = child.field;
270
- const childPath = p ? `${p}.${field}` : field;
271
- if (child.required)
272
- validateField(violations, name, value, childField, childPath);
273
- if (childField in value && !isEmptyRequired(value[childField])) {
274
- if (validateFieldType(violations, name, value, child, childPath)) {
275
- validateAllowedValue(violations, name, value, child, childPath);
276
- validateFieldConstraints(violations, name, value, child, childPath);
277
- }
278
- }
279
- }
280
- }
281
- }
282
- }
283
- }
284
- function validateSingletonGroup(violations, name, schema, group, scope, p) {
285
- for (const entry of iterGroupEntries(schema, group)) {
286
- const field = entry.field;
287
- if (entry.parent || field === "entry")
288
- continue;
289
- if (entry.required)
290
- validateField(violations, name, scope, field, p);
291
- if (field in scope && !isEmptyRequired(scope[field])) {
292
- if (validateFieldType(violations, name, scope, entry, p)) {
293
- validateAllowedValue(violations, name, scope, entry, p);
294
- validateFieldConstraints(violations, name, scope, entry, p);
295
- }
296
- }
297
- }
298
- }
299
- function schemaFieldNames(schema, group) {
300
- const out = new Set();
301
- for (const entry of iterGroupEntries(schema, group)) {
302
- if (entry.field && !entry.parent && entry.field !== "entry")
303
- out.add(entry.field);
304
- }
305
- return out;
306
- }
307
- function validateUnknownFields(violations, name, scope, allowed, p) {
308
- for (const field of Object.keys(scope)) {
309
- if (!allowed.has(field)) {
310
- const fullPath = p ? `${p}.${field}` : field;
311
- violations.push(`${name}: unsupported field '${fullPath}'`);
312
- }
313
- }
314
- }
315
- function validatePlanKnownFields(data, schema, violations) {
316
- const groupedScopes = { header: "HEADER", scope: "SCOPE" };
317
- const sequenceKeys = new Set(Object.values(SEQUENCE_KEYS_BY_ARTIFACT.plan ?? {}));
318
- const allowedTopLevel = new Set([
319
- ...schemaFieldNames(schema, "PLAN"),
320
- ...Object.keys(groupedScopes),
321
- ...sequenceKeys,
322
- ]);
323
- validateUnknownFields(violations, "plan", data, allowedTopLevel, "");
324
- for (const [key, group] of Object.entries(groupedScopes)) {
325
- const scope = data[key];
326
- if (isMapping(scope)) {
327
- validateUnknownFields(violations, "plan", scope, schemaFieldNames(schema, group), key);
328
- }
329
- }
330
- }
331
- function validateFullPlanContract(data, violations) {
332
- const header = isMapping(data.header) ? data.header : {};
333
- if (String(header.level ?? "").toLowerCase() !== "full")
334
- return;
335
- for (const field of ["reviewed", "critic_issues"]) {
336
- validateField(violations, "plan", header, field, "header");
337
- }
338
- validateField(violations, "plan", data, "design", "");
339
- const criticIssues = header.critic_issues;
340
- if (!isEmptyRequired(criticIssues)) {
341
- const match = /^\s*(\d+)\s+found,\s*(\d+)\s+addressed,\s*(\d+)\s+dismissed\s*$/.exec(String(criticIssues));
342
- if (!match) {
343
- violations.push("plan: header.critic_issues must match 'N found, M addressed, K dismissed'");
344
- }
345
- else {
346
- const [found, addressed, dismissed] = [match[1], match[2], match[3]].map((v) => parseInt(v, 10));
347
- if (found < 1)
348
- violations.push("plan: header.critic_issues must record at least 1 found issue");
349
- if (addressed + dismissed !== found) {
350
- violations.push("plan: header.critic_issues counts must satisfy addressed + dismissed == found");
351
- }
352
- }
353
- }
354
- const tasks = data.tasks;
355
- if (!Array.isArray(tasks))
356
- return;
357
- tasks.forEach((task, index) => {
358
- if (isMapping(task))
359
- validateField(violations, "plan", task, "acceptance", `tasks[${index}]`);
360
- });
361
- }
362
- function entryMinCount(schema, group) {
363
- for (const entry of iterGroupEntries(schema, group)) {
364
- if (entry.field === "entry" && entry.required)
365
- return entry.min_count || 1;
366
- }
367
- return null;
368
- }
369
- function parentRequirements(schema, parentGroup) {
370
- const requirements = {};
371
- const prefix = `${parentGroup}.`;
372
- for (const group of Object.keys(schema)) {
373
- if (SKIP_META.has(group))
374
- continue;
375
- for (const entry of iterGroupEntries(schema, group)) {
376
- const parent = entry.parent;
377
- if (typeof parent === "string" &&
378
- parent.startsWith(prefix) &&
379
- parent !== `${group}.entry` &&
380
- entry.required &&
381
- entry.field) {
382
- const parentField = parent.slice(prefix.length);
383
- (requirements[parentField] ??= []).push(entry.field);
384
- }
385
- }
386
- }
387
- return requirements;
388
- }
389
- function entryRequirements(schema, group) {
390
- const parent = `${group}.entry`;
391
- const out = [];
392
- for (const entry of iterGroupEntries(schema, group)) {
393
- if (entry.parent === parent && entry.required && entry.field)
394
- out.push(entry.field);
395
- }
396
- return out;
397
- }
398
- function validateSequences(data, schema, name, violations) {
399
- for (const [group, key] of Object.entries(SEQUENCE_KEYS_BY_ARTIFACT[name] ?? {})) {
400
- const seq = data[key];
401
- if (seq === null || seq === undefined)
402
- continue;
403
- if (!Array.isArray(seq)) {
404
- violations.push(`${name}: '${key}' must be a list`);
405
- continue;
406
- }
407
- if (seq.length === 0) {
408
- violations.push(`${name}: '${key}' requires at least 1 entry`);
409
- continue;
410
- }
411
- const childRequirements = parentRequirements(schema, group);
412
- seq.forEach((item, index) => {
413
- const p = `${key}[${index}]`;
414
- if (!isMapping(item)) {
415
- violations.push(`${name}: '${p}' must be a mapping`);
416
- return;
417
- }
418
- validateRequiredFields(violations, name, schema, group, item, p);
419
- for (const [parentField, childFields] of Object.entries(childRequirements)) {
420
- const childScope = item[parentField];
421
- if (!isMapping(childScope))
422
- continue;
423
- for (const childField of childFields) {
424
- validateField(violations, name, childScope, childField, `${p}.${parentField}`);
425
- }
426
- }
427
- for (const [[parentGroup, childGroup], childKey] of NESTED_SEQUENCE_KEYS) {
428
- if (parentGroup !== group)
429
- continue;
430
- const childSeq = item[childKey];
431
- const minCount = entryMinCount(schema, childGroup);
432
- if (minCount && (!Array.isArray(childSeq) || childSeq.length < minCount)) {
433
- violations.push(`${name}: '${p}.${childKey}' requires at least ${minCount} entry`);
434
- continue;
435
- }
436
- if (!Array.isArray(childSeq))
437
- continue;
438
- const required = entryRequirements(schema, childGroup);
439
- childSeq.forEach((child, childIndex) => {
440
- const childPath = `${p}.${childKey}[${childIndex}]`;
441
- if (!isMapping(child)) {
442
- violations.push(`${name}: '${childPath}' must be a mapping`);
443
- return;
444
- }
445
- for (const field of required)
446
- validateField(violations, name, child, field, childPath);
447
- });
448
- }
449
- });
450
- }
451
- }
452
- function validateDecisionAlternatives(data, name) {
453
- const violations = [];
454
- (data.decisions ?? []).forEach((decision, index) => {
455
- if (!isMapping(decision))
456
- return;
457
- const alternatives = decision.alternatives ?? [];
458
- if (!Array.isArray(alternatives))
459
- return;
460
- const chosen = alternatives.filter((alt) => isMapping(alt) && alt.status === "chosen");
461
- if (chosen.length !== 1) {
462
- violations.push(`${name}: 'decisions[${index}].alternatives' must have exactly one chosen entry`);
463
- }
464
- });
465
- return violations;
466
- }
467
- function validateDecisionSatisfaction(data, name) {
468
- const violations = [];
469
- const allowedStates = new Set(["open", "provisionally_satisfied", "user_confirmed_satisfied"]);
470
- const entries = [
471
- ...(data.decisions ?? []).map((d, i) => [`decisions[${i}]`, d]),
472
- ...(data.archive ?? []).map((d, i) => [`archive[${i}]`, d]),
473
- ];
474
- for (const [entryPath, decision] of entries) {
475
- if (!isMapping(decision) || !("satisfaction" in decision))
476
- continue;
477
- const p = `${entryPath}.satisfaction`;
478
- const satisfaction = decision.satisfaction;
479
- if (!isMapping(satisfaction)) {
480
- violations.push(`${name}: '${p}' must be a mapping`);
481
- continue;
482
- }
483
- validateUnknownFields(violations, name, satisfaction, new Set(["state", "evidence", "user_confirmation"]), p);
484
- const state = satisfaction.state;
485
- if (typeof state !== "string" || !state.trim()) {
486
- violations.push(`${name}: missing required field '${p}.state'`);
487
- continue;
488
- }
489
- if (!allowedStates.has(state)) {
490
- violations.push(`${name}: invalid value '${state}' for '${p}.state' (expected one of: open, provisionally_satisfied, user_confirmed_satisfied)`);
491
- continue;
492
- }
493
- if (state === "provisionally_satisfied" && isEmptyRequired(satisfaction.evidence)) {
494
- violations.push(`${name}: '${p}.evidence' is required for provisionally_satisfied`);
495
- }
496
- if (state === "user_confirmed_satisfied") {
497
- const confirmation = satisfaction.user_confirmation;
498
- if (confirmation === null || confirmation === undefined) {
499
- violations.push(`${name}: '${p}.user_confirmation' is required for user_confirmed_satisfied`);
500
- continue;
501
- }
502
- if (!isMapping(confirmation)) {
503
- violations.push(`${name}: '${p}.user_confirmation' must be a mapping with confirmed_by and confirmed_at, got ${pyTypeName(confirmation)}`);
504
- continue;
505
- }
506
- for (const field of ["confirmed_by", "confirmed_at"]) {
507
- if (isEmptyRequired(confirmation[field])) {
508
- violations.push(`${name}: missing required field '${p}.user_confirmation.${field}'`);
509
- }
510
- }
511
- }
512
- }
513
- return violations;
514
- }
515
- function validationRuleSeverity(schema, rule) {
516
- for (const groupKey of ["VALIDATION", "VALIDATION_RULES"]) {
517
- for (const entry of Object.values(schema[groupKey] ?? {})) {
518
- if (isMapping(entry) && entry.rule === rule) {
519
- const severity = entry.severity;
520
- return severity ? String(severity) : null;
521
- }
522
- }
523
- }
524
- return null;
525
- }
526
- function expectedSequenceOrder(name, key) {
527
- return SEQUENCE_ORDER_BY_ARTIFACT[`${name}\0${key}`] ?? "ascending";
528
- }
529
- function sequenceInOrder(nums, direction) {
530
- const reverse = direction === "descending";
531
- const sorted = [...nums].sort((a, b) => (reverse ? b - a : a - b));
532
- return nums.length === sorted.length && nums.every((n, i) => n === sorted[i]);
533
- }
534
- function validateYamlContent(content, schema, name) {
535
- const violations = [];
536
- let data;
537
- try {
538
- data = parseYaml(content);
539
- }
540
- catch (exc) {
541
- return [`${name}: invalid YAML: ${exc.message}`];
542
- }
543
- if (!isMapping(data)) {
544
- return [`${name}: root must be a mapping`];
545
- }
546
- for (const [group, groupLower, fields] of collectSingletonGroups(schema)) {
547
- let scope;
548
- if (groupLower in data && isMapping(data[groupLower])) {
549
- scope = data[groupLower];
550
- }
551
- else if (fields.some((f) => f in data)) {
552
- scope = data;
553
- }
554
- else {
555
- continue;
556
- }
557
- validateSingletonGroup(violations, name, schema, group, scope, groupLower);
558
- }
559
- if (name === "plan") {
560
- validatePlanKnownFields(data, schema, violations);
561
- validateFullPlanContract(data, violations);
562
- }
563
- validateSequences(data, schema, name, violations);
564
- if (name === "decisions") {
565
- violations.push(...validateDecisionAlternatives(data, name));
566
- violations.push(...validateDecisionSatisfaction(data, name));
567
- }
568
- const wordBudgetSeverity = validationRuleSeverity(schema, "word_budget");
569
- for (const be of Object.values(schema.BUDGET ?? {})) {
570
- if (!isMapping(be))
571
- continue;
572
- const mw = be.max_words;
573
- const scope = be.scope ?? "";
574
- if (mw && String(scope).includes("full_file") && wordBudgetSeverity === "error") {
575
- const wc = wordCount(content);
576
- if (wc > mw)
577
- violations.push(`${name}: word count (${wc}) exceeds budget (${mw})`);
578
- }
579
- }
580
- for (const groupKey of ["VALIDATION", "VALIDATION_RULES"]) {
581
- for (const ve of Object.values(schema[groupKey] ?? {})) {
582
- if (!isMapping(ve))
583
- continue;
584
- const rule = ve.rule ?? "";
585
- if (ve.severity !== "error")
586
- continue;
587
- if (rule.includes("unique") && rule.includes("number")) {
588
- for (const [key, val] of Object.entries(data)) {
589
- if (Array.isArray(val)) {
590
- const nums = val.filter((e) => isMapping(e) && "number" in e).map((e) => e.number);
591
- if (nums.length > 0) {
592
- if (nums.length !== new Set(nums).size) {
593
- violations.push(`${name}: duplicate numbers in '${key}'`);
594
- }
595
- const direction = expectedSequenceOrder(name, key);
596
- if (!sequenceInOrder(nums, direction)) {
597
- violations.push(`${name}: '${key}' not in ${direction} order`);
598
- }
599
- }
600
- }
601
- }
602
- }
603
- else if (rule === "closure_consistency") {
604
- const header = isMapping(data.header) ? data.header : {};
605
- const status = data.status ?? header.status;
606
- if (typeof status === "string" && status === "closed") {
607
- for (const field of ["closed_at", "final_value", "target_ref", "reason"]) {
608
- let val = data[field];
609
- if (val === null || val === undefined)
610
- val = header[field];
611
- if (val === null || val === undefined || (typeof val === "string" && !val.trim())) {
612
- violations.push(`${name}: closure field '${field}' is required when status is 'closed'`);
613
- }
614
- }
615
- }
616
- }
617
- }
618
- }
619
- return violations;
620
- }
621
- function validateMd(content, name, schema = null) {
622
- const violations = [];
623
- if (!content.trim())
624
- violations.push(`${name}: empty content`);
625
- const fences = (content.match(/^```/gm) ?? []).length;
626
- if (fences % 2)
627
- violations.push(`${name}: unclosed code fence`);
628
- if (schema)
629
- violations.push(...validateMdSchema(content, name, schema));
630
- return violations;
631
- }
632
- function validateMdSchema(content, name, schema) {
633
- const violations = [];
634
- if (!content.trim())
635
- return violations;
636
- for (const [groupKey, groupValue] of Object.entries(schema)) {
637
- if (SKIP_META.has(groupKey) || !isMapping(groupValue))
638
- continue;
639
- const hasRequired = Object.values(groupValue).some((e) => isMapping(e) && e.required && e.field);
640
- if (!hasRequired)
641
- continue;
642
- if (groupKey === "ITEM")
643
- validateMdItems(content, name, violations);
644
- else if (groupKey === "RELEASE")
645
- validateMdReleases(content, name, violations);
646
- else if (groupKey === "TOKEN")
647
- validateMdTokens(content, name, violations);
648
- }
649
- return violations;
650
- }
651
- function validateMdItems(content, name, violations) {
652
- const versionHeading = /^##\s+/m.exec(content);
653
- if (!versionHeading) {
654
- violations.push(`${name}: missing severity sections (expected '## <glyph> <name>' headings)`);
655
- return;
656
- }
657
- const severityGlyphs = ["⇶", "⇉", "→", "⇢"];
658
- const requiredItemGlyphs = new Set(["⇶"]);
659
- let found = false;
660
- for (const glyph of severityGlyphs) {
661
- const g = glyph.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
662
- if (new RegExp(`^##\\s*${g}`, "m").test(content)) {
663
- found = true;
664
- const sectionStart = new RegExp(`^##\\s*${g}.+$`, "m").exec(content);
665
- if (sectionStart) {
666
- const idx = sectionStart.index + sectionStart[0].length;
667
- const nextMatch = content.slice(idx).match(/\n##\s/);
668
- let bodyStart = idx;
669
- if (content.startsWith("\r\n", bodyStart))
670
- bodyStart += 2;
671
- else if (content[bodyStart] === "\n")
672
- bodyStart += 1;
673
- const sectionEnd = nextMatch ? idx + nextMatch.index : content.length;
674
- const sectionBody = content.slice(bodyStart, sectionEnd);
675
- if (requiredItemGlyphs.has(glyph) && !/^\s*-/m.test(sectionBody)) {
676
- const headingSlice = content.slice(sectionStart.index, sectionStart.index + sectionStart[0].length);
677
- const glyphNameMatch = new RegExp(`^##\\s*(${g}.+)$`, "m").exec(headingSlice);
678
- const headingText = glyphNameMatch ? glyphNameMatch[1] : glyph;
679
- violations.push(`${name}: severity section '${headingText}' has no list entries (expected '- [type]' items)`);
680
- }
681
- }
682
- }
683
- }
684
- if (!found) {
685
- violations.push(`${name}: missing severity glyph in section headings (expected '## ⇶ Critical', '## ⇉ Degraded', '## → Normal', '## ⇢ Annoying')`);
686
- }
687
- }
688
- function validateMdReleases(content, name, violations) {
689
- if (!/^##\s*\[/m.test(content)) {
690
- violations.push(`${name}: missing version header (expected '## [X.Y.Z]')`);
691
- }
692
- const changeSections = new Set(["### Added", "### Changed", "### Fixed", "### Removed"]);
693
- const lines = new Set(content.split("\n"));
694
- if (![...changeSections].some((s) => lines.has(s))) {
695
- violations.push(`${name}: missing change sections (expected '### Added', '### Changed', '### Fixed', or '### Removed')`);
696
- }
697
- }
698
- function validateMdTokens(content, name, violations) {
699
- if (!/^##\s/m.test(content)) {
700
- violations.push(`${name}: missing section heading (expected '## SectionName')`);
701
- }
702
- const yamlBlocks = (content.match(/^```yaml\s*$/gm) ?? []).length;
703
- if (!yamlBlocks) {
704
- violations.push(`${name}: missing YAML code block with token definitions (expected '\`\`\`yaml')`);
705
- }
706
- }
707
- // ── Path resolution ────────────────────────────────────────────────
708
- function resolvePathRel(fp, cwd) {
709
- return path.isAbsolute(fp) ? fp : path.join(cwd, fp);
710
- }
711
- function docsPathOverrides(cwd) {
712
- const docsPath = path.join(cwd, ".agentera", "docs.yaml");
713
- if (!fs.existsSync(docsPath) || !fs.statSync(docsPath).isFile())
714
- return {};
715
- let data;
716
- try {
717
- data = loadYamlMapping(fs.readFileSync(docsPath, "utf8"));
718
- }
719
- catch (exc) {
720
- process.stderr.write(`warning: failed to load docs path overrides: ${exc.message}\n`);
721
- return {};
722
- }
723
- const mapping = data.mapping;
724
- if (!Array.isArray(mapping))
725
- return {};
726
- const overrides = {};
727
- for (const entry of mapping) {
728
- if (!isMapping(entry))
729
- continue;
730
- const artifact = entry.artifact;
731
- const p = entry.path;
732
- if (typeof artifact === "string" && typeof p === "string")
733
- overrides[artifact] = p;
734
- }
735
- return overrides;
736
- }
737
- function defaultArtifactPath(artifact, cwd) {
738
- const rel = docsPathOverrides(cwd)[artifact] ?? DEFAULT_ARTIFACT_PATHS[artifact] ?? "";
739
- return rel ? resolvePathRel(rel, cwd) : "";
740
- }
741
- function artifactPaths(cwd) {
742
- const paths = { ...DEFAULT_ARTIFACT_PATHS, ...docsPathOverrides(cwd) };
743
- const resolved = {};
744
- for (const [artifact, p] of Object.entries(paths))
745
- resolved[artifact] = resolvePathRel(p, cwd);
746
- return resolved;
747
- }
748
- function samePath(left, right) {
749
- return resolvePath(left) === resolvePath(right);
750
- }
751
- function artifactForWrite(absPath, relPath, basename, cwd) {
752
- for (const [artifact, mappedPath] of Object.entries(artifactPaths(cwd))) {
753
- if (samePath(absPath, mappedPath))
754
- return artifact;
755
- }
756
- const match = AGENT_YAML_RE.exec(relPath);
757
- if (match) {
758
- const id = match[1];
759
- return id in ARTIFACT_PROTOCOL_PATHS ? id : null;
760
- }
761
- if (HUMAN_FACING_ARTIFACT_IDS.has(normalizeArtifactProtocolId(basename) ?? "")) {
762
- return normalizeArtifactProtocolId(basename);
763
- }
764
- return null;
765
- }
766
- function readIfNeeded(content, absPath) {
767
- if (content !== null && content !== undefined)
768
- return content;
769
- try {
770
- return fs.readFileSync(absPath, "utf8");
771
- }
772
- catch {
773
- return null;
774
- }
775
- }
776
- function compactAfterValidWrite(artifact, absPath) {
777
- if (!fs.existsSync(absPath))
778
- return [];
779
- try {
780
- if (artifact === "todo") {
781
- compactFile(absPath, "todo-resolved");
782
- }
783
- else if (artifact in COMPACTABLE_YAML_ARTIFACTS) {
784
- compactYamlFile(absPath, artifact);
785
- }
786
- else {
787
- return [];
788
- }
789
- }
790
- catch (exc) {
791
- return [`${artifact}: compaction failed: ${exc.message}`];
792
- }
793
- return [];
794
- }
795
- // ── Validator + adapter ────────────────────────────────────────────
796
- export class ArtifactSchemaValidator {
797
- schemasDir;
798
- schemaCache;
799
- constructor(schemasDir = schemasDirDefault()) {
800
- this.schemasDir = schemasDir;
801
- this.schemaCache = new Map();
802
- }
803
- loadSchema(name) {
804
- if (!this.schemaCache.has(name)) {
805
- const p = path.join(this.schemasDir, `${name}.yaml`);
806
- if (fs.existsSync(p) && fs.statSync(p).isFile()) {
807
- this.schemaCache.set(name, loadYamlMapping(fs.readFileSync(p, "utf8")));
808
- }
809
- else {
810
- this.schemaCache.set(name, null);
811
- }
812
- }
813
- return this.schemaCache.get(name) ?? null;
814
- }
815
- validateYaml(content, schema, name) {
816
- return validateYamlContent(content, schema, name);
817
- }
818
- validateMarkdown(content, name, schema = null) {
819
- return validateMd(content, name, schema);
820
- }
821
- validateWrite(write, cwd) {
822
- const absPath = resolvePathRel(write.file_path, cwd);
823
- const rel = path.relative(cwd, absPath).replace(/\\/g, "/");
824
- const basename = path.basename(absPath);
825
- const artifact = artifactForWrite(absPath, rel, basename, cwd);
826
- if (artifact && AGENT_FACING_ARTIFACT_IDS.has(artifact)) {
827
- const schema = this.loadSchema(artifact);
828
- if (schema === null)
829
- return [];
830
- if (Object.keys(schema).length === 0)
831
- return [`${artifact}: schema file is empty or contains no valid definitions`];
832
- const content = readIfNeeded(write.content, absPath);
833
- if (content === null)
834
- return [];
835
- let violations = this.validateYaml(content, schema, artifact);
836
- if (violations.length > 0)
837
- return violations;
838
- return compactAfterValidWrite(artifact, absPath);
839
- }
840
- if (artifact && HUMAN_FACING_ARTIFACT_IDS.has(artifact)) {
841
- const content = readIfNeeded(write.content, absPath);
842
- if (content === null)
843
- return [];
844
- const schema = this.loadSchema(artifact);
845
- const violations = this.validateMarkdown(content, artifact, schema);
846
- if (violations.length > 0)
847
- return violations;
848
- return compactAfterValidWrite(artifact, absPath);
849
- }
850
- return [];
851
- }
852
- validateExplicit(artifact, filePath, cwd) {
853
- const content = readIfNeeded(null, filePath);
854
- if (content === null)
855
- return [`${artifact}: cannot read artifact file '${filePath}'`];
856
- const protocolId = normalizeArtifactProtocolId(artifact);
857
- if (protocolId === null) {
858
- return [`${artifact}: unsupported artifact protocol id`];
859
- }
860
- if (AGENT_FACING_ARTIFACT_IDS.has(protocolId)) {
861
- const schema = this.loadSchema(protocolId);
862
- if (schema === null)
863
- return [`${protocolId}: schema '${protocolId}' is not available`];
864
- if (Object.keys(schema).length === 0) {
865
- return [`${protocolId}: schema '${protocolId}' file is empty or contains no valid definitions`];
866
- }
867
- return this.validateYaml(content, schema, protocolId);
868
- }
869
- if (HUMAN_FACING_ARTIFACT_IDS.has(protocolId)) {
870
- const schema = this.loadSchema(protocolId);
871
- return this.validateMarkdown(content, artifact, schema);
872
- }
873
- return [
874
- `${artifact}: unsupported artifact; expected one of: ${Object.keys(DEFAULT_ARTIFACT_PATHS).sort().join(", ")}`,
875
- ];
876
- }
877
- }
878
- export function loadSchema(name) {
879
- return new ArtifactSchemaValidator().loadSchema(name);
880
- }
881
- export class HookCliAdapter {
882
- parser;
883
- validator;
884
- constructor(parser, validator) {
885
- this.parser = parser ?? new RuntimeEventParser();
886
- this.validator = validator ?? new ArtifactSchemaValidator();
887
- }
888
- run(raw, defaultCwd = null) {
889
- let data;
890
- try {
891
- if (!raw.trim())
892
- return [0, []];
893
- data = JSON.parse(raw);
894
- }
895
- catch {
896
- return [0, []];
897
- }
898
- if (!isMapping(data))
899
- return [0, []];
900
- const write = this.parser.parse(data);
901
- if (write === null)
902
- return [0, []];
903
- const cwd = data.cwd ?? defaultCwd ?? process.cwd();
904
- const violations = this.validator.validateWrite(write, cwd);
905
- return violations.length > 0 ? [2, violations] : [0, []];
906
- }
907
- runExplicit(artifact, filePath, cwd) {
908
- artifact = artifact.trim();
909
- const defaultPath = defaultArtifactPath(artifact, cwd);
910
- const resolvedFile = filePath ? resolvePathRel(filePath, cwd) : defaultPath;
911
- const violations = this.validator.validateExplicit(artifact, resolvedFile, cwd);
912
- const payload = {
913
- command: "validate-artifact",
914
- status: violations.length > 0 ? "fail" : "pass",
915
- artifact,
916
- file: resolvedFile,
917
- docs_mapped_default: defaultPath || null,
918
- path_source: filePath ? "provided" : "docs_mapped_default",
919
- violations,
920
- };
921
- return violations.length > 0 ? [2, payload] : [0, payload];
922
- }
923
- }
924
- //# sourceMappingURL=validateArtifact.js.map