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

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