@brunosps00/dev-workflow 1.7.1 → 2.1.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-plugin/marketplace.json +1 -0
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +305 -0
- package/README.md +7 -5
- package/lib/agents.js +6 -1
- package/lib/build-plugin.js +4 -1
- package/lib/constants.js +4 -2
- package/lib/init.js +14 -0
- package/lib/install-state.js +8 -4
- package/lib/validate.js +21 -0
- package/package.json +2 -1
- package/scaffold/agents/core/dw-build-fixer.md +0 -1
- package/scaffold/agents/core/dw-code-explorer.md +0 -1
- package/scaffold/agents/core/dw-code-reviewer.md +0 -1
- package/scaffold/agents/core/dw-planner.md +0 -1
- package/scaffold/agents/core/dw-test-author.md +0 -1
- package/scaffold/agents/csharp/dw-csharp-reviewer.md +0 -1
- package/scaffold/agents/csharp/dw-dotnet-build-fixer.md +0 -1
- package/scaffold/agents/frontend/dw-qa-runner.md +0 -1
- package/scaffold/agents/python/dw-python-build-fixer.md +0 -1
- package/scaffold/agents/python/dw-python-reviewer.md +0 -1
- package/scaffold/agents/rust/dw-rust-build-fixer.md +0 -1
- package/scaffold/agents/rust/dw-rust-reviewer.md +0 -1
- package/scaffold/agents/security/dw-security-reviewer.md +0 -1
- package/scaffold/agents/security/dw-silent-failure-hunter.md +0 -1
- package/scaffold/agents/typescript/dw-typescript-build-fixer.md +0 -1
- package/scaffold/agents/typescript/dw-typescript-reviewer.md +0 -1
- package/scaffold/config/routing.json +60 -0
- package/scaffold/en/commands/dw-brainstorm.md +12 -8
- package/scaffold/en/commands/dw-bugfix.md +4 -2
- package/scaffold/en/commands/dw-claude-run.md +5 -1
- package/scaffold/en/commands/dw-codex-run.md +5 -1
- package/scaffold/en/commands/dw-dockerize.md +14 -7
- package/scaffold/en/commands/dw-generate-pr.md +13 -0
- package/scaffold/en/commands/dw-new-project.md +14 -13
- package/scaffold/en/commands/dw-plan.md +2 -2
- package/scaffold/en/commands/dw-refactor.md +1 -0
- package/scaffold/en/commands/dw-review.md +33 -2
- package/scaffold/en/commands/dw-run.md +2 -1
- package/scaffold/en/commands/dw-triage.md +220 -0
- package/scaffold/en/templates/idea-onepager.md +28 -0
- package/scaffold/en/templates/project-onepager.md +6 -5
- package/scaffold/en/templates/task-template.md +2 -1
- package/scaffold/en/templates/tasks-template.md +11 -8
- package/scaffold/en/templates/triage-needs-info-template.md +23 -0
- package/scaffold/en/templates/triage-out-of-scope-template.md +36 -0
- package/scaffold/en/templates/triage-record-template.md +88 -0
- package/scaffold/pt-br/commands/dw-autopilot.md +81 -81
- package/scaffold/pt-br/commands/dw-brainstorm.md +12 -9
- package/scaffold/pt-br/commands/dw-bugfix.md +4 -2
- package/scaffold/pt-br/commands/dw-claude-run.md +23 -19
- package/scaffold/pt-br/commands/dw-codex-run.md +22 -18
- package/scaffold/pt-br/commands/dw-context-budget.md +10 -10
- package/scaffold/pt-br/commands/dw-copilot-run.md +20 -20
- package/scaffold/pt-br/commands/dw-dockerize.md +106 -99
- package/scaffold/pt-br/commands/dw-find-skills.md +52 -52
- package/scaffold/pt-br/commands/dw-generate-pr.md +13 -0
- package/scaffold/pt-br/commands/dw-goal.md +41 -41
- package/scaffold/pt-br/commands/dw-harness-audit.md +11 -11
- package/scaffold/pt-br/commands/dw-intel.md +70 -70
- package/scaffold/pt-br/commands/dw-learn.md +24 -24
- package/scaffold/pt-br/commands/dw-new-project.md +93 -92
- package/scaffold/pt-br/commands/dw-open-design.md +53 -53
- package/scaffold/pt-br/commands/dw-opportunities.md +45 -45
- package/scaffold/pt-br/commands/dw-pause.md +39 -39
- package/scaffold/pt-br/commands/dw-plan.md +3 -3
- package/scaffold/pt-br/commands/dw-refactor.md +31 -30
- package/scaffold/pt-br/commands/dw-resume.md +22 -22
- package/scaffold/pt-br/commands/dw-review.md +33 -2
- package/scaffold/pt-br/commands/dw-run.md +2 -1
- package/scaffold/pt-br/commands/dw-skill-health.md +10 -10
- package/scaffold/pt-br/commands/dw-subtask-complete.md +4 -4
- package/scaffold/pt-br/commands/dw-subtask-start.md +4 -4
- package/scaffold/pt-br/commands/dw-triage.md +220 -0
- package/scaffold/pt-br/templates/bugfix-summary-template.md +20 -20
- package/scaffold/pt-br/templates/concerns-template.md +20 -20
- package/scaffold/pt-br/templates/idea-onepager.md +28 -0
- package/scaffold/pt-br/templates/project-onepager.md +35 -34
- package/scaffold/pt-br/templates/state-template.md +13 -13
- package/scaffold/pt-br/templates/task-template.md +2 -1
- package/scaffold/pt-br/templates/tasks-template.md +11 -8
- package/scaffold/pt-br/templates/triage-needs-info-template.md +23 -0
- package/scaffold/pt-br/templates/triage-out-of-scope-template.md +36 -0
- package/scaffold/pt-br/templates/triage-record-template.md +88 -0
- package/scaffold/scripts/hooks/git-guardrails.mjs +41 -24
- package/scaffold/skills/docker-compose-recipes/SKILL.md +2 -4
- package/scaffold/skills/docker-compose-recipes/references/compose-composition.md +2 -2
- package/scaffold/skills/docker-compose-recipes/references/env-conventions.md +16 -9
- package/scaffold/skills/docker-compose-recipes/references/healthcheck-patterns.md +0 -1
- package/scaffold/skills/docker-compose-recipes/references/prod-vs-dev.md +7 -2
- package/scaffold/skills/docker-compose-recipes/services/elasticsearch.yml +3 -3
- package/scaffold/skills/docker-compose-recipes/services/meilisearch.yml +2 -2
- package/scaffold/skills/docker-compose-recipes/services/minio.yml +8 -4
- package/scaffold/skills/docker-compose-recipes/services/mysql.yml +4 -4
- package/scaffold/skills/docker-compose-recipes/services/postgres.yml +2 -2
- package/scaffold/skills/docker-compose-recipes/services/rabbitmq.yml +3 -3
- package/scaffold/skills/docker-compose-recipes/services/typesense.yml +3 -3
- package/scaffold/skills/dw-cli-run/SKILL.md +42 -38
- package/scaffold/skills/dw-cli-run/references/dispatch-tuning.md +85 -0
- package/scaffold/skills/dw-debug-protocol/SKILL.md +2 -0
- package/scaffold/skills/dw-debug-protocol/references/six-step-triage.md +60 -1
- package/scaffold/skills/dw-execute-phase/SKILL.md +4 -2
- package/scaffold/skills/dw-execute-phase/agents/executor.md +4 -2
- package/scaffold/skills/dw-execute-phase/agents/plan-checker.md +9 -7
- package/scaffold/skills/dw-execute-phase/references/atomic-commits.md +12 -8
- package/scaffold/skills/dw-execute-phase/references/plan-verification.md +6 -4
- package/scaffold/skills/dw-execute-phase/references/wave-coordination.md +14 -14
- package/scaffold/skills/dw-grilling/SKILL.md +17 -7
- package/scaffold/skills/dw-grilling/references/decision-tree.md +30 -7
- package/scaffold/skills/dw-simplification/references/deep-modules.md +50 -0
- package/scaffold/skills/dw-testing-discipline/SKILL.md +3 -1
- package/scaffold/skills/dw-testing-discipline/references/tdd-loop.md +83 -0
- package/scaffold/skills/docker-compose-recipes/services/mailhog.yml +0 -23
- package/scaffold/skills/docker-compose-recipes/services/postgres-pgvector.yml +0 -31
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev-workflow",
|
|
3
3
|
"description": "Standalone, à-la-carte skills from the dev-workflow pipeline: minimalism, search-first, simplification, verification, security review, and more.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Bruno Santos"
|
|
7
7
|
},
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this
|
|
6
|
+
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
> Entries for 2.0.0 are written from the change set itself. Entries before it were
|
|
9
|
+
> reconstructed from commit history in August 2026 — this file did not exist while
|
|
10
|
+
> those versions were released, so they are summaries of what shipped, not
|
|
11
|
+
> contemporaneous release notes. `git log` remains the authoritative record.
|
|
12
|
+
|
|
13
|
+
## [2.1.0] — 2026-08-04
|
|
14
|
+
|
|
15
|
+
Release driven by a skill-by-skill analysis of [mattpocock/skills](https://github.com/mattpocock/skills),
|
|
16
|
+
whose philosophy is the opposite of this project's: small composable skills anchored
|
|
17
|
+
to an issue tracker, against an opinionated pipeline with durable state in `.dw/`.
|
|
18
|
+
What follows is the transferable technique, adapted — plus five defects of our own
|
|
19
|
+
that the comparison exposed. What was deliberately **not** taken, and why, is
|
|
20
|
+
recorded in [docs/skills-ecosystem-comparison.md](docs/skills-ecosystem-comparison.md).
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- **`/dw-triage` — the intake boundary the pipeline never had.** External bug
|
|
25
|
+
reports, feature requests, and PRs previously had to be hand-converted into a
|
|
26
|
+
bugfix or a PRD before anything could touch them. One category (`bug` |
|
|
27
|
+
`enhancement`) and one state (`needs-triage` → `needs-info` | `ready-for-work` |
|
|
28
|
+
`needs-human` | `wontfix`), persisted in `.dw/triage/NNN-<slug>.md`, routing to
|
|
29
|
+
`/dw-bugfix`, `/dw-plan prd`, or `/dw-brainstorm --mode=grill`. Two mechanisms
|
|
30
|
+
carry the weight: **claims are verified before a brief is written** (bugs
|
|
31
|
+
reproduced from the reporter's steps, PR diffs checked against what they claim),
|
|
32
|
+
and `.dw/out-of-scope/<concept>.md` remembers rejections **by domain concept**
|
|
33
|
+
rather than by the request's wording, so a request refused in January is not
|
|
34
|
+
re-litigated in March. A `wontfix` for "already implemented" deliberately does
|
|
35
|
+
not write there — that store is memory of refusal, not of delivery.
|
|
36
|
+
It is local-first in the strict sense: `.dw/` is the source of truth and the
|
|
37
|
+
command works with no network and no `gh`. GitHub read via `gh` is optional
|
|
38
|
+
enrichment, and writing back is opt-in per write, never a side effect of triage.
|
|
39
|
+
- **`### Decision Map` in the idea one-pager.** `dw-grilling` already instructed
|
|
40
|
+
the agent to record its decision tree so a session could resume — with nowhere
|
|
41
|
+
to record it, so the graph was rebuilt from scratch every time and what the last
|
|
42
|
+
session knew was still *undecided* was lost. Each node now carries a `State`
|
|
43
|
+
(`resolved` | `open-ready` | `open-blocked`), a `Depends on:` field reusing the
|
|
44
|
+
form `tasks.md` already uses, and an explicit `**Frontier:**` line so the next
|
|
45
|
+
session reads what is decidable now without recomputing the graph. `#### Decision
|
|
46
|
+
Fog` records what is known to be undecided but not yet sharp enough to phrase as
|
|
47
|
+
a decision. Grill resumes from the map instead of re-deriving it, never re-asks a
|
|
48
|
+
`resolved` node, and the alignment gate now also requires `Frontier: none`.
|
|
49
|
+
Schema stays at `1.1`: the section is optional, so existing one-pagers stay valid.
|
|
50
|
+
- **`/dw-review --since <ref>`** — ad-hoc review against a verified comparison
|
|
51
|
+
point. Resolves the ref with `git rev-parse --verify`, aborts with an actionable
|
|
52
|
+
message if it does not resolve, aborts if the diff is empty rather than reviewing
|
|
53
|
+
nothing, and records the exact diff and commit commands in every report so the
|
|
54
|
+
review is reproducible. Three-dot, matching PR review semantics. The default
|
|
55
|
+
PRD/bugfix flow is unchanged.
|
|
56
|
+
- **Test-first loop in `dw-testing-discipline`** (`references/tdd-loop.md`):
|
|
57
|
+
confirm the public seam with the user, one red test per vertical slice, run it
|
|
58
|
+
and **observe** the expected red, minimum green, next slice. Refactor is outside
|
|
59
|
+
the cycle. `/dw-run` uses it only on an explicit request — never by default.
|
|
60
|
+
- **Red-capable feedback contract in `dw-debug-protocol`.** Reproduction was
|
|
61
|
+
specified as an outcome, not a procedure. A loop must now be single,
|
|
62
|
+
deterministic, fast, agent-runnable, and **proven red now** — "it should fail"
|
|
63
|
+
does not count — before any theorizing, with a repertoire of loop types and a
|
|
64
|
+
HITL template for when the loop needs credentials, hardware, or a human action.
|
|
65
|
+
`/dw-bugfix` records the loop command before and after the fix. Trivial bugs stay
|
|
66
|
+
exempt; the exemption ends when a first fix fails or the bug spans layers.
|
|
67
|
+
- **Seam dependency categories and Design It Twice** in
|
|
68
|
+
`dw-simplification/references/deep-modules.md`. Classifying what a seam isolates
|
|
69
|
+
(in-process, local-substitutable, remote owned, true external) derives the test
|
|
70
|
+
strategy instead of reflexively mocking or running everything; interface findings
|
|
71
|
+
require three-plus proposals under distinct constraints before one is recommended.
|
|
72
|
+
Loaded from `/dw-refactor` only for interface/seam findings, so simple refactors
|
|
73
|
+
stay cheap.
|
|
74
|
+
- **`AGENTS.md` and `CLAUDE.md`** at the repo root. A project whose product is
|
|
75
|
+
agent instructions had none for maintaining itself; the invariants existed only
|
|
76
|
+
as tests that fail after the mistake.
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
|
|
80
|
+
- **`git restore .` bypassed the git guardrails entirely.** `git checkout .` was
|
|
81
|
+
blocked while `git restore .`, `git restore -- .`, `git restore --staged
|
|
82
|
+
--worktree .` and `git restore --source=<ref> .` — which discard exactly the same
|
|
83
|
+
uncommitted work — passed through. The hook had **no test at all**, which is why
|
|
84
|
+
the hole survived. It now has one that invokes the script for real over stdin,
|
|
85
|
+
including a case that runs it from a directory whose name contains a space.
|
|
86
|
+
- **`Depends on:` was parsed by the wave executor but existed in no template.**
|
|
87
|
+
`/dw-plan` told each task to declare its dependencies and
|
|
88
|
+
`dw-execute-phase/references/wave-coordination.md` built the parallel graph by
|
|
89
|
+
topological sort from that field — while `tasks-template.md` had no column for it
|
|
90
|
+
and `task-template.md` no field. The graph rested on data nothing produced. The
|
|
91
|
+
field now has a home in both, and `wave-coordination.md` uses the `1.0` task IDs
|
|
92
|
+
the pipeline actually writes instead of the `01` form its example carried.
|
|
93
|
+
- **`/dw-brainstorm --research` wrote outside the repo.** Reports went to
|
|
94
|
+
`~/Documents/<Topic>_Research_<date>/`, so `/dw-plan` and `/dw-intel` could not
|
|
95
|
+
consume research the pipeline itself produced. They now land under the active
|
|
96
|
+
spec, or under `.dw/spec/research/` when standalone.
|
|
97
|
+
- **The marketplace manifest had no description**, which `claude plugin validate`
|
|
98
|
+
warns about and `npm run validate` did not catch. The field was added to the
|
|
99
|
+
generator in `build-plugin.js`, not only to the checked-in JSON, so it survives
|
|
100
|
+
the next `npm run build:plugin`.
|
|
101
|
+
- **The PT `/dw-refactor` searched for a section that did not exist.** It told the
|
|
102
|
+
agent to locate `Modo: refactor-audit (catalogo de code smells + deep-modules)`
|
|
103
|
+
while the heading in `dw-brainstorm` reads `catálogo`, accented. The lookup never
|
|
104
|
+
matched; the EN pair matches exactly and always worked. Surfaced by the
|
|
105
|
+
accentuation pass below.
|
|
106
|
+
|
|
107
|
+
### Changed
|
|
108
|
+
|
|
109
|
+
- **24 PT-BR scaffold files were written with no diacritics at all** ("Voce e a
|
|
110
|
+
entrada", "secao", "nao") while the other half of the scaffold was correctly
|
|
111
|
+
accented, making it impossible to tell a new mistake from old debt. All 24 are
|
|
112
|
+
now accented. Diacritics only, verified mechanically: both sides normalized
|
|
113
|
+
(Unicode NFKD, combining marks dropped) and compared byte for byte, so any
|
|
114
|
+
content change would have failed the check. Literal strings the commands search
|
|
115
|
+
for, code blocks, flags, paths, and English technical terms were left untouched.
|
|
116
|
+
|
|
117
|
+
## [2.0.0] — 2026-08-02
|
|
118
|
+
|
|
119
|
+
First release after a full security audit of the compose recipes. Two options were
|
|
120
|
+
removed rather than shipped with vulnerabilities the project could not close.
|
|
121
|
+
|
|
122
|
+
Versions 1.8.0, 1.9.0 and 1.10.0 exist as commits but were never published to npm;
|
|
123
|
+
their contents are folded in here. The last published version was 1.7.1.
|
|
124
|
+
|
|
125
|
+
### Removed
|
|
126
|
+
|
|
127
|
+
- **`Postgres + pgvector` is no longer offered by `/dw-new-project`**, and
|
|
128
|
+
`services/postgres-pgvector.yml` is deleted. After repinning to the newest
|
|
129
|
+
available base the image still carried 18 CRITICAL, none of them actionable: 15
|
|
130
|
+
were Go `stdlib` inside a vendored binary (only a maintainer rebuild clears
|
|
131
|
+
those) and the rest have no upstream fix at all (`perl` 5.40, `libxml2`
|
|
132
|
+
`CVE-2026-6653`). Shipping a recipe whose CVEs the project cannot close was not
|
|
133
|
+
a defensible default for an optional capability. **Existing projects are
|
|
134
|
+
unaffected** — `/dw-dockerize` keeps whatever image the project already uses and
|
|
135
|
+
tells the user it needs its own review, rather than substituting one.
|
|
136
|
+
- **MailHog is no longer offered as a dev email-capture option**, and
|
|
137
|
+
`services/mailhog.yml` is deleted. It reported 109 CRITICAL / 1250 HIGH with
|
|
138
|
+
1359 of those carrying a published fix — the profile of an image not rebuilt
|
|
139
|
+
since its upstream went quiet in 2020. Mailpit, already the documented default,
|
|
140
|
+
scans 0 CRITICAL / 0 HIGH for the same job.
|
|
141
|
+
|
|
142
|
+
### Security
|
|
143
|
+
|
|
144
|
+
- **Every credential in every compose recipe now uses `${VAR:?message}`** instead
|
|
145
|
+
of `${VAR:-default}`, so Compose refuses to start rather than falling back to a
|
|
146
|
+
value published in this repository. Applied to `postgres`, `mysql`,
|
|
147
|
+
`elasticsearch`, `meilisearch`, `minio`, `rabbitmq`, and `typesense`.
|
|
148
|
+
- **Every authenticated service publishes on `127.0.0.1` only.** Docker's
|
|
149
|
+
`"HOST:CONTAINER"` short form binds every host interface, which turns a local
|
|
150
|
+
dev credential into a network-reachable one.
|
|
151
|
+
- **`typesense` was pinned to `0.27.1`, a tag that does not exist** — the recipe
|
|
152
|
+
could never have worked (`MANIFEST_UNKNOWN`). Repinned to `30.2`. It also passed
|
|
153
|
+
its API key as a `command:` flag with a working default, which the first version
|
|
154
|
+
of the credential test missed because it only read `environment:` keys.
|
|
155
|
+
- **`minio` moved off `minio/minio:latest`** to `RELEASE.2025-09-07T16-13-09Z`.
|
|
156
|
+
This does not reduce CVEs — MinIO stopped publishing to Docker Hub after that
|
|
157
|
+
release, so `latest` resolves to the same image — but it makes a scan result
|
|
158
|
+
describe what the next user runs rather than what was pulled that day.
|
|
159
|
+
- **No recipe uses an image digest or a floating tag.** A digest freezes the base
|
|
160
|
+
image and accrues CVEs with no upgrade path; the previously pinned pgvector
|
|
161
|
+
digest went from 1 to 22 CRITICAL in three weeks without the image changing at
|
|
162
|
+
all, because only the vulnerability database moved.
|
|
163
|
+
|
|
164
|
+
### Changed
|
|
165
|
+
|
|
166
|
+
- **CLI dispatch is standardized on spawning a CLI with an explicit model and
|
|
167
|
+
effort**, for both Claude and Codex. Codex has no subagent primitive, so spawn
|
|
168
|
+
was already the only option there; standardizing removes the asymmetry. Every
|
|
169
|
+
dispatch now declares **WRITE** or **READ-ONLY** — the hard worktree rule binds
|
|
170
|
+
to WRITE only, since a read-only dispatch cannot edit, which is the entire
|
|
171
|
+
reason the rule exists.
|
|
172
|
+
- **In-session subagents inherit the session model.** Every generated Claude
|
|
173
|
+
subagent previously carried `model: sonnet`, silently overriding an Opus or
|
|
174
|
+
Fable session for planning and review work with no way to see it from the
|
|
175
|
+
harness. Sizing now belongs to the dispatch, not to the agent definition.
|
|
176
|
+
- **Requirement IDs are language-neutral in the shared skills.** `dw-execute-phase`
|
|
177
|
+
is shared by English and Portuguese projects but hard-coded the Portuguese token
|
|
178
|
+
`RF-XX`, so its `plan-checker` searched `tasks.md` for a string English projects
|
|
179
|
+
never generate (`FR-1.1`). Requirement-coverage verification could not match.
|
|
180
|
+
- `tasks.md` gained a `Commit` column, giving `/dw-run` step 6 ("mark Done with
|
|
181
|
+
the commit SHA") somewhere to write. It previously had no destination.
|
|
182
|
+
- `/dw-generate-pr` records the PR URL back into the PRD. Nothing on the `.dw/`
|
|
183
|
+
side previously recorded which PR delivered the work.
|
|
184
|
+
|
|
185
|
+
### Added
|
|
186
|
+
|
|
187
|
+
- `.dw/config/routing.json` — maps a task's Conventional-Commit type to a tier,
|
|
188
|
+
and a tier to a concrete model and effort per brand. Seeded once and never
|
|
189
|
+
reconciled on update, because model availability differs per account.
|
|
190
|
+
- `references/dispatch-tuning.md` in `dw-cli-run`, which declared
|
|
191
|
+
`load_policy: lazy-references` but shipped none. The dual-evaluation protocol,
|
|
192
|
+
escalation ladder, and cold-start tuning moved there.
|
|
193
|
+
- Per-dispatch MCP kill switches: `--strict-mcp-config` (Claude),
|
|
194
|
+
`-c mcp_servers='{}'` (Codex). A spawned CLI boots every configured MCP server
|
|
195
|
+
and shares no prompt cache, which can outweigh a small task.
|
|
196
|
+
- `test/compose-recipe-safety.test.js` and `test/dispatch-routing.test.js`.
|
|
197
|
+
|
|
198
|
+
### Fixed
|
|
199
|
+
|
|
200
|
+
- `.claude-plugin/plugin.json` was stuck at `1.7.0` while `package.json` said
|
|
201
|
+
`1.7.1`, leaving `npm run validate` failing on `main`.
|
|
202
|
+
- Managed-file manifest deduplication and pgvector dev defaults — both committed
|
|
203
|
+
on 2026-07-15 but never merged or published until now.
|
|
204
|
+
|
|
205
|
+
### Notes
|
|
206
|
+
|
|
207
|
+
The regression guards added here deliberately cover **classes**, not files. The
|
|
208
|
+
July 2026 audit raised default credentials against one recipe; that fix was scoped
|
|
209
|
+
to the file in the diff, and the August audit found the same defect in six
|
|
210
|
+
siblings. `compose-recipe-safety.test.js` now fails on any credential default, any
|
|
211
|
+
non-loopback published port on an authenticated service, any digest pin, and any
|
|
212
|
+
floating tag — across every recipe.
|
|
213
|
+
|
|
214
|
+
A full image sweep covered all 16 referenced images, up from 2. Results and the
|
|
215
|
+
residual advisories live in `.dw/secure-audit/` (local, gitignored).
|
|
216
|
+
|
|
217
|
+
## [1.7.1] — 2026-07-24
|
|
218
|
+
|
|
219
|
+
### Fixed
|
|
220
|
+
- `/dw-open-design` command, wrappers, and scripts are synced into the project by
|
|
221
|
+
`install-deps`.
|
|
222
|
+
|
|
223
|
+
## [1.7.0] — 2026-07-15
|
|
224
|
+
|
|
225
|
+
### Added
|
|
226
|
+
- `/dw-open-design` command, with a refactor screenshot mode and a requirement
|
|
227
|
+
that briefs be refined before runs.
|
|
228
|
+
- Docs-first NestJS bootstrap in `/dw-new-project` (Next.js + NestJS, pnpm
|
|
229
|
+
workspaces + Turborepo, pg-boss, Mailpit, dev topology).
|
|
230
|
+
|
|
231
|
+
### Fixed
|
|
232
|
+
- Managed instruction blocks stay idempotent across updates.
|
|
233
|
+
|
|
234
|
+
## [1.6.0] — 2026-07-15
|
|
235
|
+
|
|
236
|
+
Release commit exists; the change set is not cleanly separable from 1.7.0 in the
|
|
237
|
+
history (a source restore commit sits between them). See `git log 28ccc36..af6b157`.
|
|
238
|
+
|
|
239
|
+
## [1.5.0] — 2026-07-02
|
|
240
|
+
|
|
241
|
+
### Added
|
|
242
|
+
- ECC-inspired upgrades: additional skills, runtime cost tracking, a curated rules
|
|
243
|
+
library, and the instincts memory layer.
|
|
244
|
+
|
|
245
|
+
## [1.4.0] — 2026-06-29
|
|
246
|
+
|
|
247
|
+
### Added
|
|
248
|
+
- Skills ecosystem comparison documentation and the README adoptions that followed.
|
|
249
|
+
|
|
250
|
+
## [1.3.0] — 2026-06-23
|
|
251
|
+
|
|
252
|
+
### Added
|
|
253
|
+
- À-la-carte plugin distribution plus a repo `validate` gate.
|
|
254
|
+
- `git-guardrails` and statusline enforcement hooks.
|
|
255
|
+
- Per-skill invocation control via `disable-model-invocation`.
|
|
256
|
+
- `dw-minimalism` (YAGNI decision ladder) and `dw-cli-run` (Claude/Codex/Copilot
|
|
257
|
+
runner protocol) skills.
|
|
258
|
+
|
|
259
|
+
## [1.2.1] — 2026-05-27
|
|
260
|
+
|
|
261
|
+
### Fixed
|
|
262
|
+
- Context-budget wrapper name collision.
|
|
263
|
+
|
|
264
|
+
## [1.2.0] — 2026-05-27
|
|
265
|
+
|
|
266
|
+
### Added
|
|
267
|
+
- Structured return contracts across skills.
|
|
268
|
+
- `/dw-opportunities` and `/dw-refactor` workflows.
|
|
269
|
+
|
|
270
|
+
## [1.1.0] – [1.1.4] — 2026-05-25
|
|
271
|
+
|
|
272
|
+
### Added
|
|
273
|
+
- WSL-resilient browser layer, Security Gate, and the `impeccable` absorption.
|
|
274
|
+
- Portable `/dw-goal` autopilot flow and the subagent handoff workflow.
|
|
275
|
+
- Post-update action guidance.
|
|
276
|
+
|
|
277
|
+
### Fixed
|
|
278
|
+
- Playwright browser selection prefers a real browser with CDP fallback; the
|
|
279
|
+
reverse CDP relay ships prebuilt and runs at user level.
|
|
280
|
+
|
|
281
|
+
## [1.0.0] – [1.0.6] — 2026-05-13
|
|
282
|
+
|
|
283
|
+
Surface consolidation release: 15 obsolete commands deleted and the remainder
|
|
284
|
+
merged into a 20-command surface (later 38 with the tiers added).
|
|
285
|
+
|
|
286
|
+
### Changed
|
|
287
|
+
- `create-prd` + `create-techspec` + `create-tasks` → `/dw-plan`
|
|
288
|
+
- `run-task` + `run-plan` → `/dw-run`
|
|
289
|
+
- `review-implementation` + `code-review` → `/dw-review`
|
|
290
|
+
- `run-qa` + `fix-qa` → `/dw-qa`
|
|
291
|
+
- `security-check` + `deps-audit` → `/dw-secure-audit`
|
|
292
|
+
- `map-codebase` folded into `/dw-intel --build`
|
|
293
|
+
|
|
294
|
+
### Added
|
|
295
|
+
- Removed-commands manifest with old-to-new mapping for migration.
|
|
296
|
+
- Tiered `/dw-help` output with an `--advanced` flag.
|
|
297
|
+
- Opt-in AWS and Azure skill installers with their respective MCP servers.
|
|
298
|
+
|
|
299
|
+
## [0.1.0] – [0.15.0] — 2026-04-06 to 2026-05-13
|
|
300
|
+
|
|
301
|
+
Pre-1.0 development. The CLI, the scaffold layout, the command set, and the
|
|
302
|
+
multi-platform wrapper generation took shape across 35 releases in five weeks.
|
|
303
|
+
See `git log 6cd61cb..d6953f4`.
|
|
304
|
+
|
|
305
|
+
[2.0.0]: https://github.com/brunosps/dev-workflow/releases/tag/v2.0.0
|
package/README.md
CHANGED
|
@@ -42,14 +42,15 @@ Exportable skills (no `.dw/` pipeline required): `dw-minimalism`, `dw-search-fir
|
|
|
42
42
|
|
|
43
43
|
## Commands
|
|
44
44
|
|
|
45
|
-
dev-workflow
|
|
45
|
+
dev-workflow v2.1.0 ships **39 commands** organized into four tiers. Most users only invoke Tier 1 + Tier 2.
|
|
46
46
|
|
|
47
|
-
### Tier 1 — Gateway (
|
|
47
|
+
### Tier 1 — Gateway (4)
|
|
48
48
|
|
|
49
49
|
| Command | When |
|
|
50
50
|
|---------|------|
|
|
51
51
|
| **`/dw-autopilot "wish"`** | Default entry point in two invocations. First run completes PRD → TechSpec → Tasks and stops. Second run resumes from state, executes `/dw-goal --from-autopilot <slug>` for Run → Review → QA/Fix → Review, then Security Gate → Commit → PR. |
|
|
52
52
|
| **`/dw-bugfix "description"`** | A bug report or pasted error. Triages bug-vs-feature-vs-scope, surgical fix or routes to a PRD. |
|
|
53
|
+
| **`/dw-triage [item]`** | An external bug report, feature request, or PR. Checks whether it already exists and whether it was rejected before, verifies the claim, then routes to `/dw-bugfix`, `/dw-plan prd`, or `/dw-brainstorm --mode=grill`. Local-first in `.dw/triage/`; works with no network and no `gh`. |
|
|
53
54
|
| **`/dw-help [keyword]`** | Discover commands. Pass a keyword for shortcuts; `--advanced` reveals internal commands. |
|
|
54
55
|
|
|
55
56
|
### Tier 2 — Pipeline granular (10)
|
|
@@ -62,26 +63,27 @@ Use these when you want step-by-step control instead of `/dw-autopilot`.
|
|
|
62
63
|
| **`/dw-brainstorm "idea"`** | Refine a concrete idea before PRD. Flags: `--onepager` (durable artifact), `--council` (multi-advisor debate), `--research` (multi-source cited research). |
|
|
63
64
|
| **`/dw-plan "feature"`** | PRD → TechSpec → Tasks sequentially with checkpoints. Stages: `prd`, `techspec`, `tasks`. Mandatory clarification questions, source-grounding, constitution gate, final consistency check. |
|
|
64
65
|
| **`/dw-run [task-id]`** | Execute tasks. Default: all pending in dependency order with wave-based parallel dispatch. Single-task: pass an ID. `--resume` continues an interrupted plan. |
|
|
65
|
-
| **`/dw-review`** | Level 2 (PRD coverage mapping) + Level 3 (code quality). Hard gates on dw-verify PASS, secure-audit, constitution violations. Flags: `--coverage-only`, `--code-only`, `--bugfix <slug>` (review a bugfix at `.dw/bugfixes/<slug>/`). |
|
|
66
|
+
| **`/dw-review`** | Level 2 (PRD coverage mapping) + Level 3 (code quality). Hard gates on dw-verify PASS, secure-audit, constitution violations. Flags: `--coverage-only`, `--code-only`, `--bugfix <slug>` (review a bugfix at `.dw/bugfixes/<slug>/`), `--since <ref>` (ad-hoc review from a verified comparison point). |
|
|
66
67
|
| **`/dw-qa`** | Mode-aware QA. Auto-detects UI vs API. Flags: `--fix` (iterative QA + fix-retest loop), `--api`, `--ai` (AI eval against reference dataset), `--uat` (human-in-the-loop walkthrough), `--bugfix <slug>` (QA a bugfix). |
|
|
67
68
|
| **`/dw-pause`** | Consolidate the current session's mental state into `.dw/STATE.md` (Decisions, Blockers, Todos, Deferred, Lessons, Open Loops). Used before long breaks or context-window compactions. |
|
|
68
69
|
| **`/dw-resume`** | Read `.dw/STATE.md`, present a TLDR of where work left off, and suggest the next `dw-*` command. Never auto-executes. |
|
|
69
70
|
| **`/dw-commit`** | Atomic Conventional Commits for pending changes. Applies `dw-git-discipline` (one intent per commit, lint+tests+build green before). |
|
|
70
71
|
| **`/dw-generate-pr [target]`** | Push the branch, draft a PR body with summary + test plan, open the browser. Hard gates: dw-verify PASS + secure-audit. |
|
|
71
72
|
|
|
72
|
-
### Tier 3 — Specialty (
|
|
73
|
+
### Tier 3 — Specialty (13)
|
|
73
74
|
|
|
74
75
|
| Command | What |
|
|
75
76
|
|---------|------|
|
|
76
77
|
| **`/dw-analyze-project`** | Scans the repo, writes `.dw/rules/` (per-module conventions, anti-patterns, naming). Step 8 offers `.dw/constitution.md`; Step 9 writes `.dw/rules/concerns.md`; Step 10 can synthesize a frontend `DESIGN.md` from existing tokens. Run once per project; refresh after major refactors. |
|
|
77
78
|
| **`/dw-redesign-ui "target"`** | Audits a frontend page, runs the `dw-ui-discipline` 4-question grounding, proposes 2-3 design directions, ships the redesign. WCAG 2.2 AA accessibility floor is non-negotiable; UI diffs can also run the deterministic impeccable slop detector. |
|
|
79
|
+
| **`/dw-open-design "brief"`** | Generates, iterates, or refactors headless Open Design HTML prototypes through the `od` CLI. Refines the brief before dispatch, runs with an explicit `--agent codex\|claude`, captures JSONL audit logs, and stops for a dual ≥9 visual gate. `--refactor` works from a live URL or from screenshots. |
|
|
78
80
|
| **`/dw-refactor "target"`** | Audits a target for refactor opportunities using Fowler smells, `dw-simplification`, deep-modules analysis, and behavior-preserving test gates. This is the explicit route for code-health and tech-debt work. |
|
|
79
81
|
| **`/dw-functional-doc`** | Maps screens + user flows into a functional doc, validated end-to-end with Playwright. Uses the WSL-resilient browser resolver and can capture guided functional video evidence. |
|
|
80
82
|
| **`/dw-context-budget`** | Audits context overhead from commands, skills, agents, instruction files, and MCPs. |
|
|
81
83
|
| **`/dw-harness-audit`** | Deterministic health scorecard for the dev-workflow install, agents, wrappers, MCPs, and gates. |
|
|
82
84
|
| **`/dw-skill-health`** | Audits installed skills and agents for bloat, duplication, and missing references. |
|
|
83
85
|
| **`/dw-learn`** | Synthesizes durable decisions (confidence-tagged), bugfixes, deviations, and git history into atomic confidence-weighted **instincts** you approve at `.dw/memory/instincts/`; can propose constitution principles. On-demand and human-in-the-loop — **no always-on observer**. |
|
|
84
|
-
| **`/dw-new-project`** | Bootstrap a new project from an empty or docs-first directory while preserving existing documentation and prototypes. Stack interview includes Next.js + NestJS, Postgres
|
|
86
|
+
| **`/dw-new-project`** | Bootstrap a new project from an empty or docs-first directory while preserving existing documentation and prototypes. Stack interview includes Next.js + NestJS, Postgres, pg-boss, Mailpit, dev topology, and wraps official `create-*` tools before composing dev infrastructure, `.env`, scripts, CI, and `.dw/rules/`. |
|
|
85
87
|
| **`/dw-dockerize`** | Reads existing project, detects stack + runtime deps, proposes Dockerfile + docker-compose for dev/prod with explicit trade-offs (Conservative/Balanced/Bold). |
|
|
86
88
|
| **`/dw-install-azure-skills`** | **Opt-in.** Clones curated Azure skills from [`MicrosoftDocs/Agent-Skills`](https://github.com/MicrosoftDocs/Agent-Skills) (CC-BY-4.0) into `.agents/skills/azure/` and registers the [Microsoft Learn MCP Server](https://learn.microsoft.com/en-us/training/support/mcp-get-started) (HTTP, no-auth). Interactive category selection (Compute / Data & Storage / AI & ML / Networking / Identity & Security / DevOps / Observability / Integration / Architecture / All). Re-run to refresh from upstream. Also available as CLI: `npx @brunosps00/dev-workflow install-azure-skills`. |
|
|
87
89
|
| **`/dw-install-aws-skills`** | **Opt-in.** Clones curated AWS skills from [`aws/agent-toolkit-for-aws`](https://github.com/aws/agent-toolkit-for-aws) (Apache 2.0) into `.agents/skills/aws/` and registers the unified [AWS MCP Server](https://docs.aws.amazon.com/aws-mcp/) (stdio via `uvx mcp-proxy-for-aws@latest`). **Requires `uv`, `aws cli ≥ 2.32.0`, and AWS credentials.** Interactive category selection (Core / Analytics / Database / EC2 / Migration / Networking / Operations / Security / Serverless / Storage / All). The agent gains `aws___call_aws` (executes 15,000+ AWS APIs) and `aws___run_script` (Python sandboxed) — review `.dw/references/aws-mcp-instructions.md` for the destructive-operations protocol. Also available as CLI: `npx @brunosps00/dev-workflow install-aws-skills [--region=<aws-region>]`. |
|
package/lib/agents.js
CHANGED
|
@@ -176,7 +176,12 @@ function renderClaudeAgent(agent, source) {
|
|
|
176
176
|
`name: ${agent.name}`,
|
|
177
177
|
`description: "${yamlString(agent.description)}"`,
|
|
178
178
|
`tools: ${tools.join(', ')}`,
|
|
179
|
-
`
|
|
179
|
+
// `inherit` is Claude Code's documented default: the subagent runs on the
|
|
180
|
+
// session's model. Sizing happens at dispatch (the CLI runners pass an
|
|
181
|
+
// explicit --model/--effort per .dw/config/routing.json), so pinning a tier
|
|
182
|
+
// here would silently override the owner's session choice. A scaffold source
|
|
183
|
+
// agent may still opt out by declaring its own `model:`.
|
|
184
|
+
`model: ${source.metadata.model || 'inherit'}`,
|
|
180
185
|
`permissionMode: ${agent.tool_policy === 'read-only' ? 'plan' : 'default'}`,
|
|
181
186
|
`maxTurns: ${agent.max_turns}`,
|
|
182
187
|
'---',
|
package/lib/build-plugin.js
CHANGED
|
@@ -22,6 +22,8 @@ const { readSkillRegistry } = require('./skill-registry');
|
|
|
22
22
|
|
|
23
23
|
const REPO_ROOT = path.join(__dirname, '..');
|
|
24
24
|
const PLUGIN_DIR = path.join(REPO_ROOT, '.claude-plugin');
|
|
25
|
+
const MARKETPLACE_DESCRIPTION =
|
|
26
|
+
'À-la-carte dev-workflow skills for focused agent work: minimalism, search-first research, verification, security review, and code quality.';
|
|
25
27
|
|
|
26
28
|
function buildManifests() {
|
|
27
29
|
const registry = readSkillRegistry();
|
|
@@ -46,6 +48,7 @@ function buildManifests() {
|
|
|
46
48
|
|
|
47
49
|
const marketplace = {
|
|
48
50
|
name: 'brunosps00-dev-workflow',
|
|
51
|
+
description: MARKETPLACE_DESCRIPTION,
|
|
49
52
|
owner: author,
|
|
50
53
|
plugins: [
|
|
51
54
|
{
|
|
@@ -72,7 +75,7 @@ function run() {
|
|
|
72
75
|
for (const name of exportable) console.log(` - ${name}`);
|
|
73
76
|
}
|
|
74
77
|
|
|
75
|
-
module.exports = { buildManifests, run };
|
|
78
|
+
module.exports = { buildManifests, run, MARKETPLACE_DESCRIPTION };
|
|
76
79
|
|
|
77
80
|
if (require.main === module) {
|
|
78
81
|
run();
|
package/lib/constants.js
CHANGED
|
@@ -30,13 +30,14 @@ const COMMANDS = {
|
|
|
30
30
|
{ name: 'dw-redesign-ui', description: 'Audits a frontend page, proposes design directions you choose from, then ships the redesign.' },
|
|
31
31
|
{ name: 'dw-refactor', description: 'Audits a target for refactor opportunities using the refactor-audit protocol, Fowler smells, deep-modules analysis, and behavior-preserving test gates.' },
|
|
32
32
|
{ name: 'dw-resume', description: 'Trigger when user says "resume work", "where did we stop?", or starts a session in a project with an existing .dw/STATE.md. Reads STATE.md, presents a TLDR, and suggests the next dw-* command.' },
|
|
33
|
-
{ name: 'dw-review', description: 'Trigger when user asks to review code, check quality, or verify PR readiness. Default runs L2 (PRD coverage) + L3 (code quality). Flags --coverage-only / --code-only / --bugfix <slug>.' },
|
|
33
|
+
{ name: 'dw-review', description: 'Trigger when user asks to review code, check quality, or verify PR readiness. Default runs L2 (PRD coverage) + L3 (code quality). Flags --coverage-only / --code-only / --bugfix <slug> / --since <ref>.' },
|
|
34
34
|
{ name: 'dw-run', description: 'Trigger when user wants to execute tasks. Default runs all pending in dependency order; \'run <task-id>\' runs one; \'run --resume\' continues an interrupted plan.' },
|
|
35
35
|
{ name: 'dw-secure-audit', description: 'Security Gate: OWASP + Semgrep SAST (diff) + gitleaks secrets + Trivy SCA/IaC + lockfile + supply-chain + outdated. Rigoroso: secrets/CRITICAL/HIGH block. Auto-invoked by /dw-review and /dw-generate-pr, explicit phase in /dw-autopilot, and runnable standalone.' },
|
|
36
36
|
{ name: 'dw-skill-health', description: 'Audits installed skills and agents for bloat, duplication, missing references, and stale or unused modules.' },
|
|
37
37
|
{ name: 'dw-subtask-start', userInvoked: true, description: 'Creates a minimal input packet for a subagent without injecting the parent transcript.' },
|
|
38
38
|
{ name: 'dw-subtask-complete', userInvoked: true, description: 'Records a structured subagent handoff with result, files, decisions, risks, verification, and blockers.' },
|
|
39
39
|
{ name: 'dw-subtask-resume', userInvoked: true, description: 'Consumes pending subagent handoffs, summarizes them for the parent, and archives the local packets.' },
|
|
40
|
+
{ name: 'dw-triage', description: 'Local-first intake for external bug reports, feature requests, and PRs. Persists .dw/triage/ state, checks redundancy and prior rejections, verifies claims, then routes to /dw-bugfix, /dw-plan prd, /dw-brainstorm --mode=grill, or no work.' },
|
|
40
41
|
{ name: 'dw-update', description: 'Updates dev-workflow to the latest npm release in-place, with a snapshot you can roll back to.' },
|
|
41
42
|
],
|
|
42
43
|
'pt-br': [
|
|
@@ -70,13 +71,14 @@ const COMMANDS = {
|
|
|
70
71
|
{ name: 'dw-redesign-ui', description: 'Audita uma pagina frontend, propoe direcoes de design que voce escolhe, e entrega o redesign.' },
|
|
71
72
|
{ name: 'dw-refactor', description: 'Audita um target por oportunidades de refactor usando o protocolo refactor-audit, smells Fowler, deep-modules e gates de teste preservando comportamento.' },
|
|
72
73
|
{ name: 'dw-resume', description: 'Trigger quando usuario diz "retoma", "onde paramos?" ou comeca sessao num projeto com .dw/STATE.md existente. Le STATE.md, apresenta TLDR e sugere proximo comando dw-*.' },
|
|
73
|
-
{ name: 'dw-review', description: 'Trigger quando
|
|
74
|
+
{ name: 'dw-review', description: 'Trigger quando usuário pede pra revisar código, checar qualidade ou validar prontidão pra PR. Default roda L2 (cobertura PRD) + L3 (qualidade). Flags --coverage-only / --code-only / --bugfix <slug> / --since <ref>.' },
|
|
74
75
|
{ name: 'dw-run', description: 'Trigger quando usuario quer executar tasks. Default roda todas pendentes em ordem de dependencia; \'run <task-id>\' roda uma; \'run --resume\' continua plan interrompido.' },
|
|
75
76
|
{ name: 'dw-secure-audit', description: 'Security Gate: OWASP + Semgrep SAST (diff) + gitleaks secrets + Trivy SCA/IaC + lockfile + supply-chain + outdated. Rigoroso: secrets/CRITICAL/HIGH bloqueiam. Auto-invocado por /dw-review e /dw-generate-pr, fase explicita no /dw-autopilot, e executavel standalone.' },
|
|
76
77
|
{ name: 'dw-skill-health', description: 'Audita skills e agentes instalados por bloat, duplicacao, referencias quebradas e modulos sem uso.' },
|
|
77
78
|
{ name: 'dw-subtask-start', userInvoked: true, description: 'Cria um input packet minimo para subagente sem injetar transcript bruto do parent.' },
|
|
78
79
|
{ name: 'dw-subtask-complete', userInvoked: true, description: 'Registra handoff estruturado do subagente com resultado, arquivos, decisoes, riscos, verificacao e bloqueios.' },
|
|
79
80
|
{ name: 'dw-subtask-resume', userInvoked: true, description: 'Consome handoffs pendentes de subagentes, resume para o parent e arquiva os pacotes locais.' },
|
|
81
|
+
{ name: 'dw-triage', description: 'Intake local-first para bug reports, feature requests e PRs externos. Persiste estado em .dw/triage/, checa redundância e rejeições anteriores, verifica alegações, e então roteia para /dw-bugfix, /dw-plan prd, /dw-brainstorm --mode=grill, ou nenhum trabalho.' },
|
|
80
82
|
{ name: 'dw-update', description: 'Atualiza o dev-workflow para o release mais recente no npm, com snapshot para rollback.' },
|
|
81
83
|
],
|
|
82
84
|
};
|
package/lib/init.js
CHANGED
|
@@ -194,6 +194,20 @@ async function run({ force = false, lang = null, mode = 'init', profile = null,
|
|
|
194
194
|
touchedFiles.push(stackMapDest);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
// 3.95. Seed .dw/config/routing.json (dispatch tier/model/effort per brand for
|
|
198
|
+
// the CLI runners). Seeded once and NEVER reconciled: model availability differs
|
|
199
|
+
// per account, so the owner's edits must survive updates.
|
|
200
|
+
const routingSrc = path.join(SCAFFOLD_DIR, 'config', 'routing.json');
|
|
201
|
+
if (require('fs').existsSync(routingSrc)) {
|
|
202
|
+
const cfgDir = path.join(projectRoot, '.dw', 'config');
|
|
203
|
+
ensureDir(cfgDir);
|
|
204
|
+
const routingDest = path.join(cfgDir, 'routing.json');
|
|
205
|
+
const rtStatus = writeFile(routingDest, require('fs').readFileSync(routingSrc, 'utf-8'), false);
|
|
206
|
+
if (rtStatus === 'created') totalCreated++;
|
|
207
|
+
else totalSkipped++;
|
|
208
|
+
touchedFiles.push(routingDest);
|
|
209
|
+
}
|
|
210
|
+
|
|
197
211
|
// 4. Create .dw/rules/ with README
|
|
198
212
|
if (!isUpdate) {
|
|
199
213
|
console.log(' Rules:');
|
package/lib/install-state.js
CHANGED
|
@@ -42,10 +42,14 @@ function writeInstallState(projectRoot, state) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
function listManagedFiles(projectRoot, relativeFiles) {
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
return [
|
|
46
|
+
...new Set(
|
|
47
|
+
relativeFiles
|
|
48
|
+
.filter(Boolean)
|
|
49
|
+
.map((filePath) => path.relative(projectRoot, filePath))
|
|
50
|
+
.sort()
|
|
51
|
+
),
|
|
52
|
+
];
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
module.exports = {
|
package/lib/validate.js
CHANGED
|
@@ -23,8 +23,10 @@ function run() {
|
|
|
23
23
|
|
|
24
24
|
// Plugin manifest drift check.
|
|
25
25
|
const { plugin, marketplace } = buildManifests();
|
|
26
|
+
checkMarketplaceDescription(marketplace, issues);
|
|
26
27
|
checkManifestDrift('.claude-plugin/plugin.json', plugin, issues);
|
|
27
28
|
checkManifestDrift('.claude-plugin/marketplace.json', marketplace, issues);
|
|
29
|
+
checkMarketplaceFileDescription('.claude-plugin/marketplace.json', issues);
|
|
28
30
|
|
|
29
31
|
console.log('dev-workflow validate\n');
|
|
30
32
|
if (warnings.length) {
|
|
@@ -55,6 +57,25 @@ function checkManifestDrift(relPath, expected, issues) {
|
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
|
|
60
|
+
function checkMarketplaceDescription(marketplace, issues) {
|
|
61
|
+
if (!marketplace || typeof marketplace.description !== 'string' || !marketplace.description.trim()) {
|
|
62
|
+
issues.push('Generated marketplace manifest must include a root-level description.');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function checkMarketplaceFileDescription(relPath, issues) {
|
|
67
|
+
const file = path.join(__dirname, '..', relPath);
|
|
68
|
+
if (!fs.existsSync(file)) return;
|
|
69
|
+
try {
|
|
70
|
+
const manifest = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
71
|
+
if (typeof manifest.description !== 'string' || !manifest.description.trim()) {
|
|
72
|
+
issues.push(`${relPath} must include a root-level description.`);
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
issues.push(`${relPath} is not valid JSON.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
58
79
|
module.exports = { run };
|
|
59
80
|
|
|
60
81
|
if (require.main === module) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brunosps00/dev-workflow",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "AI-driven development workflow commands for any project. Scaffolds a complete PRD-to-PR pipeline with multi-platform AI assistant support.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"dev-workflow": "./bin/dev-workflow.js"
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"scaffold/",
|
|
18
18
|
".claude-plugin/",
|
|
19
19
|
"README.md",
|
|
20
|
+
"CHANGELOG.md",
|
|
20
21
|
"LICENSE"
|
|
21
22
|
],
|
|
22
23
|
"keywords": [
|