agentera 3.0.0-dev.5 → 3.0.0-dev.51

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 (598) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +119 -22
  3. package/bundle/CHANGELOG.md +1351 -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 +236 -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 +437 -0
  11. package/bundle/references/adapters/package-registry.yaml +435 -189
  12. package/bundle/references/adapters/package-surface-characterization.md +66 -35
  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 +191 -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 +3022 -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 -1
  29. package/bundle/references/cli/vocabulary-index.yaml +20 -17
  30. package/bundle/references/cli/vocabulary.md +326 -361
  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 +224 -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 +102 -0
  39. package/bundle/skills/agentera/capabilities/{realisera → build}/schemas/exit.yaml +6 -5
  40. package/bundle/skills/agentera/capabilities/build/schemas/triggers.yaml +27 -0
  41. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +176 -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 +458 -36
  91. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +128 -17
  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 +190 -0
  95. package/dist/analytics/extractCorpus/copilotSessions.js +275 -0
  96. package/dist/analytics/extractCorpus/core.js +392 -0
  97. package/dist/analytics/extractCorpus/corpus.js +167 -0
  98. package/dist/analytics/extractCorpus/coverageAudit.js +260 -0
  99. package/dist/analytics/extractCorpus/cursorSessions.js +425 -0
  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 +118 -0
  103. package/dist/analytics/extractCorpus/index.js +14 -0
  104. package/dist/analytics/extractCorpus/jsonlSessions.js +204 -0
  105. package/dist/analytics/extractCorpus/sqliteCaps.js +43 -0
  106. package/dist/analytics/extractCorpus/sqliteSessions.js +367 -0
  107. package/dist/analytics/extractCorpus/tierReader.js +108 -0
  108. package/dist/analytics/extractCorpus.js +2 -1791
  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 +56 -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 +565 -0
  134. package/dist/cli/capabilityContext/bespoke.js +44 -0
  135. package/dist/cli/capabilityContext/build.js +242 -0
  136. package/dist/cli/capabilityContext/closeout.js +233 -0
  137. package/dist/cli/capabilityContext/contract.js +179 -0
  138. package/dist/cli/capabilityContext/evidence.js +463 -0
  139. package/dist/cli/capabilityContext/index.js +3 -0
  140. package/dist/cli/capabilityContext/orchestration.js +131 -0
  141. package/dist/cli/capabilityContext/planState.js +260 -0
  142. package/dist/cli/capabilityContext/progress.js +142 -0
  143. package/dist/cli/capabilityContext/projectVerification.js +409 -0
  144. package/dist/cli/capabilityContext/shared.js +83 -0
  145. package/dist/cli/capabilityContext/slim.js +152 -0
  146. package/dist/cli/capabilityContext/startup.js +150 -0
  147. package/dist/cli/capabilityContext/startupAggregation.js +68 -0
  148. package/dist/cli/capabilityContext/types.js +56 -0
  149. package/dist/cli/capabilityContext.js +1 -2487
  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 +164 -14
  153. package/dist/cli/commands/doctor.js +122 -97
  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 +26 -44
  157. package/dist/cli/commands/personalGlossary.js +176 -0
  158. package/dist/cli/commands/prime/briefOrientation.js +747 -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 +212 -0
  163. package/dist/cli/commands/prime/orientationOutput.js +399 -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 +78 -53
  169. package/dist/cli/commands/report.js +96 -25
  170. package/dist/cli/commands/route.js +142 -0
  171. package/dist/cli/commands/schema.js +266 -143
  172. package/dist/cli/commands/state/decisions.js +387 -0
  173. package/dist/cli/commands/state/docs.js +70 -0
  174. package/dist/cli/commands/state/experimentRecords.js +151 -0
  175. package/dist/cli/commands/state/experiments.js +14 -0
  176. package/dist/cli/commands/state/get.js +129 -0
  177. package/dist/cli/commands/state/health.js +14 -0
  178. package/dist/cli/commands/state/index.js +16 -0
  179. package/dist/cli/commands/state/list.js +194 -0
  180. package/dist/cli/commands/state/objective.js +25 -0
  181. package/dist/cli/commands/state/plan.js +14 -0
  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 +13 -0
  185. package/dist/cli/commands/state/shared.js +14 -0
  186. package/dist/cli/commands/state/todo.js +42 -0
  187. package/dist/cli/commands/state/write.js +430 -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 +272 -223
  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 +372 -0
  196. package/dist/cli/dispatch/commands.js +27 -0
  197. package/dist/cli/dispatch/index.js +207 -0
  198. package/dist/cli/dispatch/lifecycle.js +652 -0
  199. package/dist/cli/dispatch/prime.js +139 -0
  200. package/dist/cli/dispatch/projections.js +17 -0
  201. package/dist/cli/dispatch/shared.js +63 -0
  202. package/dist/cli/dispatch/state.js +140 -0
  203. package/dist/cli/dispatch.js +1 -1294
  204. package/dist/cli/errors.js +16 -17
  205. package/dist/cli/help.js +394 -43
  206. package/dist/cli/migrationRequired.js +87 -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 +11 -79
  242. package/dist/hooks/compaction/apply.js +446 -0
  243. package/dist/hooks/compaction/dryRun.js +184 -0
  244. package/dist/hooks/compaction/index.js +22 -0
  245. package/dist/hooks/compaction/parse.js +325 -0
  246. package/dist/hooks/compaction/retention.js +202 -0
  247. package/dist/hooks/compaction/status.js +360 -0
  248. package/dist/hooks/compaction/types.js +5 -0
  249. package/dist/hooks/validateArtifact/agentFacing.js +9 -0
  250. package/dist/hooks/validateArtifact/index.js +92 -0
  251. package/dist/hooks/validateArtifact/markdown.js +145 -0
  252. package/dist/hooks/validateArtifact/schema.js +546 -0
  253. package/dist/hooks/validateArtifact/traversal.js +107 -0
  254. package/dist/hooks/validateArtifact/violations.js +107 -0
  255. package/dist/migrate/v2HandoffManifest.js +452 -0
  256. package/dist/registries/activationContract.js +2 -0
  257. package/dist/registries/activationTuples.js +107 -0
  258. package/dist/registries/artifactProtocolIds.js +78 -0
  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 +229 -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 +385 -0
  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 -0
  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 +846 -0
  313. package/dist/state/entityMigrationTodo.js +133 -0
  314. package/dist/state/entityPublicationContext.js +806 -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 +982 -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/projectRoot.js +62 -0
  343. package/dist/state/projectionPolicy.js +190 -0
  344. package/dist/state/retrievalAuthority.js +156 -0
  345. package/dist/state/safeProjectFile.js +155 -0
  346. package/dist/state/startupAnalysis/benchmark.js +432 -0
  347. package/dist/state/startupAnalysis/contract.js +160 -0
  348. package/dist/state/startupAnalysis/helpers.js +286 -0
  349. package/dist/state/startupAnalysis/index.js +6 -0
  350. package/dist/state/startupAnalysis/metrics.js +340 -0
  351. package/dist/state/startupAnalysis/records.js +198 -0
  352. package/dist/state/startupAnalysis/report.js +111 -0
  353. package/dist/state/startupAnalysis/threshold.js +512 -0
  354. package/dist/state/startupAnalysis.js +2 -1953
  355. package/dist/state/startupProjection.js +499 -0
  356. package/dist/state/stateMode.js +85 -0
  357. package/dist/state/stateStorageAuthority.js +47 -0
  358. package/dist/state/summaryEntityRead.js +25 -0
  359. package/dist/state/summaryMigrationProvenance.js +66 -0
  360. package/dist/state/summarySourceRowAuthority.js +36 -0
  361. package/dist/state/todoActivationSafety.js +58 -0
  362. package/dist/state/todoDocsEntities.js +1069 -0
  363. package/dist/state/todoDocsEntityValidation.js +158 -0
  364. package/dist/state/todoMarkdownProjection.js +51 -0
  365. package/dist/state/todoReconciliationActivation.js +140 -0
  366. package/dist/state/todoReconciliationInspection.js +169 -0
  367. package/dist/state/todoReconciliationRepair.js +170 -0
  368. package/dist/state/todoReconciliationTransaction.js +582 -0
  369. package/dist/state/write/assign.js +20 -0
  370. package/dist/state/write/candidateMutation.js +269 -0
  371. package/dist/state/write/errors.js +11 -0
  372. package/dist/state/write/experimentPublication.js +192 -0
  373. package/dist/state/write/explain.js +363 -0
  374. package/dist/state/write/fields.js +61 -0
  375. package/dist/state/write/glossaryPublication.js +263 -0
  376. package/dist/state/write/grammar.js +285 -0
  377. package/dist/state/write/helpers.js +29 -0
  378. package/dist/state/write/index.js +12 -0
  379. package/dist/state/write/input.js +367 -0
  380. package/dist/state/write/lock.js +837 -0
  381. package/dist/state/write/mutation.js +234 -0
  382. package/dist/state/write/operations.js +170 -0
  383. package/dist/state/write/planEvaluation.js +128 -0
  384. package/dist/state/write/planPublication.js +179 -0
  385. package/dist/state/write/runtimeOperations.js +144 -0
  386. package/dist/state/write/serialize.js +1 -0
  387. package/dist/state/write/transaction.js +52 -0
  388. package/dist/state/write/validate.js +7 -0
  389. package/dist/upgrade/appContentRefresh.js +383 -0
  390. package/dist/upgrade/appModel.js +8 -7
  391. package/dist/upgrade/atomicWriter.js +1 -0
  392. package/dist/upgrade/bundleEvidence.js +33 -0
  393. package/dist/upgrade/channels.js +12 -8
  394. package/dist/upgrade/compatibility.js +56 -21
  395. package/dist/upgrade/doctor.js +197 -192
  396. package/dist/upgrade/doctorClassifier.js +187 -0
  397. package/dist/upgrade/installedHooksRetirement.js +196 -0
  398. package/dist/upgrade/legacyAgentCleanup.js +282 -0
  399. package/dist/upgrade/lifecycleUpgrade.js +113 -0
  400. package/dist/upgrade/migrateArtifactsV2ToV3.js +367 -149
  401. package/dist/upgrade/migrationPublication.js +122 -0
  402. package/dist/upgrade/nextMajorDoctor.js +42 -8
  403. package/dist/upgrade/npxPlatformStatus.js +22 -0
  404. package/dist/upgrade/projectIntegration.js +145 -187
  405. package/dist/upgrade/projectIntegrationDecision.js +50 -0
  406. package/dist/upgrade/retiredResourceDiagnostics.js +117 -0
  407. package/dist/upgrade/runtimeMigration.js +273 -363
  408. package/dist/upgrade/upgradeCommands.js +14 -1
  409. package/dist/upgrade/upgradeLock.js +85 -0
  410. package/dist/upgrade/upgradeOrchestrator.js +263 -59
  411. package/dist/upgrade/v3CapabilitySurface.js +14 -0
  412. package/dist/upgrade/versionResolution.js +8 -1
  413. package/dist/validate/activationArtifactEvidence.js +844 -0
  414. package/dist/validate/activationConjunction.js +816 -0
  415. package/dist/validate/activationEvidenceManifest.js +515 -0
  416. package/dist/validate/activationPackageSemantics.js +29 -0
  417. package/dist/validate/appHomeContract.js +5 -11
  418. package/dist/validate/bootstrapAuthority.js +44 -0
  419. package/dist/validate/capability.js +133 -12
  420. package/dist/validate/crossCapability.js +15 -10
  421. package/dist/validate/retainedReferenceAuthority.js +879 -0
  422. package/dist/validate/selfAudit.js +73 -37
  423. package/dist/validate/v1LegacyCruft.js +131 -0
  424. package/dist/validate/vocabularyAuthority.js +303 -0
  425. package/package.json +53 -27
  426. package/bundle/references/adapters/cursor.md +0 -213
  427. package/bundle/references/adapters/opencode.md +0 -530
  428. package/bundle/references/adapters/package-manifest-interface-model.yaml +0 -337
  429. package/bundle/references/adapters/runtime-adapter-characterization.md +0 -79
  430. package/bundle/references/adapters/runtime-adapter-interface-model.yaml +0 -200
  431. package/bundle/references/adapters/runtime-adapter-registry.yaml +0 -548
  432. package/bundle/references/adapters/runtime-feature-parity.md +0 -189
  433. package/bundle/references/analysis/benchmark.md +0 -267
  434. package/bundle/references/analysis/startup-measurement-contract.yaml +0 -424
  435. package/bundle/references/cli/agent-ready-state-contract.yaml +0 -953
  436. package/bundle/references/cli/audience-namespace-cli-migration.yaml +0 -355
  437. package/bundle/references/cli/bundle-skill-vocabulary.yaml +0 -278
  438. package/bundle/references/cli/capability-tool-classification.yaml +0 -53
  439. package/bundle/references/cli/routing-execution-vocabulary.yaml +0 -281
  440. package/bundle/references/meta/documentation-inventory.md +0 -43
  441. package/bundle/references/v1-section-mapping.md +0 -47
  442. package/bundle/skills/agentera/.claude-plugin/plugin.json +0 -27
  443. package/bundle/skills/agentera/agents/dokumentera.toml +0 -6
  444. package/bundle/skills/agentera/agents/hej.toml +0 -6
  445. package/bundle/skills/agentera/agents/inspektera.toml +0 -6
  446. package/bundle/skills/agentera/agents/inspirera.toml +0 -6
  447. package/bundle/skills/agentera/agents/optimera.toml +0 -6
  448. package/bundle/skills/agentera/agents/orkestrera.toml +0 -6
  449. package/bundle/skills/agentera/agents/planera.toml +0 -6
  450. package/bundle/skills/agentera/agents/profilera.toml +0 -6
  451. package/bundle/skills/agentera/agents/realisera.toml +0 -6
  452. package/bundle/skills/agentera/agents/resonera.toml +0 -6
  453. package/bundle/skills/agentera/agents/visionera.toml +0 -6
  454. package/bundle/skills/agentera/agents/visualisera.toml +0 -6
  455. package/bundle/skills/agentera/capabilities/dokumentera/schemas/artifacts.yaml +0 -73
  456. package/bundle/skills/agentera/capabilities/dokumentera/schemas/triggers.yaml +0 -35
  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/schemas/artifacts.yaml +0 -76
  460. package/bundle/skills/agentera/capabilities/inspektera/schemas/triggers.yaml +0 -38
  461. package/bundle/skills/agentera/capabilities/inspirera/schemas/artifacts.yaml +0 -24
  462. package/bundle/skills/agentera/capabilities/inspirera/schemas/triggers.yaml +0 -34
  463. package/bundle/skills/agentera/capabilities/optimera/schemas/triggers.yaml +0 -39
  464. package/bundle/skills/agentera/capabilities/orkestrera/schemas/artifacts.yaml +0 -64
  465. package/bundle/skills/agentera/capabilities/orkestrera/schemas/triggers.yaml +0 -42
  466. package/bundle/skills/agentera/capabilities/orkestrera/schemas/validation.yaml +0 -120
  467. package/bundle/skills/agentera/capabilities/planera/schemas/artifacts.yaml +0 -62
  468. package/bundle/skills/agentera/capabilities/planera/schemas/triggers.yaml +0 -34
  469. package/bundle/skills/agentera/capabilities/planera/schemas/validation.yaml +0 -61
  470. package/bundle/skills/agentera/capabilities/profilera/schemas/artifacts.yaml +0 -18
  471. package/bundle/skills/agentera/capabilities/profilera/schemas/triggers.yaml +0 -45
  472. package/bundle/skills/agentera/capabilities/profilera/schemas/validation.yaml +0 -57
  473. package/bundle/skills/agentera/capabilities/realisera/schemas/artifacts.yaml +0 -80
  474. package/bundle/skills/agentera/capabilities/realisera/schemas/triggers.yaml +0 -39
  475. package/bundle/skills/agentera/capabilities/realisera/schemas/validation.yaml +0 -110
  476. package/bundle/skills/agentera/capabilities/resonera/schemas/artifacts.yaml +0 -47
  477. package/bundle/skills/agentera/capabilities/resonera/schemas/triggers.yaml +0 -46
  478. package/bundle/skills/agentera/capabilities/resonera/schemas/validation.yaml +0 -77
  479. package/bundle/skills/agentera/capabilities/visionera/schemas/triggers.yaml +0 -41
  480. package/bundle/skills/agentera/capabilities/visualisera/schemas/triggers.yaml +0 -33
  481. package/bundle/skills/agentera/references/contract.md +0 -1039
  482. package/bundle/skills/hej/.claude-plugin/plugin.json +0 -6
  483. package/bundle/skills/hej/SKILL.md +0 -69
  484. package/bundle/skills/hej/agents/hej.toml +0 -11
  485. package/bundle/skills/hej/agents/openai.yaml +0 -8
  486. package/dist/analytics/extractCorpus.js.map +0 -1
  487. package/dist/analytics/usageStats.js.map +0 -1
  488. package/dist/bin/agentera.js.map +0 -1
  489. package/dist/capabilities/dokumentera/instructions.js +0 -6
  490. package/dist/capabilities/dokumentera/instructions.js.map +0 -1
  491. package/dist/capabilities/hej/instructions.js +0 -6
  492. package/dist/capabilities/hej/instructions.js.map +0 -1
  493. package/dist/capabilities/index.js.map +0 -1
  494. package/dist/capabilities/inspektera/instructions.js +0 -6
  495. package/dist/capabilities/inspektera/instructions.js.map +0 -1
  496. package/dist/capabilities/inspirera/instructions.js +0 -6
  497. package/dist/capabilities/inspirera/instructions.js.map +0 -1
  498. package/dist/capabilities/optimera/instructions.js +0 -6
  499. package/dist/capabilities/optimera/instructions.js.map +0 -1
  500. package/dist/capabilities/orkestrera/instructions.js +0 -6
  501. package/dist/capabilities/orkestrera/instructions.js.map +0 -1
  502. package/dist/capabilities/planera/instructions.js +0 -6
  503. package/dist/capabilities/planera/instructions.js.map +0 -1
  504. package/dist/capabilities/profilera/instructions.js +0 -6
  505. package/dist/capabilities/profilera/instructions.js.map +0 -1
  506. package/dist/capabilities/realisera/instructions.js +0 -6
  507. package/dist/capabilities/realisera/instructions.js.map +0 -1
  508. package/dist/capabilities/resonera/instructions.js +0 -6
  509. package/dist/capabilities/resonera/instructions.js.map +0 -1
  510. package/dist/capabilities/visionera/instructions.js +0 -6
  511. package/dist/capabilities/visionera/instructions.js.map +0 -1
  512. package/dist/capabilities/visualisera/instructions.js +0 -6
  513. package/dist/capabilities/visualisera/instructions.js.map +0 -1
  514. package/dist/cli/appContext.js.map +0 -1
  515. package/dist/cli/argvalidate.js.map +0 -1
  516. package/dist/cli/capabilityContext.js.map +0 -1
  517. package/dist/cli/commands/capability.js.map +0 -1
  518. package/dist/cli/commands/compact.js.map +0 -1
  519. package/dist/cli/commands/doctor.js.map +0 -1
  520. package/dist/cli/commands/lint.js.map +0 -1
  521. package/dist/cli/commands/prime.js.map +0 -1
  522. package/dist/cli/commands/query.js.map +0 -1
  523. package/dist/cli/commands/report.js.map +0 -1
  524. package/dist/cli/commands/schema.js.map +0 -1
  525. package/dist/cli/commands/state.js +0 -1023
  526. package/dist/cli/commands/state.js.map +0 -1
  527. package/dist/cli/commands/upgrade.js.map +0 -1
  528. package/dist/cli/commands/validate.js.map +0 -1
  529. package/dist/cli/commands/verify.js.map +0 -1
  530. package/dist/cli/dispatch.js.map +0 -1
  531. package/dist/cli/errors.js.map +0 -1
  532. package/dist/cli/help.js.map +0 -1
  533. package/dist/cli/orientation.js.map +0 -1
  534. package/dist/cli/prime-blob.js.map +0 -1
  535. package/dist/cli/stateQuery.js.map +0 -1
  536. package/dist/cli/structured.js.map +0 -1
  537. package/dist/cli/todoMarkdown.js.map +0 -1
  538. package/dist/core/difflib.js.map +0 -1
  539. package/dist/core/paths.js.map +0 -1
  540. package/dist/core/pyjson.js.map +0 -1
  541. package/dist/core/sourceRoot.js.map +0 -1
  542. package/dist/core/toml.js.map +0 -1
  543. package/dist/core/yaml.js.map +0 -1
  544. package/dist/eval/evalSkills.js.map +0 -1
  545. package/dist/eval/semanticEval.js.map +0 -1
  546. package/dist/eval/semanticFixtures.js.map +0 -1
  547. package/dist/hooks/common.js.map +0 -1
  548. package/dist/hooks/compaction.js +0 -935
  549. package/dist/hooks/compaction.js.map +0 -1
  550. package/dist/hooks/cursorPreToolUse.js +0 -19
  551. package/dist/hooks/cursorPreToolUse.js.map +0 -1
  552. package/dist/hooks/cursorSessionStart.js +0 -71
  553. package/dist/hooks/cursorSessionStart.js.map +0 -1
  554. package/dist/hooks/sessionStart.js +0 -209
  555. package/dist/hooks/sessionStart.js.map +0 -1
  556. package/dist/hooks/sessionStop.js +0 -212
  557. package/dist/hooks/sessionStop.js.map +0 -1
  558. package/dist/hooks/validateArtifact.js +0 -935
  559. package/dist/hooks/validateArtifact.js.map +0 -1
  560. package/dist/registries/artifactRegistry.js.map +0 -1
  561. package/dist/registries/capabilityContract.js.map +0 -1
  562. package/dist/registries/evaluatorHandoffContract.js.map +0 -1
  563. package/dist/registries/packageRegistry.js.map +0 -1
  564. package/dist/registries/runtimeAdapterRegistry.js +0 -315
  565. package/dist/registries/runtimeAdapterRegistry.js.map +0 -1
  566. package/dist/setup/codex.js +0 -1197
  567. package/dist/setup/codex.js.map +0 -1
  568. package/dist/setup/copilot.js +0 -227
  569. package/dist/setup/copilot.js.map +0 -1
  570. package/dist/setup/cursor.js +0 -127
  571. package/dist/setup/cursor.js.map +0 -1
  572. package/dist/setup/doctor.js +0 -1297
  573. package/dist/setup/doctor.js.map +0 -1
  574. package/dist/setup/smokeChecks.js.map +0 -1
  575. package/dist/state/installRoot.js.map +0 -1
  576. package/dist/state/startupAnalysis.js.map +0 -1
  577. package/dist/upgrade/appModel.js.map +0 -1
  578. package/dist/upgrade/channels.js.map +0 -1
  579. package/dist/upgrade/compatibility.js.map +0 -1
  580. package/dist/upgrade/doctor.js.map +0 -1
  581. package/dist/upgrade/migrateArtifactsV1ToV2.js +0 -570
  582. package/dist/upgrade/migrateArtifactsV1ToV2.js.map +0 -1
  583. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +0 -1
  584. package/dist/upgrade/nextMajorDoctor.js.map +0 -1
  585. package/dist/upgrade/projectIntegration.js.map +0 -1
  586. package/dist/upgrade/runtimeMigration.js.map +0 -1
  587. package/dist/upgrade/upgradeCommands.js.map +0 -1
  588. package/dist/upgrade/upgradeOrchestrator.js.map +0 -1
  589. package/dist/upgrade/versionResolution.js.map +0 -1
  590. package/dist/validate/appHomeContract.js.map +0 -1
  591. package/dist/validate/capability.js.map +0 -1
  592. package/dist/validate/crossCapability.js.map +0 -1
  593. package/dist/validate/lifecycleAdapters.js +0 -772
  594. package/dist/validate/lifecycleAdapters.js.map +0 -1
  595. package/dist/validate/selfAudit.js.map +0 -1
  596. /package/bundle/skills/agentera/capabilities/{dokumentera → document}/schemas/exit.yaml +0 -0
  597. /package/bundle/skills/agentera/capabilities/{inspirera → research}/schemas/exit.yaml +0 -0
  598. /package/bundle/skills/agentera/capabilities/{hej → status}/schemas/exit.yaml +0 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Decision 58 artifact protocol names: one `artifact_id` per artifact in CLI,
3
+ * hooks, validators, and JSON envelopes. Storage paths live here only.
4
+ */
5
+ export const ARTIFACT_PROTOCOL_PATHS = {
6
+ vision: ".agentera/vision.yaml",
7
+ decisions: ".agentera/decisions.yaml",
8
+ plan: ".agentera/plan.yaml",
9
+ progress: ".agentera/progress.yaml",
10
+ health: ".agentera/health.yaml",
11
+ docs: ".agentera/docs.yaml",
12
+ objective: ".agentera/objective.yaml",
13
+ experiments: ".agentera/experiments.yaml",
14
+ todo: "TODO.md",
15
+ changelog: "CHANGELOG.md",
16
+ design: "DESIGN.md",
17
+ glossary: ".agentera/glossary.yaml",
18
+ };
19
+ export const HUMAN_FACING_ARTIFACT_IDS = new Set(["todo", "changelog", "design"]);
20
+ export const TRACKED_ARTIFACT_IDS = [
21
+ "progress",
22
+ "decisions",
23
+ "plan",
24
+ "health",
25
+ "design",
26
+ "docs",
27
+ "vision",
28
+ "todo",
29
+ "changelog",
30
+ ];
31
+ export const VALIDATE_ARTIFACT_PROTOCOL_IDS = [
32
+ "changelog",
33
+ "decisions",
34
+ "design",
35
+ "docs",
36
+ "health",
37
+ "plan",
38
+ "progress",
39
+ "todo",
40
+ "vision",
41
+ "glossary",
42
+ ];
43
+ function artifactProtocolStem(input) {
44
+ const lower = input.trim().toLowerCase();
45
+ return lower.endsWith(".md") ? lower.slice(0, -3) : lower;
46
+ }
47
+ export function normalizeArtifactProtocolId(input) {
48
+ const trimmed = input.trim();
49
+ if (trimmed in ARTIFACT_PROTOCOL_PATHS) {
50
+ return trimmed;
51
+ }
52
+ const lower = trimmed.toLowerCase();
53
+ if (lower in ARTIFACT_PROTOCOL_PATHS) {
54
+ return lower;
55
+ }
56
+ const stem = artifactProtocolStem(trimmed);
57
+ if (stem in ARTIFACT_PROTOCOL_PATHS) {
58
+ return stem;
59
+ }
60
+ return null;
61
+ }
62
+ export function requireArtifactProtocolId(input, context) {
63
+ const id = normalizeArtifactProtocolId(input);
64
+ if (id === null) {
65
+ const valid = VALIDATE_ARTIFACT_PROTOCOL_IDS.join(", ");
66
+ throw new Error(`unsupported artifact ${JSON.stringify(input)} in ${context}; valid artifact_id values: ${valid}`);
67
+ }
68
+ return id;
69
+ }
70
+ /** Normalize docs.yaml mapping keys to artifact_id. */
71
+ export function normalizeArtifactMappingKeys(mapping) {
72
+ const out = {};
73
+ for (const [key, value] of Object.entries(mapping)) {
74
+ const id = normalizeArtifactProtocolId(key);
75
+ out[id ?? key] = value;
76
+ }
77
+ return out;
78
+ }
@@ -2,9 +2,11 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { loadYamlMapping } from "../core/yaml.js";
5
+ import { resolveProfileDirOverride } from "../core/envPaths.js";
5
6
  import { resolvePath } from "../core/paths.js";
6
7
  import { resolveSourceRoot } from "../core/sourceRoot.js";
7
8
  import { resolveCandidate } from "../state/installRoot.js";
9
+ import { ARTIFACT_PROTOCOL_PATHS } from "./artifactProtocolIds.js";
8
10
  function sourceRoot() {
9
11
  return resolveSourceRoot();
10
12
  }
@@ -36,12 +38,11 @@ export function normalizePath(p) {
36
38
  s = s.replace(/<objective-name>/g, "<name>");
37
39
  return s.trim();
38
40
  }
39
- const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
40
41
  const URI_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
41
42
  const ENCODED_TRAVERSAL_RE = /%(?:2e|2f|5c)/i;
42
43
  const WINDOWS_DRIVE_RE = /^[A-Za-z]:[\\/]/;
43
44
  function rejectUnsafeArtifactPath(p, artifactId) {
44
- if (CONTROL_CHAR_RE.test(p)) {
45
+ if ([...p].some((char) => char.charCodeAt(0) <= 31 || char.charCodeAt(0) === 127)) {
45
46
  throw new Error(`artifact '${artifactId}' path contains control characters`);
46
47
  }
47
48
  if (ENCODED_TRAVERSAL_RE.test(p)) {
@@ -67,28 +68,141 @@ function projectPath(projectRoot, artifactPath, artifactId) {
67
68
  }
68
69
  return resolved;
69
70
  }
70
- function schemaMetas(dir) {
71
- const metas = new Map();
71
+ export const EXPECTED_ARTIFACT_SCHEMA_VERSION = "1.0.0";
72
+ function readSchemaMeta(file) {
73
+ const meta = loadYaml(file).meta;
74
+ if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
75
+ return null;
76
+ }
77
+ return meta;
78
+ }
79
+ function warnMalformedSchemaMeta(name) {
80
+ process.stderr.write(`warning: artifact schema ${name} is missing meta; expected v3 schema version ${EXPECTED_ARTIFACT_SCHEMA_VERSION}\n`);
81
+ }
82
+ function warnSchemaVersionMismatch(meta, name) {
83
+ const version = String(meta.version ?? "").trim();
84
+ if (!version || version !== EXPECTED_ARTIFACT_SCHEMA_VERSION) {
85
+ const reported = version || "(missing)";
86
+ process.stderr.write(`warning: artifact schema ${name} version ${reported} does not match expected v3 schema version ${EXPECTED_ARTIFACT_SCHEMA_VERSION}\n`);
87
+ }
88
+ }
89
+ function listSchemaFiles(dir) {
72
90
  if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
73
- return metas;
91
+ return [];
74
92
  }
75
- const files = fs
93
+ return fs
76
94
  .readdirSync(dir)
77
95
  .filter((name) => name.endsWith(".yaml"))
78
96
  .sort();
79
- for (const name of files) {
80
- const meta = loadYaml(path.join(dir, name)).meta;
81
- if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
97
+ }
98
+ /**
99
+ * Full schema-meta index over an artifact schemas directory. Emits malformed-meta
100
+ * and version-mismatch warnings for every schema file; the full loader relies on
101
+ * this strict coverage to surface drift across the whole identity set.
102
+ */
103
+ function schemaMetas(dir) {
104
+ const metas = new Map();
105
+ for (const name of listSchemaFiles(dir)) {
106
+ const meta = readSchemaMeta(path.join(dir, name));
107
+ if (!meta) {
108
+ warnMalformedSchemaMeta(name);
82
109
  continue;
83
110
  }
84
- const m = meta;
85
- const artifactId = String(m.name ?? "").trim();
111
+ warnSchemaVersionMismatch(meta, name);
112
+ const artifactId = String(meta.name ?? "").trim();
86
113
  if (artifactId) {
87
- metas.set(artifactId, m);
114
+ metas.set(artifactId, meta);
88
115
  }
89
116
  }
90
117
  return metas;
91
118
  }
119
+ /**
120
+ * Targeted schema-meta lookup for a single artifact identity. Walks the schemas
121
+ * directory only to find the file whose `meta.name` matches `artifactId`, and
122
+ * emits warnings only for that schema. Unrelated malformed or version-mismatched
123
+ * schemas in the same directory stay silent so callers resolving a single
124
+ * identity (e.g. `profile`) don't fan out noise across the required-identity set.
125
+ */
126
+ function loadSchemaMetaForArtifact(dir, artifactId) {
127
+ for (const name of listSchemaFiles(dir)) {
128
+ let meta;
129
+ try {
130
+ meta = readSchemaMeta(path.join(dir, name));
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ if (!meta)
136
+ continue;
137
+ if (String(meta.name ?? "").trim() !== artifactId)
138
+ continue;
139
+ warnSchemaVersionMismatch(meta, name);
140
+ return meta;
141
+ }
142
+ return null;
143
+ }
144
+ function findRequiredIdentity(model, artifactId) {
145
+ const identities = (model.required_artifact_identities ?? {});
146
+ for (const [scope, identityList] of Object.entries(identities)) {
147
+ if (!Array.isArray(identityList))
148
+ continue;
149
+ for (const identity of identityList) {
150
+ if (!identity || typeof identity !== "object" || Array.isArray(identity))
151
+ continue;
152
+ const id = identity;
153
+ if (String(id.artifact_id ?? "").trim() === artifactId) {
154
+ return { scope, identity: id };
155
+ }
156
+ }
157
+ }
158
+ return null;
159
+ }
160
+ function findSpecialCase(model, artifactId) {
161
+ const specialCases = (model.explicit_special_cases ?? []);
162
+ for (const special of specialCases) {
163
+ if (!special || typeof special !== "object" || Array.isArray(special))
164
+ continue;
165
+ const sp = special;
166
+ if (String(sp.artifact_id ?? "").trim() === artifactId) {
167
+ return sp;
168
+ }
169
+ }
170
+ return null;
171
+ }
172
+ function buildRequiredRecord(scope, identity, meta) {
173
+ const template = identity.path_template;
174
+ return {
175
+ artifactId: String(identity.artifact_id ?? "").trim(),
176
+ displayName: String(identity.display_name ?? "").trim(),
177
+ defaultPath: normalizePath(String(identity.default_path ?? meta.path ?? "")),
178
+ producers: asSet(meta.producer),
179
+ consumers: asSet(meta.consumers),
180
+ artifactType: String(meta.artifact_type ?? "").trim(),
181
+ scope: String(scope),
182
+ pathTemplate: template && typeof template === "object" && !Array.isArray(template)
183
+ ? template
184
+ : null,
185
+ docsYamlCanOverridePath: true,
186
+ implementationStatus: String(meta.implementation_status ?? "implemented").trim(),
187
+ };
188
+ }
189
+ function buildSpecialCaseRecord(sp) {
190
+ const template = sp.path_template;
191
+ return {
192
+ artifactId: String(sp.artifact_id ?? "").trim(),
193
+ displayName: String(sp.display_name ?? "").trim(),
194
+ defaultPath: normalizePath(String(sp.default_path ?? "")),
195
+ producers: asSet(sp.producers),
196
+ consumers: asSet(sp.consumers),
197
+ artifactType: String(sp.artifact_type ?? "").trim(),
198
+ scope: String(sp.scope ?? "").trim(),
199
+ pathTemplate: template && typeof template === "object" && !Array.isArray(template)
200
+ ? template
201
+ : null,
202
+ docsYamlCanOverridePath: Boolean(sp.docs_yaml_can_override_path),
203
+ implementationStatus: String(sp.implementation_status ?? "implemented").trim(),
204
+ };
205
+ }
92
206
  export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir(), registryModelPathArg = registryModelPath()) {
93
207
  const model = loadYaml(registryModelPathArg);
94
208
  const metas = schemaMetas(artifactSchemasDirPath);
@@ -104,24 +218,15 @@ export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir
104
218
  }
105
219
  const id = identity;
106
220
  const artifactId = String(id.artifact_id ?? "").trim();
221
+ if (!artifactId) {
222
+ continue;
223
+ }
107
224
  const meta = metas.get(artifactId);
108
- if (!artifactId || !meta) {
225
+ if (!meta) {
226
+ process.stderr.write(`warning: required artifact identity '${artifactId}' has no matching schema file in ${artifactSchemasDirPath}\n`);
109
227
  continue;
110
228
  }
111
- const template = id.path_template;
112
- records.set(artifactId, {
113
- artifactId,
114
- displayName: String(id.display_name ?? "").trim(),
115
- defaultPath: normalizePath(String(id.default_path ?? meta.path ?? "")),
116
- producers: asSet(meta.producer),
117
- consumers: asSet(meta.consumers),
118
- artifactType: String(meta.artifact_type ?? "").trim(),
119
- scope: String(scope),
120
- pathTemplate: template && typeof template === "object" && !Array.isArray(template)
121
- ? template
122
- : null,
123
- docsYamlCanOverridePath: true,
124
- });
229
+ records.set(artifactId, buildRequiredRecord(scope, id, meta));
125
230
  }
126
231
  }
127
232
  const specialCases = (model.explicit_special_cases ?? []);
@@ -134,73 +239,129 @@ export function loadArtifactRegistry(artifactSchemasDirPath = artifactSchemasDir
134
239
  if (!artifactId) {
135
240
  continue;
136
241
  }
137
- const template = sp.path_template;
138
- records.set(artifactId, {
139
- artifactId,
140
- displayName: String(sp.display_name ?? "").trim(),
141
- defaultPath: normalizePath(String(sp.default_path ?? "")),
142
- producers: asSet(sp.producers),
143
- consumers: asSet(sp.consumers),
144
- artifactType: String(sp.artifact_type ?? "").trim(),
145
- scope: String(sp.scope ?? "").trim(),
146
- pathTemplate: template && typeof template === "object" && !Array.isArray(template)
147
- ? template
148
- : null,
149
- docsYamlCanOverridePath: Boolean(sp.docs_yaml_can_override_path),
150
- });
242
+ records.set(artifactId, buildSpecialCaseRecord(sp));
151
243
  }
152
244
  return records;
153
245
  }
154
- export function loadDocsPathOverrides(projectRoot) {
155
- const docsPath = path.join(projectRoot, ".agentera", "docs.yaml");
156
- if (!fs.existsSync(docsPath)) {
157
- return {};
246
+ /**
247
+ * Targeted lookup of a single artifact record. Resolves against the same
248
+ * model/schema authority as `loadArtifactRegistry` but inspects only the
249
+ * requested identity, so a special case such as `profile` loads without
250
+ * walking or warning about unrelated required schemas. A requested required
251
+ * identity still warns and returns `undefined` when its matching schema file is
252
+ * missing from the schemas directory.
253
+ */
254
+ export function loadArtifactRecord(artifactId, artifactSchemasDirPath = artifactSchemasDir(), registryModelPathArg = registryModelPath()) {
255
+ const model = loadYaml(registryModelPathArg);
256
+ const specialCase = findSpecialCase(model, artifactId);
257
+ if (specialCase) {
258
+ return buildSpecialCaseRecord(specialCase);
259
+ }
260
+ const required = findRequiredIdentity(model, artifactId);
261
+ if (!required) {
262
+ return undefined;
158
263
  }
264
+ const meta = loadSchemaMetaForArtifact(artifactSchemasDirPath, artifactId);
265
+ if (!meta) {
266
+ process.stderr.write(`warning: required artifact identity '${artifactId}' has no matching schema file in ${artifactSchemasDirPath}\n`);
267
+ return undefined;
268
+ }
269
+ return buildRequiredRecord(required.scope, required.identity, meta);
270
+ }
271
+ export function docsPathOverridesFromBytes(bytes, strict = false) {
159
272
  let data;
160
273
  try {
161
- data = loadYamlMapping(fs.readFileSync(docsPath, "utf8"));
274
+ data = loadYamlMapping(bytes.toString());
162
275
  }
163
276
  catch (exc) {
277
+ if (strict)
278
+ throw new Error(`failed to load docs path overrides: ${exc.message}`);
164
279
  process.stderr.write(`warning: failed to load docs path overrides: ${exc.message}\n`);
165
280
  return {};
166
281
  }
167
282
  const mapping = data.mapping;
168
283
  if (!Array.isArray(mapping)) {
284
+ if (strict && mapping !== undefined)
285
+ throw new Error("failed to load docs path overrides: mapping must be a list");
169
286
  return {};
170
287
  }
171
288
  const overrides = {};
172
289
  for (const entry of mapping) {
173
290
  if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
291
+ if (strict)
292
+ throw new Error("failed to load docs path overrides: every mapping entry must be a mapping");
174
293
  continue;
175
294
  }
176
295
  const e = entry;
177
- const artifact = e.artifact;
178
- const p = e.path;
179
- if (typeof artifact === "string" && typeof p === "string") {
180
- overrides[artifact] = p;
181
- }
296
+ if (typeof e.artifact === "string" && typeof e.path === "string")
297
+ overrides[e.artifact] = e.path;
298
+ else if (strict)
299
+ throw new Error("failed to load docs path overrides: every mapping entry requires string artifact and path fields");
182
300
  }
183
301
  return overrides;
184
302
  }
185
- export function resolveArtifactPath(record, projectRoot, activeObjectiveName = null, env = process.env) {
303
+ export function loadDocsPathOverrides(projectRoot, strict = false) {
304
+ const docsPath = path.join(projectRoot, ARTIFACT_PROTOCOL_PATHS.docs);
305
+ if (!fs.existsSync(docsPath)) {
306
+ return {};
307
+ }
308
+ let bytes;
309
+ try {
310
+ bytes = fs.readFileSync(docsPath);
311
+ }
312
+ catch (exc) {
313
+ if (strict)
314
+ throw new Error(`failed to load docs path overrides: ${exc.message}`);
315
+ process.stderr.write(`warning: failed to load docs path overrides: ${exc.message}\n`);
316
+ return {};
317
+ }
318
+ return docsPathOverridesFromBytes(bytes, strict);
319
+ }
320
+ function nearestExistingAncestor(p) {
321
+ let current = p;
322
+ while (!fs.existsSync(current)) {
323
+ const parent = path.dirname(current);
324
+ if (parent === current)
325
+ break;
326
+ current = parent;
327
+ }
328
+ return fs.realpathSync.native(current);
329
+ }
330
+ export function assertRealpathBoundary(projectRoot, artifactPath, artifactId) {
331
+ const projectReal = nearestExistingAncestor(resolvePath(projectRoot));
332
+ const ancestorReal = nearestExistingAncestor(artifactPath);
333
+ const rel = path.relative(projectReal, ancestorReal);
334
+ if (rel !== "" && (rel.startsWith("..") || path.isAbsolute(rel))) {
335
+ throw new Error(`artifact '${artifactId}' path escapes the project boundary`);
336
+ }
337
+ }
338
+ export function resolveArtifactPath(record, projectRoot, activeObjectiveNameOrOptions = null, env = process.env) {
339
+ const options = typeof activeObjectiveNameOrOptions === "object" && activeObjectiveNameOrOptions !== null
340
+ ? activeObjectiveNameOrOptions
341
+ : { activeObjectiveName: activeObjectiveNameOrOptions };
342
+ const activeObjectiveName = options.activeObjectiveName ?? null;
186
343
  let artifactPath = record.defaultPath;
187
- const overrides = loadDocsPathOverrides(projectRoot);
344
+ const overrides = options.docsPathOverrides ?? loadDocsPathOverrides(projectRoot, options.strictWrite === true);
188
345
  if (record.docsYamlCanOverridePath && record.displayName in overrides) {
189
346
  artifactPath = overrides[record.displayName];
190
347
  }
191
348
  if (artifactPath.includes("<name>") && activeObjectiveName) {
192
349
  artifactPath = artifactPath.replace(/<name>/g, activeObjectiveName);
193
350
  }
194
- const profilePrefix = "$PROFILERA_PROFILE_DIR/";
195
- if (artifactPath.startsWith(profilePrefix)) {
196
- const explicit = env.PROFILERA_PROFILE_DIR;
197
- const suffix = artifactPath.slice(profilePrefix.length);
198
- if (explicit) {
199
- return path.join(explicit, suffix);
351
+ const profileDirPrefixes = ["$AGENTERA_PROFILE_DIR/", "$PROFILERA_PROFILE_DIR/"];
352
+ for (const prefix of profileDirPrefixes) {
353
+ if (artifactPath.startsWith(prefix)) {
354
+ const suffix = artifactPath.slice(prefix.length);
355
+ const explicit = resolveProfileDirOverride(env);
356
+ if (explicit) {
357
+ return path.join(explicit, suffix);
358
+ }
359
+ const [base] = resolveCandidate(null, { env, home: os.homedir() });
360
+ return path.join(base, suffix);
200
361
  }
201
- const [base] = resolveCandidate(null, { env, home: os.homedir() });
202
- return path.join(base, suffix);
203
362
  }
204
- return projectPath(projectRoot, artifactPath, record.artifactId);
363
+ const resolved = projectPath(projectRoot, artifactPath, record.artifactId);
364
+ if (options.strictWrite)
365
+ assertRealpathBoundary(projectRoot, resolved, record.artifactId);
366
+ return resolved;
205
367
  }
206
- //# sourceMappingURL=artifactRegistry.js.map
@@ -0,0 +1,45 @@
1
+ const FIELD_SKIP = new Set([
2
+ "meta",
3
+ "GROUP_PREFIXES",
4
+ "BUDGET",
5
+ "COMPACTION",
6
+ "VALIDATION",
7
+ "ARCHIVE",
8
+ "CONVENTION",
9
+ "CONVENTIONS",
10
+ ]);
11
+ function mapping(value) {
12
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
13
+ }
14
+ export function artifactSchemaFieldDescription(entry, group) {
15
+ return {
16
+ id: entry.id ?? null,
17
+ group,
18
+ field: entry.field ?? null,
19
+ ...(typeof entry.path === "string" ? { path: entry.path } : {}),
20
+ type: entry.type ?? "unknown",
21
+ required: "required" in entry ? entry.required : "unknown",
22
+ format: entry.format ?? null,
23
+ validation: entry.validation ?? [],
24
+ ...(entry.accepted_forms !== undefined ? { accepted_forms: structuredClone(entry.accepted_forms) } : {}),
25
+ ...(entry.normalization !== undefined ? { normalization: structuredClone(entry.normalization) } : {}),
26
+ ...(entry.write_operations !== undefined ? { write_operations: structuredClone(entry.write_operations) } : {}),
27
+ };
28
+ }
29
+ export function describeArtifactSchemaFields(schema) {
30
+ const fields = [];
31
+ for (const [group, value] of Object.entries(schema)) {
32
+ if (FIELD_SKIP.has(group) || !mapping(value))
33
+ continue;
34
+ for (const entry of Object.values(value)) {
35
+ if (mapping(entry) && "field" in entry)
36
+ fields.push(artifactSchemaFieldDescription(entry, group));
37
+ }
38
+ }
39
+ return fields;
40
+ }
41
+ export function artifactSchemaFieldsForOperation(schema, verb) {
42
+ if (!schema)
43
+ return [];
44
+ return describeArtifactSchemaFields(schema).filter((field) => Array.isArray(field.write_operations) && field.write_operations.includes(verb));
45
+ }
@@ -11,6 +11,7 @@ export const BOOTSTRAP_RULE_SECTIONS = [
11
11
  "FIELD_RULES",
12
12
  "PRIMITIVE_REFERENCE_FIELDS",
13
13
  "ROUTE_ALIASES",
14
+ "TRIGGER_ENRICHMENT",
14
15
  ];
15
16
  export class ContractBootstrapError extends Error {
16
17
  errors;
@@ -26,7 +27,7 @@ function isMapping(value) {
26
27
  export function loadCapabilitySchemaContract(contractPath) {
27
28
  let data;
28
29
  try {
29
- data = loadYamlMapping(fs.readFileSync(contractPath, "utf8"));
30
+ data = loadYamlMapping(fs.readFileSync(contractPath, "utf8")); // cast: YAML parse IO boundary
30
31
  }
31
32
  catch (exc) {
32
33
  throw new ContractBootstrapError([
@@ -100,8 +101,47 @@ export function buildCapabilitySchemaContract(data, contractPath) {
100
101
  capability: entry.capability,
101
102
  })),
102
103
  },
104
+ triggerEnrichment: buildTriggerEnrichmentRules(data),
103
105
  };
104
106
  }
107
+ function buildTriggerEnrichmentRules(data) {
108
+ const enrichment = data.TRIGGER_ENRICHMENT;
109
+ const fields = enrichment.fields;
110
+ const primaryAliases = data.ROUTE_ALIASES.primary_aliases;
111
+ const allowedCapabilityIds = primaryAliases.map((entry) => entry.capability);
112
+ return {
113
+ spec: enrichment.spec,
114
+ fields: Object.fromEntries(Object.entries(fields).map(([name, raw]) => [name, buildEnrichmentFieldRule(raw)])),
115
+ allowedCapabilityIds,
116
+ };
117
+ }
118
+ function buildEnrichmentFieldRule(raw) {
119
+ const rule = {
120
+ type: raw.type,
121
+ required: Boolean(raw.required),
122
+ default: raw.default,
123
+ };
124
+ if (typeof raw.min === "number")
125
+ rule.min = raw.min;
126
+ if (typeof raw.max === "number")
127
+ rule.max = raw.max;
128
+ if (raw.each_must_be_valid_regex === true)
129
+ rule.eachMustBeValidRegex = true;
130
+ if (isMapping(raw.entries)) {
131
+ const entries = {};
132
+ for (const [entryName, entryRaw] of Object.entries(raw.entries)) {
133
+ const e = entryRaw;
134
+ entries[entryName] = {
135
+ type: e.type,
136
+ required: Boolean(e.required),
137
+ nonEmpty: e.non_empty === true,
138
+ enumSource: typeof e.enum_source === "string" ? e.enum_source : "",
139
+ };
140
+ }
141
+ rule.entries = entries;
142
+ }
143
+ return rule;
144
+ }
105
145
  function requiredGroupsOf(data, sourceLabel, errors) {
106
146
  const groups = data.REQUIRED_GROUPS;
107
147
  if (!Array.isArray(groups) ||
@@ -154,6 +194,7 @@ function checkRuleSections(data, sourceLabel, errors) {
154
194
  checkTriggerPriorityRules(data, sourceLabel, errors);
155
195
  checkPrimitiveReferenceRules(data, sourceLabel, errors);
156
196
  checkRouteAliasRules(data, sourceLabel, errors);
197
+ checkTriggerEnrichmentRules(data, sourceLabel, errors);
157
198
  }
158
199
  function checkDirectoryRules(data, sourceLabel, errors) {
159
200
  const directory = data.DIRECTORY_REQUIREMENTS;
@@ -308,4 +349,90 @@ function checkSelfGroups(data, sourceLabel, requiredGroups, errors) {
308
349
  }
309
350
  }
310
351
  }
311
- //# sourceMappingURL=capabilityContract.js.map
352
+ /**
353
+ * Required integer range field inside TRIGGER_ENRICHMENT compatibility rules.
354
+ */
355
+ function checkEnrichmentIntegerField(value, label, sourceLabel, errors) {
356
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > 100) {
357
+ errors.push(`bootstrap [error]: ${label} in ${sourceLabel} must be an integer in range 0..100`);
358
+ }
359
+ }
360
+ function checkTriggerEnrichmentRules(data, sourceLabel, errors) {
361
+ const enrichment = data.TRIGGER_ENRICHMENT;
362
+ if (!isMapping(enrichment)) {
363
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT in ${sourceLabel} must be present as a mapping`);
364
+ return;
365
+ }
366
+ if (typeof enrichment.spec !== "string" || !enrichment.spec) {
367
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.spec in ${sourceLabel} must be a non-empty string`);
368
+ }
369
+ const fields = enrichment.fields;
370
+ if (!isMapping(fields)) {
371
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields in ${sourceLabel} must be a mapping`);
372
+ return;
373
+ }
374
+ // Legacy fields remain shape-validated for compatibility, but are not
375
+ // carried into the active semantic trigger model.
376
+ const expected = {
377
+ patterns: "list_of_strings",
378
+ confidence_threshold: "integer",
379
+ borderline_band: "integer",
380
+ patterns_regex: "list_of_strings",
381
+ disambiguates_against: "list_of_mappings",
382
+ };
383
+ for (const [fieldName, expectedType] of Object.entries(expected)) {
384
+ if (!isMapping(fields[fieldName])) {
385
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName} in ${sourceLabel} must be a mapping`);
386
+ continue;
387
+ }
388
+ if (fields[fieldName].type !== expectedType) {
389
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.type in ${sourceLabel} must be ${expectedType}`);
390
+ }
391
+ if (fields[fieldName].required !== false) {
392
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.required in ${sourceLabel} must be false (enrichment is opt-in)`);
393
+ }
394
+ const min = fields[fieldName].min;
395
+ const max = fields[fieldName].max;
396
+ if (expectedType === "integer") {
397
+ if (typeof min !== "number" || min !== 0) {
398
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.min in ${sourceLabel} must be 0`);
399
+ }
400
+ if (typeof max !== "number" || max !== 100) {
401
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.max in ${sourceLabel} must be 100`);
402
+ }
403
+ }
404
+ if (fieldName === "patterns_regex" && fields[fieldName].each_must_be_valid_regex !== true) {
405
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.${fieldName}.each_must_be_valid_regex in ${sourceLabel} must be true`);
406
+ }
407
+ }
408
+ // disambiguates_against.entries capability/hint shape
409
+ const disambig = isMapping(fields.disambiguates_against) ? fields.disambiguates_against : null;
410
+ const entriesList = disambig && isMapping(disambig.entries) ? disambig.entries : null;
411
+ if (disambig && !entriesList) {
412
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries in ${sourceLabel} must be a mapping`);
413
+ }
414
+ if (entriesList) {
415
+ if (!isMapping(entriesList.capability)) {
416
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability in ${sourceLabel} must be a mapping`);
417
+ }
418
+ else {
419
+ if (entriesList.capability.required !== true) {
420
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability.required in ${sourceLabel} must be true`);
421
+ }
422
+ if (entriesList.capability.enum_source !== "ROUTE_ALIASES.primary_aliases.capability") {
423
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.capability.enum_source in ${sourceLabel} must be ROUTE_ALIASES.primary_aliases.capability`);
424
+ }
425
+ }
426
+ if (!isMapping(entriesList.hint)) {
427
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint in ${sourceLabel} must be a mapping`);
428
+ }
429
+ else {
430
+ if (entriesList.hint.required !== true) {
431
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint.required in ${sourceLabel} must be true`);
432
+ }
433
+ if (entriesList.hint.non_empty !== true) {
434
+ errors.push(`bootstrap [error]: TRIGGER_ENRICHMENT.fields.disambiguates_against.entries.hint.non_empty in ${sourceLabel} must be true`);
435
+ }
436
+ }
437
+ }
438
+ }