@clossys/launcher 0.3.0 → 0.4.0

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 (286) hide show
  1. package/README.md +1328 -60
  2. package/contracts/conversation-contract.md +2 -1
  3. package/contracts/product-ci-workflow.yml +74 -0
  4. package/contracts/repository-inventory.json +53 -0
  5. package/dist/admission-fixture.d.ts +168 -0
  6. package/dist/admission-fixture.d.ts.map +1 -0
  7. package/dist/admission-fixture.js +453 -0
  8. package/dist/admission-fixture.js.map +1 -0
  9. package/dist/admission.d.ts +124 -0
  10. package/dist/admission.d.ts.map +1 -0
  11. package/dist/admission.js +799 -0
  12. package/dist/admission.js.map +1 -0
  13. package/dist/agents-guide.d.ts +9 -0
  14. package/dist/agents-guide.d.ts.map +1 -0
  15. package/dist/agents-guide.js +26 -0
  16. package/dist/agents-guide.js.map +1 -0
  17. package/dist/apply-command-options.check.d.ts +12 -0
  18. package/dist/apply-command-options.check.d.ts.map +1 -0
  19. package/dist/apply-command-options.check.js +20 -0
  20. package/dist/apply-command-options.check.js.map +1 -0
  21. package/dist/apply-plan-cli.d.ts +39 -1
  22. package/dist/apply-plan-cli.d.ts.map +1 -1
  23. package/dist/apply-plan-cli.js +432 -15
  24. package/dist/apply-plan-cli.js.map +1 -1
  25. package/dist/apply-plan.d.ts +46 -59
  26. package/dist/apply-plan.d.ts.map +1 -1
  27. package/dist/apply-plan.js +112 -97
  28. package/dist/apply-plan.js.map +1 -1
  29. package/dist/apply-step-fixture.d.ts +87 -0
  30. package/dist/apply-step-fixture.d.ts.map +1 -0
  31. package/dist/apply-step-fixture.js +199 -0
  32. package/dist/apply-step-fixture.js.map +1 -0
  33. package/dist/apply-store.d.ts +93 -0
  34. package/dist/apply-store.d.ts.map +1 -0
  35. package/dist/apply-store.js +625 -0
  36. package/dist/apply-store.js.map +1 -0
  37. package/dist/approval-sheet.d.ts +21 -0
  38. package/dist/approval-sheet.d.ts.map +1 -0
  39. package/dist/approval-sheet.js +157 -0
  40. package/dist/approval-sheet.js.map +1 -0
  41. package/dist/body-command.d.ts +42 -0
  42. package/dist/body-command.d.ts.map +1 -0
  43. package/dist/body-command.js +143 -0
  44. package/dist/body-command.js.map +1 -0
  45. package/dist/change-set-contract.d.ts +381 -0
  46. package/dist/change-set-contract.d.ts.map +1 -0
  47. package/dist/change-set-contract.js +738 -0
  48. package/dist/change-set-contract.js.map +1 -0
  49. package/dist/change-set-digest.d.ts +28 -0
  50. package/dist/change-set-digest.d.ts.map +1 -0
  51. package/dist/change-set-digest.js +65 -0
  52. package/dist/change-set-digest.js.map +1 -0
  53. package/dist/check-cli.d.ts.map +1 -1
  54. package/dist/check-cli.js +14 -3
  55. package/dist/check-cli.js.map +1 -1
  56. package/dist/cli.d.ts +17 -6
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +84 -23
  59. package/dist/cli.js.map +1 -1
  60. package/dist/core.d.ts +79 -22
  61. package/dist/core.d.ts.map +1 -1
  62. package/dist/core.js +843 -268
  63. package/dist/core.js.map +1 -1
  64. package/dist/dry-materialize.d.ts +63 -0
  65. package/dist/dry-materialize.d.ts.map +1 -0
  66. package/dist/dry-materialize.js +330 -0
  67. package/dist/dry-materialize.js.map +1 -0
  68. package/dist/generated/contract-schema.generated.d.ts +97 -0
  69. package/dist/generated/contract-schema.generated.d.ts.map +1 -0
  70. package/dist/generated/contract-schema.generated.js +496 -0
  71. package/dist/generated/contract-schema.generated.js.map +1 -0
  72. package/dist/generated/package-scope.generated.d.ts +6 -0
  73. package/dist/generated/package-scope.generated.d.ts.map +1 -0
  74. package/dist/generated/package-scope.generated.js +10 -0
  75. package/dist/generated/package-scope.generated.js.map +1 -0
  76. package/dist/generated/plan-contracts.generated.d.ts +3 -0
  77. package/dist/generated/plan-contracts.generated.d.ts.map +1 -0
  78. package/dist/generated/plan-contracts.generated.js +2840 -0
  79. package/dist/generated/plan-contracts.generated.js.map +1 -0
  80. package/dist/host.d.ts.map +1 -1
  81. package/dist/host.js +11 -0
  82. package/dist/host.js.map +1 -1
  83. package/dist/identity.d.ts +15 -0
  84. package/dist/identity.d.ts.map +1 -0
  85. package/dist/identity.js +48 -0
  86. package/dist/identity.js.map +1 -0
  87. package/dist/index.d.ts +34 -5
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +19 -2
  90. package/dist/index.js.map +1 -1
  91. package/dist/inventory-adoption.d.ts +24 -5
  92. package/dist/inventory-adoption.d.ts.map +1 -1
  93. package/dist/inventory-adoption.js +70 -25
  94. package/dist/inventory-adoption.js.map +1 -1
  95. package/dist/inventory-choice.d.ts +40 -0
  96. package/dist/inventory-choice.d.ts.map +1 -0
  97. package/dist/inventory-choice.js +156 -0
  98. package/dist/inventory-choice.js.map +1 -0
  99. package/dist/inventory-contract.d.ts +89 -0
  100. package/dist/inventory-contract.d.ts.map +1 -0
  101. package/dist/inventory-contract.js +121 -0
  102. package/dist/inventory-contract.js.map +1 -0
  103. package/dist/key-editor.d.ts +30 -0
  104. package/dist/key-editor.d.ts.map +1 -0
  105. package/dist/key-editor.js +445 -0
  106. package/dist/key-editor.js.map +1 -0
  107. package/dist/ledger-contract.d.ts +187 -0
  108. package/dist/ledger-contract.d.ts.map +1 -0
  109. package/dist/ledger-contract.js +532 -0
  110. package/dist/ledger-contract.js.map +1 -0
  111. package/dist/ledger-trust.d.ts +90 -0
  112. package/dist/ledger-trust.d.ts.map +1 -0
  113. package/dist/ledger-trust.js +198 -0
  114. package/dist/ledger-trust.js.map +1 -0
  115. package/dist/lockfile-invariants.d.ts +48 -0
  116. package/dist/lockfile-invariants.d.ts.map +1 -0
  117. package/dist/lockfile-invariants.js +375 -0
  118. package/dist/lockfile-invariants.js.map +1 -0
  119. package/dist/lockfile-readers.d.ts +72 -0
  120. package/dist/lockfile-readers.d.ts.map +1 -0
  121. package/dist/lockfile-readers.js +713 -0
  122. package/dist/lockfile-readers.js.map +1 -0
  123. package/dist/lockfile-regen.d.ts +106 -0
  124. package/dist/lockfile-regen.d.ts.map +1 -0
  125. package/dist/lockfile-regen.js +760 -0
  126. package/dist/lockfile-regen.js.map +1 -0
  127. package/dist/lockfile-tool-env.d.ts +29 -0
  128. package/dist/lockfile-tool-env.d.ts.map +1 -0
  129. package/dist/lockfile-tool-env.js +111 -0
  130. package/dist/lockfile-tool-env.js.map +1 -0
  131. package/dist/materialize.d.ts +113 -0
  132. package/dist/materialize.d.ts.map +1 -0
  133. package/dist/materialize.js +840 -0
  134. package/dist/materialize.js.map +1 -0
  135. package/dist/observe-repository.d.ts +90 -0
  136. package/dist/observe-repository.d.ts.map +1 -0
  137. package/dist/observe-repository.js +1367 -0
  138. package/dist/observe-repository.js.map +1 -0
  139. package/dist/plan-bundle-setup-fixture.d.ts +68 -0
  140. package/dist/plan-bundle-setup-fixture.d.ts.map +1 -0
  141. package/dist/plan-bundle-setup-fixture.js +167 -0
  142. package/dist/plan-bundle-setup-fixture.js.map +1 -0
  143. package/dist/plan-bundle.d.ts +250 -0
  144. package/dist/plan-bundle.d.ts.map +1 -0
  145. package/dist/plan-bundle.js +827 -0
  146. package/dist/plan-bundle.js.map +1 -0
  147. package/dist/plan-command.d.ts +29 -0
  148. package/dist/plan-command.d.ts.map +1 -0
  149. package/dist/plan-command.js +493 -0
  150. package/dist/plan-command.js.map +1 -0
  151. package/dist/plan-contract.d.ts +153 -0
  152. package/dist/plan-contract.d.ts.map +1 -0
  153. package/dist/plan-contract.js +61 -0
  154. package/dist/plan-contract.js.map +1 -0
  155. package/dist/plan-digest.d.ts +25 -0
  156. package/dist/plan-digest.d.ts.map +1 -0
  157. package/dist/plan-digest.js +106 -0
  158. package/dist/plan-digest.js.map +1 -0
  159. package/dist/plan-rules.d.ts +23 -0
  160. package/dist/plan-rules.d.ts.map +1 -0
  161. package/dist/plan-rules.js +177 -0
  162. package/dist/plan-rules.js.map +1 -0
  163. package/dist/planned-bundle.d.ts +20 -0
  164. package/dist/planned-bundle.d.ts.map +1 -0
  165. package/dist/planned-bundle.js +191 -0
  166. package/dist/planned-bundle.js.map +1 -0
  167. package/dist/product-repository.d.ts +4 -0
  168. package/dist/product-repository.d.ts.map +1 -1
  169. package/dist/product-repository.js +9 -1
  170. package/dist/product-repository.js.map +1 -1
  171. package/dist/provenance-gate.d.ts +48 -0
  172. package/dist/provenance-gate.d.ts.map +1 -0
  173. package/dist/provenance-gate.js +324 -0
  174. package/dist/provenance-gate.js.map +1 -0
  175. package/dist/pull-request-body.d.ts +45 -0
  176. package/dist/pull-request-body.d.ts.map +1 -0
  177. package/dist/pull-request-body.js +232 -0
  178. package/dist/pull-request-body.js.map +1 -0
  179. package/dist/registry-snapshot.d.ts +141 -0
  180. package/dist/registry-snapshot.d.ts.map +1 -0
  181. package/dist/registry-snapshot.js +483 -0
  182. package/dist/registry-snapshot.js.map +1 -0
  183. package/dist/release-age-edit.d.ts +52 -0
  184. package/dist/release-age-edit.d.ts.map +1 -0
  185. package/dist/release-age-edit.js +413 -0
  186. package/dist/release-age-edit.js.map +1 -0
  187. package/dist/root-entries.d.ts +36 -0
  188. package/dist/root-entries.d.ts.map +1 -0
  189. package/dist/root-entries.js +80 -0
  190. package/dist/root-entries.js.map +1 -0
  191. package/dist/setup-template-scripts.d.ts +34 -0
  192. package/dist/setup-template-scripts.d.ts.map +1 -0
  193. package/dist/setup-template-scripts.js +557 -0
  194. package/dist/setup-template-scripts.js.map +1 -0
  195. package/dist/setup-templates.d.ts +54 -0
  196. package/dist/setup-templates.d.ts.map +1 -0
  197. package/dist/setup-templates.js +427 -0
  198. package/dist/setup-templates.js.map +1 -0
  199. package/dist/skills.d.ts +34 -1
  200. package/dist/skills.d.ts.map +1 -1
  201. package/dist/skills.js +129 -17
  202. package/dist/skills.js.map +1 -1
  203. package/dist/status.d.ts +63 -0
  204. package/dist/status.d.ts.map +1 -0
  205. package/dist/status.js +539 -0
  206. package/dist/status.js.map +1 -0
  207. package/dist/types.d.ts +151 -13
  208. package/dist/types.d.ts.map +1 -1
  209. package/package.json +4 -5
  210. package/skeleton/README.md +14 -9
  211. package/skeleton/package.json +2 -1
  212. package/skill/SKILL.md +20 -16
  213. package/skill-catalogue/advisor/SKILL.md +100 -11
  214. package/skill-catalogue/architect/SKILL.md +2 -13
  215. package/skill-catalogue/bouncer/SKILL.md +2 -13
  216. package/skill-catalogue/builder/SKILL.md +2 -13
  217. package/skill-catalogue/butler/SKILL.md +2 -13
  218. package/skill-catalogue/controller/SKILL.md +2 -13
  219. package/skill-catalogue/customer/SKILL.md +4 -13
  220. package/skill-catalogue/designer/SKILL.md +9 -14
  221. package/skill-catalogue/giver/SKILL.md +2 -13
  222. package/skill-catalogue/influencer/SKILL.md +2 -13
  223. package/skill-catalogue/inspector/SKILL.md +2 -13
  224. package/skill-catalogue/integrator/SKILL.md +2 -13
  225. package/skill-catalogue/keeper/SKILL.md +2 -13
  226. package/skill-catalogue/launcher/SKILL.md +20 -16
  227. package/skill-catalogue/locksmith/SKILL.md +2 -13
  228. package/skill-catalogue/messenger/SKILL.md +2 -13
  229. package/skill-catalogue/observer/SKILL.md +2 -13
  230. package/skill-catalogue/publisher/SKILL.md +11 -17
  231. package/skill-catalogue/starter/SKILL.md +3 -13
  232. package/skill-catalogue/strategist/SKILL.md +14 -17
  233. package/skill-catalogue/writer/SKILL.md +7 -14
  234. package/src/admission-fixture.ts +572 -0
  235. package/src/admission.ts +816 -0
  236. package/src/agents-guide.ts +29 -0
  237. package/src/apply-command-options.check.ts +27 -0
  238. package/src/apply-plan-cli.ts +454 -14
  239. package/src/apply-plan.ts +112 -124
  240. package/src/apply-step-fixture.ts +236 -0
  241. package/src/apply-store.ts +584 -0
  242. package/src/approval-sheet.ts +164 -0
  243. package/src/body-command.ts +162 -0
  244. package/src/change-set-contract.ts +937 -0
  245. package/src/change-set-digest.ts +70 -0
  246. package/src/check-cli.ts +14 -3
  247. package/src/cli.ts +90 -22
  248. package/src/core.ts +973 -275
  249. package/src/dry-materialize.ts +353 -0
  250. package/src/generated/contract-schema.generated.ts +520 -0
  251. package/src/generated/package-scope.generated.ts +10 -0
  252. package/src/generated/plan-contracts.generated.ts +2840 -0
  253. package/src/host.ts +10 -0
  254. package/src/identity.ts +51 -0
  255. package/src/index.ts +72 -3
  256. package/src/inventory-adoption.ts +107 -29
  257. package/src/inventory-choice.ts +172 -0
  258. package/src/inventory-contract.ts +166 -0
  259. package/src/key-editor.ts +446 -0
  260. package/src/ledger-contract.ts +637 -0
  261. package/src/ledger-trust.ts +267 -0
  262. package/src/lockfile-invariants.ts +421 -0
  263. package/src/lockfile-readers.ts +749 -0
  264. package/src/lockfile-regen.ts +851 -0
  265. package/src/lockfile-tool-env.ts +131 -0
  266. package/src/materialize.ts +886 -0
  267. package/src/observe-repository.ts +1365 -0
  268. package/src/plan-bundle-setup-fixture.ts +200 -0
  269. package/src/plan-bundle.ts +964 -0
  270. package/src/plan-command.ts +509 -0
  271. package/src/plan-contract.ts +179 -0
  272. package/src/plan-digest.ts +102 -0
  273. package/src/plan-rules.ts +188 -0
  274. package/src/planned-bundle.ts +211 -0
  275. package/src/product-repository.ts +10 -1
  276. package/src/provenance-gate.ts +352 -0
  277. package/src/pull-request-body.ts +261 -0
  278. package/src/registry-snapshot.ts +534 -0
  279. package/src/release-age-edit.ts +430 -0
  280. package/src/root-entries.ts +81 -0
  281. package/src/setup-template-scripts.ts +571 -0
  282. package/src/setup-templates.ts +471 -0
  283. package/src/skills.ts +161 -18
  284. package/src/status.ts +557 -0
  285. package/src/types.ts +148 -13
  286. package/CHANGELOG.md +0 -131
@@ -24,7 +24,7 @@ staff this role, it says so in plain language and routes the client to
24
24
 
25
25
  Every reply has four parts:
26
26
 
27
- 1. **Where we are** — one or two plain sentences, grounded in the brief and this role's status probe.
27
+ 1. **Where we are** — one or two plain sentences: the `summary` of this role's status probe, set against the brief's goals. The status probe is the one source for this part; never derive it from the role's status file or any other file. If the role has no status probe, or it cannot measure yet, say so plainly.
28
28
  2. **My recommendation** — what we would do, with a one-line reason. Always stated.
29
29
  3. **Your call** — one question with 2-4 options, the recommended option listed first and labelled, "something else" as the only free-text path. Use the host's multiple-choice control when one exists; otherwise numbered picks.
30
30
  4. **What happens next** — what happens if the client takes the recommendation.
@@ -38,3 +38,4 @@ Rules:
38
38
  - One decision per turn; no forms.
39
39
  - Push back once, plainly, when a choice goes against the recommendation. Refuse, with the reason, when a choice breaks a hard rule.
40
40
  - Read-only until approval, one approved step at a time; chat agreement by itself is never authorization.
41
+ - Invoked with the `loop` keyword, run exactly one iteration of the five stages of the role-loop archetypes that `@clossys/controller` ships (see its README) -- `sense`, `judge`, `act`, `verify`, `learn` -- and stop at the approval gate inside `judge`; a bare mention without `loop` never starts one.
@@ -0,0 +1,74 @@
1
+ # CI workflow for a client product repository. The setup pull request of a
2
+ # product repository writes this file as .github/workflows/clossys-ci.yml,
3
+ # only when that path is absent -- an existing file is left as the
4
+ # repository has it.
5
+ #
6
+ # Passes ci-conventions-check with `verify-product` declared as the required
7
+ # context mapped to that installed path; a test in this package runs the
8
+ # shipped bytes through the checker. One job means no fan-in job is needed:
9
+ # `verify-product` is itself the required-status-check context.
10
+ #
11
+ # The package manager is chosen by lockfile, and anything else fails
12
+ # closed: a repository with exactly one of package-lock.json or
13
+ # pnpm-lock.yaml installs with that manager, and a repository with both, with
14
+ # neither, or with a yarn.lock beside either is refused by the install step
15
+ # with an error rather than guessed at. The install step
16
+ # passes --ignore-scripts, and no cache is configured because cache selection
17
+ # would need the same lockfile decision made before the install step runs.
18
+ # Build and test run the repository's own `build` and `test` scripts when
19
+ # present and skip a missing one.
20
+
21
+ name: Clossys CI
22
+
23
+ on:
24
+ pull_request:
25
+ push:
26
+ branches: [main]
27
+ merge_group:
28
+
29
+ # Least-privilege by default (ci-conventions.md, Security). A job that
30
+ # genuinely needs more declares exactly that job-level exception.
31
+ permissions:
32
+ contents: read
33
+
34
+ # cancel-in-progress only for pull_request: the group key includes the
35
+ # event name, so a push (to main) or a merge_group run is never cancelled
36
+ # by a later pull_request run on the same ref, and a pull_request run IS
37
+ # cancelled by its own next push -- ci-conventions.md, Cost.
38
+ concurrency:
39
+ group: ci-${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
40
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
41
+
42
+ jobs:
43
+ verify-product:
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 15
46
+ steps:
47
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
48
+ with:
49
+ persist-credentials: false
50
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
51
+ with:
52
+ node-version: 20
53
+ # Selects the manager once and records it as PM for the build and
54
+ # test steps below, so the lockfile decision is not repeated.
55
+ - name: Install dependencies
56
+ run: |
57
+ if [ -f yarn.lock ]; then
58
+ echo "::error::yarn.lock is present and Yarn is not supported"
59
+ exit 1
60
+ elif [ -f pnpm-lock.yaml ] && [ ! -f package-lock.json ]; then
61
+ echo "PM=pnpm" >> "$GITHUB_ENV"
62
+ corepack enable
63
+ pnpm install --frozen-lockfile --ignore-scripts
64
+ elif [ -f package-lock.json ] && [ ! -f pnpm-lock.yaml ]; then
65
+ echo "PM=npm" >> "$GITHUB_ENV"
66
+ npm ci --ignore-scripts
67
+ else
68
+ echo "::error::exactly one of package-lock.json or pnpm-lock.yaml is required"
69
+ exit 1
70
+ fi
71
+ - name: Build
72
+ run: '"${PM:?}" run --if-present build'
73
+ - name: Test
74
+ run: '"${PM:?}" run --if-present test'
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/clossys/foundry/blob/main/docs/contracts/repository-inventory.json",
4
+ "title": "hub repository inventory",
5
+ "description": "Issues #996, #1334 and #1179: the one v1 shape of a hub's repository inventory. Declared location: clossys/.state/inventory.json in the hub. That file is machine state, not a hand-edited record (see docs/contracts/consumer-layout.json's `clossys/.state/` entry). @clossys/launcher writes it on appoint -- from the repositories a founder chose on @clossys/advisor's repository-choice card (`launcher --repositories`), from a supplied --inventory document, or from a merge of an --inventory document with the on-disk inventory -- and reads it back on every resume. Every inventory file is read as its exact bytes by the shared strict reader (readContractDocument()), never decoded to text first, so bytes that are not valid UTF-8 are refused rather than replaced. Both packages pack this file at build time and check it with the one shared contract checker (packages/advisor/src/contract-schema.ts), so neither depends on the other. Launcher's validateInventoryDocument() checks every inventory document against it, on write and on read; Advisor's repositoryChoiceCard() checks the repository ids it offers against definitions/repositoryId. A document at the declared location that fails this contract is reported as invalid, with the offending field named, never silently treated as though it were merely empty and never adopted as though it validated. One rule is not expressible in this schema and every reader applies it in code: two entries whose ids are the same repository under a different letter case (GitHub owner and repository names are case-insensitive) are a duplicate and are refused, not silently kept as two entries. Where the hub's owner is known -- every read Launcher makes of a hub's inventory, and every set of ids chosen for one -- a bare id also names that owner's repository, so `app` and `<owner>/app` are the same repository and are refused the same way, by position. Launcher decides whether two ids are the same repository by that one identity everywhere (packages/launcher/src/identity.ts, in this public repository). Provenance (#1334): launcher's --inventory once accepted any JSON document that merely carried a repositories-shaped array (for example a governance record whose entries also carried role, visibility, status, and notes) and wrote it as the hub inventory with no schema check; every object here is therefore closed. Future, not built: the apply-plan work (#1178) wants a per-entry `status` field and a GitHub repository id distinct from the human-chosen `id`. Those arrive as a v2 of this contract (a new schemaVersion value, additive fields, or both -- not decided here); this v1 contract does not reserve or accept either field, and a document that includes one now is refused like any other unrecognized key.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schemaVersion", "repositories"],
9
+ "properties": {
10
+ "schemaVersion": { "const": 1 },
11
+ "repositories": {
12
+ "type": "array",
13
+ "description": "Every repository in the hub's scope, in the order they were chosen. May be empty (a freshly created hub); appointing an existing repository as the hub requires at least one entry, which @clossys/launcher enforces.",
14
+ "items": { "$ref": "#/definitions/repository" }
15
+ }
16
+ },
17
+ "definitions": {
18
+ "repositoryId": {
19
+ "title": "a bare repository name or owner/name, with no \".\" or \"..\" segment, empty segment, whitespace, or more than one \"/\"",
20
+ "description": "Identifies one repository: a bare repository name (read as belonging to the hub's own owner), or `owner/name`. The owner segment follows this pattern's own owner rule (letters, digits and hyphens, never leading or trailing, at most 39 characters -- this pattern does not reject a run of consecutive hyphens) and the name segment GitHub's repository rule (letters, digits, `.`, `_`, `-`), the same rules @clossys/launcher applies when it resolves a sibling clone beside the hub -- so a document's ids and the repositories Launcher clones or composes skills into are governed by one rule. Valid: `app`, `acme/app`. Refused: `\"\"`, ` app`, `app `, `acme/app/extra`, `acme/`, `/app`, `.`, `..`, `acme/..`.",
21
+ "type": "string",
22
+ "pattern": "^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?/)?(?!\\.\\.?$)[A-Za-z0-9._-]+$"
23
+ },
24
+ "repository": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["id"],
28
+ "properties": {
29
+ "id": { "$ref": "#/definitions/repositoryId" },
30
+ "packages": {
31
+ "type": "array",
32
+ "description": "Optional. Exactly the shape of @clossys/integrator's InventoryPackageEntry (#996, packages/integrator/src/delta.ts, documented in packages/integrator/README.md's \"Per-repository currency delta\" section), which Integrator's emitCurrencyDelta() produces -- one definition read by both packages, not a launcher-owned approximation of it.",
33
+ "items": { "$ref": "#/definitions/packageEntry" }
34
+ }
35
+ }
36
+ },
37
+ "packageEntry": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": ["name"],
41
+ "properties": {
42
+ "name": { "$ref": "#/definitions/nonBlankString" },
43
+ "version": { "$ref": "#/definitions/nonBlankString", "description": "Present only where a currency judgment named a target version." },
44
+ "wiring": { "enum": ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies", "unknown"] }
45
+ }
46
+ },
47
+ "nonBlankString": {
48
+ "title": "a string with at least one non-whitespace character",
49
+ "type": "string",
50
+ "pattern": "\\S"
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,168 @@
1
+ import type { AdmissionReaders, BaseTreeEntry, HubAuthority } from "./admission.js";
2
+ import type { ApplyBundle, RepositoryChangeSet } from "./change-set-contract.js";
3
+ import type { InstalledLedger } from "./ledger-contract.js";
4
+ import type { AdvisorPlan } from "./plan-contract.js";
5
+ export type Loose = Record<string, any>;
6
+ export declare const SITE_ID = "example-owner/site";
7
+ export declare const SITE_NODE_ID = "R_exampleSite1";
8
+ export declare const DOCS_ID = "example-owner/docs";
9
+ export declare const STARTER = "example-owner/site:@example/starter";
10
+ export declare const STRATEGIST = "example-owner/site:@example/strategist";
11
+ export declare const WRITER = "example-owner/site:@example/writer";
12
+ export declare const PLAN_FILE = "clossys/advisor/plan.json";
13
+ export declare const ASSESSMENT_FILE = "clossys/advisor/assessment-input.json";
14
+ export declare const READINESS_BIN = "node_modules/.bin/advisor-execution-readiness";
15
+ export declare const FAR_FUTURE = "2999-01-01T00:00:00Z";
16
+ export declare const clone: <T>(value: T) => T;
17
+ /** Recomputes a set's own digest, and the branch and title that follow from it. */
18
+ export declare function reseal(set: Loose): RepositoryChangeSet;
19
+ export declare const corpusSet: (name: string) => Loose;
20
+ export declare function git(cwd: string, ...args: string[]): string;
21
+ export interface DecisionInput {
22
+ readonly at: string;
23
+ readonly chosen: string;
24
+ readonly subjectDigest?: string;
25
+ }
26
+ export declare function decision(at: string, chosen: string, subjectDigest?: string): Loose;
27
+ /** The corpus plan with staffing and exact packages, with its decisions replaced. */
28
+ export declare function withDecisions(plan: AdvisorPlan, decisions: readonly Loose[]): AdvisorPlan;
29
+ /** The corpus plan before any decision: its digest does not depend on decisions. */
30
+ export declare function basePlan(): Loose;
31
+ export declare const FIRST_AT = "2026-09-24T10:00:00Z";
32
+ export declare const LATER_AT = "2026-09-25T10:00:00Z";
33
+ /** A plan whose latest decision approves `subject`. */
34
+ export declare function approvedPlan(subject: string, base?: AdvisorPlan): AdvisorPlan;
35
+ /** `decide(plan, chosen, at, subject?)`: the plan with one more decision. */
36
+ export declare function decide(plan: AdvisorPlan, chosen: string, at: string, subject?: string): AdvisorPlan;
37
+ /** What readHubAuthority returns for the plan: the head is that of `hub`, else of the hub last built for this plan, or a placeholder commit id when none was. */
38
+ export declare function authorityOf(plan: AdvisorPlan, hub?: string): HubAuthority;
39
+ /** The plan's identity for each package act of one repository. */
40
+ export declare function committedPlanPackages(plan: AdvisorPlan, repositoryId: string): {
41
+ planItem: string;
42
+ act: "install" | "pin-starter";
43
+ name: string;
44
+ version: string;
45
+ integrity: string;
46
+ placement: "dependencies" | "devDependencies";
47
+ }[];
48
+ export interface BundleEntryInput {
49
+ readonly id: string;
50
+ readonly set?: RepositoryChangeSet;
51
+ readonly changeSet?: string;
52
+ readonly phase?: "setup" | "apply";
53
+ }
54
+ /** A valid report bundle for `plan`, holding the given change sets, with its digest computed. */
55
+ export declare function bundleOf(plan: AdvisorPlan, entries: readonly BundleEntryInput[], extra?: {
56
+ planDigest?: string;
57
+ computedAt?: string;
58
+ }): ApplyBundle;
59
+ export type BaseTree = Map<string, BaseTreeEntry>;
60
+ export declare const MANIFEST: string;
61
+ export declare function lockfileText(packages: readonly {
62
+ name: string;
63
+ version: string;
64
+ integrity: string;
65
+ }[], placement?: "devDependencies" | "dependencies"): string;
66
+ /** The in-memory readers the pure core takes over a base tree, and the hub's stored bundles and sets. */
67
+ export declare function memoryReaders(state: {
68
+ bundles: readonly ApplyBundle[];
69
+ sets: readonly RepositoryChangeSet[];
70
+ tree: BaseTree;
71
+ }): AdmissionReaders;
72
+ export interface WorldOptions {
73
+ /** Edits the plan before its digest is taken: everything the digest covers. */
74
+ readonly editPlan?: (plan: Loose) => void;
75
+ /** Edits the setup set (and its texts) before it is sealed. */
76
+ readonly editSetup?: (set: Loose, texts: Record<string, string>) => void;
77
+ /** Edits the apply set before it is sealed. */
78
+ readonly editApply?: (set: Loose, texts: Record<string, string>) => void;
79
+ /** Called with the base tree once it exists, returning the commit it lives at. */
80
+ readonly commitBase?: (tree: BaseTree) => string;
81
+ }
82
+ export interface World {
83
+ readonly plan: AdvisorPlan;
84
+ readonly planDigest: string;
85
+ readonly authority: HubAuthority;
86
+ readonly setup: RepositoryChangeSet;
87
+ readonly apply: RepositoryChangeSet;
88
+ readonly texts: Record<string, string>;
89
+ /** The approved bundle: it holds the setup set. */
90
+ readonly approvedBundle: ApplyBundle;
91
+ /** The later run's bundle: it holds the apply set, and is what the apply set's `bundle` names. */
92
+ readonly applyBundle: ApplyBundle;
93
+ readonly ledgerBytes: Buffer;
94
+ readonly ledger: InstalledLedger;
95
+ readonly tree: BaseTree;
96
+ readonly baseCommit: string;
97
+ }
98
+ export declare const DEFAULT_BASE_COMMIT: string;
99
+ /** Whole-file bytes for every whole file of a set: a discovery link's target, or a line of text. */
100
+ export declare function textsFor(set: Loose): Record<string, string>;
101
+ /** The ledger a setup set writes from nothing: `renderInstalledLedger(null, ...)` with the plan's identities. */
102
+ export declare function setupLedgerBytes(set: RepositoryChangeSet, subject: string, plan: AdvisorPlan): Buffer;
103
+ /** Re-serializes a ledger after `edit`, canonically: for rows that must still pass L1 to L10. */
104
+ export declare function editLedger(bytes: Uint8Array, edit: (ledger: Loose) => void): Buffer;
105
+ /**
106
+ * The corpus pair `setup-site` / `apply-after-setup`, retargeted to a plan and
107
+ * resealed, with the approved bundle, the later run's bundle, the ledger the
108
+ * merged setup leaves, and the tree of the base it lives in.
109
+ */
110
+ export declare function buildWorld(options?: WorldOptions): World;
111
+ /** The same world's apply set as a fresh copy that changed `edit` and was resealed (its `bundle` kept). */
112
+ export declare function mutateSet(set: RepositoryChangeSet, edit: (set: Loose) => void): RepositoryChangeSet;
113
+ export declare function makeRoot(roots: string[], prefix?: string): string;
114
+ export interface SiteRepoOptions {
115
+ readonly mergeStyle?: "direct" | "squash";
116
+ }
117
+ /**
118
+ * A local clone whose default branch holds exactly `tree`. With `squash`, the
119
+ * files arrive on a side branch and land as one new commit with no ancestor on
120
+ * that branch, the way a squash merge leaves them.
121
+ */
122
+ export declare function siteRepo(roots: string[], tree: BaseTree, options?: SiteRepoOptions): {
123
+ clone: string;
124
+ baseCommit: string;
125
+ sideTip: string | null;
126
+ };
127
+ /** A stub for advisor-execution-readiness: exit 0 when expiresAt is later than argv[3], 1 when not, 2 when unreadable. */
128
+ export declare const READINESS_STUB = "#!/usr/bin/env node\nconst fs = require(\"node:fs\");\nlet document;\ntry {\n document = JSON.parse(fs.readFileSync(process.argv[2], \"utf8\"));\n} catch {\n process.exit(2);\n}\nconst engagement = document && document.engagement;\nif (engagement && engagement.hang === true) setTimeout(() => process.exit(0), 60000);\nelse {\n const authorization = engagement && engagement.executionAuthorization;\n const expires = authorization ? Date.parse(authorization.expiresAt) : NaN;\n const asOf = Date.parse(process.argv[3]);\n if (Number.isNaN(expires) || Number.isNaN(asOf)) process.exit(2);\n process.exit(expires > asOf ? 0 : 1);\n}\n";
129
+ export declare function writeReadinessStub(hub: string): string;
130
+ /** An assessment-input document carrying an execution authorization for a plan. */
131
+ export declare function assessmentFor(plan: AdvisorPlan, patch?: Loose, permitted?: readonly string[]): Loose;
132
+ export interface HubOptions {
133
+ /** The plans committed in order; the last one is the head. */
134
+ readonly plans: readonly AdvisorPlan[];
135
+ /** An uncommitted edit of plan.json in the worktree. */
136
+ readonly worktreePlan?: AdvisorPlan;
137
+ /** Commits plan.json as this instead of the JSON of a plan. */
138
+ readonly planBytes?: string;
139
+ readonly planMode?: "regular" | "symlink" | "executable" | "absent";
140
+ /** Detach HEAD at the commit with this index (0 is the first). */
141
+ readonly detachAt?: number;
142
+ /** The committed assessment-input.json: a document, or null to commit none. Default: a current authorization for the last plan. */
143
+ readonly assessment?: Loose | null;
144
+ /** Write the stub readiness executable into the hub's node_modules/.bin. Default true. */
145
+ readonly readiness?: boolean;
146
+ readonly sets?: readonly RepositoryChangeSet[];
147
+ readonly bundles?: readonly ApplyBundle[];
148
+ /** Put the hub in a subdirectory of the repository that holds it. */
149
+ readonly nested?: boolean;
150
+ /** Give the hub's branch an upstream: a bare origin the commits are pushed to. Default true; false leaves the branch with none. */
151
+ readonly upstream?: boolean;
152
+ }
153
+ export interface HubFixture {
154
+ readonly hub: string;
155
+ readonly repository: string;
156
+ readonly commits: readonly string[];
157
+ /** The bare origin the hub's branch tracks, or null when it has none. */
158
+ readonly origin: string | null;
159
+ }
160
+ /** A temporary git hub with plan.json (and assessment-input.json) committed, and sets and bundles stored in it. */
161
+ export declare function hubRepo(roots: string[], options: HubOptions): HubFixture;
162
+ /** Commits `plan` as clossys/advisor/plan.json at the hub's current branch, and pushes it when the branch has an upstream: one more decision, or a whole other plan. */
163
+ export declare function commitHubPlan(hub: string, plan: AdvisorPlan, message?: string): string;
164
+ /** Commits a new assessment-input.json at the hub's current branch, and pushes it when the branch has an upstream. */
165
+ export declare function commitHubAssessment(hub: string, document: Loose, message?: string): string;
166
+ /** Puts one more commit on the hub's origin from a separate clone, then fetches it: the hub's branch is now behind its upstream. */
167
+ export declare function advanceHubUpstream(roots: string[], hub: string, origin: string): void;
168
+ //# sourceMappingURL=admission-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission-fixture.d.ts","sourceRoot":"","sources":["../src/admission-fixture.ts"],"names":[],"mappings":"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"}