@skitterbyte/skitterspec-jira 0.0.0-stage → 2.0.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 (113) hide show
  1. package/MIGRATION.md +1266 -0
  2. package/README.md +44 -2
  3. package/assets/claude-md-section.md +85 -0
  4. package/assets/commands/allow-main.md +33 -0
  5. package/assets/commands/spec-connect.md +13 -0
  6. package/assets/commands/spec-live.md +14 -0
  7. package/assets/commands/spec-remote-review.md +37 -0
  8. package/assets/commands/spec-skip.md +24 -0
  9. package/assets/core/SETUP.md +192 -0
  10. package/assets/core/env.config.json.example +56 -0
  11. package/assets/core/env.config.md +606 -0
  12. package/assets/core/gating.config.json.example +4 -0
  13. package/assets/core/gating.config.md +81 -0
  14. package/assets/core/jira.config.json.example +18 -0
  15. package/assets/core/jira.config.md +88 -0
  16. package/assets/hooks/main-guard.cjs +162 -0
  17. package/assets/hooks/review-gate.cjs +146 -0
  18. package/assets/review/page.html +3384 -0
  19. package/assets/rules/commit-trailers.md +96 -0
  20. package/assets/rules/negative-checks.md +69 -0
  21. package/assets/rules/offered-unblocks.md +100 -0
  22. package/assets/rules/spec-planning.md +702 -0
  23. package/assets/rules/spec-reports.md +572 -0
  24. package/assets/skills/no-spec/SKILL.md +249 -0
  25. package/assets/skills/spec/SKILL.md +714 -0
  26. package/assets/skills/spec-bug/SKILL.md +585 -0
  27. package/assets/skills/spec-cancel/SKILL.md +261 -0
  28. package/assets/skills/spec-complete/SKILL.md +451 -0
  29. package/assets/skills/spec-diff/SKILL.md +870 -0
  30. package/assets/skills/spec-hotfix/SKILL.md +607 -0
  31. package/assets/skills/spec-init/SKILL.md +178 -0
  32. package/assets/skills/spec-jira-setup/SKILL.md +221 -0
  33. package/assets/skills/spec-list/SKILL.md +173 -0
  34. package/assets/skills/spec-next/SKILL.md +678 -0
  35. package/assets/skills/spec-push/SKILL.md +306 -0
  36. package/assets/skills/spec-review/SKILL.md +256 -0
  37. package/assets/skills/spec-reviewed/SKILL.md +284 -0
  38. package/assets/skills/spec-start/SKILL.md +496 -0
  39. package/assets/skills/spec-status/SKILL.md +114 -0
  40. package/assets/skills/spec-sync/SKILL.md +220 -0
  41. package/assets/skills/spec-to-main/SKILL.md +141 -0
  42. package/bin/skitterspec-jira.js +68 -0
  43. package/package.json +40 -4
  44. package/src/cli.js +5967 -0
  45. package/src/deprecate.js +138 -0
  46. package/src/env/bootstrap.js +188 -0
  47. package/src/env/building.js +143 -0
  48. package/src/env/classify.js +176 -0
  49. package/src/env/commitcmd.js +108 -0
  50. package/src/env/config.js +850 -0
  51. package/src/env/dev.js +63 -0
  52. package/src/env/glob.js +34 -0
  53. package/src/env/hooks.js +226 -0
  54. package/src/env/hotfix.js +413 -0
  55. package/src/env/hotfixland.js +302 -0
  56. package/src/env/integrate.js +167 -0
  57. package/src/env/live.js +479 -0
  58. package/src/env/mainguard.js +299 -0
  59. package/src/env/provision.js +466 -0
  60. package/src/env/proxy.js +225 -0
  61. package/src/env/prune.js +119 -0
  62. package/src/env/registry.js +159 -0
  63. package/src/env/render.js +17 -0
  64. package/src/env/resolve.js +716 -0
  65. package/src/env/review.js +2622 -0
  66. package/src/env/reviewers/coderabbit.js +228 -0
  67. package/src/env/reviewers.js +517 -0
  68. package/src/env/serve.js +1044 -0
  69. package/src/env/supervise.js +157 -0
  70. package/src/env/teardown.js +248 -0
  71. package/src/env/trust.js +87 -0
  72. package/src/gating.js +155 -0
  73. package/src/init.js +1150 -0
  74. package/src/lines-diff.js +114 -0
  75. package/src/prompts.js +129 -0
  76. package/src/vendor/jira/adf.js +414 -0
  77. package/src/vendor/jira/api.js +295 -0
  78. package/src/vendor/jira/cli-sync.js +1252 -0
  79. package/src/vendor/jira/commands.js +44 -0
  80. package/src/vendor/jira/config.js +286 -0
  81. package/src/vendor/jira/credentials.js +108 -0
  82. package/src/vendor/jira/dialect.js +45 -0
  83. package/src/vendor/jira/mcp.js +129 -0
  84. package/src/vendor/provider-kit/index.js +41 -0
  85. package/src/vendor/provider-kit/src/adapter.js +23 -0
  86. package/src/vendor/provider-kit/src/apply.js +207 -0
  87. package/src/vendor/provider-kit/src/args.js +68 -0
  88. package/src/vendor/provider-kit/src/assignment.js +277 -0
  89. package/src/vendor/provider-kit/src/config.js +251 -0
  90. package/src/vendor/provider-kit/src/credentials.js +404 -0
  91. package/src/vendor/provider-kit/src/doctor.js +35 -0
  92. package/src/vendor/provider-kit/src/http.js +63 -0
  93. package/src/vendor/provider-kit/src/identity.js +93 -0
  94. package/src/vendor/provider-kit/src/list-assignee.js +71 -0
  95. package/src/vendor/provider-kit/src/list-rows.js +35 -0
  96. package/src/vendor/provider-kit/src/md-compare.js +39 -0
  97. package/src/vendor/provider-kit/src/md-tables.js +94 -0
  98. package/src/vendor/provider-kit/src/prompt.js +50 -0
  99. package/src/vendor/provider-kit/src/released.js +219 -0
  100. package/src/vendor/provider-kit/src/specs.js +248 -0
  101. package/src/vendor/provider-kit/src/transport.js +22 -0
  102. package/src/vendor/sync-core/index.js +92 -0
  103. package/src/vendor/sync-core/src/base.js +81 -0
  104. package/src/vendor/sync-core/src/compare.js +338 -0
  105. package/src/vendor/sync-core/src/dialect.js +51 -0
  106. package/src/vendor/sync-core/src/fields.js +36 -0
  107. package/src/vendor/sync-core/src/legacy.js +100 -0
  108. package/src/vendor/sync-core/src/normalize.js +971 -0
  109. package/src/vendor/sync-core/src/push.js +85 -0
  110. package/src/vendor/sync-core/src/retarget.js +278 -0
  111. package/src/vendor/sync-core/src/task-block.js +308 -0
  112. package/src/vendor/sync-core/src/verify.js +67 -0
  113. package/src/vendor/sync-core/src/write.js +191 -0
@@ -0,0 +1,249 @@
1
+ ---
2
+ name: no-spec
3
+ description: Do a piece of work that genuinely has no spec — a version bump, a lockfile refresh, a rename — on its own branch in its own worktree, reviewed on a page and landed on the verdict. Never on the base branch. Use when the user says "/no-spec", or asks for mechanical work that does not warrant a spec and should not sit on main.
4
+ ---
5
+
6
+ # /no-spec — work with no spec, off the base branch
7
+
8
+ > Stay silent while this runs — speak only to ask something you cannot answer
9
+ > yourself, or to report a failure at the moment it happens. Read
10
+ > `.claude/rules/spec-reports.md` before reporting; it defines the block this
11
+ > skill ends with.
12
+
13
+ Some work has no spec and should not have one. Bumping four projects to a new
14
+ version, refreshing a lockfile, a rename across a package: writing a one-phase
15
+ document for it produces a spec nobody reads, and `spec --quick` would have been
16
+ that under a friendlier name.
17
+
18
+ **What it is not is an excuse to work on the base branch.** Two things follow
19
+ from doing it there, and both cost someone else something: the tree is left
20
+ dirty, so every in-flight spec has to replay over it and a release cannot be
21
+ cut; and no page is ever rendered, so the work gets no review at all. This skill
22
+ is the same lane every spec uses — branch, worktree, page, verdict, land —
23
+ with the document left out because there is nothing to put in it.
24
+
25
+ **It writes no spec, moves nothing through the lifecycle, and mints no ticket.**
26
+ There is no bucket, no status, no phase index and no `Refs:` trailer. If you
27
+ find yourself wanting any of those, the work wanted `/spec`.
28
+
29
+ ## 1. Name it
30
+
31
+ Take a kebab-case name from the invocation. It becomes the branch
32
+ (`chore/<name>`) and the worktree folder, so it should describe the work:
33
+ `bump-deps`, `rename-widget-props`, `lockfile-refresh`.
34
+
35
+ **Ask if none was given.** Do not invent one — a name nobody chose is a branch
36
+ nobody recognises a week later, and this is the one thing the skill cannot infer
37
+ from the work.
38
+
39
+ **Refuse a name that is already a spec**, which the engine does for you: two
40
+ things answering to one name is how a teardown removes the wrong tree.
41
+
42
+ ## 2. Provision
43
+
44
+ ```
45
+ skitterspec spec-env nospec <name>
46
+ ```
47
+
48
+ It records the name as a **specless branch** and prints the plan. Run the
49
+ `git worktree add` it prints, then move this session into the worktree with a
50
+ plain `cd` and run the `then, run:` line where there is one:
51
+
52
+ ```
53
+ cd "<worktreePath>" && skitterspec spec-env bootstrap <name>
54
+ ```
55
+
56
+ That seeds the project's gitignored files into the worktree, then runs its
57
+ `setup`, and stops at the first failing step, naming it. There is no stack: a
58
+ specless branch never gets an env file or Docker. The Bash working directory persists between calls, so from
59
+ here on the work happens on its own branch.
60
+
61
+ **The worktree steps are the engine's to run, never yours.** Seeding the
62
+ gitignored files, the env file, `setup` and the stack all happen inside
63
+ `skitterspec spec-env bootstrap <name>` — one call that names no file. Do not
64
+ reconstruct them as shell: they used to be printed that way, an agent's copy was
65
+ never faithful, and a project's secrets hook refused every rewrite that named a
66
+ `.env` path. `bootstrap --plan` says what it would do, for reading only.
67
+
68
+ **Confirm the move landed** rather than reading silence as success
69
+ (`.claude/rules/negative-checks.md` rule 1): `skitterspec spec-env resolve` with
70
+ no argument must name this branch, and report `no spec` as its bucket. If it
71
+ names something else, stop — say so and do nothing further, because the failure
72
+ this guards against is a session that writes a branch's worth of work into the
73
+ primary checkout while everything looks normal at the time.
74
+
75
+ **The record is not bookkeeping.** It is the only thing that makes a name with
76
+ nothing under `specs/**` resolvable, so without it `review`, `integrate`, `down`
77
+ and a bare `resolve` would all refuse this branch as a spec that does not exist.
78
+
79
+ **Where isolation is not configured** (`specs/.core/env.config.json` absent)
80
+ there is no worktree to make. Say so in one line and stop: this skill exists to
81
+ move work off the base branch, and without isolation there is nowhere to move it
82
+ to. Do not silently do the work in place — that is the outcome it exists to
83
+ prevent.
84
+
85
+ ## 3. Do the work
86
+
87
+ Follow the project's rules in `.claude/rules/*.md` and `CLAUDE.md`, exactly as a
88
+ phase would. Tests are part of the work and not after it: extend or add whatever
89
+ covers the change, then run the project's typecheck and test commands. Do not
90
+ proceed to the page until they are green — and if they cannot be made green, say
91
+ so where it happens and report `❌`.
92
+
93
+ **Mechanical does not mean untested.** A version bump that breaks a build is the
94
+ commonest thing in this lane, which is why the gate is the same one a phase has.
95
+
96
+ ## 4. Render the page and arm the gate
97
+
98
+ The work is done, the tests are green, and nothing is committed yet:
99
+
100
+ ```
101
+ skitterspec spec-env review <name> --buttons nospec --run-reviewers
102
+ ```
103
+
104
+ **This is free.** The engine reads git and splices text into a template; the
105
+ diff never passes through you however large it is.
106
+
107
+ `--buttons nospec` offers `Commit & Land` and `Commit`. It is its own set
108
+ because neither of the usual pairs fits: there is no next phase to continue and
109
+ nothing to put in flight.
110
+
111
+ **Then arm the gate:**
112
+
113
+ ```
114
+ skitterspec spec-env review arm <name>
115
+ ```
116
+
117
+ **This skill arms, and `/spec` does not.** That asymmetry is the rule in
118
+ `.claude/rules/spec-reports.md` rather than a choice made here: the gate asserts
119
+ that *finished work* owes an answer, and this is finished work. A written spec
120
+ owes no phase, so authoring arms nothing.
121
+
122
+ **Then offer `/spec-diff`. Do not run it.** The written review costs real tokens
123
+ because writing it means reading the diff, and that spend is the user's call.
124
+
125
+ ## 5. Wait for the verdict
126
+
127
+ **The wait is a command. Do not write one.**
128
+
129
+ 1. **Note the moment you start waiting**, as an ISO timestamp. That instant is
130
+ the whole scope of what you may claim.
131
+ 2. **Run the engine's wait, and end your turn** — under the harness's
132
+ persistent watch primitive where one exists, else in the background
133
+ (`.claude/rules/spec-reports.md` carries the preference):
134
+
135
+ ```
136
+ skitterspec spec-env review wait <name> --since <the timestamp>
137
+ ```
138
+
139
+ Pass no timeout. A reader who walks away from a diff is the normal case, and
140
+ a bounded watch once lost a verdict to a lunch break.
141
+ 3. **On waking, let the engine pick:**
142
+
143
+ **A watch that dies is re-armed on the same window**, silently and bounded by
144
+ the age of that window — `.claude/rules/spec-reports.md` carries the contract,
145
+ including when to stop and what the banner says instead. Do not restate it
146
+ here.
147
+
148
+ ```
149
+ skitterspec spec-env review <name> --claim-since <the timestamp> --json
150
+ ```
151
+
152
+ It claims the one pass that arrived inside the window, acts on nothing when
153
+ none did, and refuses to choose when two did.
154
+
155
+ Relay the engine's **stack** — the `local:`, `network:` and `remote:` lines, all
156
+ three, in that order — never the bare `page:` path.
157
+ `.claude/rules/spec-reports.md` carries the shape and why every tier is named.
158
+
159
+ ### Route on the verdict
160
+
161
+ - **`commit-land`** — hand off to `review.commitWith` (`/commit` by default),
162
+ then land it, then tear the worktree down:
163
+
164
+ ```
165
+ skitterspec spec-env integrate <name>
166
+ skitterspec spec-env down <name>
167
+ ```
168
+
169
+ `integrate` plans a rebase onto the base branch and a `merge --ff-only`; run
170
+ the commands it prints. `down` removes the worktree, deletes the branch and
171
+ **forgets the specless record**, which is what stops a torn-down name going on
172
+ answering to every verb with a path that is no longer there.
173
+
174
+ **Between the two, run the after-land commands.** Where the `integrate` plan
175
+ ends with a `then, in the primary checkout (<path>), run:` section — the
176
+ project's `afterLand` — run those commands there, in order, once the
177
+ fast-forward has succeeded, and on an already-landed no-op too. Run only the
178
+ lines under that heading; a `skipped (nothing in the land matched):` block
179
+ lists conditional entries this land did not need, and is information, never
180
+ commands. A lockfile
181
+ refresh is exactly the land that needs them.
182
+ **Stop at the first non-zero exit**: the run becomes `⚠️`, naming the command that failed and the ones that
183
+ did not run, and it **never undoes the land and never stops the `down`**.
184
+
185
+ **If the rebase conflicts, stop.** `git rebase --abort`, leave the commit on
186
+ the branch, tear nothing down, and report `❌` with the conflict — there is a
187
+ standing worktree, which is what separates `❌` from `⏸`.
188
+
189
+ - **`commit`** — the same commit, and **stop there**. The branch stands with the
190
+ work on it, which is the right ending for work that turned out to be bigger
191
+ than one sitting. Say in `Next` that `/spec-to-main` lands it later.
192
+ - **`changes`** — work the notes, record a resolution for each one so the next
193
+ render shows it struck through with what changed, then
194
+ **re-render and wait again**. The reader is still holding a decision.
195
+ - **`discuss`** — report and talk. Claim nothing, change nothing, tear nothing
196
+ down.
197
+
198
+ **Never tear the worktree down on anything but `commit-land`.** It is the only
199
+ verdict that says the work is finished, and the cost of being wrong is somebody
200
+ else's branch removed from disk.
201
+
202
+ ## Report
203
+
204
+ End with the block defined in `.claude/rules/spec-reports.md`. That file carries
205
+ the shape; this section carries only what is specific here.
206
+
207
+ **Verdicts**
208
+
209
+ - `✅` — the work is done, the tests are green, and the verdict was acted on.
210
+ - `⚠️` — done and green, with something worth knowing — an after-land command
211
+ that failed, for one. `Notes` carries what the after-land commands ran and
212
+ skipped, or where they stopped; nothing about them when none are configured.
213
+ - `❌` — the tests are red, or the land failed part-way. Quote the failure and
214
+ say what is standing.
215
+ - `⏸` — refused before acting: no name given, the name is already a spec, the
216
+ `cd` did not take, or the project has no isolation. Nothing changed.
217
+
218
+ **Fields:** `Branch` · `Built` · `Tests` · `Notes` · `Landed` · `Worktree` ·
219
+ `Review` · `Follow-ups` · `Next`
220
+
221
+ **No `Tracker` and no `Spec`, ever.** There is no ticket and no document, and a
222
+ row saying so would report an absence with nothing behind it — which
223
+ `spec-reports.md` forbids for exactly this reason.
224
+
225
+ `Landed` and `Worktree` appear only once a verdict has been acted on; a run
226
+ waiting on the page has neither, and **omits the `Review` row** in favour of the
227
+ banner, which carries the counts, the stack and the two exits:
228
+
229
+ ---
230
+
231
+ ## ⏸ Review ready — &lt;N&gt; files, +&lt;a&gt; −&lt;d&gt;
232
+
233
+ - **local** — &lt;the `local:` URL&gt;
234
+ - **network** — &lt;the `network:` URL, or off with the command that turns it on&gt;
235
+ - **remote** — &lt;the `remote:` URL, or off with the command that turns it on&gt;
236
+
237
+ I'm holding here until you send a verdict — the wait covers local and network.
238
+
239
+ `Commit & Land` finishes it · `Commit` keeps the branch
240
+
241
+ ---
242
+
243
+ There `Next` names the page rather than a command, because the button is what
244
+ carries the work on.
245
+
246
+ **`Follow-ups` is where a spec gets offered.** This lane is for work with no
247
+ spec, so the thing it most often surfaces is work that *does* want one. Offer to
248
+ `/spec` it on the spot — and `/spec` provisions its own worktree, so there is
249
+ no caveat about where to write it.