github-delivery-os 1.3.0 → 1.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.
- package/.claude/skills/delivery-ops/SKILL.md +20 -1
- package/README.md +6 -6
- package/package.json +1 -1
- package/src/install.js +27 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: delivery-ops
|
|
3
|
-
description: Operate a repo that has GitHub Delivery OS installed — create sprint/production-release/QA-request/bug issues that actually trigger its automation, comment as an approver in phrasing its workflows recognize, check status (labels, latest comments, burn-down),
|
|
3
|
+
description: Operate a repo that has GitHub Delivery OS installed — create sprint/production-release/QA-request/bug issues that actually trigger its automation, comment as an approver in phrasing its workflows recognize, check status (labels, latest comments, burn-down), run autonomous task tracking (identify tasks/bugs, group them into phases via sprints, maintain a roadmap issue, update status, comment, and close as work progresses), and turn a spec (SRS/PRD) or a plain-language feature description into a full phase-and-task breakdown filed as real issues. Targets a specific repo via --repo; defaults to the current repo if this skill was installed into it and none is named. Use when asked to create a sprint, request a release, approve/decline a release, check release or sprint status, track/file a task or bug found during work, plan or check a roadmap/phase, break a spec/SRS/feature into phases and tasks, or demo/test Delivery OS against a given repo.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Operate Delivery OS
|
|
@@ -220,6 +220,25 @@ Close with `gh issue close <number> --repo <owner>/<repo> --comment "<summary of
|
|
|
220
220
|
|
|
221
221
|
This only tracks what happens while a Claude session is actively working — nothing reconciles state that changes in the background (a human merges a PR or closes an issue manually with no session running). That gap is tracked as its own deferred item rather than solved here: [Phaneroo/github-delivery-operating-system#12](https://github.com/Phaneroo/github-delivery-operating-system/issues/12). Mitigate it by always reconciling via `gh issue list` at the start of relevant work (see above) rather than trusting anything remembered from earlier.
|
|
222
222
|
|
|
223
|
+
## Turning a spec or feature into phases and tasks
|
|
224
|
+
|
|
225
|
+
Given an SRS/PRD, or just a plain-language feature description, break it into a real phase/task breakdown filed as actual issues — not a document, GitHub itself.
|
|
226
|
+
|
|
227
|
+
**Why this doesn't just lean on `sprint-child-creator`:** that automation (see "Sprint Planning" under "Creating issues") turns a Sprint issue's feature list into child issues automatically, but each child is bare — just a title and `Parent Sprint: #N`, nothing else (`.github/scripts/sprint-child-creator.js` only ever builds that one-line body). A spec implies real per-item detail — acceptance criteria, priority, sometimes an owner — that the auto-created children can't carry. So this recipe works *around* that automation for the actual task content, while still linking into it enough for burn-down tracking to work.
|
|
228
|
+
|
|
229
|
+
1. **Read the spec and decompose it.** Identify discrete requirements/features. Group them into phases by logical sequencing or dependency, not just document order — each phase becomes one Sprint.
|
|
230
|
+
|
|
231
|
+
2. **Show the full plan before creating anything.** All phases, each with its Sprint Goal and the requirements that become Task issues under it. This creates many issues at once — always confirm first here, regardless of the "confirm only when unsure" default elsewhere in autonomous tracking; the blast radius is too large to skip.
|
|
232
|
+
|
|
233
|
+
3. **Per phase, once confirmed:**
|
|
234
|
+
- Create the Sprint Planning issue with the usual recipe (`SPRINT - <phase name>`, dates, goal). "Sprint Features (One Per Line)" is template-required, so it can't be left empty — put one line noting the real breakdown is in linked Task issues (e.g. `See linked Task issues for this phase's breakdown`). This means exactly one bare placeholder child gets auto-created.
|
|
235
|
+
- File one full Task issue per requirement (the usual Task recipe — Owner, Priority, Acceptance Criteria drawn from the spec text; ask only when the spec genuinely doesn't specify something, like priority). Include `Parent Sprint: #<sprint-number>` in the body (e.g. under Artifacts / Links) — that exact phrase is what `auto-close-sprint` actually scans for (`.github/workflows/auto-close-sprint.yml` filters on body content only, **not** the `sprint-active` label, deliberately — see its own comment on why label-scoping was tried and reverted). Add the `sprint-active` label anyway, for consistency with how the sprint's own children are found (see "Finding things" below), but know it plays no role in the burn-down count.
|
|
236
|
+
- Now that the real Task issues exist, close the one placeholder child: `gh issue close <N> --repo <owner>/<repo> --comment "Superseded by full Task issues for this phase — see #.., #.., #.."`, filling in the actual issue numbers just created. Otherwise the placeholder sits in the sprint's burn-down denominator as an item that can never represent real completed work, and the sprint can never legitimately reach 100%.
|
|
237
|
+
|
|
238
|
+
4. **Report back everything created**, grouped by phase — sprint issue number, task issue numbers, and the placeholder-close.
|
|
239
|
+
|
|
240
|
+
For a single small feature that doesn't warrant phase-level sequencing, skip the Sprint wrapper entirely — just file standalone Task issues (cross-referencing each other via "Related: #N" where relevant) using the normal Task recipe.
|
|
241
|
+
|
|
223
242
|
## Finding things
|
|
224
243
|
|
|
225
244
|
When there's no issue number in hand yet:
|
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ Workflows and templates are **copied directly** into your repo. No `workflow_cal
|
|
|
90
90
|
|
|
91
91
|
Installing via `npx github-delivery-os` (not the `scripts/install.sh` clone path) also writes `.github/delivery-os.json`, a small manifest recording the installed version — this is what powers the update check in `status`. It's only written when the files it describes are actually current (a fresh install, or `--overwrite`); a skip-mode install over existing files leaves it untouched rather than claiming a version that isn't really on disk. `uninstall` removes it.
|
|
92
92
|
|
|
93
|
-
With `--with-skill`, a `.claude/skills/delivery-ops/SKILL.md` file is also written — a Claude Code skill scoped to this repo, so anyone working here with Claude Code can create issues that correctly trigger the workflows above, comment as an approver, check status,
|
|
93
|
+
With `--with-skill`, a `.claude/skills/delivery-ops/SKILL.md` file is also written — a Claude Code skill scoped to this repo, so anyone working here with Claude Code can create issues that correctly trigger the workflows above, comment as an approver, check status, run autonomous task tracking (identify and file tasks/bugs, group them into phases via sprints, maintain a roadmap issue, and update/close issues as work progresses), and turn a spec (SRS/PRD) or a plain-language feature description into a full phase-and-task breakdown filed as real issues, without knowing the underlying `gh` commands or issue-body formats by heart. It's opt-in and retroactive: `--with-skill` on any later `install` call adds it if it isn't there yet.
|
|
94
94
|
|
|
95
95
|
---
|
|
96
96
|
|
|
@@ -168,28 +168,28 @@ See [How To](docs/how-to.md) for the underlying workflows this drives, field by
|
|
|
168
168
|
|
|
169
169
|
### Example: filing a bug and a task, step by step
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
Illustrative walkthrough against `acme/storefront`, a repo with Delivery OS installed (same example repo used in the full walkthrough below).
|
|
172
172
|
|
|
173
173
|
**Filing the bug:**
|
|
174
174
|
|
|
175
175
|
1. In Claude Code, inside (or pointed at, via `--repo`) the target repo, describe the bug in plain language:
|
|
176
|
-
> *File a bug on
|
|
176
|
+
> *File a bug on acme/storefront — the order request form submits with an empty phone number, severity high. Steps: fill in the form, leave phone blank, submit. Expected: should block submission. Actual: submits anyway, so there's no way to contact the customer. Tested on Chrome, desktop, production.*
|
|
177
177
|
2. Claude pre-flights the repo — confirms Delivery OS is installed and the `bug`/`qa` labels exist.
|
|
178
178
|
3. Claude shows the exact issue it's about to create before doing anything:
|
|
179
179
|
- Title: `[BUG] Order request form submits with empty phone number`
|
|
180
180
|
- Labels: `bug`, `qa`
|
|
181
181
|
- Body, field by field: `Platform(s) Affected` → Web, `Severity` → High, `Build / Version` → main (as deployed), `Bug Summary`, `Steps to Reproduce` (numbered), `Expected Result`, `Actual Result`, `Test Environment` → Chrome, desktop, production.
|
|
182
182
|
4. Confirm ("yes") when asked to create it.
|
|
183
|
-
5. Claude runs `gh issue create` and reports back the issue —
|
|
183
|
+
5. Claude runs `gh issue create` and reports back the issue — e.g. `acme/storefront#42`. Nothing else happens automatically; bug reports don't trigger a workflow, they're just labeled and tracked.
|
|
184
184
|
|
|
185
185
|
**Filing the follow-up task:**
|
|
186
186
|
|
|
187
187
|
1. Ask Claude to turn the bug into tracked work, referencing the bug's issue number:
|
|
188
|
-
> *Create a task to add phone number validation to the order form, owner @
|
|
188
|
+
> *Create a task to add phone number validation to the order form, owner @alex, priority P1, status Backlog, acceptance: form blocks submission until a valid phone number is entered. Link it to #42.*
|
|
189
189
|
2. Claude shows the constructed issue:
|
|
190
190
|
- Title: `TASK - Add phone number validation to order form`
|
|
191
191
|
- Labels: `task`
|
|
192
|
-
- Body: `Task Summary`, `Description` (references #
|
|
192
|
+
- Body: `Task Summary`, `Description` (references #42), `Owner` → @alex, `Priority` → P1 - High, `Status` → Backlog, `Acceptance Criteria`, `Artifacts / Links` → Related bug: #42.
|
|
193
193
|
3. Confirm ("yes") to create it.
|
|
194
194
|
4. Claude runs `gh issue create`. Same as the bug — no workflow trigger, just labeled and tracked, now linked back to the bug it addresses.
|
|
195
195
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-delivery-os",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "A GitHub-native Delivery Governance Framework for structured sprint execution, QA review, and collaborative production release control.",
|
|
5
5
|
"main": "src/install.js",
|
|
6
6
|
"bin": {
|
package/src/install.js
CHANGED
|
@@ -460,6 +460,20 @@ function runInstall(options) {
|
|
|
460
460
|
console.log('=== Installation complete ===');
|
|
461
461
|
}
|
|
462
462
|
|
|
463
|
+
// runInstall only records a new manifest version when everything already
|
|
464
|
+
// installed actually gets touched this run (see the cleanInstall check
|
|
465
|
+
// there) — so a repo with templates and/or the skill already on disk needs
|
|
466
|
+
// --with-templates/--with-skill passed again on an update, not just
|
|
467
|
+
// --overwrite, or the recorded version never advances and `status` keeps
|
|
468
|
+
// suggesting the same command forever. Build the hint from what's actually
|
|
469
|
+
// on disk so it's never wrong.
|
|
470
|
+
function buildOverwriteCommand({ hasTemplates, hasSkill }) {
|
|
471
|
+
const flags = [hasTemplates ? '--with-templates' : null, hasSkill ? '--with-skill' : null, '--overwrite']
|
|
472
|
+
.filter(Boolean)
|
|
473
|
+
.join(' ');
|
|
474
|
+
return `npx github-delivery-os@latest install ${flags} .`;
|
|
475
|
+
}
|
|
476
|
+
|
|
463
477
|
const TEMPLATES = [
|
|
464
478
|
'config.yml',
|
|
465
479
|
'sprint_planning.yml',
|
|
@@ -518,7 +532,9 @@ async function runStatus(options) {
|
|
|
518
532
|
console.log(`Installed version: ${manifest.version}${installedOn}`);
|
|
519
533
|
} else {
|
|
520
534
|
console.log('Installed version: unknown (installed before version tracking was added)');
|
|
521
|
-
console.log(
|
|
535
|
+
console.log(
|
|
536
|
+
` Run: ${buildOverwriteCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
537
|
+
);
|
|
522
538
|
}
|
|
523
539
|
|
|
524
540
|
if (checkUpdates) {
|
|
@@ -529,7 +545,9 @@ async function runStatus(options) {
|
|
|
529
545
|
console.log(`✓ Up to date (latest is ${latest})`);
|
|
530
546
|
} else if (manifest && manifest.version) {
|
|
531
547
|
console.log(`⬆️ Update available: ${manifest.version} → ${latest}`);
|
|
532
|
-
console.log(
|
|
548
|
+
console.log(
|
|
549
|
+
` Run: ${buildOverwriteCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
550
|
+
);
|
|
533
551
|
} else {
|
|
534
552
|
console.log(`Latest published version: ${latest}`);
|
|
535
553
|
}
|
|
@@ -549,7 +567,9 @@ async function runStatus(options) {
|
|
|
549
567
|
console.log(` ${wf}.yml requires .github/scripts/${REQUIRED_SCRIPT_BY_WORKFLOW[wf]}.js, which is missing.`);
|
|
550
568
|
});
|
|
551
569
|
console.log(' That workflow will fail with MODULE_NOT_FOUND the next time it runs.');
|
|
552
|
-
console.log(
|
|
570
|
+
console.log(
|
|
571
|
+
` Fix: ${buildOverwriteCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
572
|
+
);
|
|
553
573
|
console.log('');
|
|
554
574
|
}
|
|
555
575
|
|
|
@@ -558,7 +578,9 @@ async function runStatus(options) {
|
|
|
558
578
|
console.log(' If this repo\'s own package.json has "type": "module", every workflow that');
|
|
559
579
|
console.log(' require()s a script under .github/scripts will fail with "module is not');
|
|
560
580
|
console.log(' defined in ES module scope" the next time it runs.');
|
|
561
|
-
console.log(
|
|
581
|
+
console.log(
|
|
582
|
+
` Fix: ${buildOverwriteCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
583
|
+
);
|
|
562
584
|
console.log('');
|
|
563
585
|
}
|
|
564
586
|
|
|
@@ -746,6 +768,7 @@ module.exports = {
|
|
|
746
768
|
readManifest,
|
|
747
769
|
writeManifest,
|
|
748
770
|
fetchLatestVersion,
|
|
771
|
+
buildOverwriteCommand,
|
|
749
772
|
skillPath,
|
|
750
773
|
SKILL_REL_PATH,
|
|
751
774
|
WORKFLOWS,
|