ctxr-cli 0.32.0 → 0.34.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 (275) hide show
  1. package/README.md +15 -1
  2. package/dist/commands/archive.d.ts +5 -4
  3. package/dist/commands/archive.d.ts.map +1 -1
  4. package/dist/commands/archive.js +7 -7
  5. package/dist/commands/archive.js.map +1 -1
  6. package/dist/commands/catalog-show.d.ts +8 -0
  7. package/dist/commands/catalog-show.d.ts.map +1 -1
  8. package/dist/commands/catalog-show.js +29 -2
  9. package/dist/commands/catalog-show.js.map +1 -1
  10. package/dist/commands/context-gather.d.ts.map +1 -1
  11. package/dist/commands/context-gather.js +3 -2
  12. package/dist/commands/context-gather.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +5 -1
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +4 -0
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/graph-build.d.ts +4 -1
  18. package/dist/commands/graph-build.d.ts.map +1 -1
  19. package/dist/commands/graph-build.js +14 -5
  20. package/dist/commands/graph-build.js.map +1 -1
  21. package/dist/commands/land.d.ts +27 -7
  22. package/dist/commands/land.d.ts.map +1 -1
  23. package/dist/commands/land.js +307 -32
  24. package/dist/commands/land.js.map +1 -1
  25. package/dist/commands/publish-gather.d.ts.map +1 -1
  26. package/dist/commands/publish-gather.js +2 -3
  27. package/dist/commands/publish-gather.js.map +1 -1
  28. package/dist/commands/review-list.d.ts +19 -5
  29. package/dist/commands/review-list.d.ts.map +1 -1
  30. package/dist/commands/review-list.js +55 -6
  31. package/dist/commands/review-list.js.map +1 -1
  32. package/dist/commands/rollup-gather.d.ts.map +1 -1
  33. package/dist/commands/rollup-gather.js +2 -3
  34. package/dist/commands/rollup-gather.js.map +1 -1
  35. package/dist/commands/second-opinion.d.ts +33 -0
  36. package/dist/commands/second-opinion.d.ts.map +1 -0
  37. package/dist/commands/second-opinion.js +56 -0
  38. package/dist/commands/second-opinion.js.map +1 -0
  39. package/dist/commands/serve.d.ts.map +1 -1
  40. package/dist/commands/serve.js +4 -0
  41. package/dist/commands/serve.js.map +1 -1
  42. package/dist/commands/session-discard.d.ts +18 -0
  43. package/dist/commands/session-discard.d.ts.map +1 -0
  44. package/dist/commands/session-discard.js +31 -0
  45. package/dist/commands/session-discard.js.map +1 -0
  46. package/dist/commands/session-list.d.ts +17 -6
  47. package/dist/commands/session-list.d.ts.map +1 -1
  48. package/dist/commands/session-list.js +31 -11
  49. package/dist/commands/session-list.js.map +1 -1
  50. package/dist/commands/session-rebase.d.ts +18 -0
  51. package/dist/commands/session-rebase.d.ts.map +1 -0
  52. package/dist/commands/session-rebase.js +43 -0
  53. package/dist/commands/session-rebase.js.map +1 -0
  54. package/dist/commands/session-start.d.ts +8 -0
  55. package/dist/commands/session-start.d.ts.map +1 -1
  56. package/dist/commands/session-start.js +45 -5
  57. package/dist/commands/session-start.js.map +1 -1
  58. package/dist/commands/session-status.d.ts +17 -0
  59. package/dist/commands/session-status.d.ts.map +1 -0
  60. package/dist/commands/session-status.js +38 -0
  61. package/dist/commands/session-status.js.map +1 -0
  62. package/dist/commands/session-submit.d.ts +23 -0
  63. package/dist/commands/session-submit.d.ts.map +1 -0
  64. package/dist/commands/session-submit.js +42 -0
  65. package/dist/commands/session-submit.js.map +1 -0
  66. package/dist/commands/shared-stores-status.d.ts +24 -0
  67. package/dist/commands/shared-stores-status.d.ts.map +1 -0
  68. package/dist/commands/shared-stores-status.js +51 -0
  69. package/dist/commands/shared-stores-status.js.map +1 -0
  70. package/dist/commands/shared-stores-sync.d.ts +27 -0
  71. package/dist/commands/shared-stores-sync.d.ts.map +1 -0
  72. package/dist/commands/shared-stores-sync.js +115 -0
  73. package/dist/commands/shared-stores-sync.js.map +1 -0
  74. package/dist/commands/verify.d.ts.map +1 -1
  75. package/dist/commands/verify.js +2 -4
  76. package/dist/commands/verify.js.map +1 -1
  77. package/dist/config/schema.d.ts +16 -0
  78. package/dist/config/schema.d.ts.map +1 -1
  79. package/dist/config/schema.js +32 -0
  80. package/dist/config/schema.js.map +1 -1
  81. package/dist/core/agents-doc.d.ts +10 -0
  82. package/dist/core/agents-doc.d.ts.map +1 -1
  83. package/dist/core/agents-doc.js +26 -1
  84. package/dist/core/agents-doc.js.map +1 -1
  85. package/dist/core/approval/decision.d.ts +39 -1
  86. package/dist/core/approval/decision.d.ts.map +1 -1
  87. package/dist/core/approval/decision.js +53 -6
  88. package/dist/core/approval/decision.js.map +1 -1
  89. package/dist/core/approval/session-group.d.ts +156 -0
  90. package/dist/core/approval/session-group.d.ts.map +1 -0
  91. package/dist/core/approval/session-group.js +359 -0
  92. package/dist/core/approval/session-group.js.map +1 -0
  93. package/dist/core/approval/session-marker.d.ts +79 -0
  94. package/dist/core/approval/session-marker.d.ts.map +1 -0
  95. package/dist/core/approval/session-marker.js +146 -0
  96. package/dist/core/approval/session-marker.js.map +1 -0
  97. package/dist/core/approval/store-forges.d.ts +15 -0
  98. package/dist/core/approval/store-forges.d.ts.map +1 -0
  99. package/dist/core/approval/store-forges.js +33 -0
  100. package/dist/core/approval/store-forges.js.map +1 -0
  101. package/dist/core/browse/approve.d.ts +8 -0
  102. package/dist/core/browse/approve.d.ts.map +1 -1
  103. package/dist/core/browse/approve.js +366 -48
  104. package/dist/core/browse/approve.js.map +1 -1
  105. package/dist/core/browse/link-resolver.d.ts +9 -4
  106. package/dist/core/browse/link-resolver.d.ts.map +1 -1
  107. package/dist/core/browse/link-resolver.js +12 -7
  108. package/dist/core/browse/link-resolver.js.map +1 -1
  109. package/dist/core/browse/review.d.ts +5 -0
  110. package/dist/core/browse/review.d.ts.map +1 -1
  111. package/dist/core/browse/review.js +8 -0
  112. package/dist/core/browse/review.js.map +1 -1
  113. package/dist/core/checks/integrity-checks.d.ts.map +1 -1
  114. package/dist/core/checks/integrity-checks.js +7 -1
  115. package/dist/core/checks/integrity-checks.js.map +1 -1
  116. package/dist/core/checks/manifest.d.ts.map +1 -1
  117. package/dist/core/checks/manifest.js +2 -0
  118. package/dist/core/checks/manifest.js.map +1 -1
  119. package/dist/core/checks/shared-stores-checks.d.ts +17 -0
  120. package/dist/core/checks/shared-stores-checks.d.ts.map +1 -0
  121. package/dist/core/checks/shared-stores-checks.js +84 -0
  122. package/dist/core/checks/shared-stores-checks.js.map +1 -0
  123. package/dist/core/errors.d.ts +17 -0
  124. package/dist/core/errors.d.ts.map +1 -1
  125. package/dist/core/errors.js +21 -0
  126. package/dist/core/errors.js.map +1 -1
  127. package/dist/core/forge/github.d.ts +14 -0
  128. package/dist/core/forge/github.d.ts.map +1 -1
  129. package/dist/core/forge/github.js +17 -0
  130. package/dist/core/forge/github.js.map +1 -1
  131. package/dist/core/git/fast-forward.d.ts +23 -0
  132. package/dist/core/git/fast-forward.d.ts.map +1 -0
  133. package/dist/core/git/fast-forward.js +38 -0
  134. package/dist/core/git/fast-forward.js.map +1 -0
  135. package/dist/core/git/repo.d.ts +11 -0
  136. package/dist/core/git/repo.d.ts.map +1 -1
  137. package/dist/core/git/repo.js +25 -0
  138. package/dist/core/git/repo.js.map +1 -1
  139. package/dist/core/graph/model.d.ts +27 -0
  140. package/dist/core/graph/model.d.ts.map +1 -1
  141. package/dist/core/graph/model.js +68 -2
  142. package/dist/core/graph/model.js.map +1 -1
  143. package/dist/core/graph/persist.d.ts.map +1 -1
  144. package/dist/core/graph/persist.js +3 -2
  145. package/dist/core/graph/persist.js.map +1 -1
  146. package/dist/core/mcp/sessions.d.ts +11 -14
  147. package/dist/core/mcp/sessions.d.ts.map +1 -1
  148. package/dist/core/mcp/sessions.js +23 -43
  149. package/dist/core/mcp/sessions.js.map +1 -1
  150. package/dist/core/notes/list.d.ts.map +1 -1
  151. package/dist/core/notes/list.js +5 -0
  152. package/dist/core/notes/list.js.map +1 -1
  153. package/dist/core/reconcile.d.ts.map +1 -1
  154. package/dist/core/reconcile.js +2 -1
  155. package/dist/core/reconcile.js.map +1 -1
  156. package/dist/core/retrieval/pass.d.ts.map +1 -1
  157. package/dist/core/retrieval/pass.js +5 -4
  158. package/dist/core/retrieval/pass.js.map +1 -1
  159. package/dist/core/rollup.d.ts.map +1 -1
  160. package/dist/core/rollup.js +2 -3
  161. package/dist/core/rollup.js.map +1 -1
  162. package/dist/core/root.d.ts.map +1 -1
  163. package/dist/core/root.js +33 -2
  164. package/dist/core/root.js.map +1 -1
  165. package/dist/core/second-opinion/environment.d.ts +21 -0
  166. package/dist/core/second-opinion/environment.d.ts.map +1 -0
  167. package/dist/core/second-opinion/environment.js +70 -0
  168. package/dist/core/second-opinion/environment.js.map +1 -0
  169. package/dist/core/second-opinion/judge.d.ts +29 -0
  170. package/dist/core/second-opinion/judge.d.ts.map +1 -0
  171. package/dist/core/second-opinion/judge.js +55 -0
  172. package/dist/core/second-opinion/judge.js.map +1 -0
  173. package/dist/core/second-opinion/launch.d.ts +16 -0
  174. package/dist/core/second-opinion/launch.d.ts.map +1 -0
  175. package/dist/core/second-opinion/launch.js +75 -0
  176. package/dist/core/second-opinion/launch.js.map +1 -0
  177. package/dist/core/second-opinion/lineup.d.ts +82 -0
  178. package/dist/core/second-opinion/lineup.d.ts.map +1 -0
  179. package/dist/core/second-opinion/lineup.js +113 -0
  180. package/dist/core/second-opinion/lineup.js.map +1 -0
  181. package/dist/core/second-opinion/modes.d.ts +98 -0
  182. package/dist/core/second-opinion/modes.d.ts.map +1 -0
  183. package/dist/core/second-opinion/modes.js +224 -0
  184. package/dist/core/second-opinion/modes.js.map +1 -0
  185. package/dist/core/second-opinion/prompts.d.ts +18 -0
  186. package/dist/core/second-opinion/prompts.d.ts.map +1 -0
  187. package/dist/core/second-opinion/prompts.js +65 -0
  188. package/dist/core/second-opinion/prompts.js.map +1 -0
  189. package/dist/core/session/commit.d.ts +29 -0
  190. package/dist/core/session/commit.d.ts.map +1 -0
  191. package/dist/core/session/commit.js +22 -0
  192. package/dist/core/session/commit.js.map +1 -0
  193. package/dist/core/session/discard.d.ts +24 -0
  194. package/dist/core/session/discard.d.ts.map +1 -0
  195. package/dist/core/session/discard.js +68 -0
  196. package/dist/core/session/discard.js.map +1 -0
  197. package/dist/core/session/list.d.ts +48 -0
  198. package/dist/core/session/list.d.ts.map +1 -0
  199. package/dist/core/session/list.js +55 -0
  200. package/dist/core/session/list.js.map +1 -0
  201. package/dist/core/session/rebase.d.ts +34 -0
  202. package/dist/core/session/rebase.d.ts.map +1 -0
  203. package/dist/core/session/rebase.js +87 -0
  204. package/dist/core/session/rebase.js.map +1 -0
  205. package/dist/core/session/remote.d.ts +80 -0
  206. package/dist/core/session/remote.d.ts.map +1 -0
  207. package/dist/core/session/remote.js +102 -0
  208. package/dist/core/session/remote.js.map +1 -0
  209. package/dist/core/session/resolve.d.ts +41 -0
  210. package/dist/core/session/resolve.d.ts.map +1 -0
  211. package/dist/core/session/resolve.js +109 -0
  212. package/dist/core/session/resolve.js.map +1 -0
  213. package/dist/core/session/status.d.ts +47 -0
  214. package/dist/core/session/status.d.ts.map +1 -0
  215. package/dist/core/session/status.js +55 -0
  216. package/dist/core/session/status.js.map +1 -0
  217. package/dist/core/session/submit.d.ts +67 -0
  218. package/dist/core/session/submit.d.ts.map +1 -0
  219. package/dist/core/session/submit.js +254 -0
  220. package/dist/core/session/submit.js.map +1 -0
  221. package/dist/core/shared-stores-location.d.ts +17 -0
  222. package/dist/core/shared-stores-location.d.ts.map +1 -0
  223. package/dist/core/shared-stores-location.js +22 -0
  224. package/dist/core/shared-stores-location.js.map +1 -0
  225. package/dist/core/shared-stores.d.ts +69 -0
  226. package/dist/core/shared-stores.d.ts.map +1 -0
  227. package/dist/core/shared-stores.js +100 -0
  228. package/dist/core/shared-stores.js.map +1 -0
  229. package/dist/core/skills.d.ts.map +1 -1
  230. package/dist/core/skills.js +14 -10
  231. package/dist/core/skills.js.map +1 -1
  232. package/dist/run.d.ts.map +1 -1
  233. package/dist/run.js +122 -6
  234. package/dist/run.js.map +1 -1
  235. package/dist/version.d.ts +1 -1
  236. package/dist/version.js +1 -1
  237. package/package.json +1 -1
  238. package/templates/agents/shared-stores.md +11 -0
  239. package/templates/approve/copies-missing.md +1 -0
  240. package/templates/approve/elsewhere-heading.md +1 -0
  241. package/templates/approve/elsewhere-intro.md +1 -0
  242. package/templates/approve/homed-elsewhere.md +1 -0
  243. package/templates/approve/not-decider.md +1 -0
  244. package/templates/approve/part-heading.md +1 -0
  245. package/templates/approve/parts-changed.md +1 -0
  246. package/templates/approve/session-decision-note.md +1 -0
  247. package/templates/approve/session-intro.md +1 -0
  248. package/templates/approve/session-no-decision.md +1 -0
  249. package/templates/approve/store-unreachable.md +1 -0
  250. package/templates/land/resolver.md +2 -0
  251. package/templates/second-opinion/poll-answer.md +7 -0
  252. package/templates/second-opinion/taste-panel.md +14 -0
  253. package/templates/session/pages/bare-route.md +2 -0
  254. package/templates/session/pages/block.md +8 -0
  255. package/templates/session/pages/condition-preview.md +1 -0
  256. package/templates/session/pages/condition.md +1 -0
  257. package/templates/session/pages/moved.md +1 -0
  258. package/templates/session/pages/stops-working.md +1 -0
  259. package/templates/session/pages/table-head-preview.md +2 -0
  260. package/templates/session/pages/table-head.md +2 -0
  261. package/templates/skills/ctxr-capture-circleback/sweep.mjs +33 -6
  262. package/templates/skills/ctxr-capture-circleback.md +9 -6
  263. package/templates/skills/ctxr-connection-finding.md +4 -1
  264. package/templates/skills/ctxr-land.md +26 -7
  265. package/templates/skills/ctxr-placement.md +10 -0
  266. package/templates/skills/ctxr-rollup.md +3 -0
  267. package/templates/skills/ctxr-second-opinion.md +52 -36
  268. package/templates/skills/ctxr-session-lifecycle.md +60 -33
  269. package/templates/skills/ctxr-submit.md +65 -56
  270. package/templates/skills/ctxr-second-opinion/run.mjs +0 -542
  271. /package/templates/{skills/ctxr-second-opinion → second-opinion}/critic-contract.md +0 -0
  272. /package/templates/{skills/ctxr-second-opinion → second-opinion}/lenses.md +0 -0
  273. /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/architect.md +0 -0
  274. /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/pragmatist.md +0 -0
  275. /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/skeptic.md +0 -0
@@ -5,9 +5,9 @@ a session, the conflict playbook, sequencing several pull requests) and is not r
5
5
  ## When
6
6
 
7
7
  Fires on an explicit request to wrap up — "submit", "open the PR", "push it", "ship it" — or on the
8
- operator's own closing utterance ("done", "that's all", a sign-off). That request is the whole reason step 8
8
+ operator's own closing utterance ("done", "that's all", a sign-off). That request is the whole reason step 7
9
9
  needs no further confirmation: it is the consent for the push and the pull-request open. Enter without
10
- one and there is nothing behind those steps.
10
+ one and there is nothing behind that step.
11
11
 
12
12
  Anti-triggers — do not enter this skill when: you have merely finished the task you were given (a
13
13
  delivered piece of work is not a closing signal, and the next message is as likely to extend it as to
@@ -16,13 +16,19 @@ asked for more work. Your own judgment that the work looks complete is never the
16
16
  your own summary saying so.
17
17
 
18
18
  Two tells that you are here uninvited. Reaching for `ctxr doctor`, `ctxr lint`, or `ctxr catalog check`
19
- to decide *whether* to submit — those live at step 5 and after, inside a submit already asked for, and
20
- running them ahead of one is a rehearsal, not a check. And composing a question like "shall I open the
21
- pull request?" — needing to ask is itself the answer: leave, and let the work continue.
19
+ to decide *whether* to submit — those live at step 4 and inside `ctxr session submit`, in a submit already
20
+ asked for, and running them ahead of one is a rehearsal, not a check. And composing a question like "shall
21
+ I open the pull request?" — needing to ask is itself the answer: leave, and let the work continue.
22
22
 
23
23
  Ending a turn without that signal is normal and is not this skill. Say in one line what is uncommitted
24
24
  and which worktree holds it, then stop. The work is safe on the branch and the next message picks it up.
25
25
 
26
+ ## A session in a mounted store
27
+
28
+ A session started inside `shared/<name>` belongs to that mounted store. Run every step below from that session's worktree. The pull request opens on that store's repository. The hand-off names that store's approval page, from its own `contexture.yaml`.
29
+
30
+ A session started with `ctxr session start --joins` is one part of a session of this store. Submit every part of the session. Run `ctxr session submit` once in each part's worktree. Why: each store gets its own pull request, and the command marks each pull request with the session. Do not write a session marker into a body yourself. Why: the command writes it, and it refuses a body that already carries one.
31
+
26
32
  ## Routes
27
33
 
28
34
  Every pull request takes one of three routes. Say which, and why, in its body:
@@ -35,57 +41,60 @@ Every pull request takes one of three routes. Say which, and why, in its body:
35
41
 
36
42
  ## Steps
37
43
 
38
- 1. Re-scan (mandatory — never replay a plan from an earlier snapshot): `git fetch origin`,
39
- `git status --short`, `git diff --stat`, `git diff --cached --stat`,
40
- `git ls-files --others --exclude-standard`, `git log --oneline origin/__DEFAULT_BRANCH__..HEAD`. State moves
41
- under you while you work; name the delta from the previous scan rather than silently folding new work
42
- into old buckets. If the session touched or linked to an entity note, run `ctxr rollup stale --for <entity>`
43
- (or a plain `ctxr rollup stale` when unsure which), and offer `ctxr-rollup` on anything flagged — never run a
44
- rollup unasked; the operator decides.
44
+ `<session>` below is the session worktree's directory name, as `ctxr session list` prints it.
45
+
46
+ 1. Re-scan (mandatory — never replay a plan from an earlier snapshot): `ctxr session status <session>`, with
47
+ `--diff` when you need the changes themselves. It fetches `__DEFAULT_BRANCH__` and reports what is
48
+ uncommitted, the diff stat of committed and uncommitted work, and the commits ahead of
49
+ `origin/__DEFAULT_BRANCH__`. State moves under you while you work; name the delta from the previous scan
50
+ rather than silently folding new work into old buckets. If the session touched or linked to an entity
51
+ note, run `ctxr rollup stale --for <entity>` (or a plain `ctxr rollup stale` when unsure which), and
52
+ offer `ctxr-rollup` on anything flagged — never run a rollup unasked; the operator decides.
45
53
  2. Capture pass: run `ctxr-session-capture` exactly once here — closing a session is itself a capture
46
54
  trigger; do not fire it again after submitting.
47
- 3. Stage surgically: `git add <paths>`, never `git add -A`; confirm with `git status --short` that the
48
- staged set matches the intended unit. Derived artifacts under the cache paths never stage.
49
- 4. One coherent unit per pull request. If the session produced two disjoint units, say so and ask
50
- whether to split.
51
- 5. Validate: run `ctxr doctor` (store scope, not `--staged` — a session's job is to leave the whole store
52
- healthy, not merely pass one commit's gate). Fix a failure; never bypass it, and never proceed past it.
53
- 6. Commit: `git commit -m "<message>"`, describing the unit staged in step 3.
54
- 7. Name the branch: `<prefix>/<short-slug>`, with a prefix from `skill/` `feat/` `project/` `notes/` `chore/`
55
- `refactor/` `fix/` unless this store's conventions say otherwise. If it still carries a generated name,
56
- `git branch -m "<name>"` before pushing — never
57
- let a generated name reach the forge. A name given at `ctxr session start` does not settle this: it
58
- named a worktree when the work began, and what ships is decided here.
59
- 8. Before you open the pull request, run `ctxr publish urls --since origin/__DEFAULT_BRANCH__ --json`.
60
- When it lists a page, add a **Pages** section to the body. The section is a table with one row per page.
61
- Each row gives the page's status, its lifespan (permanent or disposable), its preview address, and its
62
- published address. Copy every value from the report, never rebuilt by hand. Why: the report reads the
63
- change set, and a guess from the path can be wrong. Mark the old address of a moved page as one that
64
- stops working. Mark the address of a removed page the same way. Under the table, state the condition
65
- one time: a preview resolves only while this pull request is open and the server can see this
66
- session's worktree, and the published address resolves when the served checkout has the landed commit.
67
- When the report has no preview, leave out that column. When it says that no base URL is declared, say
68
- that the addresses are bare routes. When it lists no page, add no section.
69
- Then run `ctxr graph diff --since origin/__DEFAULT_BRANCH__ --format markdown`. Paste its output into the
70
- body verbatim, as the **Knowledge changes** section. Do not add, remove, or change a word of it. Why: you
71
- wrote the change, and the reviewer checks your account against this record, which the command wrote.
72
- Always paste the block, also when it says that the range changes no note. Why: a missing section looks the
73
- same as a skipped step. The block is the record of the change. The review address in the block is a
74
- convenience only. Why: it resolves only while this session's worktree exists and the server can reach it.
75
- Then run `git push -u origin "<branch>"`. Then run `gh pr create --base __DEFAULT_BRANCH__ --title "<title>"
76
- --body "<why / what changed / route / verification / follow-ups>"`. `gh` reads its own credential file, so
55
+ 3. One coherent unit per pull request. `ctxr session submit` commits every change in the worktree outside
56
+ the derived paths, so what the re-scan shows is what ships. If the session produced two disjoint units,
57
+ say so and ask whether to split; anything that should not ship leaves the worktree before step 7. Derived
58
+ artifacts under the cache paths never ship, and the command refuses an index that holds one, whoever
59
+ staged it.
60
+ 4. Validate: run `ctxr doctor` (store scope, not `--staged` — a session's job is to leave the whole store
61
+ healthy, not merely pass one commit's gate). `ctxr session submit` runs the same check as its gate and
62
+ commits nothing when it fails. Fix a failure; never bypass it, and never proceed past it.
63
+ 5. Name the branch: `<prefix>/<short-slug>`, with a prefix from `skill/` `feat/` `project/` `notes/` `chore/`
64
+ `refactor/` `fix/` unless this store's conventions say otherwise. Never let a generated name reach the
65
+ forge: the name you pass at step 7 replaces it. A name given at `ctxr session start` does not settle
66
+ this: it named a worktree when the work began, and what ships is decided here.
67
+ 6. Write the commit message, the title and the body. The body answers
68
+ `<why / what changed / route / verification / follow-ups>`. Write the why so that a reviewer does not
69
+ have to find it again. Do not write a Knowledge changes section or a Pages section: the command appends
70
+ both after your body — the Pages table from the change set's page report when a page changed, and the
71
+ Knowledge changes block always — and refuses a body that already carries either heading. Why: you wrote
72
+ the change, and the reviewer checks your account against the record the command wrote.
73
+ 7. Submit: `ctxr session submit <session> --branch "<name>" --message "<message>" --title "<title>"
74
+ --body-file <file>` (or `--body "<body>"` for a short one). It stages, runs the gate, commits, renames the
75
+ branch, pushes, and opens the pull request against `__DEFAULT_BRANCH__`, or updates the one already open
76
+ for the branch. Do not stop to confirm first. Why: the request to submit is the consent, and the
77
+ command's store-scope check is the gate on this path. Never push or open the pull request any other way;
77
78
  never export or interpolate a token, and never rewrite the origin's URL. Why: that URL can hold a
78
- credential. The body answers those five questions and carries the sections above. Write the why so that a
79
- reviewer does not have to find it again. Do not stop to confirm first. Why: the request to submit is the
80
- consent for both, and `ctxr doctor` in step 5 is the gate on this path. If `gh` has no reachable GitHub
81
- remote for this repository, `git push` still succeeds alone. Then report the pushed branch, and give the
82
- operator the manual pull-request instructions. Do not retry `gh`.
83
- 9. Verify before any retry: a transport error can arrive AFTER the push or the pull-request open already
84
- succeeded. Before retrying anything, `git ls-remote origin <branch>` and `gh pr list --head <branch>` —
85
- never replay a push or a pull-request open blindly.
86
- 10. Hand off: report the pull request's number and its url, and name what landing it takes —
87
- `ctxr-land`, targeting that number — so the next step is one word away instead of something to
88
- reconstruct later. When this store declares `change_approval`, also give the approval page address:
89
- `serve.base_url`, then `/approve/`, then the session worktree's directory name and a `/`. Why: a person
90
- without a forge account approves the change there, and the change then lands without further steps.
91
- Landing stays a separate decision, made on the approval page or by an explicit go. Never run it from here.
79
+ credential.
80
+ Exit `0` means the pull request is open. Exit `3` names the step that stopped it, with everything before
81
+ that step left in place: a failed gate (fix it and run the same submit again), a derived path in the
82
+ index (unstage it), a rebase in progress (finish it with the conflict playbook), or a push or forge
83
+ failure. Exit `2` is a refused argument: a branch name the default branch or another branch carries, or
84
+ a body with a generated heading. If the forge cannot be reached, report the pushed branch and give the
85
+ operator the manual pull-request instructions.
86
+ 8. Verify before any retry: a transport error can arrive AFTER the push or the pull-request open already
87
+ succeeded. `ctxr session submit` reads the remote branch and the forge's pull requests for it before it
88
+ pushes or opens anything, so running the same submit again is the retry, and it publishes once.
89
+ Submitting a session again after requested changes works the same way: a further commit on the same
90
+ branch, and the same pull request updated — keep `--branch` as it was.
91
+ 9. Hand off. Report each pull request's number and its url. Name what lands it: `ctxr-land`, with that
92
+ number, or with the session when the session has a part in more than one store. Why: the next step is
93
+ then one word away, not something to reconstruct later. When this store declares `change_approval`,
94
+ also give the approval page address that the command reports.
95
+ It is `serve.base_url`, then `/approve/`, then the session worktree's directory name and a `/`.
96
+ For a session with parts in several stores, give one address only: the session's page in the store
97
+ where it started. Every part's submit reports that same address. Why: a person without a forge account
98
+ approves the change there. One decision covers every part, and the change then lands without further
99
+ steps. Landing stays a separate decision, made on the approval page or by an explicit go.
100
+ Never run it from here.