agentic-sdlc-wizard 1.38.0 → 1.39.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/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to the SDLC Wizard.
|
|
|
4
4
|
|
|
5
5
|
> **Note:** This changelog is for humans to read. Don't manually apply these changes - just run the wizard ("Check for SDLC wizard updates") and it handles everything automatically.
|
|
6
6
|
|
|
7
|
+
## [1.39.0] - 2026-04-24
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Dead plugin registration cleanup in /update-wizard** (Step 7.7). When a wizard-installed plugin marketplace in `~/.claude/settings.json` points to a directory that no longer exists (rename, disable, or removal), every Claude Code session emits `UserPromptSubmit hook error: Failed to run: Plugin directory does not exist: ...` until cleaned up. New step detects entries in `extraKnownMarketplaces` matching `sdlc-wizard*` whose `source.path` is missing, plus the corresponding `enabledPlugins["sdlc-wizard@<marketplace>"]` flag, and offers cleanup with a backup. Scope-guarded to wizard installs only — never touches third-party plugin registrations. Lives in update-skill (not setup) because dead registrations only appear after install when something disables or removes the plugin directory; update is the natural drift-detection seam.
|
|
12
|
+
|
|
13
|
+
- **Community feature-discovery scanner** — ROADMAP #207. New `tests/e2e/scan-community.sh` script extracts `/[a-z][a-z0-9-]*` slash-command mentions from transcript text (Reddit, HN, Discord, CC GitHub Discussions exports) and emits any not in the `tests/e2e/known-slash-commands.txt` allowlist. Output is JSON with `scan_date`, `input_files`, and `candidates: [{slash, count, sample}]` for triage. Maintainer pulls transcripts manually (per ROADMAP #231 Phase 3 plan: "scan-community → port to tests/e2e/scan-community.sh; maintainer runs weekly on Max"); the scanner itself is offline + deterministic. Allowlist seeded with wizard skills (`/sdlc`, `/setup`, `/update`, `/feedback`, `/code-review`, `/less-permission-prompts`, `/claude-automation-recommender`, `/schedule`, `/ultrareview`), CC native commands as of 2.1.118 (`/help`, `/clear`, `/model`, `/effort`, `/usage`, `/cost`, `/stats`, `/compact`, `/resume`, `/init`, `/mcp`, `/plugin`, `/agents`, `/hooks`, `/permissions`, `/sandbox`, `/fast`, `/exit`, `/login`, `/logout`, `/doctor`, `/install`, `/uninstall`, `/settings`), plus common URL-path false positives (`/dev`, `/usr`, `/var`, `/tmp`, `/etc`, `/bin`, `/lib`, `/opt`, `/home`, `/root`, `/proc`, `/sys`, `/run`, `/mnt`, `/media`, `/srv`). Length-≥4 filter drops `/a`, `/ab` style noise. New `tests/test-community-scanner.sh` (11 tests) covers detection, allowlist filtering (CC native + wizard skills), dedup + count, empty-input edge case, JSON shape, stdin input, multi-file aggregation, and sample-context inclusion. Procedure documented in `CLAUDE_CODE_SDLC_WIZARD.md` → "Community Feature-Discovery Scanner". Complements aistupidlevel.info degradation signal and CC changelog diffs — three signals together cover official + community feature surface.
|
|
14
|
+
|
|
7
15
|
## [1.38.0] - 2026-04-24
|
|
8
16
|
|
|
9
17
|
### Added
|
|
@@ -981,6 +981,52 @@ Don't add `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` — Sonnet's 1M window has different
|
|
|
981
981
|
- Sonnet 4.6 will drop some fine-grained self-review moves (it's fast, less deliberate). The Opus reviewer catches them — but you'll see more "fix in round 2" cycles compared to Opus-coder runs.
|
|
982
982
|
- Mixed-mode disables auto-mode (same as flagship pin). The Sonnet pin is per-session — to switch back, remove the `model` line.
|
|
983
983
|
|
|
984
|
+
### Community Feature-Discovery Scanner (roadmap #207)
|
|
985
|
+
|
|
986
|
+
The weekly-update workflow watches Anthropic's official changelog + GitHub releases, but new CC slash-commands (e.g. a hypothetical `/insights`) often surface FIRST on Reddit, HN, or Discord weeks before they hit the changelog. `tests/e2e/scan-community.sh` ports the community-scan job out of CI (deleted per ROADMAP #231) into a maintainer-runnable script: pull transcripts manually, pipe through the scanner, triage the digest.
|
|
987
|
+
|
|
988
|
+
**What it does:** extracts every `/[a-z][a-z0-9-]*` mention (length ≥ 4) from input text, dedupes against `tests/e2e/known-slash-commands.txt`, and emits a JSON digest with each unknown slash-command's count and one sample line for context.
|
|
989
|
+
|
|
990
|
+
**Maintainer procedure:**
|
|
991
|
+
|
|
992
|
+
```bash
|
|
993
|
+
# 1. Capture transcripts. Save Reddit threads, HN comments, Discord exports,
|
|
994
|
+
# or CC GH Discussions to plain-text files. The scanner doesn't care about
|
|
995
|
+
# formatting — just the raw text.
|
|
996
|
+
mkdir -p /tmp/community-scan-$(date +%Y-%m-%d)
|
|
997
|
+
cd /tmp/community-scan-*
|
|
998
|
+
# (paste / curl content into reddit.txt, hn.txt, discord.txt, etc.)
|
|
999
|
+
|
|
1000
|
+
# 2. Run the scanner. Multiple files are aggregated into one digest.
|
|
1001
|
+
bash /path/to/sdlc-wizard/tests/e2e/scan-community.sh *.txt > digest.json
|
|
1002
|
+
|
|
1003
|
+
# 3. Triage. Anything in `candidates` is a slash-command the wizard's
|
|
1004
|
+
# allowlist doesn't recognize — could be a new CC native command, a
|
|
1005
|
+
# third-party plugin, or pure noise.
|
|
1006
|
+
jq '.candidates' digest.json
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
**Output shape:**
|
|
1010
|
+
|
|
1011
|
+
```json
|
|
1012
|
+
{
|
|
1013
|
+
"scan_date": "2026-04-24",
|
|
1014
|
+
"input_files": ["reddit.txt", "hn.txt"],
|
|
1015
|
+
"candidates": [
|
|
1016
|
+
{ "slash": "/insights", "count": 3, "sample": "Did you all see /insights in CC 2.2..." },
|
|
1017
|
+
{ "slash": "/newthing", "count": 1, "sample": "I tried /newthing on a long session..." }
|
|
1018
|
+
]
|
|
1019
|
+
}
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
**Updating the allowlist:** when triage confirms a candidate is real and the wizard now accounts for it (either as a wizard skill or by documenting CC's native command), append it to `tests/e2e/known-slash-commands.txt` so the next scan stops surfacing it. The file is the single source of truth — no rebuild, no migration.
|
|
1023
|
+
|
|
1024
|
+
**Why offline + deterministic:** the previous CI-based scan-community job burned $2-5/run via claude-code-action calls and produced one merged community-pattern PR in 30 days (ROADMAP #231 Phase 1 audit). Replacing it with a local regex scan + maintainer triage gives the same signal at zero API cost; the original `.github/prompts/analyze-community.md` prompt still exists for the LLM-summarization layer if a maintainer wants narrative analysis on top.
|
|
1025
|
+
|
|
1026
|
+
**Regression test:** `tests/test-community-scanner.sh` covers detection of new commands, allowlist filtering (CC native + wizard skills), dedup + count behavior, empty-input edge case, JSON shape, stdin input, multi-file aggregation, and sample-context inclusion (11 tests). The fixtures under `tests/fixtures/community-scanner/` are seeded with `/newthing`, `/alpha`, `/beta`, `/gamma` mock mentions; if the scanner regresses the test fails on the missed slash.
|
|
1027
|
+
|
|
1028
|
+
---
|
|
1029
|
+
|
|
984
1030
|
### Verifying Prompt-Hook-Fires-Once (roadmap #224)
|
|
985
1031
|
|
|
986
1032
|
CC 2.1.118 shipped a fix for `prompt` hooks double-firing when an agent-hook verifier subagent itself made tool calls. The bug would manifest as duplicate `SDLC BASELINE` injections per `UserPromptSubmit` — context bloat plus possible confusion. The dual-channel (project + plugin) double-print is already handled by `dedupe_plugin_or_project` in v1.37.1; this section is the runtime check for the *CC-internal* double-fire case.
|
|
@@ -2786,7 +2832,7 @@ If deployment fails or post-deploy verification catches issues:
|
|
|
2786
2832
|
|
|
2787
2833
|
**SDLC.md:**
|
|
2788
2834
|
```markdown
|
|
2789
|
-
<!-- SDLC Wizard Version: 1.
|
|
2835
|
+
<!-- SDLC Wizard Version: 1.39.0 -->
|
|
2790
2836
|
<!-- Setup Date: [DATE] -->
|
|
2791
2837
|
<!-- Completed Steps: step-0.1, step-0.2, step-0.4, step-1, step-2, step-3, step-4, step-5, step-6, step-7, step-8, step-9 -->
|
|
2792
2838
|
<!-- Git Workflow: [PRs or Solo] -->
|
|
@@ -3848,7 +3894,7 @@ Walk through updates? (y/n)
|
|
|
3848
3894
|
Store wizard state in `SDLC.md` as metadata comments (invisible to readers, parseable by Claude):
|
|
3849
3895
|
|
|
3850
3896
|
```markdown
|
|
3851
|
-
<!-- SDLC Wizard Version: 1.
|
|
3897
|
+
<!-- SDLC Wizard Version: 1.39.0 -->
|
|
3852
3898
|
<!-- Setup Date: 2026-01-24 -->
|
|
3853
3899
|
<!-- Completed Steps: step-0.1, step-0.2, step-1, step-2, step-3, step-4, step-5, step-6, step-7, step-8, step-9 -->
|
|
3854
3900
|
<!-- Git Workflow: PRs -->
|
package/package.json
CHANGED
package/skills/update/SKILL.md
CHANGED
|
@@ -46,10 +46,11 @@ Parse all CHANGELOG entries between the user's installed version and the latest.
|
|
|
46
46
|
|
|
47
47
|
```
|
|
48
48
|
Installed: 1.24.0
|
|
49
|
-
Latest: 1.
|
|
49
|
+
Latest: 1.39.0
|
|
50
50
|
|
|
51
51
|
What changed:
|
|
52
|
-
- [1.
|
|
52
|
+
- [1.39.0] Community feature-discovery scanner — ROADMAP #207. `tests/e2e/scan-community.sh` extracts unknown `/slash-command` mentions from transcript text (Reddit / HN / Discord exports), dedupes against `tests/e2e/known-slash-commands.txt` allowlist, emits JSON digest of candidates with count + sample. Replaces the deleted CI scan-community job (per #231 Phase 3) with a maintainer-runnable offline scan. 11 quality tests.
|
|
53
|
+
- [1.38.0] Mixed-mode tier (Sonnet 4.6 coder + Opus 4.7 reviewer) for simple repos — ROADMAP #233. New `cli/lib/repo-complexity.js` heuristic + `npx agentic-sdlc-wizard complexity .` CLI command. Setup Step 9.5 expanded from binary y/N to 3-way (no-pin / mixed / flagship). Cross-model review always stays at flagship regardless of coder pin. Reconciles with #198: mixed-mode is opt-in per-project; no-pin remains the default. Plus ROADMAP #224 prompt-hook-fires-once instrumentation (opt-in `SDLC_HOOK_FIRE_LOG`).
|
|
53
54
|
- [1.37.1] Token-bloat fix: dedupe 2× SDLC BASELINE print when both project + plugin register the same hook (~300 tokens doubled per prompt). 5 hooks gain `dedupe_plugin_or_project()` helper. Codex 2-round 100/100.
|
|
54
55
|
- [1.37.0] `monthly-research.yml` workflow deleted (ROADMAP #231 Phase 1) — 0 merged artifacts in 30d while burning $11-23/month; research happens inline now. `model-effort-check.sh` loud WARNING below xhigh (#217) — max preferred, xhigh floor; duplicate effort nudge in `instructions-loaded-check.sh` removed; single source of truth. Both changes Codex-certified.
|
|
55
56
|
- [1.36.1] Repo renamed `agentic-ai-sdlc-wizard` → `claude-sdlc-wizard` (matches sibling pattern; npm package unchanged); `npm pkg fix` metadata cleanup; slug migration across docs/tests/configs
|
|
@@ -166,6 +167,54 @@ If the user's `.claude/settings.json` has a top-level `allowedTools` array, offe
|
|
|
166
167
|
|
|
167
168
|
When migrating: preserve every entry byte-for-byte; only the container key changes. Do not reorder, dedup, or expand wildcards. Other top-level keys (hooks, env, model, custom user fields) are never touched.
|
|
168
169
|
|
|
170
|
+
### Step 7.7: Dead Plugin Registration Cleanup (Global Settings)
|
|
171
|
+
|
|
172
|
+
Wizard installs sometimes leave dead plugin registrations in the user's **global** `~/.claude/settings.json` after the underlying plugin directory is renamed, disabled, or removed. Symptom: every Claude Code session emits `UserPromptSubmit hook error: Failed to run: Plugin directory does not exist: <path> ... run /plugin to reinstall`. The error is harmless but bleeds into every prompt across every project until cleaned up.
|
|
173
|
+
|
|
174
|
+
This step is **global-settings-only** (`~/.claude/settings.json`, not the project's `.claude/settings.json`). The update skill normally avoids global settings; this is the one exception, and only when the plugin marketplace name matches an exact wizard-owned identifier.
|
|
175
|
+
|
|
176
|
+
**Wizard-owned marketplace allowlist** (exact match, no wildcard — wildcards risk eating third-party plugins like `sdlc-wizard-tools` if such a thing ever ships):
|
|
177
|
+
|
|
178
|
+
- `sdlc-wizard-local`
|
|
179
|
+
- `sdlc-wizard-wrap`
|
|
180
|
+
|
|
181
|
+
If `cli/init.js` later registers additional wizard marketplace names, append them to this list verbatim.
|
|
182
|
+
|
|
183
|
+
**Detection:**
|
|
184
|
+
|
|
185
|
+
1. Read `~/.claude/settings.json` and parse as JSON.
|
|
186
|
+
2. For each `extraKnownMarketplaces[key]` where `key` is in the allowlist above:
|
|
187
|
+
- Verify `entry.source.source === "directory"` AND `typeof entry.source.path === "string"`. If either guard fails, skip — not the shape the wizard installs (matches the type-check at `cli/init.js`).
|
|
188
|
+
- Resolve the `source.path` (expand `~` if literal). If the resolved path **does not exist** on disk, mark the marketplace **dead**.
|
|
189
|
+
3. For every dead marketplace `<name>`, look for `enabledPlugins["sdlc-wizard@<name>"]` — also flag for removal.
|
|
190
|
+
4. Repeat for **all** allowlist entries; collect the full set of dead `(marketplace, enabledPlugins)` pairs before prompting. Multiple dead registrations are common (e.g. both `sdlc-wizard-local` and `sdlc-wizard-wrap` if the user reinstalled twice).
|
|
191
|
+
|
|
192
|
+
**Cleanup (always ask first, all-or-nothing per user response):**
|
|
193
|
+
|
|
194
|
+
> Your `~/.claude/settings.json` references wizard plugin marketplaces that don't exist on disk:
|
|
195
|
+
>
|
|
196
|
+
> - `extraKnownMarketplaces.sdlc-wizard-local.source.path` → `<resolved-path>` (missing)
|
|
197
|
+
> - `enabledPlugins["sdlc-wizard@sdlc-wizard-local"]` is `true`
|
|
198
|
+
> - (list all dead pairs from detection)
|
|
199
|
+
>
|
|
200
|
+
> This causes `Plugin directory does not exist` errors on every prompt in every Claude Code session until cleaned up.
|
|
201
|
+
>
|
|
202
|
+
> Drop the listed entries from `~/.claude/settings.json`? `[y/N]`
|
|
203
|
+
|
|
204
|
+
If the user says yes:
|
|
205
|
+
1. **Back up with timestamp**: `cp ~/.claude/settings.json ~/.claude/settings.json.bak.$(date +%Y%m%dT%H%M%S)` so two cleanups on the same day don't overwrite each other's backups.
|
|
206
|
+
2. **Build a single `jq` filter** that drops every dead marketplace and every dead `enabledPlugins` key in one pass: `jq 'del(.enabledPlugins["sdlc-wizard@sdlc-wizard-local"]) | del(.extraKnownMarketplaces["sdlc-wizard-local"]) | del(.enabledPlugins["sdlc-wizard@sdlc-wizard-wrap"]) | del(.extraKnownMarketplaces["sdlc-wizard-wrap"])'` (include only the keys actually marked dead in detection).
|
|
207
|
+
3. Write to a temp file, validate with `jq empty` (round-trip parse), only then replace `~/.claude/settings.json` with `mv`. If validation fails, restore from the backup.
|
|
208
|
+
4. **Formatting note**: `jq` rewrites the whole file and normalizes formatting. The wizard does NOT preserve comments, trailing commas, or other JSONC features — Claude Code's `settings.json` is strict JSON, so this is safe today, but say so to the user. If they care about preserving the exact diff, give them the manual `del()` filter and let them decide whether to apply it.
|
|
209
|
+
|
|
210
|
+
If the user says no: skip silently. Some users have a recovery plan (re-enable the renamed dir, reinstall, etc.).
|
|
211
|
+
|
|
212
|
+
**Idempotency:** Re-running Step 7.7 after a successful cleanup must be a no-op. Detection only flags marketplaces whose `source.path` is missing AND whose name is in the allowlist; both must be true, so a clean settings.json reports zero dead pairs.
|
|
213
|
+
|
|
214
|
+
**Scope guard:** only touch entries whose marketplace name matches the exact allowlist. Third-party plugin registrations (`legal@knowledge-work-plugins`, `claude-md-management@claude-plugins-official`, etc.) and unrelated `sdlc`-prefixed marketplaces (e.g. `danielscholl/claude-sdlc`) are never the wizard's business. Path-existence alone never qualifies a marketplace for cleanup — only allowlist + missing-path together do.
|
|
215
|
+
|
|
216
|
+
**Why this lives in the update skill, not setup:** setup runs once at install time, when the plugin paths are valid by definition. Dead registrations only appear later, when something disables/renames/deletes the plugin directory. Update is the natural seam to detect drift and offer cleanup.
|
|
217
|
+
|
|
169
218
|
### Step 8: Apply Selected Changes
|
|
170
219
|
|
|
171
220
|
For each file the user approved:
|