github-delivery-os 1.4.0 → 1.5.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 +6 -6
- package/.github/workflows/setup-labels.yml +3 -2
- package/.github/workflows/sprint-child-creator.yml +1 -1
- package/.github/workflows/telegram-issues.yml +6 -2
- package/README.md +12 -332
- package/package.json +1 -1
- package/src/cli.js +8 -4
- package/src/install.js +17 -14
|
@@ -21,7 +21,7 @@ Creating issues and comments in a repo is a visible, outward action — other co
|
|
|
21
21
|
Before creating anything that depends on configuration, check the target repo actually has Delivery OS installed and configured — a silent no-op (nothing happens because a variable is unset) is more confusing than an upfront "this won't do much yet":
|
|
22
22
|
|
|
23
23
|
- **Installed?** `gh api repos/<owner>/<repo>/contents/.github/workflows/authorize-deployment.yml --silent` (404 = not installed — suggest `npx github-delivery-os status .` or `install --with-templates` in that repo).
|
|
24
|
-
- **Labels set up?** `gh label list --repo <owner>/<repo>` — look for `production`, `qa`, `qa-request`, `sprint`, `sprint-
|
|
24
|
+
- **Labels set up?** `gh label list --repo <owner>/<repo>` — look for `production`, `qa`, `qa-request`, `sprint`, `sprint-child`, `planning`, `declined`, `ready-for-deploy`. Missing labels mean `Setup Labels` hasn't been run there yet — offer to fix it directly rather than just reporting the gap: `gh workflow run setup-labels.yml --repo <owner>/<repo>` (it's a `workflow_dispatch` trigger, so this actually creates them on the spot). Confirm with the user first since it's a real change to their repo. (`sprint-active` instead of `sprint-child` means the repo is on a pre-1.5.0 install — still valid, just the older label name.)
|
|
25
25
|
- **Repo variables set?** `gh variable list --repo <owner>/<repo>` — look for `RELEASE_APPROVER`, `QA_APPROVER`, `QA_ASSIGNEES`. If unset, say so plainly: the issue will still get created, but `notify-release-approver` will ping the literal placeholder `release-approver`/`qa-approver`, not a real person. Setting these requires repo admin access (`gh variable set NAME --repo <owner>/<repo> --body <value>`) — don't set them without being asked to, since they name a real person as approver.
|
|
26
26
|
|
|
27
27
|
## Creating issues
|
|
@@ -32,7 +32,7 @@ Before creating anything that depends on configuration, check the target repo ac
|
|
|
32
32
|
|
|
33
33
|
This confirm-first default is for issues created **on explicit request** ("file a bug for this", "create a sprint"). The "Autonomous tracking" section below describes a *different* mode — noticing and filing work on its own during a session — and overrides this default there: act first, confirm after, per its own "Confirm only when unsure" rule. Don't apply both rules to the same action.
|
|
34
34
|
|
|
35
|
-
**Sprint Planning** — triggers `sprint-child-creator` (one child issue per feature line, each labeled `sprint-active
|
|
35
|
+
**Sprint Planning** — triggers `sprint-child-creator` (one child issue per feature line, each labeled `sprint-child` — `sprint-active` on repos installed before 1.5.0 — on open):
|
|
36
36
|
- Title **must contain** the literal string `SPRINT -`, e.g. `SPRINT - Sprint 14`
|
|
37
37
|
- Labels: `sprint`, `planning`
|
|
38
38
|
- Body:
|
|
@@ -163,7 +163,7 @@ Closing a sprint task (child) issue is what actually moves the burn-down — cre
|
|
|
163
163
|
gh issue close <number> --repo <owner>/<repo>
|
|
164
164
|
```
|
|
165
165
|
|
|
166
|
-
`auto-close-sprint` fires on close, re-reads every
|
|
166
|
+
`auto-close-sprint` fires on close, re-reads every issue whose body contains `Parent Sprint: #<N>` (label-independent — see below), recomputes progress, and rewrites the sprint issue's `## 🚦 Sprint Status` section. At 100% it also closes the sprint issue itself and posts a completion comment. Re-check the sprint issue's body afterward to see the update — it happens as a side effect of closing the child, not as a response visible on the child issue itself.
|
|
167
167
|
|
|
168
168
|
## Autonomous tracking (identify → file → update → close)
|
|
169
169
|
|
|
@@ -201,7 +201,7 @@ Don't rely on recalling an issue number from earlier in the conversation, and ne
|
|
|
201
201
|
gh issue list --repo <owner>/<repo> --state open --search "<keywords from the work>"
|
|
202
202
|
```
|
|
203
203
|
|
|
204
|
-
Narrow with `--label task` (or `bug`, `sprint-
|
|
204
|
+
Narrow with `--label task` (or `bug`, `sprint-child`, `qa-request`) only once the category is known and the target repo actually has that label — don't assume `--label task` alone finds everything relevant. (Older repos may still use `sprint-active` instead of `sprint-child`; check `gh label list` first.)
|
|
205
205
|
|
|
206
206
|
This is also what makes picking work back up in a *new* session possible without any local memory — the issue list itself is the state.
|
|
207
207
|
|
|
@@ -232,7 +232,7 @@ Given an SRS/PRD, or just a plain-language feature description, break it into a
|
|
|
232
232
|
|
|
233
233
|
3. **Per phase, once confirmed:**
|
|
234
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-
|
|
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-child` label, deliberately — see its own comment on why label-scoping was tried and reverted). Add the `sprint-child` 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
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
237
|
|
|
238
238
|
4. **Report back everything created**, grouped by phase — sprint issue number, task issue numbers, and the placeholder-close.
|
|
@@ -245,4 +245,4 @@ When there's no issue number in hand yet:
|
|
|
245
245
|
- **Production releases awaiting a decision:** `gh issue list --repo <owner>/<repo> --label production --state open`
|
|
246
246
|
- **Active sprints:** `gh issue list --repo <owner>/<repo> --label sprint --state open` (title contains `SPRINT -`)
|
|
247
247
|
- **Open QA requests:** `gh issue list --repo <owner>/<repo> --label qa-request --state open`
|
|
248
|
-
- **A sprint's own children:** `gh issue list --repo <owner>/<repo> --label sprint-
|
|
248
|
+
- **A sprint's own children:** `gh issue list --repo <owner>/<repo> --label sprint-child --search "\"Parent Sprint: #<N>\" in:body"` — the exact-phrase quotes matter, otherwise the search matches "Parent", "Sprint", and the number as separate free-text terms instead of the literal phrase. On a repo installed before 1.5.0 (or one that hasn't run the `gh label edit` migration — see `docs/consumer-setup.md`), use `--label sprint-active` instead, or drop `--label` entirely and rely on the body search alone if you're not sure which name applies.
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
{ name: 'intake', color: '0E8A16' },
|
|
27
27
|
{ name: 'bug', color: 'D93F0B' },
|
|
28
28
|
{ name: 'sprint', color: '1D76DB' },
|
|
29
|
-
{ name: 'sprint-
|
|
29
|
+
{ name: 'sprint-child', color: '1D76DB', description: "Applied to a sprint's task-breakdown children on open; doesn't change when the sprint closes" },
|
|
30
30
|
{ name: 'planning', color: '5319E7' },
|
|
31
31
|
{ name: 'sprint-planning', color: '5319E7' },
|
|
32
32
|
{ name: 'task', color: '7057FF' },
|
|
@@ -40,13 +40,14 @@ jobs:
|
|
|
40
40
|
{ name: 'risk', color: 'B60205' },
|
|
41
41
|
];
|
|
42
42
|
let created = 0;
|
|
43
|
-
for (const { name, color } of labels) {
|
|
43
|
+
for (const { name, color, description } of labels) {
|
|
44
44
|
try {
|
|
45
45
|
await github.rest.issues.createLabel({
|
|
46
46
|
owner: context.repo.owner,
|
|
47
47
|
repo: context.repo.repo,
|
|
48
48
|
name,
|
|
49
49
|
color,
|
|
50
|
+
...(description ? { description } : {}),
|
|
50
51
|
});
|
|
51
52
|
console.log(`Created: ${name}`);
|
|
52
53
|
created++;
|
|
@@ -77,7 +77,10 @@ jobs:
|
|
|
77
77
|
fi
|
|
78
78
|
fi
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
# sprint-active is the pre-1.5.0 label name; still checked here so
|
|
81
|
+
# issues created before a repo upgrades don't go silent on close.
|
|
82
|
+
if [[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'sprint-child') }}" == "true" ]] || \
|
|
83
|
+
[[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'sprint-active') }}" == "true" ]]; then
|
|
81
84
|
if [ "$ACTION" = "opened" ]; then
|
|
82
85
|
MESSAGE="🟡🛠️ SPRINT TASK CREATED%0A$TITLE%0A$URL%0A---%0A👤 $ACTOR%0A🕒 $TIMESTAMP"
|
|
83
86
|
elif [ "$ACTION" = "closed" ]; then
|
|
@@ -129,7 +132,8 @@ jobs:
|
|
|
129
132
|
elif [[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'production') }}" == "true" ]]; then
|
|
130
133
|
MESSAGE="💬🚀 RELEASE COMMENT%0A$TITLE%0A$URL%0A---%0A$COMMENT%0A---%0A👤 $ACTOR%0A🕒 $TIMESTAMP"
|
|
131
134
|
|
|
132
|
-
elif [[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'sprint-
|
|
135
|
+
elif [[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'sprint-child') }}" == "true" ]] || \
|
|
136
|
+
[[ "${{ contains(github.event.issue.labels.*.name || fromJSON('[]'), 'sprint-active') }}" == "true" ]]; then
|
|
133
137
|
MESSAGE="💬🛠️ SPRINT TASK COMMENT%0A$TITLE%0A$URL%0A---%0A$COMMENT%0A---%0A👤 $ACTOR%0A🕒 $TIMESTAMP"
|
|
134
138
|
fi
|
|
135
139
|
fi
|
package/README.md
CHANGED
|
@@ -4,350 +4,32 @@
|
|
|
4
4
|
|
|
5
5
|
[](https://socket.dev/npm/package/github-delivery-os)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Delivery OS embeds structured intake, sprint orchestration, QA governance, and collaborative release gates directly into your GitHub repos — replacing informal coordination (manual approvals, inconsistent sprint tracking, socially enforced releases) without replacing your CI/CD or disrupting how you already work.
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
Engineering teams often rely on informal coordination inside GitHub — manual approvals, inconsistent sprint tracking, reactive QA engagement, and socially enforced production releases.
|
|
12
|
-
|
|
13
|
-
As teams scale, this creates:
|
|
14
|
-
|
|
15
|
-
* Delivery ambiguity
|
|
16
|
-
* QA bottlenecks
|
|
17
|
-
* Unclear accountability
|
|
18
|
-
* Release risk
|
|
19
|
-
* Cross-team misalignment
|
|
20
|
-
|
|
21
|
-
The **GitHub Delivery Operating System (Delivery OS)** embeds structured intake, sprint orchestration, QA governance, and collaborative release gates directly into engineering repositories — without replacing CI/CD pipelines or disrupting developer workflows.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
**One command** (recommended):
|
|
9
|
+
## Install
|
|
28
10
|
|
|
29
11
|
```bash
|
|
30
12
|
npx github-delivery-os install --with-templates .
|
|
31
13
|
```
|
|
32
14
|
|
|
33
|
-
From your repo root. Add `--with-labels` to create labels via `gh` CLI
|
|
34
|
-
|
|
35
|
-
**Alternative — clone and run script:**
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
git clone https://github.com/Phaneroo/github-delivery-operating-system
|
|
39
|
-
cd github-delivery-operating-system
|
|
40
|
-
|
|
41
|
-
# New install or repo with existing workflows — adds only missing files (safe)
|
|
42
|
-
./scripts/install.sh --with-templates /path/to/your-repo
|
|
43
|
-
|
|
44
|
-
# Also create labels via gh CLI (requires gh auth)
|
|
45
|
-
./scripts/install.sh --with-templates --with-labels /path/to/your-repo
|
|
46
|
-
|
|
47
|
-
# Update Delivery OS (replace existing) — use --dry-run first to preview
|
|
48
|
-
./scripts/install.sh --with-templates --overwrite /path/to/your-repo
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**Note:** By default, existing files are **never overwritten**. Use `--overwrite` only when updating Delivery OS. See [Consumer Setup](docs/consumer-setup.md) for the full command guide.
|
|
52
|
-
|
|
53
|
-
**Other commands:**
|
|
54
|
-
```bash
|
|
55
|
-
npx github-delivery-os status . # Show what's installed + installed version
|
|
56
|
-
npx github-delivery-os status --offline . # Same, without checking npm for updates
|
|
57
|
-
npx github-delivery-os uninstall . # Remove workflows
|
|
58
|
-
npx github-delivery-os uninstall --with-templates . # Remove workflows + templates
|
|
59
|
-
npx github-delivery-os uninstall --dry-run . # Preview (no changes)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
`status` also checks npm for a newer release and tells you if you're behind (e.g. `⬆️ Update available: 1.0.3 → 1.1.0`), along with the exact command to update. That check is silent and non-fatal if you're offline — use `--offline` to skip it outright (e.g. in CI).
|
|
63
|
-
|
|
64
|
-
**Command variations — which one to run when:**
|
|
65
|
-
|
|
66
|
-
| Command | When to run it |
|
|
67
|
-
|---------|-----------------|
|
|
68
|
-
| `npx github-delivery-os install --with-templates .` | First install of Delivery OS in a repo without Claude Code — workflows + issue templates. The default recommendation above. |
|
|
69
|
-
| `npx github-delivery-os install --with-templates --with-labels .` | Same, plus creating all required labels immediately via `gh` CLI — skips the manual "Actions → Setup Labels → Run workflow" step. Needs `gh auth`. |
|
|
70
|
-
| `npx github-delivery-os install --with-templates --with-skill .` | You (or your team) will operate this repo's Delivery OS from [Claude Code](https://claude.com/claude-code) — adds the `delivery-ops` skill so issues/comments/status checks can be done in plain language. |
|
|
71
|
-
| `npx github-delivery-os install --with-templates --with-labels --with-skill .` | Everything at once — the fastest path to a fully working, Claude-Code-operable install in one command. |
|
|
72
|
-
| `npx github-delivery-os install --with-templates --with-skill --dry-run .` | Preview any of the above combinations first — prints what would be created without writing anything. Combine with any other flags. |
|
|
73
|
-
| `npx github-delivery-os install --with-templates --with-skill --overwrite .` | Updating an existing install to the latest release, or retroactively adding `--with-templates`/`--with-skill` to a repo that skipped them originally. **Only** command here that replaces existing files — everything above is always skip-existing/safe. |
|
|
74
|
-
| `npx github-delivery-os status .` | Not sure what's currently installed, whether it's up to date, or whether a workflow is broken (e.g. a required script silently missing). Safe, read-only. |
|
|
75
|
-
| `npx github-delivery-os uninstall --with-templates --with-skill .` | Removing Delivery OS entirely — workflows, scripts, templates, and the skill. Omit either flag to keep that part (both are kept by default). |
|
|
76
|
-
|
|
77
|
-
**What gets installed:**
|
|
78
|
-
|
|
79
|
-
| Workflow | Trigger | Purpose |
|
|
80
|
-
|----------|---------|---------|
|
|
81
|
-
| `sprint-child-creator` | Issue opened, title contains `SPRINT -` | Parses "Sprint Features (One Per Line)" and creates one child issue per line, each linked back with `Parent Sprint: #N` |
|
|
82
|
-
| `auto-close-sprint` | Issue closed, body contains `Parent Sprint` | Recomputes the parent sprint's burn-down/health and rewrites its status section; auto-closes the sprint at 100% |
|
|
83
|
-
| `notify-release-approver` | Issue opened, labeled `production` | Comments on the issue tagging the repo's `RELEASE_APPROVER` |
|
|
84
|
-
| `authorize-deployment` | Comment posted on a `production`-labeled issue | Checks the commenter and keyword against `RELEASE_APPROVER`/`QA_APPROVER`; once both approve, adds `ready-for-deploy` |
|
|
85
|
-
| `auto-assign-qa` | Issue opened/labeled `qa` or `qa-request` | Assigns the repo's configured `QA_ASSIGNEES` |
|
|
86
|
-
| `telegram-issues` | Issue/comment/PR events | Sends a Telegram alert if `TELEGRAM_BOT_TOKEN`/`TELEGRAM_CHAT_ID` are configured |
|
|
87
|
-
| `setup-labels` | Manual (`workflow_dispatch`) | One-time run that creates all labels Delivery OS needs |
|
|
88
|
-
|
|
89
|
-
Workflows and templates are **copied directly** into your repo. No `workflow_call` or external references.
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
## Quick Start (After Install)
|
|
98
|
-
|
|
99
|
-
1. **Create labels:** Actions → Setup Labels → Run workflow
|
|
100
|
-
2. **Configure variables:** Settings → Secrets and variables → Actions → Variables
|
|
101
|
-
- `RELEASE_APPROVER` — GitHub username
|
|
102
|
-
- `QA_APPROVER` — GitHub username
|
|
103
|
-
- `QA_ASSIGNEES` — Comma-separated usernames (e.g. `user1,user2`)
|
|
104
|
-
3. **Optional:** Add `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` for alerts
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Sprint Child Creation
|
|
109
|
-
|
|
110
|
-
When you open an issue using the **Sprint Planning** template with a title like `SPRINT - Sprint 12`:
|
|
111
|
-
|
|
112
|
-
1. Each line under "Sprint Features (One Per Line)" becomes a child issue
|
|
113
|
-
2. Child issues link back with `Parent Sprint: #N`
|
|
114
|
-
3. Closing child issues updates burn-down; sprint auto-closes at 100%
|
|
115
|
-
|
|
116
|
-
**Required:** Install with `--with-templates` so the sprint form is available.
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Operating From Claude Code (`--with-skill`)
|
|
121
|
-
|
|
122
|
-
Installing with `--with-skill` drops a `.claude/skills/delivery-ops/SKILL.md` skill into the repo, scoped to *this* repo's Delivery OS install. It lets anyone using [Claude Code](https://claude.com/claude-code) drive the workflows above by asking in plain language — e.g. "create a sprint for the checkout redesign" — instead of hand-building `gh issue create` calls and remembering each template's exact field names.
|
|
123
|
-
|
|
124
|
-
Before doing anything, it checks the target repo: confirms Delivery OS is actually installed, that `Setup Labels` has been run, and that `RELEASE_APPROVER` / `QA_APPROVER` / `QA_ASSIGNEES` are configured — flagging (or offering to fix) gaps instead of silently creating an issue that does nothing. It also always shows the constructed title/body/labels or comment text for confirmation before creating or posting for real, since these are visible actions in the repo's activity, not a local preview.
|
|
125
|
-
|
|
126
|
-
It can also run the full lifecycle of a piece of work on its own: notice something worth tracking, classify it, file it, keep its status/comments in sync as work happens, and close it out — acting without asking when the outcome is clear (always posting a one-line notice in the conversation so nothing happens invisibly), and asking first only when the classification or "is this actually done" is genuinely ambiguous. A "phase" is just a Sprint Planning issue; a "roadmap" is one persistent issue Claude keeps rewritten with each phase's state — no new issue types or automation involved.
|
|
127
|
-
|
|
128
|
-
### Create a sprint
|
|
129
|
-
1. Ask: *"Create a sprint called Sprint 14 for \<goal>, running \<start> to \<end>, with features: \<one per line>"*
|
|
130
|
-
2. It opens an issue titled `SPRINT - Sprint 14`, labeled `sprint` + `planning`, with `### Sprint Name` / `Start` / `End` / `Goal` / `Features (One Per Line)` / `Approved` fields filled in.
|
|
131
|
-
3. On open, `sprint-child-creator` splits each feature line into its own child issue, labeled `sprint-active` and linked back with `Parent Sprint: #N`.
|
|
132
|
-
4. Close each child issue as work finishes — that's what advances the burn-down; `auto-close-sprint` recomputes it and rewrites the parent's `## 🚦 Sprint Status` section, auto-closing the sprint at 100%.
|
|
133
|
-
|
|
134
|
-
### Request a production release
|
|
135
|
-
1. Ask: *"Open a production release for \<project> v1.2.0, sprint #N, summary: \<summary>"*
|
|
136
|
-
2. It opens an issue titled `PRODUCTION RELEASE - <project> - v1.2.0`, labeled `release` + `production` + `approval`, with the sprint reference, version, release summary, QA summary/links, and `Deployment Authorized: No`.
|
|
137
|
-
3. On open, `notify-release-approver` comments tagging the repo's configured `RELEASE_APPROVER`.
|
|
138
|
-
|
|
139
|
-
### Approve or decline a release
|
|
140
|
-
1. Ask: *"Approve release #N"* or *"Decline release #N — \<reason>"*.
|
|
141
|
-
2. It checks that the currently authenticated `gh` login matches the repo's `RELEASE_APPROVER` — if not, it stops and says so instead of posting a comment that would silently do nothing.
|
|
142
|
-
3. It posts a comment starting with a recognized keyword (`approved`, `ok`, `go ahead` to approve; `declined`, `rejected`, `not approved` to decline) — `authorize-deployment` only reacts to that leading keyword from the exact configured approver. A later comment from the same approver overrides an earlier one.
|
|
143
|
-
|
|
144
|
-
### Request QA
|
|
145
|
-
1. Ask: *"Open a QA request for \<feature>, related to issue #N, testing \<what/where>"*
|
|
146
|
-
2. It opens an issue titled `QA REQUEST - <feature>`, labeled `qa-request`, with the related task, what to test, environment/build link, and acceptance criteria.
|
|
147
|
-
3. On open, `auto-assign-qa` assigns the repo's configured `QA_ASSIGNEES`.
|
|
148
|
-
|
|
149
|
-
### Approve QA
|
|
150
|
-
1. Ask: *"Mark QA #N as approved"* (or *"looks good"*).
|
|
151
|
-
2. Same login check as release approval, but against `QA_APPROVER`.
|
|
152
|
-
3. Posts a comment starting with `qa approved`, `approved`, `qa ok`, or `looks good`.
|
|
153
|
-
|
|
154
|
-
### Report a bug
|
|
155
|
-
1. Ask: *"File a bug: \<one-line summary>, severity \<level>, steps: \<...>"*
|
|
156
|
-
2. It opens an issue titled `[BUG] <summary>`, labeled `bug` + `qa`, with platform, severity, build/version, steps to reproduce, expected vs. actual result, and test environment.
|
|
157
|
-
|
|
158
|
-
### Track a task
|
|
159
|
-
1. Ask: *"Create a task to \<summary>, owner \<name>, priority P1"*
|
|
160
|
-
2. It opens an issue titled `TASK - <summary>`, labeled `task`, with owner, priority, status, acceptance criteria, and links. (No workflow trigger — this is plain tracking.)
|
|
161
|
-
|
|
162
|
-
### Check status
|
|
163
|
-
- *"What's the status of issue #N?"* → current labels and latest comments.
|
|
164
|
-
- *"How's Sprint 14 doing?"* → reads the parent issue's `## 🚦 Sprint Status` section (progress %, time elapsed, health, burn-down bar).
|
|
165
|
-
- *"What releases are waiting on approval?"* / *"What sprints are active?"* / *"What QA requests are open?"* → lists issues by label (`production`, `sprint`, `qa-request`) so you don't need an issue number in hand.
|
|
166
|
-
|
|
167
|
-
See [How To](docs/how-to.md) for the underlying workflows this drives, field by field.
|
|
168
|
-
|
|
169
|
-
### Example: filing a bug and a task, step by step
|
|
170
|
-
|
|
171
|
-
Illustrative walkthrough against `acme/storefront`, a repo with Delivery OS installed (same example repo used in the full walkthrough below).
|
|
172
|
-
|
|
173
|
-
**Filing the bug:**
|
|
174
|
-
|
|
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 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
|
-
2. Claude pre-flights the repo — confirms Delivery OS is installed and the `bug`/`qa` labels exist.
|
|
178
|
-
3. Claude shows the exact issue it's about to create before doing anything:
|
|
179
|
-
- Title: `[BUG] Order request form submits with empty phone number`
|
|
180
|
-
- Labels: `bug`, `qa`
|
|
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
|
-
4. Confirm ("yes") when asked to create it.
|
|
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
|
-
|
|
185
|
-
**Filing the follow-up task:**
|
|
186
|
-
|
|
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 @alex, priority P1, status Backlog, acceptance: form blocks submission until a valid phone number is entered. Link it to #42.*
|
|
189
|
-
2. Claude shows the constructed issue:
|
|
190
|
-
- Title: `TASK - Add phone number validation to order form`
|
|
191
|
-
- Labels: `task`
|
|
192
|
-
- Body: `Task Summary`, `Description` (references #42), `Owner` → @alex, `Priority` → P1 - High, `Status` → Backlog, `Acceptance Criteria`, `Artifacts / Links` → Related bug: #42.
|
|
193
|
-
3. Confirm ("yes") to create it.
|
|
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
|
-
|
|
196
|
-
### Full example: shipping a feature end-to-end
|
|
197
|
-
|
|
198
|
-
A realistic Claude Code session, run from inside the consumer repo (the skill defaults to it since it was installed with `--with-skill` there). `RELEASE_APPROVER`, `QA_APPROVER`, and `QA_ASSIGNEES` are already configured.
|
|
199
|
-
|
|
200
|
-
```
|
|
201
|
-
You: Create a sprint called "Sprint 14 - Checkout Revamp", running 2026-09-16 to
|
|
202
|
-
2026-09-30, goal is shipping the new checkout flow, features:
|
|
203
|
-
- Redesign cart summary
|
|
204
|
-
- Add saved payment methods
|
|
205
|
-
- Fix tax rounding bug
|
|
206
|
-
|
|
207
|
-
Claude: This will create an issue in acme/storefront:
|
|
208
|
-
|
|
209
|
-
Title: SPRINT - Sprint 14 - Checkout Revamp
|
|
210
|
-
Labels: sprint, planning
|
|
211
|
-
Body:
|
|
212
|
-
### Sprint Name
|
|
213
|
-
Sprint 14 - Checkout Revamp
|
|
214
|
-
### Sprint Start
|
|
215
|
-
2026-09-16
|
|
216
|
-
### Sprint End
|
|
217
|
-
2026-09-30
|
|
218
|
-
### Sprint Goal
|
|
219
|
-
Ship the new checkout flow
|
|
220
|
-
### Sprint Features (One Per Line)
|
|
221
|
-
Redesign cart summary
|
|
222
|
-
Add saved payment methods
|
|
223
|
-
Fix tax rounding bug
|
|
224
|
-
### Sprint Approved
|
|
225
|
-
Pending
|
|
226
|
-
|
|
227
|
-
Create this issue?
|
|
228
|
-
|
|
229
|
-
You: yes
|
|
230
|
-
|
|
231
|
-
Claude: Created #52. sprint-child-creator will fire on open and create one child
|
|
232
|
-
issue per feature — #53 "Redesign cart summary", #54 "Add saved payment
|
|
233
|
-
methods", #55 "Fix tax rounding bug" — each labeled sprint-active and
|
|
234
|
-
linked back with "Parent Sprint: #52".
|
|
235
|
-
|
|
236
|
-
[ ... engineers do the work, close #53 and #54 as they land ... ]
|
|
237
|
-
|
|
238
|
-
You: How's Sprint 14 doing?
|
|
239
|
-
|
|
240
|
-
Claude: Reading #52... ## 🚦 Sprint Status: 67% complete (2/3 closed), 20% of
|
|
241
|
-
sprint time elapsed, 🟢 on track.
|
|
242
|
-
|
|
243
|
-
You: QA found a rounding issue in the tax calc — file a bug. Severity high,
|
|
244
|
-
repros on checkout with 3+ items, expected total matches line items,
|
|
245
|
-
actual is off by $0.01.
|
|
246
|
-
|
|
247
|
-
Claude: This will create an issue in acme/storefront:
|
|
248
|
-
|
|
249
|
-
Title: [BUG] Tax rounding off by $0.01 with 3+ items
|
|
250
|
-
Labels: bug, qa
|
|
251
|
-
Body: (Platform, Severity: High, Steps to Reproduce, Expected vs.
|
|
252
|
-
Actual Result, Test Environment filled in from what you said)
|
|
253
|
-
|
|
254
|
-
Create this issue?
|
|
255
|
-
|
|
256
|
-
You: yes
|
|
257
|
-
|
|
258
|
-
Claude: Created #56.
|
|
259
|
-
|
|
260
|
-
[ ... #55 fixed, referencing #56 ... ]
|
|
261
|
-
|
|
262
|
-
You: Open a QA request for the tax rounding fix, related to #55, test on
|
|
263
|
-
staging, acceptance: totals match to the cent for carts of 1-10 items.
|
|
264
|
-
|
|
265
|
-
Claude: This will create an issue in acme/storefront:
|
|
15
|
+
From your repo root. Add `--with-labels` to create labels via `gh` CLI, `--with-skill` for the [Claude Code](https://claude.com/claude-code) skill, `--dry-run` to preview first. See the [landing page](https://phaneroo.github.io/github-delivery-operating-system/#install) for every flag combination and when to use it, or [Consumer Setup](docs/consumer-setup.md) for the clone-and-run alternative, configuration, and troubleshooting.
|
|
266
16
|
|
|
267
|
-
|
|
268
|
-
Labels: qa-request
|
|
269
|
-
Body: (Related Sprint Task Issue #55, What to Test, Environment +
|
|
270
|
-
Build Link: staging, Acceptance Criteria filled in)
|
|
17
|
+
## What you get
|
|
271
18
|
|
|
272
|
-
|
|
19
|
+
| | |
|
|
20
|
+
|---|---|
|
|
21
|
+
| **Sprint child creation** | One issue per feature line, automatic burn-down, auto-close at 100% |
|
|
22
|
+
| **Dual approval gates** | Release approver + QA sign-off required before deploy |
|
|
23
|
+
| **Auto-assign QA & Telegram alerts** | QA-labeled issues get assigned automatically; optional alerts for bugs, QA, sprints, releases |
|
|
24
|
+
| **Claude Code skill** (`--with-skill`) | Operate it all in plain language — create/comment/check status, autonomous task tracking, and turning a spec into a full phase-and-task breakdown |
|
|
273
25
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
Claude: Created #57. auto-assign-qa will assign it to the configured
|
|
277
|
-
QA_ASSIGNEES.
|
|
278
|
-
|
|
279
|
-
[ ... QA tests it, comes back clean ... ]
|
|
280
|
-
|
|
281
|
-
You: Mark QA #57 as approved, looks good.
|
|
282
|
-
|
|
283
|
-
Claude: Checking gh auth status... authenticated as jane-qa, which matches this
|
|
284
|
-
repo's QA_APPROVER. Posting:
|
|
285
|
-
|
|
286
|
-
"looks good — verified on staging, totals match to the cent"
|
|
287
|
-
|
|
288
|
-
on #57.
|
|
289
|
-
|
|
290
|
-
You: yes, post it
|
|
291
|
-
|
|
292
|
-
Claude: Posted. Now close #55 to update the sprint burn-down?
|
|
293
|
-
|
|
294
|
-
You: yes
|
|
295
|
-
|
|
296
|
-
Claude: Closed #55. Sprint 14 is now 100% complete — auto-close-sprint closed
|
|
297
|
-
#52 and posted a completion comment.
|
|
298
|
-
|
|
299
|
-
You: Open a production release for storefront v2.4.1, sprint #52, summary
|
|
300
|
-
"checkout revamp: new cart summary, saved payment methods, tax rounding
|
|
301
|
-
fix", QA evidence: #57.
|
|
302
|
-
|
|
303
|
-
Claude: This will create an issue in acme/storefront:
|
|
304
|
-
|
|
305
|
-
Title: PRODUCTION RELEASE - storefront - v2.4.1
|
|
306
|
-
Labels: release, production, approval
|
|
307
|
-
Body:
|
|
308
|
-
### Sprint Reference (Sprint Planning Issue #)
|
|
309
|
-
#52
|
|
310
|
-
### Version / Build Number
|
|
311
|
-
v2.4.1
|
|
312
|
-
### Release Summary
|
|
313
|
-
Checkout revamp: new cart summary, saved payment methods, tax
|
|
314
|
-
rounding fix
|
|
315
|
-
### QA Summary + Evidence Links
|
|
316
|
-
#57
|
|
317
|
-
### Overall QA Recommendation
|
|
318
|
-
Approve for Production
|
|
319
|
-
### Deployment Authorized
|
|
320
|
-
No
|
|
321
|
-
|
|
322
|
-
Create this issue?
|
|
323
|
-
|
|
324
|
-
You: yes
|
|
325
|
-
|
|
326
|
-
Claude: Created #58. notify-release-approver posted a comment tagging this
|
|
327
|
-
repo's RELEASE_APPROVER (john-lead).
|
|
328
|
-
|
|
329
|
-
[ ... some time later, as john-lead ... ]
|
|
330
|
-
|
|
331
|
-
You: Approve release #58.
|
|
332
|
-
|
|
333
|
-
Claude: Checking gh auth status... authenticated as john-lead, which matches
|
|
334
|
-
RELEASE_APPROVER. Posting "approved" on #58.
|
|
335
|
-
|
|
336
|
-
You: yes
|
|
337
|
-
|
|
338
|
-
Claude: Posted. authorize-deployment will add ready-for-deploy once both
|
|
339
|
-
approvers (release + QA) have a qualifying comment on record.
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
Each `yes` above is a real confirmation gate — Claude shows the exact issue/comment content before it creates or posts anything, since it's a visible action in the repo.
|
|
343
|
-
|
|
344
|
-
---
|
|
26
|
+
Full workflow table, quick start, and Claude Code walkthroughs are on the [landing page](https://phaneroo.github.io/github-delivery-operating-system/).
|
|
345
27
|
|
|
346
28
|
## Documentation
|
|
347
29
|
|
|
348
30
|
| Document | Description |
|
|
349
31
|
|----------|-------------|
|
|
350
|
-
| **[Landing page & quick start](https://phaneroo.github.io/github-delivery-operating-system/)** | Overview,
|
|
32
|
+
| **[Landing page & quick start](https://phaneroo.github.io/github-delivery-operating-system/)** | Overview, full command reference, workflows, Claude Code walkthroughs |
|
|
351
33
|
| [PRFAQ](docs/PRFAQ.md) | Product overview and FAQs for all audiences (npm launch, install, governance) |
|
|
352
34
|
| [Press release (npm)](docs/press-release.md) | Formal announcement: Delivery OS on npm |
|
|
353
35
|
| [Consumer Setup](docs/consumer-setup.md) | Installation, configuration, variables, labels, Telegram, uninstall |
|
|
@@ -355,8 +37,6 @@ Each `yes` above is a real confirmation gate — Claude shows the exact issue/co
|
|
|
355
37
|
| [Architecture](docs/architecture.md) | Workflows, templates, data flow |
|
|
356
38
|
| [Governance](docs/governance.md) | Lifecycle, approval gates, automation rules |
|
|
357
39
|
|
|
358
|
-
---
|
|
359
|
-
|
|
360
40
|
## License
|
|
361
41
|
|
|
362
42
|
MIT License. See [LICENSE](LICENSE) for details.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-delivery-os",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.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/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const { program } = require('commander');
|
|
3
|
+
const { program, Option } = require('commander');
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const { runInstall, runStatus, runUninstall } = require('./install');
|
|
@@ -21,8 +21,12 @@ program
|
|
|
21
21
|
.option('-t, --with-templates', 'Copy issue templates (sprint, task, bug, QA, production release)')
|
|
22
22
|
.option('-l, --with-labels', 'Create labels via gh CLI (requires gh auth)')
|
|
23
23
|
.option('-s, --with-skill', 'Add the delivery-ops Claude Code skill (.claude/skills/delivery-ops/SKILL.md)')
|
|
24
|
-
.option('-
|
|
25
|
-
.option('--no-
|
|
24
|
+
.option('-u, --update', 'Replace existing workflow/template files with the latest version')
|
|
25
|
+
.option('--no-update', 'Skip existing files (default)')
|
|
26
|
+
// Pre-1.5.0 names, kept working silently so existing scripts/CI calling
|
|
27
|
+
// `install --overwrite` don't break — --update is the documented name now.
|
|
28
|
+
.addOption(new Option('-o, --overwrite').hideHelp())
|
|
29
|
+
.addOption(new Option('--no-overwrite').hideHelp())
|
|
26
30
|
.option('-d, --dry-run', 'Show what would happen without changing files')
|
|
27
31
|
.action((target, options) => {
|
|
28
32
|
const targetDir = target || '.';
|
|
@@ -31,7 +35,7 @@ program
|
|
|
31
35
|
withTemplates: options.withTemplates ?? false,
|
|
32
36
|
withLabels: options.withLabels ?? false,
|
|
33
37
|
withSkill: options.withSkill ?? false,
|
|
34
|
-
overwrite: options.overwrite ?? false,
|
|
38
|
+
overwrite: options.update ?? options.overwrite ?? false,
|
|
35
39
|
dryRun: options.dryRun ?? false,
|
|
36
40
|
});
|
|
37
41
|
});
|
package/src/install.js
CHANGED
|
@@ -51,7 +51,7 @@ const LABELS = [
|
|
|
51
51
|
['intake', '0E8A16'],
|
|
52
52
|
['bug', 'D93F0B'],
|
|
53
53
|
['sprint', '1D76DB'],
|
|
54
|
-
['sprint-
|
|
54
|
+
['sprint-child', '1D76DB', "Applied to a sprint's task-breakdown children on open; doesn't change when the sprint closes"],
|
|
55
55
|
['planning', '5319E7'],
|
|
56
56
|
['sprint-planning', '5319E7'],
|
|
57
57
|
['task', '7057FF'],
|
|
@@ -351,9 +351,11 @@ function runInstall(options) {
|
|
|
351
351
|
}
|
|
352
352
|
|
|
353
353
|
if (!labelsSkipReason) {
|
|
354
|
-
for (const [name, color] of LABELS) {
|
|
354
|
+
for (const [name, color, description] of LABELS) {
|
|
355
355
|
try {
|
|
356
|
-
|
|
356
|
+
const args = ['label', 'create', name, '--color', color];
|
|
357
|
+
if (description) args.push('--description', description);
|
|
358
|
+
execFileSync('gh', args, {
|
|
357
359
|
cwd: targetAbs,
|
|
358
360
|
stdio: 'pipe',
|
|
359
361
|
});
|
|
@@ -406,11 +408,11 @@ function runInstall(options) {
|
|
|
406
408
|
if (templatesPresentButNotTouched || skillPresentButNotTouched) {
|
|
407
409
|
console.log(' Note: previously-installed templates and/or the Claude Code skill exist');
|
|
408
410
|
console.log(' on disk but were not requested this run, so the recorded Delivery OS');
|
|
409
|
-
console.log(' version was not updated. Re-run with --
|
|
411
|
+
console.log(' version was not updated. Re-run with --update plus --with-templates');
|
|
410
412
|
console.log(' and/or --with-skill to bring everything (and the recorded version) in sync.');
|
|
411
413
|
} else {
|
|
412
414
|
console.log(' Note: some files already existed and were skipped, so the recorded');
|
|
413
|
-
console.log(' Delivery OS version was not updated. Re-run with --
|
|
415
|
+
console.log(' Delivery OS version was not updated. Re-run with --update to sync');
|
|
414
416
|
console.log(' all files (and the recorded version) to the latest release.');
|
|
415
417
|
}
|
|
416
418
|
console.log('');
|
|
@@ -453,7 +455,7 @@ function runInstall(options) {
|
|
|
453
455
|
console.log('Dry run complete. No files were changed.');
|
|
454
456
|
} else {
|
|
455
457
|
console.log('No new files created (existing files were skipped).');
|
|
456
|
-
console.log('To update: use --
|
|
458
|
+
console.log('To update: use --update (run with --dry-run first to preview).');
|
|
457
459
|
}
|
|
458
460
|
}
|
|
459
461
|
console.log('');
|
|
@@ -464,11 +466,11 @@ function runInstall(options) {
|
|
|
464
466
|
// installed actually gets touched this run (see the cleanInstall check
|
|
465
467
|
// there) — so a repo with templates and/or the skill already on disk needs
|
|
466
468
|
// --with-templates/--with-skill passed again on an update, not just
|
|
467
|
-
// --
|
|
469
|
+
// --update, or the recorded version never advances and `status` keeps
|
|
468
470
|
// suggesting the same command forever. Build the hint from what's actually
|
|
469
471
|
// on disk so it's never wrong.
|
|
470
|
-
function
|
|
471
|
-
const flags = [hasTemplates ? '--with-templates' : null, hasSkill ? '--with-skill' : null, '--
|
|
472
|
+
function buildUpdateCommand({ hasTemplates, hasSkill }) {
|
|
473
|
+
const flags = [hasTemplates ? '--with-templates' : null, hasSkill ? '--with-skill' : null, '--update']
|
|
472
474
|
.filter(Boolean)
|
|
473
475
|
.join(' ');
|
|
474
476
|
return `npx github-delivery-os@latest install ${flags} .`;
|
|
@@ -533,7 +535,7 @@ async function runStatus(options) {
|
|
|
533
535
|
} else {
|
|
534
536
|
console.log('Installed version: unknown (installed before version tracking was added)');
|
|
535
537
|
console.log(
|
|
536
|
-
` Run: ${
|
|
538
|
+
` Run: ${buildUpdateCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
537
539
|
);
|
|
538
540
|
}
|
|
539
541
|
|
|
@@ -546,7 +548,7 @@ async function runStatus(options) {
|
|
|
546
548
|
} else if (manifest && manifest.version) {
|
|
547
549
|
console.log(`⬆️ Update available: ${manifest.version} → ${latest}`);
|
|
548
550
|
console.log(
|
|
549
|
-
` Run: ${
|
|
551
|
+
` Run: ${buildUpdateCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
550
552
|
);
|
|
551
553
|
} else {
|
|
552
554
|
console.log(`Latest published version: ${latest}`);
|
|
@@ -568,7 +570,7 @@ async function runStatus(options) {
|
|
|
568
570
|
});
|
|
569
571
|
console.log(' That workflow will fail with MODULE_NOT_FOUND the next time it runs.');
|
|
570
572
|
console.log(
|
|
571
|
-
` Fix: ${
|
|
573
|
+
` Fix: ${buildUpdateCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
572
574
|
);
|
|
573
575
|
console.log('');
|
|
574
576
|
}
|
|
@@ -579,7 +581,7 @@ async function runStatus(options) {
|
|
|
579
581
|
console.log(' require()s a script under .github/scripts will fail with "module is not');
|
|
580
582
|
console.log(' defined in ES module scope" the next time it runs.');
|
|
581
583
|
console.log(
|
|
582
|
-
` Fix: ${
|
|
584
|
+
` Fix: ${buildUpdateCommand({ hasTemplates: installedTemplates.length > 0, hasSkill: skillInstalled })}`
|
|
583
585
|
);
|
|
584
586
|
console.log('');
|
|
585
587
|
}
|
|
@@ -768,7 +770,7 @@ module.exports = {
|
|
|
768
770
|
readManifest,
|
|
769
771
|
writeManifest,
|
|
770
772
|
fetchLatestVersion,
|
|
771
|
-
|
|
773
|
+
buildUpdateCommand,
|
|
772
774
|
skillPath,
|
|
773
775
|
SKILL_REL_PATH,
|
|
774
776
|
WORKFLOWS,
|
|
@@ -776,5 +778,6 @@ module.exports = {
|
|
|
776
778
|
SCRIPTS,
|
|
777
779
|
SCRIPTS_PACKAGE_JSON,
|
|
778
780
|
REQUIRED_SCRIPT_BY_WORKFLOW,
|
|
781
|
+
LABELS,
|
|
779
782
|
},
|
|
780
783
|
};
|