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,453 @@
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
+ import { validateLifecycleOperationContractRoot } from "./lifecycleOperationContract.js";
6
+ import { LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH } from "./lifecycleOperations.js";
7
+ export const LIFECYCLE_AUTHORITY_RELATIVE_PATH = "references/adapters/runtime-lifecycle-authority.yaml";
8
+ export const LIFECYCLE_ADAPTER_CONTRACT_RELATIVE_PATH = "references/adapters/runtime-lifecycle-adapters.yaml";
9
+ export const NATIVE_RESOURCE_CLEANUP_CONTRACT_RELATIVE_PATH = "references/adapters/runtime-retired-resources.yaml";
10
+ const EXPECTED_EVIDENCE_FIELDS = ["host_present", "installed", "enabled", "trusted"];
11
+ export const LIFECYCLE_APPLICABILITY_VALUES = [
12
+ "required",
13
+ "conditional",
14
+ "not_applicable",
15
+ ];
16
+ export const LIFECYCLE_ACTION_CLASS_VALUES = [
17
+ "repairable_owned",
18
+ "manual_verification",
19
+ "unobservable_gap",
20
+ ];
21
+ export const LIFECYCLE_COMMAND_ELIGIBILITY_VALUES = [
22
+ "preview",
23
+ "apply",
24
+ "manual",
25
+ "diagnostic",
26
+ ];
27
+ const EVIDENCE_VALUES = new Set([
28
+ true,
29
+ false,
30
+ "unknown",
31
+ "denied",
32
+ "not_applicable",
33
+ ]);
34
+ const INVENTORY_DECLARATIONS = [
35
+ /^\s*["']?(?:active_runtimes|active_runtime_ids|active_runtime_order)["']?\s*:/,
36
+ /^\s*(?:export\s+)?const\s+(?:activeRuntimeIds|ACTIVE_RUNTIME_IDS)\s*=/,
37
+ ];
38
+ const INVENTORY_SCAN_EXTENSIONS = new Set([".json", ".ts", ".yaml", ".yml"]);
39
+ export class LifecycleAuthorityError extends Error {
40
+ constructor(message) {
41
+ super(message);
42
+ this.name = "LifecycleAuthorityError";
43
+ }
44
+ }
45
+ function isMapping(value) {
46
+ return value !== null && typeof value === "object" && !Array.isArray(value);
47
+ }
48
+ function stringField(value, key) {
49
+ return typeof value[key] === "string" ? value[key] : "";
50
+ }
51
+ function sourceError(sourcePath, location, message) {
52
+ return `${sourcePath}:${location}: ${message}`;
53
+ }
54
+ export function validateLifecycleAuthorityData(data, sourcePath = LIFECYCLE_AUTHORITY_RELATIVE_PATH) {
55
+ if (!isMapping(data))
56
+ return [sourceError(sourcePath, "1", "authority must be a YAML object")];
57
+ const errors = [];
58
+ if (data.status !== "migration_only_authority") {
59
+ errors.push(sourceError(sourcePath, "status", "must be migration_only_authority"));
60
+ }
61
+ if (data.schema_version !== "agentera.runtimeLifecycleAuthority.v1") {
62
+ errors.push(sourceError(sourcePath, "schema_version", "must be agentera.runtimeLifecycleAuthority.v1"));
63
+ }
64
+ if (data.decision !== 92) {
65
+ errors.push(sourceError(sourcePath, "decision", "must cite approved Decision 92"));
66
+ }
67
+ if (data.operation_contract !== LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH) {
68
+ errors.push(sourceError(sourcePath, "operation_contract", `must point to ${LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH}`));
69
+ }
70
+ if (data.adapter_contract !== LIFECYCLE_ADAPTER_CONTRACT_RELATIVE_PATH) {
71
+ errors.push(sourceError(sourcePath, "adapter_contract", `must point to ${LIFECYCLE_ADAPTER_CONTRACT_RELATIVE_PATH}`));
72
+ }
73
+ if (data.native_resource_cleanup_contract !== NATIVE_RESOURCE_CLEANUP_CONTRACT_RELATIVE_PATH) {
74
+ errors.push(sourceError(sourcePath, "native_resource_cleanup_contract", `must point to ${NATIVE_RESOURCE_CLEANUP_CONTRACT_RELATIVE_PATH}`));
75
+ }
76
+ const canonicalSkill = data.canonical_skill;
77
+ if (!isMapping(canonicalSkill) || canonicalSkill.path !== "~/.agents/skills/agentera") {
78
+ errors.push(sourceError(sourcePath, "canonical_skill.path", "must be ~/.agents/skills/agentera"));
79
+ }
80
+ if (!isMapping(canonicalSkill) || canonicalSkill.required_for_support_floor !== true) {
81
+ errors.push(sourceError(sourcePath, "canonical_skill.required_for_support_floor", "must be true"));
82
+ }
83
+ const projection = data.projection_contract;
84
+ if (!isMapping(projection) ||
85
+ projection.schema_version !== "agentera.runtimeLifecycleProjection.v1") {
86
+ errors.push(sourceError(sourcePath, "projection_contract.schema_version", "must be agentera.runtimeLifecycleProjection.v1"));
87
+ }
88
+ if (!isMapping(projection) || projection.snapshot_identity !== "deterministic_sha256") {
89
+ errors.push(sourceError(sourcePath, "projection_contract.snapshot_identity", "must be deterministic_sha256"));
90
+ }
91
+ if (!isMapping(projection) ||
92
+ JSON.stringify(projection.applicability) !== JSON.stringify(LIFECYCLE_APPLICABILITY_VALUES)) {
93
+ errors.push(sourceError(sourcePath, "projection_contract.applicability", `must be ${LIFECYCLE_APPLICABILITY_VALUES.join(", ")}`));
94
+ }
95
+ if (!isMapping(projection) ||
96
+ JSON.stringify(projection.action_classes) !== JSON.stringify(LIFECYCLE_ACTION_CLASS_VALUES)) {
97
+ errors.push(sourceError(sourcePath, "projection_contract.action_classes", `must be ${LIFECYCLE_ACTION_CLASS_VALUES.join(", ")}`));
98
+ }
99
+ if (!isMapping(projection) ||
100
+ JSON.stringify(projection.command_eligibility) !==
101
+ JSON.stringify(LIFECYCLE_COMMAND_ELIGIBILITY_VALUES)) {
102
+ errors.push(sourceError(sourcePath, "projection_contract.command_eligibility", `must be ${LIFECYCLE_COMMAND_ELIGIBILITY_VALUES.join(", ")}`));
103
+ }
104
+ if (!isMapping(projection) ||
105
+ projection.shared_resource_rule !== "selected_and_required_by_at_least_one_selected_runtime") {
106
+ errors.push(sourceError(sourcePath, "projection_contract.shared_resource_rule", "must require selection and at least one selected runtime"));
107
+ }
108
+ const evidence = data.evidence_contract;
109
+ const evidenceFields = isMapping(evidence) ? evidence.mandatory_fields : null;
110
+ if (JSON.stringify(evidenceFields) !== JSON.stringify(EXPECTED_EVIDENCE_FIELDS)) {
111
+ errors.push(sourceError(sourcePath, "evidence_contract.mandatory_fields", `must be ${EXPECTED_EVIDENCE_FIELDS.join(", ")}`));
112
+ }
113
+ const supportFloor = data.support_floor;
114
+ if (!isMapping(supportFloor) || supportFloor.unmet_blocks_release !== true) {
115
+ errors.push(sourceError(sourcePath, "support_floor.unmet_blocks_release", "must be true"));
116
+ }
117
+ if (!isMapping(supportFloor) ||
118
+ JSON.stringify(supportFloor.requirements) !==
119
+ JSON.stringify([
120
+ "canonical_shared_skill_detected",
121
+ "diagnosis_complete",
122
+ "mandatory_evidence_resolved",
123
+ ])) {
124
+ errors.push(sourceError(sourcePath, "support_floor.requirements", "must require canonical skill detection, complete diagnosis, and resolved mandatory evidence"));
125
+ }
126
+ const evidenceRules = isMapping(supportFloor) && isMapping(supportFloor.evidence_rules)
127
+ ? supportFloor.evidence_rules
128
+ : {};
129
+ if (evidenceRules.unknown_or_missing_mandatory_blocks !== true) {
130
+ errors.push(sourceError(sourcePath, "support_floor.evidence_rules.unknown_or_missing_mandatory_blocks", "must be true"));
131
+ }
132
+ if (evidenceRules.denied_mandatory_trust_blocks !== true) {
133
+ errors.push(sourceError(sourcePath, "support_floor.evidence_rules.denied_mandatory_trust_blocks", "must be true"));
134
+ }
135
+ if (JSON.stringify(evidenceRules.known_false_diagnoses_degraded) !==
136
+ JSON.stringify(["host_present", "installed", "enabled"])) {
137
+ errors.push(sourceError(sourcePath, "support_floor.evidence_rules.known_false_diagnoses_degraded", "must be host_present, installed, enabled"));
138
+ }
139
+ if (evidenceRules.not_applicable_scope !== "unobserved_conditional_surface_only") {
140
+ errors.push(sourceError(sourcePath, "support_floor.evidence_rules.not_applicable_scope", "must be unobserved_conditional_surface_only"));
141
+ }
142
+ const runtimes = data.active_runtimes;
143
+ if (!Array.isArray(runtimes)) {
144
+ return [...errors, sourceError(sourcePath, "active_runtimes", "must be a list")];
145
+ }
146
+ if (runtimes.length !== 0) {
147
+ errors.push(sourceError(sourcePath, "active_runtimes", "must be empty because repository-native runtime integrations are retired"));
148
+ }
149
+ const historicalInputs = data.historical_inputs;
150
+ if (!Array.isArray(historicalInputs) ||
151
+ historicalInputs.length !== 1 ||
152
+ !isMapping(historicalInputs[0]) ||
153
+ historicalInputs[0].id !== "claude" ||
154
+ JSON.stringify(historicalInputs[0].purposes) !== JSON.stringify(["consent_gated_historical_import"])) {
155
+ errors.push(sourceError(sourcePath, "historical_inputs", "must contain only claude for consent-gated historical import"));
156
+ }
157
+ const aliases = data.migration_aliases;
158
+ const cursorAgent = isMapping(aliases) ? aliases["cursor-agent"] : null;
159
+ if (!isMapping(cursorAgent) ||
160
+ cursorAgent.runtime_id !== "cursor" ||
161
+ cursorAgent.surface_id !== "cli") {
162
+ errors.push(sourceError(sourcePath, "migration_aliases.cursor-agent", "must route to runtime cursor surface cli"));
163
+ }
164
+ return errors;
165
+ }
166
+ export function loadLifecycleAuthority(authorityPath = path.join(resolveSourceRoot(), LIFECYCLE_AUTHORITY_RELATIVE_PATH)) {
167
+ const data = loadYamlMapping(fs.readFileSync(authorityPath, "utf8"));
168
+ const errors = validateLifecycleAuthorityData(data, authorityPath);
169
+ if (errors.length > 0) {
170
+ throw new LifecycleAuthorityError(`Runtime lifecycle authority validation failed: ${errors.join("; ")}`);
171
+ }
172
+ const canonicalSkill = data.canonical_skill;
173
+ const evidence = data.evidence_contract;
174
+ const supportFloor = data.support_floor;
175
+ const evidenceRules = supportFloor.evidence_rules;
176
+ const runtimes = data.active_runtimes.map((runtime) => ({
177
+ id: runtime.id,
178
+ displayName: runtime.display_name,
179
+ surfaces: runtime.surfaces.map((surface) => ({
180
+ id: surface.id,
181
+ displayName: surface.display_name,
182
+ presence: surface.presence,
183
+ })),
184
+ }));
185
+ return {
186
+ sourcePath: authorityPath,
187
+ canonicalSkillPath: canonicalSkill.path,
188
+ evidenceFields: evidence.mandatory_fields,
189
+ supportFloorPolicy: {
190
+ unknownOrMissingMandatoryBlocks: evidenceRules.unknown_or_missing_mandatory_blocks,
191
+ deniedMandatoryTrustBlocks: evidenceRules.denied_mandatory_trust_blocks,
192
+ knownFalseDiagnosesDegraded: evidenceRules.known_false_diagnoses_degraded,
193
+ notApplicableScope: evidenceRules.not_applicable_scope,
194
+ },
195
+ runtimes,
196
+ };
197
+ }
198
+ function inventoryDeclarations(root, canonicalPath) {
199
+ const declarations = [];
200
+ const visit = (entryPath) => {
201
+ if (!fs.existsSync(entryPath))
202
+ return;
203
+ const stat = fs.statSync(entryPath);
204
+ if (stat.isDirectory()) {
205
+ for (const name of fs.readdirSync(entryPath).sort())
206
+ visit(path.join(entryPath, name));
207
+ return;
208
+ }
209
+ if (!INVENTORY_SCAN_EXTENSIONS.has(path.extname(entryPath)) ||
210
+ path.resolve(entryPath) === canonicalPath) {
211
+ return;
212
+ }
213
+ fs.readFileSync(entryPath, "utf8")
214
+ .split(/\r\n|\r|\n/)
215
+ .forEach((line, index) => {
216
+ if (INVENTORY_DECLARATIONS.some((pattern) => pattern.test(line))) {
217
+ declarations.push(`${path.relative(root, entryPath)}:${index + 1}`);
218
+ }
219
+ });
220
+ };
221
+ visit(path.join(root, "references"));
222
+ visit(path.join(root, "packages", "cli", "src"));
223
+ return declarations;
224
+ }
225
+ export function validateLifecycleAuthorityRoot(root = resolveSourceRoot()) {
226
+ const authorityPath = path.join(root, LIFECYCLE_AUTHORITY_RELATIVE_PATH);
227
+ if (!fs.existsSync(authorityPath)) {
228
+ return [`${LIFECYCLE_AUTHORITY_RELATIVE_PATH}:1: missing runtime lifecycle authority`];
229
+ }
230
+ let data;
231
+ try {
232
+ data = loadYamlMapping(fs.readFileSync(authorityPath, "utf8"));
233
+ }
234
+ catch (error) {
235
+ return [
236
+ `${LIFECYCLE_AUTHORITY_RELATIVE_PATH}:1: could not parse authority: ${error.message}`,
237
+ ];
238
+ }
239
+ const errors = validateLifecycleAuthorityData(data, LIFECYCLE_AUTHORITY_RELATIVE_PATH);
240
+ errors.push(...validateLifecycleOperationContractRoot(root));
241
+ for (const location of inventoryDeclarations(root, path.resolve(authorityPath))) {
242
+ errors.push(`${location}: duplicate active runtime inventory; authority is ${LIFECYCLE_AUTHORITY_RELATIVE_PATH}:active_runtimes`);
243
+ }
244
+ return errors;
245
+ }
246
+ function observedSurfaceExpected(definition, observation, authority) {
247
+ if (definition.presence === "required")
248
+ return true;
249
+ if (observation?.applicability === "conditional")
250
+ return true;
251
+ if (observation?.applicability === "not_applicable")
252
+ return false;
253
+ const hostPresent = observation?.evidence?.host_present;
254
+ return (authority.supportFloorPolicy.notApplicableScope === "unobserved_conditional_surface_only" &&
255
+ observation !== undefined &&
256
+ hostPresent === true);
257
+ }
258
+ function mandatoryEvidenceViolation(field, value, surfaceId, authority) {
259
+ const location = `surfaces.${surfaceId}.${field}`;
260
+ if (value === undefined && authority.supportFloorPolicy.unknownOrMissingMandatoryBlocks) {
261
+ return {
262
+ code: "mandatory_evidence_missing",
263
+ detail: `${location} is required but missing`,
264
+ surfaceId,
265
+ field,
266
+ observed: "missing",
267
+ };
268
+ }
269
+ if (value === "unknown" && authority.supportFloorPolicy.unknownOrMissingMandatoryBlocks) {
270
+ return {
271
+ code: "mandatory_evidence_unknown",
272
+ detail: `${location} is required but unverified`,
273
+ surfaceId,
274
+ field,
275
+ observed: value,
276
+ };
277
+ }
278
+ if (field === "trusted" &&
279
+ authority.supportFloorPolicy.deniedMandatoryTrustBlocks &&
280
+ (value === "denied" || value === false)) {
281
+ return {
282
+ code: "mandatory_trust_denied",
283
+ detail: `${location} is required but trust is denied`,
284
+ surfaceId,
285
+ field,
286
+ observed: value,
287
+ };
288
+ }
289
+ if (value === "denied") {
290
+ return {
291
+ code: "mandatory_evidence_denied",
292
+ detail: `${location} is required but denied`,
293
+ surfaceId,
294
+ field,
295
+ observed: value,
296
+ };
297
+ }
298
+ if (value === "not_applicable") {
299
+ return {
300
+ code: "mandatory_evidence_not_applicable",
301
+ detail: `${location} cannot be not_applicable on an expected surface`,
302
+ surfaceId,
303
+ field,
304
+ observed: value,
305
+ };
306
+ }
307
+ if (value === false &&
308
+ !authority.supportFloorPolicy.knownFalseDiagnosesDegraded.includes(field)) {
309
+ return {
310
+ code: "mandatory_evidence_denied",
311
+ detail: `${location} is required but false is not a diagnosed degraded state for this field`,
312
+ surfaceId,
313
+ field,
314
+ observed: value,
315
+ };
316
+ }
317
+ return null;
318
+ }
319
+ function surfaceState(definition, observation, authority) {
320
+ const evidence = observation?.evidence ?? {};
321
+ const expected = observedSurfaceExpected(definition, observation, authority);
322
+ const applicability = definition.presence === "required" ? "required" : expected ? "conditional" : "not_applicable";
323
+ const missing = expected
324
+ ? authority.evidenceFields.filter((field) => evidence[field] === undefined)
325
+ : [];
326
+ const unmet = [...new Set([...(observation?.unmetMandatoryFields ?? []), ...missing])];
327
+ const diagnosisComplete = observation?.diagnosisComplete === true && unmet.length === 0;
328
+ const supportFloorViolations = expected
329
+ ? authority.evidenceFields.flatMap((field) => {
330
+ const violation = mandatoryEvidenceViolation(field, evidence[field], definition.id, authority);
331
+ return violation ? [violation] : [];
332
+ })
333
+ : [];
334
+ const releaseBlocking = supportFloorViolations.length > 0 || !diagnosisComplete;
335
+ let status;
336
+ if (!expected)
337
+ status = "not_applicable";
338
+ else if (supportFloorViolations.some((violation) => violation.code === "mandatory_trust_denied" ||
339
+ violation.code === "mandatory_evidence_denied" ||
340
+ violation.code === "mandatory_evidence_not_applicable"))
341
+ status = "blocked";
342
+ else if (!diagnosisComplete || supportFloorViolations.length > 0)
343
+ status = "unknown";
344
+ else if (Object.values(evidence).some((value) => value === false)) {
345
+ status = "degraded";
346
+ }
347
+ else
348
+ status = "ready";
349
+ return {
350
+ ...definition,
351
+ expected,
352
+ applicability,
353
+ status,
354
+ evidence,
355
+ diagnosisComplete,
356
+ unmetMandatoryFields: unmet,
357
+ releaseBlocking,
358
+ supportFloorViolations,
359
+ };
360
+ }
361
+ export function buildRuntimeLifecycleState(authority, observations) {
362
+ const duplicateObservationIds = observations
363
+ .map((observation) => observation.runtimeId)
364
+ .filter((id, index, ids) => ids.indexOf(id) !== index);
365
+ if (duplicateObservationIds.length > 0) {
366
+ throw new LifecycleAuthorityError(`duplicate lifecycle observations for runtime ${[...new Set(duplicateObservationIds)].join(", ")}`);
367
+ }
368
+ const activeIds = new Set(authority.runtimes.map((runtime) => runtime.id));
369
+ const unknown = observations.find((observation) => !activeIds.has(observation.runtimeId));
370
+ if (unknown) {
371
+ throw new LifecycleAuthorityError(`unknown active runtime observation ${unknown.runtimeId}; expected ${[...activeIds].join(", ")}`);
372
+ }
373
+ const runtimes = authority.runtimes.map((runtime) => {
374
+ const observation = observations.find((candidate) => candidate.runtimeId === runtime.id);
375
+ const observedSurfaces = observation?.surfaces ?? [];
376
+ const duplicateSurfaceIds = observedSurfaces
377
+ .map((surface) => surface.id)
378
+ .filter((id, index, ids) => ids.indexOf(id) !== index);
379
+ if (duplicateSurfaceIds.length > 0) {
380
+ throw new LifecycleAuthorityError(`${runtime.id}: duplicate lifecycle observations for surface ${[...new Set(duplicateSurfaceIds)].join(", ")}`);
381
+ }
382
+ const unknownSurface = observedSurfaces.find((surface) => !runtime.surfaces.some((definition) => definition.id === surface.id));
383
+ if (unknownSurface) {
384
+ throw new LifecycleAuthorityError(`${runtime.id}: unknown lifecycle surface ${unknownSurface.id}; expected ${runtime.surfaces.map((surface) => surface.id).join(", ")}`);
385
+ }
386
+ const surfaces = runtime.surfaces.map((definition) => surfaceState(definition, observedSurfaces.find((surface) => surface.id === definition.id), authority));
387
+ const canonicalSkillDetected = observation?.canonicalSkillDetected ?? "unknown";
388
+ const violations = [];
389
+ if (canonicalSkillDetected === "unknown") {
390
+ violations.push({
391
+ code: "canonical_skill_unknown",
392
+ detail: "canonical shared skill detection is required but unverified",
393
+ observed: canonicalSkillDetected,
394
+ });
395
+ }
396
+ else if (canonicalSkillDetected !== true) {
397
+ violations.push({
398
+ code: "canonical_skill_not_detected",
399
+ detail: "canonical shared skill is required but not detected",
400
+ observed: canonicalSkillDetected,
401
+ });
402
+ }
403
+ if (observation?.diagnosisComplete !== true) {
404
+ violations.push({
405
+ code: "diagnosis_incomplete",
406
+ detail: "required runtime lifecycle diagnosis is incomplete",
407
+ });
408
+ }
409
+ for (const surface of surfaces.filter((candidate) => candidate.expected)) {
410
+ violations.push(...surface.supportFloorViolations);
411
+ if (!surface.diagnosisComplete && observation?.diagnosisComplete === true) {
412
+ violations.push({
413
+ code: "diagnosis_incomplete",
414
+ detail: `required lifecycle diagnosis is incomplete for surface ${surface.id}`,
415
+ surfaceId: surface.id,
416
+ });
417
+ }
418
+ }
419
+ const uniqueViolations = violations.filter((violation, index, all) => all.findIndex((candidate) => candidate.code === violation.code &&
420
+ candidate.surfaceId === violation.surfaceId &&
421
+ candidate.field === violation.field) === index);
422
+ const unmet = uniqueViolations.map((violation) => [violation.code, violation.surfaceId, violation.field].filter(Boolean).join(":"));
423
+ const blocked = uniqueViolations.length > 0;
424
+ const degraded = surfaces.some((surface) => surface.expected && surface.status !== "ready");
425
+ return {
426
+ runtimeId: runtime.id,
427
+ displayName: runtime.displayName,
428
+ status: blocked ? "blocked" : degraded ? "degraded" : "ready",
429
+ canonicalSkill: {
430
+ path: authority.canonicalSkillPath,
431
+ detected: canonicalSkillDetected,
432
+ },
433
+ diagnosisComplete: observation?.diagnosisComplete === true,
434
+ surfaces,
435
+ supportFloor: {
436
+ met: !blocked,
437
+ releaseBlocking: blocked,
438
+ unmet,
439
+ violations: uniqueViolations,
440
+ },
441
+ };
442
+ });
443
+ return {
444
+ schemaVersion: "agentera.runtimeLifecycleState.v1",
445
+ authority: authority.sourcePath,
446
+ activeRuntimeIds: runtimes.map((runtime) => runtime.runtimeId),
447
+ runtimes,
448
+ releaseBlocked: runtimes.some((runtime) => runtime.supportFloor.releaseBlocking),
449
+ };
450
+ }
451
+ export function isLifecycleEvidenceValue(value) {
452
+ return EVIDENCE_VALUES.has(value);
453
+ }
@@ -0,0 +1,123 @@
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
+ import { LIFECYCLE_APPLY_STATUSES, LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH, LIFECYCLE_PLAN_ACTIONS, LIFECYCLE_RESOURCE_STATES, } from "./lifecycleOperations.js";
6
+ function sameList(value, expected) {
7
+ return Array.isArray(value) && JSON.stringify(value) === JSON.stringify(expected);
8
+ }
9
+ export function validateLifecycleOperationContractData(value) {
10
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
11
+ return ["operation contract must be a YAML object"];
12
+ }
13
+ const data = value;
14
+ const errors = [];
15
+ if (data.schema_version !== "agentera.lifecycleOperationContract.v1") {
16
+ errors.push("schema_version must be agentera.lifecycleOperationContract.v1");
17
+ }
18
+ if (data.status !== "migration_only_contract") {
19
+ errors.push("status must be migration_only_contract");
20
+ }
21
+ if (data.decision !== 92)
22
+ errors.push("decision must cite approved Decision 92");
23
+ if (!sameList(data.resource_states, LIFECYCLE_RESOURCE_STATES)) {
24
+ errors.push(`resource_states must be ${LIFECYCLE_RESOURCE_STATES.join(", ")}`);
25
+ }
26
+ if (!sameList(data.plan_actions, LIFECYCLE_PLAN_ACTIONS)) {
27
+ errors.push(`plan_actions must be ${LIFECYCLE_PLAN_ACTIONS.join(", ")}`);
28
+ }
29
+ if (!sameList(data.apply_results, LIFECYCLE_APPLY_STATUSES)) {
30
+ errors.push(`apply_results must be ${LIFECYCLE_APPLY_STATUSES.join(", ")}`);
31
+ }
32
+ const ownership = data.ownership;
33
+ if (ownership?.identity_rule !== "Managed and published pending-create records bind the filesystem device and inode observed at publication.") {
34
+ errors.push("ownership.identity_rule must bind records to publication identity");
35
+ }
36
+ if (typeof ownership?.removal_rule !== "string" || !ownership.removal_rule.includes("identity and fingerprint")) {
37
+ errors.push("ownership.removal_rule must require matching identity and fingerprint");
38
+ }
39
+ if (ownership?.manual_review_guidance !==
40
+ "The destination is not ledger-owned; review the collision manually. Agentera will not adopt it by name or equality.") {
41
+ errors.push("ownership.manual_review_guidance must provide the exact no-adoption review guidance");
42
+ }
43
+ if (typeof ownership?.journal_rule !== "string"
44
+ || !ownership.journal_rule.includes("append-only")
45
+ || !ownership.journal_rule.includes("atomically at final names")
46
+ || !ownership.journal_rule.includes("contiguous sequence-one hash chain")) {
47
+ errors.push("ownership.journal_rule must require atomic append-only publication and a strict contiguous hash chain");
48
+ }
49
+ const journalStatuses = ownership?.journal_statuses;
50
+ if (!journalStatuses
51
+ || !["absent", "clean", "recoverable_terminal_tail", "corrupt"]
52
+ .every((state) => typeof journalStatuses[state] === "string")
53
+ || !journalStatuses.recoverable_terminal_tail.includes("every mutation is blocked")
54
+ || !journalStatuses.corrupt.includes("digest mismatch")) {
55
+ errors.push("ownership.journal_statuses must define the four strict read and mutation states");
56
+ }
57
+ if (typeof ownership?.recovery_rule !== "string"
58
+ || !ownership.recovery_rule.includes("non-authoritative publication temporaries")
59
+ || !ownership.recovery_rule.includes("rolled-back prefix")
60
+ || !ownership.recovery_rule.includes("re-observes each resource")) {
61
+ errors.push("ownership.recovery_rule must ignore only publication temporaries, block rollback append, and re-observe resources");
62
+ }
63
+ const publication = data.publication_policy;
64
+ if (publication?.supported_platform !== "linux_proc_self_fd") {
65
+ errors.push("publication_policy.supported_platform must be linux_proc_self_fd");
66
+ }
67
+ if (publication?.unsupported_platform_result !== "action_required") {
68
+ errors.push("publication_policy.unsupported_platform_result must be action_required");
69
+ }
70
+ if (typeof publication?.apply_serialization !== "string"
71
+ || !publication.apply_serialization.includes("complete live preparation blocks contenders")
72
+ || !publication.apply_serialization.includes("Linux boot ID")
73
+ || !publication.apply_serialization.includes("process start ticks")) {
74
+ errors.push("publication_policy.apply_serialization must atomically publish a complete strong-identity lock");
75
+ }
76
+ if (typeof publication?.lock_recovery !== "string"
77
+ || !publication.lock_recovery.includes("Malformed or incomplete final locks fail closed")
78
+ || !publication.lock_recovery.includes("full identity and token")) {
79
+ errors.push("publication_policy.lock_recovery must fail closed and verify identity on stale recovery and release");
80
+ }
81
+ if (typeof publication?.journal_publication !== "string"
82
+ || !publication.journal_publication.includes("non-authoritative temporary name")
83
+ || !publication.journal_publication.includes("hard-linked atomically")) {
84
+ errors.push("publication_policy.journal_publication must atomically publish durable complete final events");
85
+ }
86
+ if (publication?.destructive_path_mutations !== "owned_removal_only") {
87
+ errors.push("publication_policy.destructive_path_mutations must be owned_removal_only");
88
+ }
89
+ if (typeof publication?.cleanup_rule !== "string" || !publication.cleanup_rule.includes("never unlinks")) {
90
+ errors.push("publication_policy.cleanup_rule must forbid unlinking colliding or replaced paths");
91
+ }
92
+ const nativePolicy = data.native_policy;
93
+ if (nativePolicy?.install_update_auth_trust_operations !== "forbidden") {
94
+ errors.push("native_policy.install_update_auth_trust_operations must be forbidden");
95
+ }
96
+ if (nativePolicy?.trust_is_observed_only !== true) {
97
+ errors.push("native_policy.trust_is_observed_only must be true");
98
+ }
99
+ return errors;
100
+ }
101
+ export function loadLifecycleOperationContract(contractPath = path.join(resolveSourceRoot(), LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH)) {
102
+ const data = loadYamlMapping(fs.readFileSync(contractPath, "utf8"));
103
+ const errors = validateLifecycleOperationContractData(data);
104
+ if (errors.length > 0) {
105
+ throw new Error(`Lifecycle operation contract validation failed: ${errors.join("; ")}`);
106
+ }
107
+ return data;
108
+ }
109
+ export function validateLifecycleOperationContractRoot(root) {
110
+ const contractPath = path.join(root, LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH);
111
+ if (!fs.existsSync(contractPath)) {
112
+ return [`${LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH}:1: missing lifecycle operation contract`];
113
+ }
114
+ try {
115
+ loadLifecycleOperationContract(contractPath);
116
+ return [];
117
+ }
118
+ catch (error) {
119
+ return [
120
+ `${LIFECYCLE_OPERATION_CONTRACT_RELATIVE_PATH}: could not load contract: ${error.message}`,
121
+ ];
122
+ }
123
+ }