agentera 3.0.0-dev.4 → 3.0.0-dev.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -22
  3. package/bundle/.agentera-npx-bundle.json +1 -1
  4. package/bundle/CHANGELOG.md +1351 -0
  5. package/bundle/DESIGN.md +229 -0
  6. package/bundle/LICENSE +201 -0
  7. package/bundle/README.md +143 -0
  8. package/bundle/UPGRADE.md +236 -0
  9. package/bundle/extract-corpus-parity.json +21 -0
  10. package/bundle/fixtures/routing/hybrid-corpus.yaml +154 -0
  11. package/bundle/references/adapters/package-publication.json +437 -0
  12. package/bundle/references/adapters/package-registry.yaml +434 -189
  13. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  14. package/bundle/references/adapters/runtime-lifecycle-adapters.yaml +74 -0
  15. package/bundle/references/adapters/runtime-lifecycle-authority.yaml +62 -0
  16. package/bundle/references/adapters/runtime-lifecycle-operation-contract.yaml +84 -0
  17. package/bundle/references/adapters/runtime-retired-resources.yaml +333 -0
  18. package/bundle/references/analysis/evidence-tier-authority.yaml +518 -0
  19. package/bundle/references/analysis/verification-policy.yaml +191 -0
  20. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +20 -10
  21. package/bundle/references/artifacts/glossary-entry-contract.yaml +1254 -0
  22. package/bundle/references/artifacts/state-storage-authority.yaml +2982 -0
  23. package/bundle/references/artifacts/verbosity-budget-authority.yaml +42 -0
  24. package/bundle/references/cli/app-lifecycle-vocabulary.yaml +7 -8
  25. package/bundle/references/cli/capability-instruction-contract.yaml +97 -59
  26. package/bundle/references/cli/hybrid-route-contract.yaml +438 -0
  27. package/bundle/references/cli/routing-model.md +155 -0
  28. package/bundle/references/cli/trigger-schema-enrichment.md +147 -0
  29. package/bundle/references/cli/update-channels.yaml +35 -2
  30. package/bundle/references/cli/vocabulary-index.yaml +23 -20
  31. package/bundle/references/cli/vocabulary.md +337 -366
  32. package/bundle/references/meta/retained-reference-authority.yaml +151 -0
  33. package/bundle/registry.json +14 -14
  34. package/bundle/skills/agentera/SKILL.md +218 -408
  35. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +84 -0
  36. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/exit.yaml +2 -2
  37. package/bundle/skills/agentera/capabilities/audit/schemas/triggers.yaml +25 -0
  38. package/bundle/skills/agentera/capabilities/{inspektera → audit}/schemas/validation.yaml +37 -18
  39. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +102 -0
  40. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  41. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  42. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -0
  43. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/artifacts.yaml +12 -12
  44. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/exit.yaml +5 -5
  45. package/bundle/skills/agentera/capabilities/design/schemas/triggers.yaml +16 -0
  46. package/bundle/skills/agentera/capabilities/{visualisera → design}/schemas/validation.yaml +7 -7
  47. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +51 -0
  48. package/bundle/skills/agentera/capabilities/{resonera → discuss}/schemas/exit.yaml +2 -2
  49. package/bundle/skills/agentera/capabilities/discuss/schemas/triggers.yaml +20 -0
  50. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +144 -0
  51. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +80 -0
  52. package/bundle/skills/agentera/capabilities/document/schemas/triggers.yaml +16 -0
  53. package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/validation.yaml +18 -18
  54. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/artifacts.yaml +18 -18
  55. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/exit.yaml +2 -2
  56. package/bundle/skills/agentera/capabilities/optimize/schemas/triggers.yaml +16 -0
  57. package/bundle/skills/agentera/capabilities/{optimera → optimize}/schemas/validation.yaml +9 -9
  58. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +76 -0
  59. package/bundle/skills/agentera/capabilities/{orkestrera → orchestrate}/schemas/exit.yaml +9 -7
  60. package/bundle/skills/agentera/capabilities/orchestrate/schemas/triggers.yaml +23 -0
  61. package/bundle/skills/agentera/capabilities/orchestrate/schemas/validation.yaml +121 -0
  62. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +66 -0
  63. package/bundle/skills/agentera/capabilities/{planera → plan}/schemas/exit.yaml +2 -2
  64. package/bundle/skills/agentera/capabilities/plan/schemas/triggers.yaml +23 -0
  65. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +121 -0
  66. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +23 -0
  67. package/bundle/skills/agentera/capabilities/{profilera → profile}/schemas/exit.yaml +6 -5
  68. package/bundle/skills/agentera/capabilities/profile/schemas/triggers.yaml +20 -0
  69. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +115 -0
  70. package/bundle/skills/agentera/capabilities/research/schemas/artifacts.yaml +24 -0
  71. package/bundle/skills/agentera/capabilities/research/schemas/triggers.yaml +16 -0
  72. package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/validation.yaml +2 -2
  73. package/bundle/skills/agentera/capabilities/status/schemas/artifacts.yaml +73 -0
  74. package/bundle/skills/agentera/capabilities/status/schemas/triggers.yaml +22 -0
  75. package/bundle/skills/agentera/capabilities/{hej → status}/schemas/validation.yaml +5 -5
  76. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/artifacts.yaml +16 -16
  77. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/exit.yaml +7 -6
  78. package/bundle/skills/agentera/capabilities/vision/schemas/triggers.yaml +23 -0
  79. package/bundle/skills/agentera/capabilities/{visionera → vision}/schemas/validation.yaml +18 -20
  80. package/bundle/skills/agentera/capability_schema_contract.yaml +200 -37
  81. package/bundle/skills/agentera/protocol.yaml +31 -31
  82. package/bundle/skills/agentera/route-phrases.yaml +81 -0
  83. package/bundle/skills/agentera/schemas/artifacts/changelog.yaml +5 -4
  84. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +40 -22
  85. package/bundle/skills/agentera/schemas/artifacts/design.yaml +5 -4
  86. package/bundle/skills/agentera/schemas/artifacts/docs.yaml +15 -19
  87. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +145 -14
  88. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  89. package/bundle/skills/agentera/schemas/artifacts/health.yaml +58 -21
  90. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +22 -8
  91. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +421 -33
  92. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +143 -53
  93. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +345 -31
  94. package/bundle/skills/agentera/schemas/artifacts/vision.yaml +3 -3
  95. package/dist/analytics/extractCorpus/cli.js +190 -0
  96. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  97. package/dist/analytics/extractCorpus/core.js +392 -0
  98. package/dist/analytics/extractCorpus/corpus.js +167 -0
  99. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  100. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  101. package/dist/analytics/extractCorpus/evidenceTiers.js +603 -0
  102. package/dist/analytics/extractCorpus/extractCorpusParity.js +105 -0
  103. package/dist/analytics/extractCorpus/filesystemSources.js +118 -0
  104. package/dist/analytics/extractCorpus/index.js +14 -0
  105. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  106. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  107. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  108. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  109. package/dist/analytics/extractCorpus.js +2 -1791
  110. package/dist/analytics/glossaryAdviceResolution.js +166 -0
  111. package/dist/analytics/glossaryInputAcquisition.js +319 -0
  112. package/dist/analytics/personalGlossaryAdmission.js +133 -0
  113. package/dist/analytics/personalGlossaryProfile.js +219 -0
  114. package/dist/analytics/profileSignals.js +211 -0
  115. package/dist/analytics/usageStats.js +169 -42
  116. package/dist/audit/terminologyDrift.js +281 -0
  117. package/dist/bin/agentera.js +3 -2
  118. package/dist/capabilities/audit/instructions.js +16 -0
  119. package/dist/capabilities/build/instructions.js +56 -0
  120. package/dist/capabilities/design/instructions.js +4 -0
  121. package/dist/capabilities/discuss/instructions.js +29 -0
  122. package/dist/capabilities/document/instructions.js +11 -0
  123. package/dist/capabilities/index.js +40 -0
  124. package/dist/capabilities/optimize/instructions.js +14 -0
  125. package/dist/capabilities/orchestrate/instructions.js +40 -0
  126. package/dist/capabilities/plan/instructions.js +32 -0
  127. package/dist/capabilities/profile/instructions.js +70 -0
  128. package/dist/capabilities/research/instructions.js +5 -0
  129. package/dist/capabilities/status/instructions.js +11 -0
  130. package/dist/capabilities/status/startupInstructions.js +34 -0
  131. package/dist/capabilities/vision/instructions.js +4 -0
  132. package/dist/cli/appContext.js +30 -24
  133. package/dist/cli/argvalidate.js +0 -1
  134. package/dist/cli/capabilityContext/benchmark.js +565 -0
  135. package/dist/cli/capabilityContext/bespoke.js +44 -0
  136. package/dist/cli/capabilityContext/build.js +242 -0
  137. package/dist/cli/capabilityContext/closeout.js +233 -0
  138. package/dist/cli/capabilityContext/contract.js +179 -0
  139. package/dist/cli/capabilityContext/evidence.js +463 -0
  140. package/dist/cli/capabilityContext/index.js +3 -0
  141. package/dist/cli/capabilityContext/orchestration.js +131 -0
  142. package/dist/cli/capabilityContext/planState.js +260 -0
  143. package/dist/cli/capabilityContext/progress.js +142 -0
  144. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  145. package/dist/cli/capabilityContext/shared.js +83 -0
  146. package/dist/cli/capabilityContext/slim.js +152 -0
  147. package/dist/cli/capabilityContext/startup.js +150 -0
  148. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  149. package/dist/cli/capabilityContext/types.js +56 -0
  150. package/dist/cli/capabilityContext.js +1 -2421
  151. package/dist/cli/commands/appHome.js +22 -0
  152. package/dist/cli/commands/capability.js +5 -12
  153. package/dist/cli/commands/compact.js +41 -13
  154. package/dist/cli/commands/doctor.js +127 -97
  155. package/dist/cli/commands/durability.js +81 -0
  156. package/dist/cli/commands/glossaryAdvice.js +138 -0
  157. package/dist/cli/commands/lint.js +26 -44
  158. package/dist/cli/commands/personalGlossary.js +176 -0
  159. package/dist/cli/commands/prime/briefOrientation.js +747 -0
  160. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  161. package/dist/cli/commands/prime/bundleStatus.js +190 -0
  162. package/dist/cli/commands/prime/collectEntityOrientation.js +311 -0
  163. package/dist/cli/commands/prime/collectOrientationState.js +212 -0
  164. package/dist/cli/commands/prime/orientationOutput.js +397 -0
  165. package/dist/cli/commands/prime/types.js +1 -0
  166. package/dist/cli/commands/prime/v1Migration.js +38 -0
  167. package/dist/cli/commands/prime.js +80 -558
  168. package/dist/cli/commands/profileGrounding.js +55 -0
  169. package/dist/cli/commands/query.js +78 -53
  170. package/dist/cli/commands/report.js +96 -25
  171. package/dist/cli/commands/route.js +142 -0
  172. package/dist/cli/commands/schema.js +266 -143
  173. package/dist/cli/commands/state/decisions.js +387 -0
  174. package/dist/cli/commands/state/docs.js +70 -0
  175. package/dist/cli/commands/state/experimentRecords.js +151 -0
  176. package/dist/cli/commands/state/experiments.js +14 -0
  177. package/dist/cli/commands/state/get.js +129 -0
  178. package/dist/cli/commands/state/health.js +14 -0
  179. package/dist/cli/commands/state/index.js +16 -0
  180. package/dist/cli/commands/state/list.js +194 -0
  181. package/dist/cli/commands/state/objective.js +25 -0
  182. package/dist/cli/commands/state/plan.js +14 -0
  183. package/dist/cli/commands/state/planTasks.js +154 -0
  184. package/dist/cli/commands/state/plans.js +154 -0
  185. package/dist/cli/commands/state/progress.js +13 -0
  186. package/dist/cli/commands/state/shared.js +14 -0
  187. package/dist/cli/commands/state/todo.js +42 -0
  188. package/dist/cli/commands/state/write.js +434 -0
  189. package/dist/cli/commands/upgrade.js +146 -5
  190. package/dist/cli/commands/upgradeVerify.js +118 -0
  191. package/dist/cli/commands/validate.js +272 -213
  192. package/dist/cli/commands/verify.js +24 -9
  193. package/dist/cli/contracts/bundleStatus.js +1 -0
  194. package/dist/cli/contracts/orientationState.js +1 -0
  195. package/dist/cli/dispatch/argvParser.js +32 -0
  196. package/dist/cli/dispatch/check.js +372 -0
  197. package/dist/cli/dispatch/commands.js +27 -0
  198. package/dist/cli/dispatch/index.js +207 -0
  199. package/dist/cli/dispatch/lifecycle.js +652 -0
  200. package/dist/cli/dispatch/prime.js +139 -0
  201. package/dist/cli/dispatch/projections.js +17 -0
  202. package/dist/cli/dispatch/shared.js +63 -0
  203. package/dist/cli/dispatch/state.js +140 -0
  204. package/dist/cli/dispatch.js +1 -996
  205. package/dist/cli/errors.js +52 -0
  206. package/dist/cli/help.js +390 -43
  207. package/dist/cli/migrationRequired.js +87 -0
  208. package/dist/cli/orientation/attention.js +59 -0
  209. package/dist/cli/orientation/corpusCoverage.js +102 -0
  210. package/dist/cli/orientation.js +444 -173
  211. package/dist/cli/planArtifacts.js +350 -0
  212. package/dist/cli/planEvidence.js +157 -0
  213. package/dist/cli/planLifecycleState.js +36 -0
  214. package/dist/cli/planTaskIndex.js +11 -0
  215. package/dist/cli/preCutoverCommand.js +32 -0
  216. package/dist/cli/prime-blob.js +71 -3
  217. package/dist/cli/profileAcquisition.js +167 -0
  218. package/dist/cli/startupCompletenessContract.js +59 -0
  219. package/dist/cli/stateQuery.js +63 -14
  220. package/dist/cli/structured.js +0 -1
  221. package/dist/cli/todoMarkdown.js +46 -0
  222. package/dist/cli/todoReadinessSelection.js +192 -0
  223. package/dist/cli/todoSeverity.js +18 -0
  224. package/dist/core/atomicWriter.js +20 -0
  225. package/dist/core/developmentChannel.js +1 -0
  226. package/dist/core/developmentInvocation.js +374 -0
  227. package/dist/core/difflib.js +0 -1
  228. package/dist/core/envPaths.js +20 -0
  229. package/dist/core/jsonValue.js +5 -0
  230. package/dist/core/paths.js +0 -1
  231. package/dist/core/pyjson.js +67 -3
  232. package/dist/core/shell.js +4 -0
  233. package/dist/core/skillIdentity.js +23 -0
  234. package/dist/core/sourceRoot.js +9 -12
  235. package/dist/core/text.js +10 -0
  236. package/dist/core/toml.js +0 -1
  237. package/dist/core/yaml.js +8 -1
  238. package/dist/eval/evalSkills.js +30 -26
  239. package/dist/eval/hybridRouteEvaluation.js +155 -0
  240. package/dist/eval/semanticEval.js +43 -20
  241. package/dist/eval/semanticFixtures.js +16 -5
  242. package/dist/hooks/common.js +11 -81
  243. package/dist/hooks/compaction/apply.js +446 -0
  244. package/dist/hooks/compaction/dryRun.js +184 -0
  245. package/dist/hooks/compaction/index.js +22 -0
  246. package/dist/hooks/compaction/parse.js +325 -0
  247. package/dist/hooks/compaction/retention.js +202 -0
  248. package/dist/hooks/compaction/status.js +360 -0
  249. package/dist/hooks/compaction/types.js +5 -0
  250. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  251. package/dist/hooks/validateArtifact/index.js +92 -0
  252. package/dist/hooks/validateArtifact/markdown.js +145 -0
  253. package/dist/hooks/validateArtifact/schema.js +546 -0
  254. package/dist/hooks/validateArtifact/traversal.js +107 -0
  255. package/dist/hooks/validateArtifact/violations.js +107 -0
  256. package/dist/migrate/v2HandoffManifest.js +452 -0
  257. package/dist/registries/activationContract.js +2 -0
  258. package/dist/registries/activationTuples.js +106 -0
  259. package/dist/registries/artifactProtocolIds.js +78 -0
  260. package/dist/registries/artifactRegistry.js +224 -63
  261. package/dist/registries/artifactSchemaProjection.js +45 -0
  262. package/dist/registries/capabilityContract.js +141 -13
  263. package/dist/registries/evaluatorHandoffContract.js +170 -0
  264. package/dist/registries/evidenceTierContract.js +371 -0
  265. package/dist/registries/glossaryAdviceContract.js +79 -0
  266. package/dist/registries/glossaryCaveatContract.js +67 -0
  267. package/dist/registries/glossaryConsumerContractValidation.js +787 -0
  268. package/dist/registries/glossaryEntryContract.js +757 -0
  269. package/dist/registries/glossaryTermIdentity.js +17 -0
  270. package/dist/registries/glossaryTermOccurrence.js +20 -0
  271. package/dist/registries/hybridRoute.js +274 -0
  272. package/dist/registries/hybridRouteReceipt.js +221 -0
  273. package/dist/registries/packagePublication.js +229 -0
  274. package/dist/registries/packageRegistry.js +187 -211
  275. package/dist/registries/todoReadinessContract.js +448 -0
  276. package/dist/registries/triggerLoader.js +174 -0
  277. package/dist/registries/verbosityBudgetContract.js +205 -0
  278. package/dist/release/releaseMetadata.js +385 -0
  279. package/dist/runtime/lifecycleAdapterContract.js +457 -0
  280. package/dist/runtime/lifecycleAdapters.js +777 -0
  281. package/dist/runtime/lifecycleAuthority.js +453 -0
  282. package/dist/runtime/lifecycleOperationContract.js +123 -0
  283. package/dist/runtime/lifecycleOperations.js +634 -0
  284. package/dist/runtime/lifecycleOwnershipJournal.js +622 -0
  285. package/dist/runtime/lifecyclePublication.js +415 -0
  286. package/dist/runtime/lifecycleSnapshot.js +438 -0
  287. package/dist/runtime/nativeResourceCleanup.js +502 -0
  288. package/dist/setup/opencode.js +20 -0
  289. package/dist/setup/opencodeConstants.js +1 -0
  290. package/dist/setup/sharedSkill.js +45 -0
  291. package/dist/setup/smokeChecks.js +21 -82
  292. package/dist/state/archiveDiscovery.js +580 -0
  293. package/dist/state/archivePublication.js +225 -0
  294. package/dist/state/archiveRecovery.js +237 -0
  295. package/dist/state/archiveReplay.js +53 -0
  296. package/dist/state/canonicalMigrationRecord.js +36 -0
  297. package/dist/state/changelog.js +221 -0
  298. package/dist/state/decisionEntities.js +367 -0
  299. package/dist/state/decisionLegacyValidation.js +215 -0
  300. package/dist/state/decisionMigrationProvenance.js +199 -0
  301. package/dist/state/decisionOverlay.js +254 -0
  302. package/dist/state/decisionRevision.js +256 -0
  303. package/dist/state/decisionRevisionMigration.js +89 -0
  304. package/dist/state/directRetrieval.js +323 -0
  305. package/dist/state/durability.js +324 -0
  306. package/dist/state/entityCutover.js +459 -0
  307. package/dist/state/entityCutoverGit.js +127 -0
  308. package/dist/state/entityGlossaryAuthority.js +13 -0
  309. package/dist/state/entityListProjection.js +187 -0
  310. package/dist/state/entityListRuntimeRegistry.js +85 -0
  311. package/dist/state/entityMigrationCausality.js +97 -0
  312. package/dist/state/entityMigrationIdentity.js +5 -0
  313. package/dist/state/entityMigrationPreview.js +846 -0
  314. package/dist/state/entityMigrationTodo.js +133 -0
  315. package/dist/state/entityPublicationContext.js +806 -0
  316. package/dist/state/entityRetrievalHelp.js +506 -0
  317. package/dist/state/entityStorage.js +896 -0
  318. package/dist/state/exactReplacementRecovery.js +18 -0
  319. package/dist/state/experimentArchive.js +63 -0
  320. package/dist/state/experimentIdentity.js +202 -0
  321. package/dist/state/healthEntities.js +262 -0
  322. package/dist/state/healthEntityValidation.js +18 -0
  323. package/dist/state/healthRepair.js +69 -0
  324. package/dist/state/installRoot.js +64 -25
  325. package/dist/state/legacyEntityCutoverEvidence.js +65 -0
  326. package/dist/state/legacyIdentity.js +47 -0
  327. package/dist/state/legacySummaryRecord.js +6 -0
  328. package/dist/state/listAccounting.js +54 -0
  329. package/dist/state/listClassification.js +17 -0
  330. package/dist/state/listCursor.js +42 -0
  331. package/dist/state/listRetrieval.js +781 -0
  332. package/dist/state/migrationSourceBinding.js +30 -0
  333. package/dist/state/objectiveExperimentEntities.js +322 -0
  334. package/dist/state/planEntities.js +530 -0
  335. package/dist/state/planIdentity.js +47 -0
  336. package/dist/state/planRetrieval.js +313 -0
  337. package/dist/state/planTaskRetrieval.js +294 -0
  338. package/dist/state/progressEntities.js +512 -0
  339. package/dist/state/progressGlossaryCaveat.js +168 -0
  340. package/dist/state/progressPublicationOrder.js +19 -0
  341. package/dist/state/projectRoot.js +62 -0
  342. package/dist/state/projectionPolicy.js +190 -0
  343. package/dist/state/retrievalAuthority.js +156 -0
  344. package/dist/state/safeProjectFile.js +155 -0
  345. package/dist/state/startupAnalysis/benchmark.js +432 -0
  346. package/dist/state/startupAnalysis/contract.js +160 -0
  347. package/dist/state/startupAnalysis/helpers.js +286 -0
  348. package/dist/state/startupAnalysis/index.js +6 -0
  349. package/dist/state/startupAnalysis/metrics.js +340 -0
  350. package/dist/state/startupAnalysis/records.js +198 -0
  351. package/dist/state/startupAnalysis/report.js +111 -0
  352. package/dist/state/startupAnalysis/threshold.js +512 -0
  353. package/dist/state/startupAnalysis.js +2 -1953
  354. package/dist/state/startupProjection.js +499 -0
  355. package/dist/state/stateMode.js +85 -0
  356. package/dist/state/stateStorageAuthority.js +47 -0
  357. package/dist/state/summaryEntityRead.js +25 -0
  358. package/dist/state/summaryMigrationProvenance.js +66 -0
  359. package/dist/state/summarySourceRowAuthority.js +36 -0
  360. package/dist/state/todoDocsEntities.js +1064 -0
  361. package/dist/state/todoDocsEntityValidation.js +158 -0
  362. package/dist/state/todoMarkdownProjection.js +51 -0
  363. package/dist/state/todoReconciliationActivation.js +132 -0
  364. package/dist/state/todoReconciliationInspection.js +173 -0
  365. package/dist/state/todoReconciliationRepair.js +170 -0
  366. package/dist/state/todoReconciliationTransaction.js +582 -0
  367. package/dist/state/write/assign.js +20 -0
  368. package/dist/state/write/candidateMutation.js +269 -0
  369. package/dist/state/write/errors.js +11 -0
  370. package/dist/state/write/experimentPublication.js +192 -0
  371. package/dist/state/write/explain.js +332 -0
  372. package/dist/state/write/fields.js +61 -0
  373. package/dist/state/write/glossaryPublication.js +263 -0
  374. package/dist/state/write/grammar.js +280 -0
  375. package/dist/state/write/helpers.js +29 -0
  376. package/dist/state/write/index.js +12 -0
  377. package/dist/state/write/input.js +367 -0
  378. package/dist/state/write/lock.js +837 -0
  379. package/dist/state/write/mutation.js +234 -0
  380. package/dist/state/write/operations.js +169 -0
  381. package/dist/state/write/planEvaluation.js +128 -0
  382. package/dist/state/write/planPublication.js +179 -0
  383. package/dist/state/write/runtimeOperations.js +142 -0
  384. package/dist/state/write/serialize.js +1 -0
  385. package/dist/state/write/transaction.js +52 -0
  386. package/dist/state/write/validate.js +7 -0
  387. package/dist/upgrade/appContentRefresh.js +383 -0
  388. package/dist/upgrade/appModel.js +8 -7
  389. package/dist/upgrade/atomicWriter.js +1 -0
  390. package/dist/upgrade/bundleEvidence.js +33 -0
  391. package/dist/upgrade/channels.js +12 -8
  392. package/dist/upgrade/compatibility.js +56 -21
  393. package/dist/upgrade/doctor.js +197 -192
  394. package/dist/upgrade/doctorClassifier.js +187 -0
  395. package/dist/upgrade/installedHooksRetirement.js +196 -0
  396. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  397. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  398. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  399. package/dist/upgrade/migrationPublication.js +122 -0
  400. package/dist/upgrade/nextMajorDoctor.js +155 -0
  401. package/dist/upgrade/npxPlatformStatus.js +22 -0
  402. package/dist/upgrade/projectIntegration.js +145 -187
  403. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  404. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  405. package/dist/upgrade/runtimeMigration.js +278 -352
  406. package/dist/upgrade/upgradeCommands.js +14 -1
  407. package/dist/upgrade/upgradeLock.js +85 -0
  408. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  409. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  410. package/dist/upgrade/versionResolution.js +12 -5
  411. package/dist/validate/activationArtifactEvidence.js +844 -0
  412. package/dist/validate/activationConjunction.js +816 -0
  413. package/dist/validate/activationEvidenceManifest.js +515 -0
  414. package/dist/validate/activationPackageSemantics.js +29 -0
  415. package/dist/validate/appHomeContract.js +5 -11
  416. package/dist/validate/bootstrapAuthority.js +44 -0
  417. package/dist/validate/capability.js +144 -15
  418. package/dist/validate/crossCapability.js +15 -10
  419. package/dist/validate/retainedReferenceAuthority.js +879 -0
  420. package/dist/validate/selfAudit.js +73 -37
  421. package/dist/validate/v1LegacyCruft.js +131 -0
  422. package/dist/validate/vocabularyAuthority.js +303 -0
  423. package/package.json +53 -27
  424. package/bundle/references/adapters/cursor.md +0 -213
  425. package/bundle/references/adapters/opencode.md +0 -530
  426. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  427. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  428. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  429. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  430. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  431. package/bundle/references/analysis/benchmark.md +0 -267
  432. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  433. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  434. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  435. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  436. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  437. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  438. package/bundle/references/meta/documentation-inventory.md +0 -43
  439. package/bundle/references/v1-section-mapping.md +0 -47
  440. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  441. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  442. package/bundle/skills/agentera/agents/hej.toml +0 -6
  443. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  444. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  445. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  446. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  447. package/bundle/skills/agentera/agents/planera.toml +0 -6
  448. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  449. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  450. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  451. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  452. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  453. package/bundle/skills/agentera/capabilities/dokumentera/instructions.md +0 -428
  454. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  456. package/bundle/skills/agentera/capabilities/hej/instructions.md +0 -331
  457. package/bundle/skills/agentera/capabilities/hej/schemas/artifacts.yaml +0 -69
  458. package/bundle/skills/agentera/capabilities/hej/schemas/triggers.yaml +0 -58
  459. package/bundle/skills/agentera/capabilities/inspektera/instructions.md +0 -514
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/artifacts.yaml +0 -76
  461. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  462. package/bundle/skills/agentera/capabilities/inspirera/instructions.md +0 -280
  463. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  464. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  465. package/bundle/skills/agentera/capabilities/optimera/instructions.md +0 -437
  466. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  467. package/bundle/skills/agentera/capabilities/orkestrera/instructions.md +0 -433
  468. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  469. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  470. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -107
  471. package/bundle/skills/agentera/capabilities/planera/instructions.md +0 -368
  472. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  473. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  474. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  475. package/bundle/skills/agentera/capabilities/profilera/instructions.md +0 -419
  476. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  477. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  478. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  479. package/bundle/skills/agentera/capabilities/realisera/instructions.md +0 -403
  480. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  481. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  482. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  483. package/bundle/skills/agentera/capabilities/resonera/instructions.md +0 -329
  484. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  485. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  486. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  487. package/bundle/skills/agentera/capabilities/visionera/instructions.md +0 -309
  488. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  489. package/bundle/skills/agentera/capabilities/visualisera/instructions.md +0 -400
  490. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  491. package/bundle/skills/agentera/references/contract.md +0 -1039
  492. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  493. package/bundle/skills/hej/SKILL.md +0 -69
  494. package/bundle/skills/hej/agents/hej.toml +0 -11
  495. package/bundle/skills/hej/agents/openai.yaml +0 -8
  496. package/dist/analytics/extractCorpus.js.map +0 -1
  497. package/dist/analytics/usageStats.js.map +0 -1
  498. package/dist/bin/agentera.js.map +0 -1
  499. package/dist/cli/appContext.js.map +0 -1
  500. package/dist/cli/argvalidate.js.map +0 -1
  501. package/dist/cli/capabilityContext.js.map +0 -1
  502. package/dist/cli/commands/backfill.js +0 -84
  503. package/dist/cli/commands/backfill.js.map +0 -1
  504. package/dist/cli/commands/capability.js.map +0 -1
  505. package/dist/cli/commands/compact.js.map +0 -1
  506. package/dist/cli/commands/doctor.js.map +0 -1
  507. package/dist/cli/commands/lint.js.map +0 -1
  508. package/dist/cli/commands/prime.js.map +0 -1
  509. package/dist/cli/commands/query.js.map +0 -1
  510. package/dist/cli/commands/report.js.map +0 -1
  511. package/dist/cli/commands/schema.js.map +0 -1
  512. package/dist/cli/commands/state.js +0 -1012
  513. package/dist/cli/commands/state.js.map +0 -1
  514. package/dist/cli/commands/upgrade.js.map +0 -1
  515. package/dist/cli/commands/validate.js.map +0 -1
  516. package/dist/cli/commands/verify.js.map +0 -1
  517. package/dist/cli/dispatch.js.map +0 -1
  518. package/dist/cli/help.js.map +0 -1
  519. package/dist/cli/orientation.js.map +0 -1
  520. package/dist/cli/prime-blob.js.map +0 -1
  521. package/dist/cli/stateQuery.js.map +0 -1
  522. package/dist/cli/structured.js.map +0 -1
  523. package/dist/core/difflib.js.map +0 -1
  524. package/dist/core/git.js +0 -43
  525. package/dist/core/git.js.map +0 -1
  526. package/dist/core/paths.js.map +0 -1
  527. package/dist/core/pyjson.js.map +0 -1
  528. package/dist/core/sourceRoot.js.map +0 -1
  529. package/dist/core/toml.js.map +0 -1
  530. package/dist/core/yaml.js.map +0 -1
  531. package/dist/eval/evalSkills.js.map +0 -1
  532. package/dist/eval/semanticEval.js.map +0 -1
  533. package/dist/eval/semanticFixtures.js.map +0 -1
  534. package/dist/hooks/common.js.map +0 -1
  535. package/dist/hooks/compaction.js +0 -935
  536. package/dist/hooks/compaction.js.map +0 -1
  537. package/dist/hooks/cursorPreToolUse.js +0 -19
  538. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  539. package/dist/hooks/cursorSessionStart.js +0 -71
  540. package/dist/hooks/cursorSessionStart.js.map +0 -1
  541. package/dist/hooks/sessionStart.js +0 -209
  542. package/dist/hooks/sessionStart.js.map +0 -1
  543. package/dist/hooks/sessionStop.js +0 -212
  544. package/dist/hooks/sessionStop.js.map +0 -1
  545. package/dist/hooks/validateArtifact.js +0 -933
  546. package/dist/hooks/validateArtifact.js.map +0 -1
  547. package/dist/registries/artifactRegistry.js.map +0 -1
  548. package/dist/registries/capabilityContract.js.map +0 -1
  549. package/dist/registries/packageRegistry.js.map +0 -1
  550. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  551. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  552. package/dist/setup/codex.js +0 -1056
  553. package/dist/setup/codex.js.map +0 -1
  554. package/dist/setup/copilot.js +0 -227
  555. package/dist/setup/copilot.js.map +0 -1
  556. package/dist/setup/cursor.js +0 -127
  557. package/dist/setup/cursor.js.map +0 -1
  558. package/dist/setup/doctor.js +0 -1297
  559. package/dist/setup/doctor.js.map +0 -1
  560. package/dist/setup/smokeChecks.js.map +0 -1
  561. package/dist/state/installRoot.js.map +0 -1
  562. package/dist/state/progressCommit.js +0 -289
  563. package/dist/state/progressCommit.js.map +0 -1
  564. package/dist/state/startupAnalysis.js.map +0 -1
  565. package/dist/upgrade/appModel.js.map +0 -1
  566. package/dist/upgrade/channels.js.map +0 -1
  567. package/dist/upgrade/compatibility.js.map +0 -1
  568. package/dist/upgrade/doctor.js.map +0 -1
  569. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -571
  570. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  571. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  572. package/dist/upgrade/projectIntegration.js.map +0 -1
  573. package/dist/upgrade/runtimeMigration.js.map +0 -1
  574. package/dist/upgrade/upgradeCommands.js.map +0 -1
  575. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  576. package/dist/upgrade/versionResolution.js.map +0 -1
  577. package/dist/validate/appHomeContract.js.map +0 -1
  578. package/dist/validate/capability.js.map +0 -1
  579. package/dist/validate/crossCapability.js.map +0 -1
  580. package/dist/validate/lifecycleAdapters.js +0 -772
  581. package/dist/validate/lifecycleAdapters.js.map +0 -1
  582. package/dist/validate/selfAudit.js.map +0 -1
  583. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  584. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  585. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,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
+ }