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
@@ -0,0 +1,448 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
4
+ import { loadYamlMapping } from "../core/yaml.js";
5
+ const SCHEMA_VERSION = "agentera.todoReadiness.v1";
6
+ const PHASE_AUTHORITY = "protocol.yaml#PHASES[*].capabilities";
7
+ const REQUIRED_FIELDS = [
8
+ "capability",
9
+ "reason",
10
+ "dependencies",
11
+ "blocked",
12
+ "gate",
13
+ "queue_rank",
14
+ "order_reason",
15
+ ];
16
+ const EVALUATION_PRECEDENCE = [
17
+ "todo_resolved",
18
+ "readiness_absent",
19
+ "blocked",
20
+ "gate_pending",
21
+ "dependency_cross_artifact",
22
+ "dependency_missing",
23
+ "dependency_cycle",
24
+ "dependency_open",
25
+ "ordering_conflict",
26
+ "actionable",
27
+ ];
28
+ const PROHIBITED_TIEBREAKERS = [
29
+ "entity_id",
30
+ "file_order",
31
+ "filesystem_time",
32
+ "created_or_modified_time",
33
+ "description_text",
34
+ ];
35
+ const OUTCOME_EXPECTATIONS = {
36
+ todo_resolved: { result: "resolved", eligible: false, attention: "none", recovery: "null" },
37
+ readiness_absent: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
38
+ blocked: { result: "blocked", eligible: false, attention: "item", recovery: "required" },
39
+ gate_pending: { result: "gated", eligible: false, attention: "none", recovery: "required" },
40
+ dependency_cross_artifact: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
41
+ dependency_missing: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
42
+ dependency_cycle: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
43
+ dependency_open: { result: "waiting", eligible: false, attention: "none", recovery: "required" },
44
+ dependency_resolved: { result: "satisfied", eligible: null, attention: "none", recovery: "null" },
45
+ ordering_conflict: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
46
+ actionable: { result: "actionable", eligible: true, attention: "none", recovery: "null" },
47
+ };
48
+ const QUEUE_EXPECTATIONS = {
49
+ mixed_actionable_and_triage: {
50
+ selection: "highest_ordered_actionable",
51
+ attention: "bounded_triage_summary",
52
+ },
53
+ all_non_actionable: {
54
+ selection: "abstain",
55
+ attention: "bounded_highest_severity_summary",
56
+ },
57
+ };
58
+ function isMapping(value) {
59
+ return value !== null && typeof value === "object" && !Array.isArray(value);
60
+ }
61
+ function stringList(value) {
62
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string"))
63
+ return null;
64
+ return value;
65
+ }
66
+ function sameList(actual, expected) {
67
+ const list = stringList(actual);
68
+ return list !== null && list.length === expected.length && list.every((value, index) => value === expected[index]);
69
+ }
70
+ function canonicalCapabilities(capabilityContract, errors, sourceLabel) {
71
+ const aliases = isMapping(capabilityContract.ROUTE_ALIASES)
72
+ ? capabilityContract.ROUTE_ALIASES.primary_aliases
73
+ : null;
74
+ if (!Array.isArray(aliases)) {
75
+ errors.push(`${sourceLabel}: ROUTE_ALIASES.primary_aliases must be a list`);
76
+ return [];
77
+ }
78
+ const capabilities = [];
79
+ for (const alias of aliases) {
80
+ if (!isMapping(alias) || typeof alias.capability !== "string" || !alias.capability.trim()) {
81
+ errors.push(`${sourceLabel}: each ROUTE_ALIASES.primary_aliases entry must declare capability`);
82
+ continue;
83
+ }
84
+ capabilities.push(alias.capability);
85
+ }
86
+ return capabilities;
87
+ }
88
+ function derivePhaseMapping(protocol, canonical, errors, sourceLabel) {
89
+ const mapping = new Map();
90
+ if (!isMapping(protocol.PHASES)) {
91
+ errors.push(`${sourceLabel}: protocol PHASES must be a mapping`);
92
+ return mapping;
93
+ }
94
+ for (const entry of Object.values(protocol.PHASES)) {
95
+ if (!isMapping(entry))
96
+ continue;
97
+ const phase = typeof entry.value === "string" ? entry.value : "";
98
+ const capabilities = stringList(entry.capabilities);
99
+ if (!phase || capabilities === null) {
100
+ errors.push(`${sourceLabel}: each PHASES entry must declare a value and capabilities list`);
101
+ continue;
102
+ }
103
+ for (const capability of capabilities) {
104
+ if (!canonical.has(capability)) {
105
+ errors.push(`${sourceLabel}: PHASES capability '${capability}' is not canonical`);
106
+ }
107
+ if (mapping.has(capability)) {
108
+ errors.push(`${sourceLabel}: capability '${capability}' appears in multiple PHASES entries`);
109
+ }
110
+ else {
111
+ mapping.set(capability, phase);
112
+ }
113
+ }
114
+ }
115
+ return mapping;
116
+ }
117
+ function validateFields(readiness, errors, sourceLabel) {
118
+ const fields = readiness.fields;
119
+ if (!isMapping(fields)) {
120
+ errors.push(`${sourceLabel}: READINESS.fields must be a mapping`);
121
+ return;
122
+ }
123
+ for (const name of REQUIRED_FIELDS) {
124
+ const field = fields[name];
125
+ if (!isMapping(field)) {
126
+ errors.push(`${sourceLabel}: READINESS.fields.${name} must be a mapping`);
127
+ continue;
128
+ }
129
+ if (field.required !== true) {
130
+ errors.push(`${sourceLabel}: READINESS.fields.${name}.required must be true`);
131
+ }
132
+ }
133
+ const capability = fields.capability;
134
+ if (isMapping(capability) && capability.enum_source !== PHASE_AUTHORITY) {
135
+ errors.push(`${sourceLabel}: READINESS.fields.capability.enum_source must be ${PHASE_AUTHORITY}`);
136
+ }
137
+ const dependencies = fields.dependencies;
138
+ const dependencyEntries = isMapping(dependencies) && isMapping(dependencies.entries)
139
+ ? dependencies.entries
140
+ : null;
141
+ const dependencyArtifact = dependencyEntries && isMapping(dependencyEntries.artifact)
142
+ ? dependencyEntries.artifact
143
+ : null;
144
+ if (dependencyArtifact?.const !== "todo") {
145
+ errors.push(`${sourceLabel}: dependency artifact const must be todo`);
146
+ }
147
+ }
148
+ function validateOutcomes(readiness, errors, sourceLabel) {
149
+ const outcomes = readiness.outcomes;
150
+ if (!isMapping(outcomes)) {
151
+ errors.push(`${sourceLabel}: READINESS.outcomes must be a mapping`);
152
+ return;
153
+ }
154
+ for (const [name, expected] of Object.entries(OUTCOME_EXPECTATIONS)) {
155
+ const outcome = outcomes[name];
156
+ if (!isMapping(outcome)) {
157
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name} must be a mapping`);
158
+ continue;
159
+ }
160
+ if (outcome.result !== expected.result) {
161
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.result must be ${expected.result}`);
162
+ }
163
+ if (outcome.eligible !== expected.eligible) {
164
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.eligible must be ${String(expected.eligible)}`);
165
+ }
166
+ if (outcome.attention !== expected.attention) {
167
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.attention must be one of: none, item`);
168
+ }
169
+ const validRecovery = expected.recovery === "null"
170
+ ? outcome.recovery === null
171
+ : typeof outcome.recovery === "string" && outcome.recovery.trim().length > 0;
172
+ if (!validRecovery) {
173
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.recovery must be ${expected.recovery === "null" ? "null" : "a non-empty string"}`);
174
+ }
175
+ }
176
+ }
177
+ function validateQueueOutcomes(readiness, errors, sourceLabel) {
178
+ const outcomes = readiness.queue_outcomes;
179
+ if (!isMapping(outcomes)) {
180
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes must be a mapping`);
181
+ return;
182
+ }
183
+ for (const [name, expected] of Object.entries(QUEUE_EXPECTATIONS)) {
184
+ const outcome = outcomes[name];
185
+ if (!isMapping(outcome)) {
186
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name} must be a mapping`);
187
+ continue;
188
+ }
189
+ if (outcome.selection !== expected.selection || outcome.attention !== expected.attention) {
190
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name} must use selection=${expected.selection} and attention=${expected.attention}`);
191
+ }
192
+ if (typeof outcome.recovery !== "string" || !outcome.recovery.trim()) {
193
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name}.recovery must be a non-empty string`);
194
+ }
195
+ }
196
+ }
197
+ function validateOrdering(readiness, errors, sourceLabel) {
198
+ const ordering = readiness.ordering;
199
+ if (!isMapping(ordering)) {
200
+ errors.push(`${sourceLabel}: READINESS.ordering must be a mapping`);
201
+ return;
202
+ }
203
+ if (ordering.primary !== "protocol.yaml#SEVERITY_ISSUE") {
204
+ errors.push(`${sourceLabel}: READINESS.ordering.primary must be protocol.yaml#SEVERITY_ISSUE`);
205
+ }
206
+ for (const legacy of ["within_severity", "duplicate_rank", "prohibited_tiebreakers"]) {
207
+ if (legacy in ordering)
208
+ errors.push(`${sourceLabel}: READINESS.ordering.${legacy} must be declared under one ordering mode`);
209
+ }
210
+ const modes = ordering.modes;
211
+ if (!isMapping(modes)) {
212
+ errors.push(`${sourceLabel}: READINESS.ordering.modes must be a mapping`);
213
+ return;
214
+ }
215
+ if (Object.keys(modes).sort().join(",") !== "nonprojected,projected_startup") {
216
+ errors.push(`${sourceLabel}: READINESS.ordering.modes must contain only nonprojected and projected_startup`);
217
+ }
218
+ const nonprojected = modes.nonprojected;
219
+ if (!isMapping(nonprojected)) {
220
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.nonprojected must be a mapping`);
221
+ }
222
+ else {
223
+ if (Object.keys(nonprojected).sort().join(",") !== "duplicate_rank,prohibited_tiebreakers,within_severity") {
224
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.nonprojected has unsupported fields`);
225
+ }
226
+ if (nonprojected.within_severity !== "queue_rank_ascending") {
227
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.nonprojected.within_severity must be queue_rank_ascending`);
228
+ }
229
+ if (nonprojected.duplicate_rank !== "ordering_conflict") {
230
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.nonprojected.duplicate_rank must be ordering_conflict`);
231
+ }
232
+ if (!sameList(nonprojected.prohibited_tiebreakers, PROHIBITED_TIEBREAKERS)) {
233
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.nonprojected.prohibited_tiebreakers must equal ${PROHIBITED_TIEBREAKERS.join(", ")}`);
234
+ }
235
+ }
236
+ const projected = modes.projected_startup;
237
+ const projectedRules = {
238
+ entity_annotation: "required_for_every_entity",
239
+ eligibility: "before_order",
240
+ managed_before_absent: true,
241
+ managed_within_severity: "markdown_order_ascending",
242
+ managed_duplicate_rank: "ignored",
243
+ absent_within_severity: "queue_rank_then_id",
244
+ absent_duplicate_rank: "entity_id_ascending",
245
+ };
246
+ if (!isMapping(projected)) {
247
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.projected_startup must be a mapping`);
248
+ }
249
+ else {
250
+ if (Object.keys(projected).sort().join(",") !== Object.keys(projectedRules).sort().join(",")) {
251
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.projected_startup has unsupported fields`);
252
+ }
253
+ for (const [field, expected] of Object.entries(projectedRules)) {
254
+ if (projected[field] !== expected)
255
+ errors.push(`${sourceLabel}: READINESS.ordering.modes.projected_startup.${field} must be ${String(expected)}`);
256
+ }
257
+ }
258
+ }
259
+ export function validateTodoReadinessContract(todoSchema, protocol, capabilityContract, sourceLabel = "TODO readiness contract") {
260
+ const errors = [];
261
+ const readiness = todoSchema.READINESS;
262
+ if (!isMapping(readiness))
263
+ return [`${sourceLabel}: READINESS must be a mapping`];
264
+ if (readiness.schema_version !== SCHEMA_VERSION) {
265
+ errors.push(`${sourceLabel}: READINESS.schema_version must be ${SCHEMA_VERSION}`);
266
+ }
267
+ const canonicalList = canonicalCapabilities(capabilityContract, errors, sourceLabel);
268
+ const canonical = new Set(canonicalList);
269
+ const phaseByCapability = derivePhaseMapping(protocol, canonical, errors, sourceLabel);
270
+ const destination = readiness.destination;
271
+ if (!isMapping(destination)) {
272
+ errors.push(`${sourceLabel}: READINESS.destination must be a mapping`);
273
+ }
274
+ else {
275
+ if (destination.phase_authority !== PHASE_AUTHORITY) {
276
+ errors.push(`${sourceLabel}: READINESS.destination.phase_authority must be ${PHASE_AUTHORITY}`);
277
+ }
278
+ for (const duplicate of ["allowed_destinations", "phase_mapping"]) {
279
+ if (duplicate in destination) {
280
+ errors.push(`${sourceLabel}: READINESS.destination.${duplicate} duplicates the canonical PHASES authority`);
281
+ }
282
+ }
283
+ const excluded = destination.excluded_capabilities;
284
+ if (!isMapping(excluded)) {
285
+ errors.push(`${sourceLabel}: READINESS.destination.excluded_capabilities must be a mapping`);
286
+ }
287
+ else {
288
+ for (const capability of canonicalList) {
289
+ const mapped = phaseByCapability.has(capability);
290
+ const exclusion = excluded[capability];
291
+ if (mapped && exclusion !== undefined) {
292
+ errors.push(`${sourceLabel}: mapped capability '${capability}' must not also be excluded`);
293
+ }
294
+ else if (!mapped && (typeof exclusion !== "string" || !exclusion.trim())) {
295
+ errors.push(`${sourceLabel}: canonical capability '${capability}' must be mapped to one phase or explicitly excluded`);
296
+ }
297
+ }
298
+ for (const [capability, reason] of Object.entries(excluded)) {
299
+ if (!canonical.has(capability)) {
300
+ errors.push(`${sourceLabel}: excluded capability '${capability}' is not canonical`);
301
+ }
302
+ if (typeof reason !== "string" || !reason.trim()) {
303
+ errors.push(`${sourceLabel}: excluded capability '${capability}' must have a non-empty reason`);
304
+ }
305
+ }
306
+ }
307
+ }
308
+ validateFields(readiness, errors, sourceLabel);
309
+ const evaluation = readiness.evaluation;
310
+ if (!isMapping(evaluation) || !sameList(evaluation.precedence, EVALUATION_PRECEDENCE)) {
311
+ errors.push(`${sourceLabel}: READINESS.evaluation.precedence must equal ${EVALUATION_PRECEDENCE.join(", ")}`);
312
+ }
313
+ validateOutcomes(readiness, errors, sourceLabel);
314
+ validateQueueOutcomes(readiness, errors, sourceLabel);
315
+ validateOrdering(readiness, errors, sourceLabel);
316
+ return errors;
317
+ }
318
+ function requiredMappingFields(label, value, names) {
319
+ if (!isMapping(value))
320
+ return [`${label} must be a mapping or null`];
321
+ const errors = [];
322
+ for (const name of names) {
323
+ if (!(name in value))
324
+ errors.push(`${label}.${name} is required`);
325
+ else if (typeof value[name] !== "string" || !String(value[name]).trim())
326
+ errors.push(`${label}.${name} must be a non-empty string`);
327
+ }
328
+ for (const name of Object.keys(value)) {
329
+ if (!names.includes(name))
330
+ errors.push(`${label} has unsupported field '${name}'`);
331
+ }
332
+ return errors;
333
+ }
334
+ export function todoReadinessRecordViolations(readiness, contract = loadTodoReadinessContract()) {
335
+ if (!isMapping(readiness))
336
+ return ["readiness must be a mapping"];
337
+ const errors = [];
338
+ for (const field of REQUIRED_FIELDS) {
339
+ if (!(field in readiness))
340
+ errors.push(`${field} is required when readiness is declared`);
341
+ }
342
+ for (const field of Object.keys(readiness)) {
343
+ if (!REQUIRED_FIELDS.includes(field))
344
+ errors.push(`readiness has unsupported field '${field}'`);
345
+ }
346
+ if (typeof readiness.capability !== "string" || !contract.allowedDestinations.includes(readiness.capability)) {
347
+ errors.push(`capability must be one of: ${contract.allowedDestinations.join(", ")}`);
348
+ }
349
+ if (typeof readiness.reason !== "string" || !readiness.reason.trim())
350
+ errors.push("reason must be a non-empty string");
351
+ if (!Array.isArray(readiness.dependencies))
352
+ errors.push("dependencies must be a list");
353
+ else
354
+ for (const [index, dependency] of readiness.dependencies.entries()) {
355
+ if (!isMapping(dependency)) {
356
+ errors.push(`dependencies[${index}] must be a mapping`);
357
+ continue;
358
+ }
359
+ for (const field of Object.keys(dependency)) {
360
+ if (field !== "artifact" && field !== "id")
361
+ errors.push(`dependencies[${index}] has unsupported field '${field}'`);
362
+ }
363
+ if (dependency.artifact !== "todo")
364
+ errors.push(`dependencies[${index}] dependency artifact must be 'todo'`);
365
+ if (!/^[a-z]{10}$/.test(String(dependency.id ?? "")))
366
+ errors.push(`dependencies[${index}] dependency ID must be ten lowercase letters`);
367
+ }
368
+ if (readiness.blocked !== null)
369
+ errors.push(...requiredMappingFields("blocked", readiness.blocked, ["reason", "recovery"]));
370
+ if (readiness.gate !== null) {
371
+ errors.push(...requiredMappingFields("gate", readiness.gate, ["state", "reason", "recovery"]));
372
+ const gate = isMapping(readiness.gate) ? readiness.gate : {};
373
+ const gateFields = isMapping(contract.fields.gate) && isMapping(contract.fields.gate.fields) ? contract.fields.gate.fields : {};
374
+ const stateField = isMapping(gateFields.state) ? gateFields.state : {};
375
+ const allowed = stringList(stateField.enum) ?? [];
376
+ if (typeof gate.state === "string" && !allowed.includes(gate.state))
377
+ errors.push(`gate.state must be one of: ${allowed.join(", ")}`);
378
+ }
379
+ const queueField = isMapping(contract.fields.queue_rank) ? contract.fields.queue_rank : {};
380
+ const minimum = typeof queueField.minimum === "number" ? queueField.minimum : 1;
381
+ if (!Number.isInteger(readiness.queue_rank) || Number(readiness.queue_rank) < minimum)
382
+ errors.push(`queue_rank must be an integer greater than or equal to ${minimum}`);
383
+ if (typeof readiness.order_reason !== "string" || !readiness.order_reason.trim())
384
+ errors.push("order_reason must be a non-empty string");
385
+ return [...new Set(errors)];
386
+ }
387
+ export function todoReadinessReferenceViolations(itemId, readiness, todos) {
388
+ if (!isMapping(readiness) || !Array.isArray(readiness.dependencies))
389
+ return [];
390
+ const dependencies = readiness.dependencies
391
+ .filter(isMapping)
392
+ .map((dependency) => String(dependency.id ?? ""))
393
+ .filter((id) => /^[a-z]{10}$/.test(id));
394
+ const byId = new Map(todos.map((todo) => [todo.id, todo.record]));
395
+ const errors = [];
396
+ for (const dependency of dependencies) {
397
+ if (dependency === itemId)
398
+ errors.push(`TODO '${itemId}' cannot depend on itself`);
399
+ else if (!byId.has(dependency))
400
+ errors.push(`TODO dependency '${dependency}' does not exist`);
401
+ }
402
+ const reachesItem = (id, seen) => {
403
+ if (id === itemId)
404
+ return true;
405
+ if (seen.has(id))
406
+ return false;
407
+ seen.add(id);
408
+ const record = byId.get(id);
409
+ const nested = isMapping(record?.readiness) && Array.isArray(record.readiness.dependencies)
410
+ ? record.readiness.dependencies.filter(isMapping).map((dependency) => String(dependency.id ?? ""))
411
+ : [];
412
+ return nested.some((dependency) => reachesItem(dependency, seen));
413
+ };
414
+ if (!errors.length && dependencies.some((dependency) => reachesItem(dependency, new Set()))) {
415
+ errors.push(`TODO '${itemId}' would create a dependency cycle`);
416
+ }
417
+ return errors;
418
+ }
419
+ export class TodoReadinessContractError extends Error {
420
+ errors;
421
+ constructor(errors) {
422
+ super(errors.join("; "));
423
+ this.errors = errors;
424
+ this.name = "TodoReadinessContractError";
425
+ }
426
+ }
427
+ export function loadTodoReadinessContract(todoSchemaPath = path.join(resolveSourceRoot(), "skills", "agentera", "schemas", "artifacts", "todo.yaml"), protocolPath = path.join(resolveSourceRoot(), "skills", "agentera", "protocol.yaml"), capabilityContractPath = path.join(resolveSourceRoot(), "skills", "agentera", "capability_schema_contract.yaml")) {
428
+ const todoSchema = loadYamlMapping(fs.readFileSync(todoSchemaPath, "utf8"));
429
+ const protocol = loadYamlMapping(fs.readFileSync(protocolPath, "utf8"));
430
+ const capabilityContract = loadYamlMapping(fs.readFileSync(capabilityContractPath, "utf8"));
431
+ const errors = validateTodoReadinessContract(todoSchema, protocol, capabilityContract, todoSchemaPath);
432
+ if (errors.length)
433
+ throw new TodoReadinessContractError(errors);
434
+ const readiness = todoSchema.READINESS;
435
+ const destination = readiness.destination;
436
+ const phaseByCapability = derivePhaseMapping(protocol, new Set(canonicalCapabilities(capabilityContract, [], capabilityContractPath)), [], protocolPath);
437
+ return {
438
+ schemaVersion: readiness.schema_version,
439
+ allowedDestinations: [...phaseByCapability.keys()],
440
+ phaseByCapability,
441
+ excludedCapabilities: destination.excluded_capabilities,
442
+ fields: readiness.fields,
443
+ precedence: readiness.evaluation.precedence,
444
+ outcomes: readiness.outcomes,
445
+ queueOutcomes: readiness.queue_outcomes,
446
+ ordering: readiness.ordering,
447
+ };
448
+ }
@@ -0,0 +1,174 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { loadYamlMapping } from "../core/yaml.js";
4
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
5
+ export class TriggerLoaderError extends Error {
6
+ errors;
7
+ constructor(errors) {
8
+ super(errors.join("; "));
9
+ this.name = "TriggerLoaderError";
10
+ this.errors = errors;
11
+ }
12
+ }
13
+ function isMapping(value) {
14
+ return value !== null && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+ function isNumericKey(key) {
17
+ return /^\d+$/.test(key) && Number(key) >= 1;
18
+ }
19
+ /** Absolute directory holding the Agentera capability schemas. */
20
+ export function capabilitiesBaseDir(sourceRoot = resolveSourceRoot()) {
21
+ return path.join(sourceRoot, "skills", "agentera", "capabilities");
22
+ }
23
+ /** Absolute path to a capability's triggers.yaml. */
24
+ export function triggersYamlPath(capability, sourceRoot = resolveSourceRoot()) {
25
+ return path.join(capabilitiesBaseDir(sourceRoot), capability, "schemas", "triggers.yaml");
26
+ }
27
+ function readTriggersYaml(filePath) {
28
+ if (!fs.existsSync(filePath)) {
29
+ throw new TriggerLoaderError([`triggers.yaml not found at ${filePath}`]);
30
+ }
31
+ return loadYamlMapping(fs.readFileSync(filePath, "utf8")); // cast: YAML parse IO boundary
32
+ }
33
+ function resolveDisambiguation(value, location, allowedCapabilityIds) {
34
+ if (value === undefined || value === null)
35
+ return [];
36
+ if (!Array.isArray(value)) {
37
+ throw new TriggerLoaderError([
38
+ `${location} disambiguates_against must be a list of mappings`,
39
+ ]);
40
+ }
41
+ const entries = [];
42
+ for (let i = 0; i < value.length; i++) {
43
+ const item = value[i];
44
+ if (!isMapping(item)) {
45
+ throw new TriggerLoaderError([
46
+ `${location} disambiguates_against[${i}] must be a mapping with 'capability' and 'hint'`,
47
+ ]);
48
+ }
49
+ const capability = item.capability;
50
+ if (typeof capability !== "string" || !capability) {
51
+ throw new TriggerLoaderError([
52
+ `${location} disambiguates_against[${i}] missing 'capability' (must be one of: ${allowedCapabilityIds.join(", ")})`,
53
+ ]);
54
+ }
55
+ if (!allowedCapabilityIds.includes(capability)) {
56
+ throw new TriggerLoaderError([
57
+ `${location} disambiguates_against[${i}].capability=${JSON.stringify(capability)} is not a canonical capability ID (must be one of: ${allowedCapabilityIds.join(", ")})`,
58
+ ]);
59
+ }
60
+ const hint = item.hint;
61
+ if (typeof hint !== "string" || hint.trim() === "") {
62
+ throw new TriggerLoaderError([
63
+ `${location} disambiguates_against[${i}] missing or empty 'hint' (must be a non-empty string)`,
64
+ ]);
65
+ }
66
+ entries.push({ capability, hint });
67
+ }
68
+ return entries;
69
+ }
70
+ function buildTriggerEntry(key, raw, capability, contract) {
71
+ const location = `TRIGGERS entry ${key} in ${capability}/schemas/triggers.yaml`;
72
+ const id = raw.id;
73
+ if (typeof id !== "string" || !id) {
74
+ throw new TriggerLoaderError([`${location} missing 'id'`]);
75
+ }
76
+ const description = raw.description;
77
+ if (typeof description !== "string" || description.trim() === "") {
78
+ throw new TriggerLoaderError([`${location} missing 'description'`]);
79
+ }
80
+ const priorityRaw = raw.priority;
81
+ if (typeof priorityRaw !== "string" ||
82
+ !contract.triggerPriorityRules.allowedValues.includes(priorityRaw)) {
83
+ throw new TriggerLoaderError([
84
+ `${location} has invalid priority=${JSON.stringify(priorityRaw)} (must be one of: ${contract.triggerPriorityRules.allowedValues.join(", ")})`,
85
+ ]);
86
+ }
87
+ const priority = priorityRaw;
88
+ const disambiguatesAgainst = resolveDisambiguation(raw.disambiguates_against, location, contract.triggerEnrichment.allowedCapabilityIds);
89
+ const fallback = raw.fallback === true;
90
+ return {
91
+ id,
92
+ description,
93
+ priority,
94
+ disambiguatesAgainst,
95
+ fallback,
96
+ };
97
+ }
98
+ function buildCapabilityTriggers(capability, contract, sourceRoot) {
99
+ const filePath = triggersYamlPath(capability, sourceRoot);
100
+ const data = readTriggersYaml(filePath);
101
+ const triggersGroup = data.TRIGGERS;
102
+ if (!isMapping(triggersGroup)) {
103
+ throw new TriggerLoaderError([
104
+ `${capability}/schemas/triggers.yaml is missing the TRIGGERS group`,
105
+ ]);
106
+ }
107
+ const triggers = [];
108
+ for (const key of Object.keys(triggersGroup)) {
109
+ if (!isNumericKey(key)) {
110
+ throw new TriggerLoaderError([
111
+ `${capability}/schemas/triggers.yaml has non-numeric key ${JSON.stringify(key)} in TRIGGERS`,
112
+ ]);
113
+ }
114
+ const entry = triggersGroup[key];
115
+ if (!isMapping(entry)) {
116
+ throw new TriggerLoaderError([
117
+ `TRIGGERS entry ${key} in ${capability}/schemas/triggers.yaml is not a mapping`,
118
+ ]);
119
+ }
120
+ triggers.push(buildTriggerEntry(key, entry, capability, contract));
121
+ }
122
+ return { capability, triggers };
123
+ }
124
+ /**
125
+ * Load all twelve capability triggers.yaml files into a typed active
126
+ * TriggerModel.
127
+ * The capability set is the ROUTE_ALIASES.primary_aliases list owned by the
128
+ * capability schema contract. Absent `disambiguates_against` defaults to an
129
+ * empty list; its capability references are validated against the canonical
130
+ * capability IDs and each must resolve to a capability present in the returned
131
+ * model.
132
+ */
133
+ export function loadTriggerModel(contract, options = {}) {
134
+ const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
135
+ const capabilities = contract.routeAliases.primaryAliases.map((alias) => alias.capability);
136
+ const errors = [];
137
+ const model = new Map();
138
+ for (const capability of capabilities) {
139
+ try {
140
+ model.set(capability, buildCapabilityTriggers(capability, contract, sourceRoot));
141
+ }
142
+ catch (exc) {
143
+ if (exc instanceof TriggerLoaderError) {
144
+ errors.push(...exc.errors);
145
+ }
146
+ else {
147
+ throw exc;
148
+ }
149
+ }
150
+ }
151
+ if (errors.length > 0) {
152
+ throw new TriggerLoaderError(errors);
153
+ }
154
+ // Resolve disambiguates_against references: each capability referenced must
155
+ // resolve to a capability present in the model with at least one trigger.
156
+ const resolutionErrors = [];
157
+ for (const { capability, triggers } of model.values()) {
158
+ for (const entry of triggers) {
159
+ for (const ref of entry.disambiguatesAgainst) {
160
+ const referenced = model.get(ref.capability);
161
+ if (!referenced) {
162
+ resolutionErrors.push(`TRIGGERS entry ${entry.id} in ${capability}/schemas/triggers.yaml disambiguates_against.capability=${JSON.stringify(ref.capability)} does not resolve to a loaded capability`);
163
+ }
164
+ else if (referenced.triggers.length === 0) {
165
+ resolutionErrors.push(`TRIGGERS entry ${entry.id} in ${capability}/schemas/triggers.yaml disambiguates_against.capability=${JSON.stringify(ref.capability)} resolves to a capability with no trigger entries`);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ if (resolutionErrors.length > 0) {
171
+ throw new TriggerLoaderError(resolutionErrors);
172
+ }
173
+ return { capabilities: model };
174
+ }