qualia-framework 5.9.1 → 6.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/AGENTS.md +2 -1
- package/CLAUDE.md +2 -1
- package/README.md +14 -7
- package/agents/builder.md +1 -5
- package/agents/plan-checker.md +1 -1
- package/agents/planner.md +2 -6
- package/agents/qa-browser.md +3 -3
- package/agents/roadmapper.md +1 -1
- package/agents/verifier.md +7 -9
- package/agents/visual-evaluator.md +1 -3
- package/bin/cli.js +32 -6
- package/bin/slop-detect.mjs +81 -9
- package/docs/archive/CHANGELOG-pre-v4.md +855 -0
- package/docs/onboarding.html +2 -2
- package/guide.md +15 -2
- package/hooks/auto-update.js +6 -3
- package/hooks/env-empty-guard.js +5 -4
- package/hooks/pre-compact.js +5 -3
- package/hooks/pre-push.js +57 -0
- package/package.json +2 -2
- package/qualia-design/design-reference.md +2 -1
- package/qualia-design/frontend.md +4 -4
- package/rules/one-opinion.md +59 -0
- package/rules/trust-boundary.md +35 -0
- package/skills/qualia-feature/SKILL.md +5 -5
- package/skills/qualia-flush/SKILL.md +5 -7
- package/skills/qualia-hook-gen/SKILL.md +1 -1
- package/skills/qualia-learn/SKILL.md +1 -0
- package/skills/qualia-map/SKILL.md +1 -0
- package/skills/qualia-milestone/SKILL.md +1 -1
- package/skills/qualia-new/SKILL.md +6 -6
- package/skills/qualia-plan/SKILL.md +1 -1
- package/skills/qualia-polish/REFERENCE.md +8 -6
- package/skills/qualia-polish/SKILL.md +9 -7
- package/skills/qualia-polish/scripts/loop.mjs +18 -6
- package/skills/qualia-postmortem/SKILL.md +1 -1
- package/skills/qualia-report/SKILL.md +2 -1
- package/skills/qualia-road/SKILL.md +16 -4
- package/skills/qualia-verify/SKILL.md +2 -2
- package/skills/qualia-vibe/SKILL.md +226 -0
- package/skills/qualia-vibe/scripts/extract.mjs +141 -0
- package/skills/qualia-vibe/scripts/tokens.mjs +342 -0
- package/templates/help.html +9 -2
- package/tests/bin.test.sh +12 -12
- package/tests/refs.test.sh +1 -1
- package/tests/run-all.sh +48 -0
- package/tests/slop-detect.test.sh +11 -5
|
@@ -0,0 +1,855 @@
|
|
|
1
|
+
# CHANGELOG (pre-v4)
|
|
2
|
+
|
|
3
|
+
Archive of v2.x and v3.x releases. Active changelog lives in [../../CHANGELOG.md](../../CHANGELOG.md) (v4.0.0 onward).
|
|
4
|
+
|
|
5
|
+
## [3.7.0] — 2026-04-18
|
|
6
|
+
|
|
7
|
+
Story-file plan format. Every phase plan task now carries inline rationale,
|
|
8
|
+
acceptance criteria, explicit dependencies, and self-validation commands —
|
|
9
|
+
so builders read plans as briefs and verifiers check against observable
|
|
10
|
+
user behaviors, not just grep counts.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Story-file plan format** — `templates/plan.md` rewritten. Each task
|
|
15
|
+
block now mandates: `Wave`, `Files`, `Depends on` (explicit task refs
|
|
16
|
+
or `none`, not blank), `Why` (one-sentence motivation), `Acceptance
|
|
17
|
+
Criteria` (2-4 observable user behaviors), `Action`, `Validation` (1-3
|
|
18
|
+
grep/curl/tsc self-check commands), `Context`. Optional `Persona`
|
|
19
|
+
(security | architect | ux | frontend | backend | performance).
|
|
20
|
+
- **Plan-summary dashboard** — new `node bin/qualia-ui.js plan-summary
|
|
21
|
+
<path>` command renders the plan as a terminal dashboard: phase goal,
|
|
22
|
+
waves, colored persona chips, dependency arrows, AC count, validation
|
|
23
|
+
count per task. `/qualia-plan` calls it automatically after the plan
|
|
24
|
+
is finalized.
|
|
25
|
+
- **Verifier reads per-task Acceptance Criteria** — verifier now does a
|
|
26
|
+
3-layer check: phase-level Success Criteria + per-task AC + formal
|
|
27
|
+
Verification Contracts. Catches "files exist but user flow doesn't
|
|
28
|
+
work" cases that grep-only verification would miss.
|
|
29
|
+
- **Builder reads rationale** — builder agent now reads `Why`, respects
|
|
30
|
+
`Depends on` (refuses to start before deps commit), runs `Validation`
|
|
31
|
+
commands before `git commit`.
|
|
32
|
+
- **`ac_count` in validate-plan output** — `state.js validate-plan` now
|
|
33
|
+
reports AC anchor count alongside `done_when_count` and `contract_count`.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- **`plan-checker` Rule 2** — expanded from 3 mandatory fields to the 7
|
|
38
|
+
story-file fields. Task without a `Why` or with vague AC now fails
|
|
39
|
+
validation.
|
|
40
|
+
- **`plan-checker` Rule 3** — wave assignments now cross-check against
|
|
41
|
+
`Depends on` lines (Wave 2+ with `Depends on: none` is a contradiction).
|
|
42
|
+
- **`state.js` plan preconditions** — accepts either `**Done when:**`
|
|
43
|
+
(legacy) or `**Acceptance Criteria:**` (new) as the per-task anchor,
|
|
44
|
+
so in-flight projects with older plans don't break on upgrade.
|
|
45
|
+
|
|
46
|
+
### Backward compatibility
|
|
47
|
+
|
|
48
|
+
Fully additive. Plans written before v3.7.0 (with `**Done when:**` only)
|
|
49
|
+
continue to pass state.js precondition checks. New plans generated by
|
|
50
|
+
the v3.7.0 planner use the story-file format with `**Acceptance
|
|
51
|
+
Criteria:**`. No migration required.
|
|
52
|
+
|
|
53
|
+
## [3.6.0] — 2026-04-17
|
|
54
|
+
|
|
55
|
+
P2 cleanup release. Schema reconciliation with the ERP, log retention,
|
|
56
|
+
and remaining state-machine polish from the audit. Third release of the
|
|
57
|
+
night, after v3.4.2 (P0 hotfix) and v3.5.0 (P1 hardening).
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
|
|
61
|
+
- **`tracking.json` schema additions** — new fields:
|
|
62
|
+
- `team_id`, `project_id` — stable identifiers for ERP dedupe
|
|
63
|
+
(composite `(team_id, project_id)` is the canonical project key,
|
|
64
|
+
surviving directory renames)
|
|
65
|
+
- `git_remote` — lets the ERP correlate tracking with the source repo
|
|
66
|
+
- `session_started_at`, `last_pushed_at` — distinct timestamps
|
|
67
|
+
- `build_count`, `deploy_count` — lifetime counters
|
|
68
|
+
- `submitted_by` — mirrored at the top level (was only in /qualia-report
|
|
69
|
+
payloads)
|
|
70
|
+
- `lifetime.last_closed_milestone` — sentinel for close-milestone
|
|
71
|
+
idempotency (introduced in v3.4.2)
|
|
72
|
+
- **Log retention.** Trace files in `~/.claude/.qualia-traces/` older than
|
|
73
|
+
30 days are pruned on ~1% of writes. Heavy users no longer accumulate
|
|
74
|
+
unbounded MB/day.
|
|
75
|
+
- 2 new tests covering schema additions and defensive lifetime hydrate.
|
|
76
|
+
Suite is now 150 tests, all green.
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
|
|
80
|
+
- **`polished` transition no longer mis-marks the roadmap.** Was setting
|
|
81
|
+
the LAST roadmap row to status `verified` regardless of which phase the
|
|
82
|
+
user polished. Now marks every passed phase as `polished`.
|
|
83
|
+
- **`cmdInit` defensively hydrates partial lifetime objects.** If
|
|
84
|
+
`prevLife.lifetime` was missing keys (older tracking.json format), the
|
|
85
|
+
spread left `undefined`s that subsequent `+=` produced `NaN`. Defaults
|
|
86
|
+
layer underneath the spread so missing keys are 0, not NaN.
|
|
87
|
+
|
|
88
|
+
### Changed
|
|
89
|
+
|
|
90
|
+
- **`docs/erp-contract.md`** documents `gap_cycles` polymorphism (object
|
|
91
|
+
in tracking.json, number in `/api/v1/reports` payload — receivers must
|
|
92
|
+
accept both shapes) and adds the new v3.6+ fields to the request body
|
|
93
|
+
example and required-fields table.
|
|
94
|
+
|
|
95
|
+
## [3.5.0] — 2026-04-17
|
|
96
|
+
|
|
97
|
+
P1 hardening release. 9 hooks/scripts overhauled, false positives killed,
|
|
98
|
+
false negatives caught, cross-platform robustness throughout. Companion to
|
|
99
|
+
the v3.4.2 P0 hotfix shipped earlier today.
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
|
|
103
|
+
- **`branch-guard.js` refspec bypass.** Hook checked the *current* branch,
|
|
104
|
+
so EMPLOYEE could push `feature/x:main` from a feature branch and land on
|
|
105
|
+
main. Hook now parses `tool_input.command` from the Claude Code stdin
|
|
106
|
+
payload and rejects any refspec whose destination is `main` or `master`.
|
|
107
|
+
Block messages also routed to stderr (Claude Code surfaces stderr in
|
|
108
|
+
block reasons) and `shell: process.platform === "win32"` added to git
|
|
109
|
+
spawn for Windows reliability.
|
|
110
|
+
- **`migration-guard.js` false positives.** SQL comments (`-- …` lines and
|
|
111
|
+
`/* … */` blocks) are now stripped before pattern matching, so
|
|
112
|
+
commented-out `DROP TABLE` calls no longer block. File-path regex
|
|
113
|
+
tightened from `migration|migrate|\.sql$` to
|
|
114
|
+
`(^|/)migrations?/` OR `\.sql$` — `MigrationModal.tsx` and `migrations.md`
|
|
115
|
+
no longer trigger scans. `CREATE TEMP TABLE` and partition tables exempt
|
|
116
|
+
from the RLS requirement.
|
|
117
|
+
- **`migration-guard.js` false negatives.** New blockers: `ALTER TABLE …
|
|
118
|
+
DROP COLUMN`, `DROP DATABASE`, `DROP SCHEMA … CASCADE`, `UPDATE …` without
|
|
119
|
+
WHERE, `GRANT … TO PUBLIC`. Edit-tool calls now scan `old_string +
|
|
120
|
+
new_string + content` (was only new_string).
|
|
121
|
+
- **`pre-deploy-gate.js` `service_role` scanner.** Tightened from literal
|
|
122
|
+
substring match to `\bservice_role` regex with per-line exemptions for
|
|
123
|
+
comments (`//`, `/*`, `*`), `process.env.SUPABASE_SERVICE_ROLE` reads,
|
|
124
|
+
and explicit `eslint-disable` allowlists. Walk now excludes `dist/`,
|
|
125
|
+
`out/`, `build/`, `coverage/`, `.next/`, `.vercel/`, `.turbo/` so
|
|
126
|
+
post-build artifacts don't slow the gate or false-positive on minified
|
|
127
|
+
output. Block messages routed to stderr.
|
|
128
|
+
- **`auto-update.js` 24-hour blackout fixed.** Cache timestamp was written
|
|
129
|
+
*before* the npm version fetch — failed fetches suppressed re-checks for
|
|
130
|
+
24h. Now written only after successful fetch.
|
|
131
|
+
- **`auto-update.js` no longer corrupts running sessions.** OWNER branch
|
|
132
|
+
used to spawn `npx qualia-framework@latest install` in the background,
|
|
133
|
+
which rewrote `~/.claude/settings.json` mid-session. Both OWNER and
|
|
134
|
+
EMPLOYEE now write the same notification file; user must explicitly run
|
|
135
|
+
`npx qualia-framework update` to actually upgrade.
|
|
136
|
+
- **`pre-compact.js` silent commit failures.** Auto-commit ran with
|
|
137
|
+
`stdio: "ignore"` and could fail invisibly when user had pre-commit
|
|
138
|
+
hooks or commit signing → STATE.md not persisted before context
|
|
139
|
+
compaction → context loss. Commit now uses `--no-verify --no-gpg-sign
|
|
140
|
+
--author="Qualia Framework <bot@qualia.solutions>"` so it can't be
|
|
141
|
+
blocked by user hooks. Commit status traced for visibility.
|
|
142
|
+
- **`statusline.js` 3-spawns-per-prompt.** Collapsed three separate `git`
|
|
143
|
+
invocations into a single `git status -b --porcelain=v1` call. Saves
|
|
144
|
+
~300ms per cold prompt on Windows. Cache write is now atomic
|
|
145
|
+
(`tmp + rename`) so concurrent prompts can't produce corrupt cache.
|
|
146
|
+
- **`state.js` CRLF tolerance.** Every `^Field:\s*(.+)$/m` regex is now
|
|
147
|
+
`(.+?)\r?$/m` so Windows editors saving STATE.md with CRLF don't leak
|
|
148
|
+
`\r` into captured `phase_name`, `status`, `assigned_to`.
|
|
149
|
+
- **`cli.js cmdMigrate` no longer adds duplicate hooks.** Old check used
|
|
150
|
+
substring match against the absolute path; if home directory ever
|
|
151
|
+
changed, the OLD path didn't match the NEW path and `migrate` appended a
|
|
152
|
+
second entry. Now compares basenames, so `migrate` is idempotent
|
|
153
|
+
regardless of path changes.
|
|
154
|
+
|
|
155
|
+
### Cleaned
|
|
156
|
+
|
|
157
|
+
- **Skill agent path refs corrected.** `qualia-verify`, `qualia-build`
|
|
158
|
+
used `@agents/<name>.md` (relative to project cwd, broken from
|
|
159
|
+
`.planning/`). All skills now use `@~/.claude/agents/<name>.md`
|
|
160
|
+
consistently.
|
|
161
|
+
- **`qualia-quick` description gained trigger phrases** so the smart
|
|
162
|
+
router actually fires it on natural-language requests.
|
|
163
|
+
- **`qualia-map` skill uses `Agent(...)`** instead of legacy `Task(...)`,
|
|
164
|
+
matching framework convention everywhere else.
|
|
165
|
+
- **`qualia-idk` skill removed.** Fully redundant — `qualia` (the router)
|
|
166
|
+
already lists "idk" as a trigger phrase.
|
|
167
|
+
- **`templates/help.html` regenerated.** Now lists all 26 skills (was 17).
|
|
168
|
+
Grouped: Road, Phase Depth, Quality, Quick Paths, Knowledge, Session,
|
|
169
|
+
Navigation, Meta. Version pill bumped to v3.5.0.
|
|
170
|
+
|
|
171
|
+
### Added
|
|
172
|
+
|
|
173
|
+
- **GitHub Actions CI workflow.** `.github/workflows/test.yml` runs
|
|
174
|
+
`npm test` on Ubuntu + macOS + Windows × Node 18/20/22. Triggered on
|
|
175
|
+
every push and PR. 5-minute timeout per job. Tests are no longer
|
|
176
|
+
"local-only" — every commit is verified across the supported matrix.
|
|
177
|
+
- 11 new tests covering refspec bypass (3), comment-stripped SQL,
|
|
178
|
+
ALTER TABLE DROP COLUMN, DROP DATABASE, UPDATE-without-WHERE, GRANT TO
|
|
179
|
+
PUBLIC, TEMP-table RLS exemption, MigrationModal.tsx bypass, CRLF
|
|
180
|
+
STATE.md parsing. Suite is now 148 tests, all green.
|
|
181
|
+
|
|
182
|
+
## [3.4.2] — 2026-04-17
|
|
183
|
+
|
|
184
|
+
P0 hotfix release. Closes 7 critical bugs surfaced by a deep audit.
|
|
185
|
+
|
|
186
|
+
### Fixed
|
|
187
|
+
|
|
188
|
+
- **`pre-push.js` stamp now actually reaches the remote.** Previously the hook
|
|
189
|
+
wrote `last_commit` + `last_updated` to `tracking.json` and `git add`-ed it,
|
|
190
|
+
but the push itself ran on a snapshot prepared before the hook — so the
|
|
191
|
+
stamp never made it onto the wire. The ERP, which reads `tracking.json`
|
|
192
|
+
straight from git, saw stale data forever. Hook now creates a real bot
|
|
193
|
+
commit (`--no-verify --no-gpg-sign --author="Qualia Framework <bot@…>"`)
|
|
194
|
+
so the stamp ships with the push that triggered it.
|
|
195
|
+
- **`session-start.js` no longer silently fails on first run.** `TEAL`,
|
|
196
|
+
`RESET`, `DIM` ANSI constants were referenced in the no-project welcome
|
|
197
|
+
branch but never defined in the file (only in `bin/install.js`). The outer
|
|
198
|
+
`try/catch` swallowed the `ReferenceError`, so new users saw a blank
|
|
199
|
+
session. Constants now defined at top of file.
|
|
200
|
+
- **`/qualia-optimize` works on fresh installs.** Skill spawned
|
|
201
|
+
`frontend-agent`, `backend-agent`, `performance-oracle`,
|
|
202
|
+
`architecture-strategist` — none of which ship with the framework.
|
|
203
|
+
Rewritten to use `general-purpose` with the same specialized prompts.
|
|
204
|
+
- **`.qualia-config.json` is now mode 0600.** Previously written with default
|
|
205
|
+
0644, so any local user could edit `role` to `OWNER` and bypass
|
|
206
|
+
`branch-guard`. The role bit is now access-restricted.
|
|
207
|
+
- **Default ERP key no longer shipped.** Installs no longer write the
|
|
208
|
+
hardcoded literal `"qualia-claude-2026"`. New sources, in order:
|
|
209
|
+
`$QUALIA_ERP_KEY` env var → existing `~/.claude/.erp-api-key` →
|
|
210
|
+
ERP disabled until configured. Also chmods existing key file to 0600.
|
|
211
|
+
- **Atomic file writes for `STATE.md` and `tracking.json`.** Previous
|
|
212
|
+
direct `writeFileSync` could leave half-written files on SIGINT, OOM, or
|
|
213
|
+
AV scanner interruption — the next `cmdCheck` would return `NO_PROJECT`.
|
|
214
|
+
All writes now go through `tmp + rename` (atomic on POSIX, near-atomic
|
|
215
|
+
on NTFS). Added `.planning/.state.lock` exclusive lockfile so two
|
|
216
|
+
concurrent state.js mutations can't race.
|
|
217
|
+
- **`close-milestone` is now idempotent.** Sentinel `last_closed_milestone`
|
|
218
|
+
prevents re-running from double-counting `milestones_completed` and
|
|
219
|
+
`total_phases`. Pass `--force` to deliberately re-close.
|
|
220
|
+
- **`backfill-lifetime` no longer destroys history.** Now uses `Math.max`
|
|
221
|
+
instead of overwrite — recomputed values from the current milestone's
|
|
222
|
+
STATE.md cannot reduce lifetime counters that were already accumulated
|
|
223
|
+
by `close-milestone`.
|
|
224
|
+
|
|
225
|
+
### Added
|
|
226
|
+
|
|
227
|
+
- **`init` refuses to clobber an existing project.** `state.js init` against
|
|
228
|
+
an active `.planning/STATE.md` now errors with `ALREADY_INITIALIZED`.
|
|
229
|
+
Pass `--force` to re-initialize (lifetime is still preserved).
|
|
230
|
+
- **`_trace` signature normalized to 3 args** — `_trace(event, result, data)`.
|
|
231
|
+
Old call sites passing the result string in the data slot produced
|
|
232
|
+
malformed JSONL. Telemetry is now well-formed.
|
|
233
|
+
- 8 new tests covering the fixes — pre-push behavioral mutation +
|
|
234
|
+
bot-commit, init guard, close-milestone idempotency, backfill Math.max,
|
|
235
|
+
atomic write cleanup, lock release. Suite is now 137 tests, all green.
|
|
236
|
+
|
|
237
|
+
### Migration
|
|
238
|
+
|
|
239
|
+
- Existing installs will pick up the fixes via auto-update or
|
|
240
|
+
`npx qualia-framework@latest install`.
|
|
241
|
+
- The `qualia-claude-2026` shared key is grandfathered server-side for 30
|
|
242
|
+
days. After that, every employee needs a per-user token.
|
|
243
|
+
- `init --force` is required to re-initialize an existing project (was
|
|
244
|
+
silent before — a footgun).
|
|
245
|
+
|
|
246
|
+
## [3.4.1] — 2026-04-14
|
|
247
|
+
|
|
248
|
+
### Added
|
|
249
|
+
|
|
250
|
+
- **`state.js backfill-lifetime` command** — reconstructs lifetime counters from
|
|
251
|
+
STATE.md roadmap + plan files for existing projects upgrading from pre-v3.4.0.
|
|
252
|
+
Idempotent and safe to run multiple times. Use after updating to sync historical data.
|
|
253
|
+
- 2 new tests for backfill (53 state tests, 129 total).
|
|
254
|
+
|
|
255
|
+
## [3.4.0] — 2026-04-14
|
|
256
|
+
|
|
257
|
+
ERP tracking was systematically wrong — milestone transitions destroyed all
|
|
258
|
+
historical data, phase advances reset task counts, quick/task work was never
|
|
259
|
+
counted. This release adds lifetime counters that survive every reset.
|
|
260
|
+
|
|
261
|
+
### Added
|
|
262
|
+
|
|
263
|
+
- **`lifetime` object in tracking.json** — `tasks_completed`, `phases_completed`,
|
|
264
|
+
`milestones_completed`, `total_phases`. These counters accumulate and NEVER
|
|
265
|
+
reset on init or phase advance. The ERP can now see the real total.
|
|
266
|
+
- **`milestone` field in tracking.json** — current milestone number (1-indexed),
|
|
267
|
+
survives across `state.js init` calls.
|
|
268
|
+
- **`state.js close-milestone` command** — snapshots the closing milestone's data
|
|
269
|
+
into lifetime before init resets current-phase fields.
|
|
270
|
+
- **`--tasks-done N` on note/activity transitions** — `/qualia-quick` and
|
|
271
|
+
`/qualia-task` now increment `lifetime.tasks_completed` by 1 per invocation.
|
|
272
|
+
- **`cmdCheck()` includes milestone + lifetime** in JSON output for ERP/statusline.
|
|
273
|
+
- **tracking.json archived during milestone closeout** — previously only STATE.md
|
|
274
|
+
and ROADMAP.md were archived.
|
|
275
|
+
- 12 new tests covering lifetime preservation, cross-phase accumulation,
|
|
276
|
+
close-milestone, backward compat. Suite is now 51 state tests, 129 total.
|
|
277
|
+
|
|
278
|
+
### Fixed
|
|
279
|
+
|
|
280
|
+
- **`state.js init` no longer destroys historical data.** It now reads the existing
|
|
281
|
+
tracking.json and preserves `milestone` and `lifetime` fields. Current-phase
|
|
282
|
+
fields still reset as expected.
|
|
283
|
+
- **`verified(pass)` accumulates before resetting.** Task counts are added to
|
|
284
|
+
`lifetime.tasks_completed` and `lifetime.phases_completed` BEFORE `tasks_done`
|
|
285
|
+
resets to 0. The last phase of a milestone also counts (accumulation moved
|
|
286
|
+
outside the auto-advance conditional).
|
|
287
|
+
- **`/qualia-report` endpoint fixed.** Was posting multipart to
|
|
288
|
+
`/api/claude/report-upload`; now sends structured JSON to `/api/v1/reports`
|
|
289
|
+
matching the ERP contract, including milestone + lifetime data.
|
|
290
|
+
- Test 38 updated: `--force` bypasses `INVALID_PLAN` (matches v3.3.2 behavior).
|
|
291
|
+
|
|
292
|
+
### Changed
|
|
293
|
+
|
|
294
|
+
- `templates/tracking.json` includes `milestone` and `lifetime` fields.
|
|
295
|
+
- `docs/erp-contract.md` documents the new fields in request/response schemas.
|
|
296
|
+
- `skills/qualia-milestone/SKILL.md` calls `close-milestone` before `init`.
|
|
297
|
+
|
|
298
|
+
## [3.3.2] — 2026-04-13
|
|
299
|
+
|
|
300
|
+
Patch release. `state.js transition --force` now bypasses `INVALID_PLAN`
|
|
301
|
+
errors so retroactive bookkeeping works.
|
|
302
|
+
|
|
303
|
+
### Fixed
|
|
304
|
+
|
|
305
|
+
- **`state.js transition --to planned --force` now unblocks retroactive
|
|
306
|
+
documentation.** When a phase is built without `/qualia-plan` (e.g. an
|
|
307
|
+
employee shipped the work before the framework was wired up), the
|
|
308
|
+
retroactive plan file is documentation, not a runnable plan — so it
|
|
309
|
+
often lacks `**Done when:**` markers. Previously `--force` only
|
|
310
|
+
bypassed status-ordering errors and still hard-failed on
|
|
311
|
+
`INVALID_PLAN`, leaving STATE.md stuck behind reality. `--force` now
|
|
312
|
+
also bypasses `INVALID_PLAN`. It still refuses `MISSING_FILE` /
|
|
313
|
+
`MISSING_ARG` — those would point the state machine at nothing.
|
|
314
|
+
- New test: `--force bypasses INVALID_PLAN (retroactive bookkeeping)`,
|
|
315
|
+
plus a sanity test that `--force` still rejects `MISSING_FILE`.
|
|
316
|
+
Suite is now 129 tests, all green.
|
|
317
|
+
|
|
318
|
+
## [3.3.1] — 2026-04-13
|
|
319
|
+
|
|
320
|
+
Patch release. Fixes broken `@path` references inside the v3.3.0 deep-flow
|
|
321
|
+
skills that were caught by post-release verification. Subagent spawning
|
|
322
|
+
itself was unaffected (resolves via frontmatter `name:`), but the literal
|
|
323
|
+
`Read your role: @~/.claude/agents/qualia-{name}.md` instruction passed
|
|
324
|
+
into the spawned agent's prompt would fail to resolve the file because
|
|
325
|
+
agents ship without the `qualia-` prefix (e.g. `researcher.md`, not
|
|
326
|
+
`qualia-researcher.md`).
|
|
327
|
+
|
|
328
|
+
### Fixed
|
|
329
|
+
|
|
330
|
+
- `skills/qualia-new/SKILL.md` — 6 refs rewritten (4× researcher,
|
|
331
|
+
1× research-synthesizer, 1× roadmapper).
|
|
332
|
+
- `skills/qualia-plan/SKILL.md` — 3 refs rewritten (2× planner,
|
|
333
|
+
1× plan-checker).
|
|
334
|
+
- `skills/qualia-research/SKILL.md` — 1 researcher ref rewritten.
|
|
335
|
+
- `skills/qualia-milestone/SKILL.md` — 1 roadmapper ref rewritten.
|
|
336
|
+
- `skills/qualia-optimize/SKILL.md` — removed dead call to
|
|
337
|
+
`~/.claude/qualia-framework/bin/qualia-tools.js` (never shipped in v3.x);
|
|
338
|
+
replaced with a plain `git add && git commit`.
|
|
339
|
+
|
|
340
|
+
All 128 tests still green.
|
|
341
|
+
|
|
342
|
+
## [3.3.0] — 2026-04-13
|
|
343
|
+
|
|
344
|
+
Deep flow release. Adds the comprehensive v2.6-era capabilities (research, plan-check,
|
|
345
|
+
requirements traceability, roadmap generation) back into the v3 architecture — ~2k
|
|
346
|
+
lines total instead of the v2.6 55k bloat. Same command surface for end users. No
|
|
347
|
+
migration needed — existing projects keep working.
|
|
348
|
+
|
|
349
|
+
### Added
|
|
350
|
+
|
|
351
|
+
- **`/qualia-new` comprehensive flow** — now runs deep questioning → 4 parallel
|
|
352
|
+
research agents → requirements with REQ-IDs → ROADMAP.md with phases → approval
|
|
353
|
+
gate. The 323-line wizard is replaced by a structured pipeline. Still ships with
|
|
354
|
+
`--quick` flag for trivial projects.
|
|
355
|
+
- **`/qualia-plan` plan-checker loop** — planner output is now validated by a
|
|
356
|
+
plan-checker agent against 7 rules (task specificity, wave assignment, contract
|
|
357
|
+
coverage, etc.). Up to 3 revision cycles. `--skip-check` flag available for
|
|
358
|
+
emergencies.
|
|
359
|
+
- **4 new skills:**
|
|
360
|
+
- `/qualia-discuss {N}` — capture locked decisions before planning a phase
|
|
361
|
+
- `/qualia-research {N}` — deep research for a niche phase (Context7/WebFetch/WebSearch)
|
|
362
|
+
- `/qualia-map` — brownfield codebase mapping (4 parallel scanners)
|
|
363
|
+
- `/qualia-milestone` — close current milestone, open next
|
|
364
|
+
- **4 new agents:**
|
|
365
|
+
- `qualia-researcher` — single researcher agent invoked 4× in parallel with a
|
|
366
|
+
`<dimension>` arg (stack/features/architecture/pitfalls). No more 4 duplicate
|
|
367
|
+
agent files.
|
|
368
|
+
- `qualia-research-synthesizer` — merges 4 research outputs into SUMMARY.md
|
|
369
|
+
- `qualia-roadmapper` — produces REQUIREMENTS.md + ROADMAP.md from PROJECT.md
|
|
370
|
+
+ research synthesis
|
|
371
|
+
- `qualia-plan-checker` — validates plans against 7 rules
|
|
372
|
+
- **New templates** in `~/.claude/qualia-templates/`:
|
|
373
|
+
- `requirements.md` — REQ-ID traceability format
|
|
374
|
+
- `roadmap.md` — phase structure with REQ mapping
|
|
375
|
+
- `phase-context.md` — output shape for `/qualia-discuss`
|
|
376
|
+
- `research-project/STACK.md, FEATURES.md, ARCHITECTURE.md, PITFALLS.md, SUMMARY.md`
|
|
377
|
+
- `projects/website.md, ai-agent.md, voice-agent.md, mobile-app.md` — per-type
|
|
378
|
+
phase templates
|
|
379
|
+
- **New references directory** `~/.claude/qualia-references/`:
|
|
380
|
+
- `questioning.md` — the methodology guide loaded by `/qualia-new` during the
|
|
381
|
+
questioning stage
|
|
382
|
+
- **`install.js` recursive template copy** — templates/ now supports nested
|
|
383
|
+
directories (projects/, research-project/) via a new `copyTree` helper.
|
|
384
|
+
- **`install.js` legacy cleanup** — automatically removes orphaned v2.6 install
|
|
385
|
+
cruft from `~/.claude/qualia-framework/` and any broken `~/.claude/agents/qualia-*.md`
|
|
386
|
+
files that reference the old `/home/qualia/` paths. Runs on upgrade.
|
|
387
|
+
|
|
388
|
+
### Changed
|
|
389
|
+
|
|
390
|
+
- **`/qualia-new` replaces the 323-line inline wizard** with a structured 14-step
|
|
391
|
+
process that delegates research/requirements/roadmap generation to specialized
|
|
392
|
+
agents. Still feels the same to the user — same banner, same question style,
|
|
393
|
+
same terminal output — but the backing logic is comprehensive instead of flat.
|
|
394
|
+
- **`/qualia-plan` adds the plan-checker revision loop** by default. Existing
|
|
395
|
+
behavior (single planner call) is available via `--skip-check`.
|
|
396
|
+
- **ROADMAP.md is now first-class.** v3.0 → v3.2.1 didn't create ROADMAP.md; this
|
|
397
|
+
release does. The ERP sync parser can now read structured roadmap data instead
|
|
398
|
+
of falling back to STATE.md table parsing.
|
|
399
|
+
|
|
400
|
+
### Compatibility
|
|
401
|
+
|
|
402
|
+
- **Existing v3.2.1 projects:** continue to work unchanged. The new features are
|
|
403
|
+
only triggered for newly-initialized projects.
|
|
404
|
+
- **v3.2.1 skill flow:** same command names, same aesthetics, same statusline.
|
|
405
|
+
- **Statusline:** unchanged (`state.js` still writes the same `phase`,
|
|
406
|
+
`total_phases`, `status` fields to `tracking.json`).
|
|
407
|
+
|
|
408
|
+
### Philosophy
|
|
409
|
+
|
|
410
|
+
The v2.6 framework was 55k lines because it duplicated bash boilerplate across
|
|
411
|
+
30 workflow files and built mega-agents (43KB planner alone). This release ports
|
|
412
|
+
the *concepts* (research, plan-check, requirements, roadmap) into the v3
|
|
413
|
+
architecture (small focused agents, inline skills, single state tool). Total
|
|
414
|
+
added: ~2k lines. Philosophy preserved: skills orchestrate, agents focus.
|
|
415
|
+
|
|
416
|
+
## [3.2.1] — 2026-04-12
|
|
417
|
+
|
|
418
|
+
Patch release. Republishes the v3.2.0 feature set on top of the committed
|
|
419
|
+
main branch. The original v3.2.0 was published from an uncommitted working
|
|
420
|
+
tree earlier in the day and then rebased onto `origin/main` during cleanup;
|
|
421
|
+
this release captures the post-rebase state — correct `repository.url`,
|
|
422
|
+
fixed test assertions (hook count 8 → 7), and minor comment tweaks.
|
|
423
|
+
|
|
424
|
+
No behavior changes from v3.2.0 for end users.
|
|
425
|
+
|
|
426
|
+
## [3.2.0] — 2026-04-12
|
|
427
|
+
|
|
428
|
+
Sticky update notifications for employees, env access unblocked for the whole
|
|
429
|
+
team, new `/qualia-optimize` deep optimization skill.
|
|
430
|
+
|
|
431
|
+
### Added
|
|
432
|
+
- **Sticky update banner** for EMPLOYEE installs. When `auto-update.js` detects
|
|
433
|
+
a newer version on npm, it writes `.qualia-update-available.json` instead of
|
|
434
|
+
auto-installing. `session-start.js` renders a visible banner every session
|
|
435
|
+
until the employee runs `npx qualia-framework@latest install`. OWNER still
|
|
436
|
+
auto-updates silently — never sees the banner.
|
|
437
|
+
- **`qualia-optimize`** skill — deep optimization pass that reads `.planning/`
|
|
438
|
+
AND the codebase together. Spawns parallel specialists (frontend, backend,
|
|
439
|
+
performance, architecture). Modes: `full`, `--perf`, `--ui`, `--backend`,
|
|
440
|
+
`--alignment`, `--fix`.
|
|
441
|
+
- `bin/qualia-ui.js` — new `update <current> <latest>` command renders the
|
|
442
|
+
sticky banner.
|
|
443
|
+
- `bin/install.js` — new `DEPRECATED_HOOKS` cleanup list proactively removes
|
|
444
|
+
retired hooks from existing installs during upgrade.
|
|
445
|
+
|
|
446
|
+
### Changed
|
|
447
|
+
- `hooks/auto-update.js` now branches on `cfg.role`. OWNER gets the silent
|
|
448
|
+
background install (unchanged). EMPLOYEE writes the sticky notification so
|
|
449
|
+
they can no longer ignore updates by accident.
|
|
450
|
+
|
|
451
|
+
### Removed
|
|
452
|
+
- **`hooks/block-env-edit.js`** — team decision. Claude now has full read/write
|
|
453
|
+
on `.env*` files across the team. `install.js` no longer wires this hook and
|
|
454
|
+
`DEPRECATED_HOOKS` purges it from existing installs on upgrade.
|
|
455
|
+
- Employee role descriptions updated — no longer claim "cannot edit .env files".
|
|
456
|
+
|
|
457
|
+
## [3.1.0] — 2026-04-12
|
|
458
|
+
|
|
459
|
+
Package rename and gap closure release. The package is now `qualia-framework`
|
|
460
|
+
(dropping the `-v2` suffix). Adds settings migration, skill outcome scoring,
|
|
461
|
+
analytics, cross-platform tests, and fills all v3.0.0 gaps.
|
|
462
|
+
|
|
463
|
+
### Changed
|
|
464
|
+
- **Package renamed** `qualia-framework-v2` → `qualia-framework`. All CLI
|
|
465
|
+
commands are now `qualia-framework install`, `qualia-framework update`, etc.
|
|
466
|
+
The old name continues to work via npm alias.
|
|
467
|
+
|
|
468
|
+
### Added
|
|
469
|
+
- **`qualia-framework migrate`** — upgrades v2 settings to v3 without
|
|
470
|
+
reinstalling. Wires missing hooks, env vars, status line, and MCP config.
|
|
471
|
+
- **`qualia-framework analytics`** — aggregates hook telemetry and shows
|
|
472
|
+
first-pass verification rate, gap cycles, per-hook breakdown.
|
|
473
|
+
- **Skill outcome scoring** — state transitions now write trace entries to
|
|
474
|
+
`~/.claude/.qualia-traces/` for plan→outcome correlation tracking.
|
|
475
|
+
- **Verification contract format validation** — `validate-plan` now checks
|
|
476
|
+
contract structure (check-type, command, expected, fail-if fields) with
|
|
477
|
+
warnings for invalid types or missing fields. Backward compatible.
|
|
478
|
+
- **next-devtools-mcp integration** — install and migrate now configure
|
|
479
|
+
`next-devtools-mcp@0.3.10` as an MCP server for runtime error visibility
|
|
480
|
+
in Next.js 16+ projects.
|
|
481
|
+
- **Cross-platform Node.js test runner** — 134 tests using `node:test`,
|
|
482
|
+
replacing bash-only test scripts. Works on Fedora, EndeavourOS, Windows.
|
|
483
|
+
- **ERP API contract documentation** — `docs/erp-contract.md` specifying
|
|
484
|
+
endpoints, auth, request/response shapes, rate limits, and security.
|
|
485
|
+
|
|
486
|
+
### Fixed
|
|
487
|
+
- Contract validation regex in `validate-plan` — section extraction was
|
|
488
|
+
always returning empty due to `$` matching end-of-line in multiline mode.
|
|
489
|
+
|
|
490
|
+
## [3.0.0] — 2026-04-11
|
|
491
|
+
|
|
492
|
+
Harness engineering release. Applies lessons from Anthropic's "Harness Design
|
|
493
|
+
for Long-Running Apps" article. The verifier becomes a scored evaluator, the
|
|
494
|
+
planner generates verification contracts, guards get smarter, and the harness
|
|
495
|
+
gains observability.
|
|
496
|
+
|
|
497
|
+
### Added
|
|
498
|
+
- **Scored evaluator rubric** — verifier now scores on 4 dimensions
|
|
499
|
+
(Correctness, Completeness, Wiring, Quality), each 1-5. Hard threshold:
|
|
500
|
+
any score < 3 = FAIL. Two few-shot calibration examples included.
|
|
501
|
+
- **Verification contracts** — planner generates testable contract entries
|
|
502
|
+
(`file-exists`, `grep-match`, `command-exit`, `behavioral`) per task.
|
|
503
|
+
Verifier executes contracts before ad-hoc verification.
|
|
504
|
+
- **Plan content validation** — `state.js` now rejects plans with no task
|
|
505
|
+
headers or missing "Done when" criteria. New `validate-plan` subcommand.
|
|
506
|
+
- **Configurable gap cycle limit** — default remains 2; override via
|
|
507
|
+
`tracking.json.gap_cycle_limit` or `PROJECT.md gap_cycle_limit:` field.
|
|
508
|
+
- **Pre-deploy gate: Server Component detection** — `route.ts`,
|
|
509
|
+
`middleware.ts`, `app/api/` paths, and `"use server"` directive files are
|
|
510
|
+
now exempt from the service_role leak scan.
|
|
511
|
+
- **Dynamic team management** — `qualia-framework team list|add|remove`
|
|
512
|
+
CLI commands. Team dict externalized to `~/.claude/.qualia-team.json`;
|
|
513
|
+
falls back to embedded defaults.
|
|
514
|
+
- **ERP decoupling** — ERP config (`enabled`, `url`, `api_key_file`) stored
|
|
515
|
+
in `.qualia-config.json`. `/qualia-report` skips upload when disabled.
|
|
516
|
+
- **Hook telemetry** — all 8 hooks write JSONL traces to
|
|
517
|
+
`~/.claude/.qualia-traces/YYYY-MM-DD.jsonl`. New `traces` CLI command
|
|
518
|
+
shows recent hook activity.
|
|
519
|
+
- **Build recovery tags** — `/qualia-build` creates `pre-build-phase-{N}`
|
|
520
|
+
git tag before execution. `--force` flag on `state.js transition` enables
|
|
521
|
+
state recovery after failed builds.
|
|
522
|
+
- **Knowledge base dedup** — `/qualia-learn` checks for existing entries
|
|
523
|
+
before appending. Entries now include UUID and ISO timestamp.
|
|
524
|
+
- New tests for deploy gate, state machine, and guard hooks.
|
|
525
|
+
Total: 152 tests passing (50 hooks + 40 state + 48 bin + 14 statusline).
|
|
526
|
+
|
|
527
|
+
### Fixed
|
|
528
|
+
- **block-env-edit + branch-guard hooks not wired** — both hooks were
|
|
529
|
+
copied during install but never registered in `settings.json`. Employees
|
|
530
|
+
could push to main and edit `.env` files unchecked. Now registered in
|
|
531
|
+
`PreToolUse` hooks.
|
|
532
|
+
- **Auto-update background script broken** — detached child script used
|
|
533
|
+
`return` at top level in `node -e`, which is a SyntaxError. The entire
|
|
534
|
+
update check silently failed every time. Replaced with `process.exit(0)`.
|
|
535
|
+
- **branch-guard exit code** — used `exit(1)` (hook error) instead of
|
|
536
|
+
`exit(2)` (clean block). Now consistent with block-env-edit and
|
|
537
|
+
migration-guard.
|
|
538
|
+
- Install summary hardcoded "Hooks: 6" despite installing 8. Fixed.
|
|
539
|
+
- Duplicate `statusline.js` copy in installer removed.
|
|
540
|
+
|
|
541
|
+
### Changed
|
|
542
|
+
- `agents/verifier.md` — complete rewrite of the Scoring section into a
|
|
543
|
+
structured 4-criterion rubric with calibration examples and contract
|
|
544
|
+
verification workflow.
|
|
545
|
+
- `agents/planner.md` — new Verification Contracts section with contract
|
|
546
|
+
format, types, and rules.
|
|
547
|
+
- `templates/plan.md` — includes Verification Contract section.
|
|
548
|
+
- `bin/state.js` — `getGapCycleLimit()`, `cmdValidatePlan()`, `--force`
|
|
549
|
+
flag, `gap_cycle_limit` in check output, plan content validation in
|
|
550
|
+
preconditions.
|
|
551
|
+
- `bin/install.js` — `CLAUDE_DIR`/`FRAMEWORK_DIR` moved above `loadTeam()`;
|
|
552
|
+
team dict externalized via `loadTeam()`; ERP config in `.qualia-config.json`.
|
|
553
|
+
- `bin/cli.js` — `team`, `traces` commands; uninstall cleans team file and
|
|
554
|
+
traces dir; updated help text.
|
|
555
|
+
- `bin/qualia-ui.js` — gap cycle display uses dynamic limit from state.
|
|
556
|
+
- `hooks/pre-deploy-gate.js` — 4 new server-side file exemptions.
|
|
557
|
+
- `skills/qualia-verify/SKILL.md` — spawn prompt references contracts.
|
|
558
|
+
- `skills/qualia-report/SKILL.md` — config-driven ERP upload.
|
|
559
|
+
- `skills/qualia-build/SKILL.md` — recovery point step before execution.
|
|
560
|
+
- `skills/qualia-learn/SKILL.md` — dedup check, UUID+timestamp format.
|
|
561
|
+
|
|
562
|
+
## [2.10.0] — 2026-04-11
|
|
563
|
+
|
|
564
|
+
Modern icon system, statusline context indicators.
|
|
565
|
+
|
|
566
|
+
### Added
|
|
567
|
+
- Statusline now shows memory count (`⊙`), hooks count (`⚙`), and skills count (`✦`) on the top bar.
|
|
568
|
+
- Each Qualia action has a unique, meaningful glyph: `⬢` router, `✦` new, `▣` plan, `⚙` build,
|
|
569
|
+
`◎` verify, `✧` polish, `△` ship, `⇢` handoff, `▤` report, `⊘` debug, `⊙` learn,
|
|
570
|
+
`⏸` pause, `▶` resume, `⊛` review, `◈` design, `⚡` quick, `▪` task, `⟐` gaps.
|
|
571
|
+
|
|
572
|
+
### Changed
|
|
573
|
+
- Replaced all `◆` diamond glyphs with `⬢` hexagon (Qualia brand mark) across all files:
|
|
574
|
+
qualia-ui.js, statusline.js, install.js, cli.js, hooks, and skill documentation.
|
|
575
|
+
- Updated utility glyphs: spawn (`⬡`), wave (`»`), next (`⟶`), banner separator (`▸`).
|
|
576
|
+
- Spinner tips and hook status messages now use `⬢` prefix.
|
|
577
|
+
|
|
578
|
+
## [2.9.0] — 2026-04-11
|
|
579
|
+
|
|
580
|
+
Housekeeping, test coverage, and release hygiene.
|
|
581
|
+
|
|
582
|
+
### Added
|
|
583
|
+
- GitHub Actions CI workflow — runs the full test suite on every push and PR.
|
|
584
|
+
- Behavioral test suites for `bin/cli.js`, `bin/install.js`, `bin/qualia-ui.js`,
|
|
585
|
+
`bin/statusline.js`, and the `pre-deploy-gate` / `branch-guard` hooks.
|
|
586
|
+
- `CHANGELOG.md` — this file. Backfilled from commit history.
|
|
587
|
+
- `npx qualia-framework uninstall` — clean, surgical removal of the framework
|
|
588
|
+
from `~/.claude/`. Supports `--yes` / `-y` for scripted use. Preserves
|
|
589
|
+
user-customized `CLAUDE.md` and non-Qualia entries in `settings.json`.
|
|
590
|
+
Optionally preserves the knowledge base (default Yes).
|
|
591
|
+
- Seeded knowledge base content — `learned-patterns.md` and `common-fixes.md`
|
|
592
|
+
now ship with real entries harvested from v2.7–v2.8 work, so new installs
|
|
593
|
+
have something to learn from immediately instead of empty stubs.
|
|
594
|
+
|
|
595
|
+
### Changed
|
|
596
|
+
- `bin/cli.js` version check: `execSync("npm view ... 2>/dev/null")` → `spawnSync`
|
|
597
|
+
with argv. Removes the last bash-only redirect from the CLI, matching the
|
|
598
|
+
cross-platform pattern established in v2.8.0.
|
|
599
|
+
- `STATE.md` parser hardened against edge cases (missing sections, malformed
|
|
600
|
+
phase headers, non-ASCII phase names).
|
|
601
|
+
- `README.md` — adds a Changelog section and documents the `uninstall` command.
|
|
602
|
+
|
|
603
|
+
## [2.8.1] — 2026-04-10
|
|
604
|
+
|
|
605
|
+
Small patch release. Dogfood-driven: caught while installing v2.8.0 on a real
|
|
606
|
+
machine immediately after publishing — typing `QS-FAWZI-O1` (letter O) instead
|
|
607
|
+
of `QS-FAWZI-01` (digit zero) was rejected by the exact-match TEAM lookup.
|
|
608
|
+
|
|
609
|
+
### Added
|
|
610
|
+
- `resolveTeamCode(input)` helper in `bin/install.js`. Normalizes case, trims
|
|
611
|
+
whitespace, and replaces letter `O` → digit `0` in the numeric suffix only
|
|
612
|
+
(after the last dash).
|
|
613
|
+
- Invalid-code error message now echoes the code the user typed and adds a tip
|
|
614
|
+
about the `O` vs `0` convention.
|
|
615
|
+
|
|
616
|
+
### Fixed
|
|
617
|
+
- Install codes with letter `O` in the numeric suffix (`QS-FAWZI-O1`) are now
|
|
618
|
+
tolerated and normalized to the canonical form.
|
|
619
|
+
- `package.json` `repository.url` and `homepage` corrected from the
|
|
620
|
+
hyphenated `qualia-solutions` owner to the real CamelCase `Qualiasolutions`
|
|
621
|
+
GitHub org. npm had been silently auto-normalizing on publish but the
|
|
622
|
+
metadata was still wrong.
|
|
623
|
+
- Critical constraint: the O→0 normalization only touches the segment after
|
|
624
|
+
the last dash, so `QS-MOAYAD-03` (real `O` in the name) is preserved.
|
|
625
|
+
Verified against 13 test cases including the adversarial `qs-moayad-O3`.
|
|
626
|
+
|
|
627
|
+
## [2.8.0] — 2026-04-10
|
|
628
|
+
|
|
629
|
+
Cross-platform hardening, real test coverage for the state machine, and a
|
|
630
|
+
pure-Node status line. Closes 6 audit findings in one pass. Windows, macOS,
|
|
631
|
+
and Linux all get a more honest, more tested, more portable framework.
|
|
632
|
+
|
|
633
|
+
### Added
|
|
634
|
+
- `bin/statusline.js` — pure Node status line (~200 lines, zero deps). Same
|
|
635
|
+
teal palette and 2-line layout as the previous bash version. Uses
|
|
636
|
+
`os.tmpdir()` with a per-user cache filename instead of hardcoded `/tmp`.
|
|
637
|
+
- `tests/state.test.sh` — 22 behavioral tests covering `cmdInit`, `cmdCheck`,
|
|
638
|
+
every `VALID_FROM` transition, every precondition failure mode
|
|
639
|
+
(`PRECONDITION_FAILED`, `MISSING_FILE`, `MISSING_ARG`, `INVALID_STATUS`),
|
|
640
|
+
the gap-cycle circuit breaker (1 → 2 → blocked → reset on pass), and
|
|
641
|
+
special note/activity transitions.
|
|
642
|
+
- `package.json` `test` script now runs both the hooks and state suites.
|
|
643
|
+
Total: 56 tests (34 hooks + 22 state), all passing.
|
|
644
|
+
|
|
645
|
+
### Changed
|
|
646
|
+
- `bin/qualia-ui.js` `readState`: `execSync` shell string → `spawnSync` argv.
|
|
647
|
+
Fixes the Windows banner when the username has spaces and removes the
|
|
648
|
+
bash-only `2>/dev/null` redirect.
|
|
649
|
+
- `bin/cli.js` `cmdUpdate`: replaced bash `<<<` here-string with `spawnSync`
|
|
650
|
+
+ `input:`. Manual `npx qualia-framework update` now works on Windows
|
|
651
|
+
and on Debian/Ubuntu (where `/bin/sh` is `dash`, which also lacks `<<<`).
|
|
652
|
+
- `skills/qualia-skill-new/SKILL.md` — removed 5 hardcoded
|
|
653
|
+
`/home/qualia/Projects/...` paths in favor of `${FRAMEWORK_DIR}` detection
|
|
654
|
+
(env var → git origin check → ask user). The skill no longer violates its
|
|
655
|
+
own anti-patterns section.
|
|
656
|
+
- `bin/install.js` wires the status line as `node ~/.claude/bin/statusline.js`
|
|
657
|
+
instead of shelling out to bash. Scripts count updated 2 → 3 in the
|
|
658
|
+
install summary.
|
|
659
|
+
- README truthfulness pass: "3 rules" → "4 rules"; "auto-loaded by skills"
|
|
660
|
+
→ "loaded by /qualia-plan, /qualia-debug, /qualia-new" (only those skills
|
|
661
|
+
actually cat the knowledge files); "No Git Bash, no WSL, no bash dependency"
|
|
662
|
+
claim rescoped to be accurate (hooks and status line are pure Node; skills
|
|
663
|
+
run through Claude Code's own Bash tool); "Production-Grade Hooks" bullet
|
|
664
|
+
now says "All 8 hooks" instead of leaving the count ambiguous.
|
|
665
|
+
|
|
666
|
+
### Fixed
|
|
667
|
+
- Windows session-start banner now shows phase/status even when the user's
|
|
668
|
+
path contains spaces.
|
|
669
|
+
- Manual `update` command no longer fails silently on Windows or Debian/Ubuntu.
|
|
670
|
+
- The `qualia-skill-new` skill no longer embeds developer-specific absolute
|
|
671
|
+
paths into generated skills.
|
|
672
|
+
|
|
673
|
+
### Removed
|
|
674
|
+
- `bin/statusline.sh` — replaced by `bin/statusline.js`. "Every hook and the
|
|
675
|
+
status line are pure Node.js" is now a claim the framework actually keeps.
|
|
676
|
+
- `SubagentStart` echo hook from `install.js` — cosmetic-only, and it shipped
|
|
677
|
+
broken output on Windows cmd.exe due to literal single quotes.
|
|
678
|
+
- Undocumented `settings.effortLevel = "high"` no-op from `install.js`.
|
|
679
|
+
|
|
680
|
+
## [2.7.0] — 2026-04-10
|
|
681
|
+
|
|
682
|
+
Every hook is now pure Node.js with zero shell dependencies. Works identically
|
|
683
|
+
on Windows 10/11, macOS, and Linux. The only runtime requirement is Node.js
|
|
684
|
+
18+, which was already required for `state.js`, `qualia-ui.js`, and the
|
|
685
|
+
installer itself. Motivation: the previous `.sh` hooks required bash in PATH,
|
|
686
|
+
which on Windows means Git Bash — an extra install most team members don't
|
|
687
|
+
have. Windows team members had been running the framework with silently
|
|
688
|
+
broken hooks for weeks.
|
|
689
|
+
|
|
690
|
+
### Added
|
|
691
|
+
- 8 pure-Node hooks: `session-start.js`, `auto-update.js`, `branch-guard.js`,
|
|
692
|
+
`block-env-edit.js`, `migration-guard.js`, `pre-push.js`, `pre-compact.js`,
|
|
693
|
+
`pre-deploy-gate.js`.
|
|
694
|
+
- `tests/hooks.test.sh` now exercises `.js` hooks via stdin-piped JSON input,
|
|
695
|
+
including a Windows-path test case (`C:\project\.env.local` should block).
|
|
696
|
+
- 34/34 hook tests passing (up from 21).
|
|
697
|
+
|
|
698
|
+
### Changed
|
|
699
|
+
- `install.js` writes hook commands as `node "<absolute-path>"` in
|
|
700
|
+
`settings.json`, avoiding any bash/Git Bash requirement on Windows.
|
|
701
|
+
- `install.js` deletes orphaned `.sh` files from `~/.claude/hooks/` before
|
|
702
|
+
copying `.js` hooks (clean upgrade path for existing v2.5/v2.6 installs).
|
|
703
|
+
- `chmod 755` on `.js` files (no-op on Windows, harmless).
|
|
704
|
+
- `block-env-edit.js` normalizes Windows backslashes in file paths.
|
|
705
|
+
- `pre-deploy-gate.js` uses a Node directory walker — no `grep -r`, no `find`.
|
|
706
|
+
|
|
707
|
+
### Fixed
|
|
708
|
+
- Relative `HOOKS_DIR` bug that broke tests after `cd` into subshells.
|
|
709
|
+
|
|
710
|
+
### Removed
|
|
711
|
+
- All 8 `.sh` hook files. Replaced 1:1 with `.js` equivalents.
|
|
712
|
+
|
|
713
|
+
## [2.6.1] — 2026-04-09
|
|
714
|
+
|
|
715
|
+
### Fixed
|
|
716
|
+
- `session-start.js` hook never exits with a non-zero code. Previously, a
|
|
717
|
+
transient failure in the banner renderer could surface as a hard error on
|
|
718
|
+
session start, which felt broken even though nothing was actually wrong.
|
|
719
|
+
|
|
720
|
+
## [2.6.0] — 2026-04-09
|
|
721
|
+
|
|
722
|
+
### Added
|
|
723
|
+
- `qa-browser` agent for browser-based verification.
|
|
724
|
+
- `qualia-skill-new` skill — authoring tool for new skills and agents.
|
|
725
|
+
- `bin/qualia-ui.js` cosmetics library — consistent banners across every
|
|
726
|
+
skill with a shared teal palette and layout.
|
|
727
|
+
- Memory activation: framework now participates in Claude Code's memory
|
|
728
|
+
system instead of opting out.
|
|
729
|
+
|
|
730
|
+
### Fixed
|
|
731
|
+
- Deploy gate false positives reduced.
|
|
732
|
+
|
|
733
|
+
## [2.5.0] — 2026-04-08
|
|
734
|
+
|
|
735
|
+
### Added
|
|
736
|
+
- `auto-update.js` hook — daily silent update in a detached subprocess so
|
|
737
|
+
teams stay on the current version without manual `update` calls.
|
|
738
|
+
- Design best practices baked into the entire build pipeline (planner,
|
|
739
|
+
builder, verifier, and the design rules).
|
|
740
|
+
|
|
741
|
+
### Changed
|
|
742
|
+
- Quality gates are now role-aware: OWNER bypasses env/branch/sudo
|
|
743
|
+
restrictions; EMPLOYEE is held to the original rules.
|
|
744
|
+
|
|
745
|
+
### Fixed
|
|
746
|
+
- `/qualia-report` ERP upload path and API key setup flow in the installer.
|
|
747
|
+
|
|
748
|
+
## [2.4.0] — 2026-04-08
|
|
749
|
+
|
|
750
|
+
### Added
|
|
751
|
+
- `version` and `update` CLI commands (`npx qualia-framework version`,
|
|
752
|
+
`npx qualia-framework update`).
|
|
753
|
+
- Knowledge system: `~/.claude/knowledge/` with `learned-patterns.md`,
|
|
754
|
+
`common-fixes.md`, `client-prefs.md`.
|
|
755
|
+
- `/qualia-learn` skill for capturing patterns, fixes, and client prefs to
|
|
756
|
+
the knowledge base.
|
|
757
|
+
|
|
758
|
+
## [2.3.0] — 2026-04-08
|
|
759
|
+
|
|
760
|
+
### Added
|
|
761
|
+
- `bin/state.js` state machine — validates preconditions, updates `STATE.md`
|
|
762
|
+
and `tracking.json` atomically, tracks gap-closure cycles.
|
|
763
|
+
- Smart router (`/qualia`) that reads project state and tells you the exact
|
|
764
|
+
next command.
|
|
765
|
+
- `/qualia-idk` as an alias for the smart router.
|
|
766
|
+
|
|
767
|
+
### Changed
|
|
768
|
+
- All 10 skills replaced manual `STATE.md` / `tracking.json` updates with
|
|
769
|
+
`state.js` calls.
|
|
770
|
+
- `/qualia-report` rewritten to drop DOCX generation and raw `curl` usage.
|
|
771
|
+
|
|
772
|
+
### Fixed
|
|
773
|
+
- Report generation pipeline.
|
|
774
|
+
|
|
775
|
+
## [2.2.0] — 2026-04-08
|
|
776
|
+
|
|
777
|
+
### Added
|
|
778
|
+
- Ports of 6 skills from v1: `/qualia-idk`, `/qualia-design`, `/qualia-debug`,
|
|
779
|
+
`/qualia-review`, `/qualia-pause`, `/qualia-resume`.
|
|
780
|
+
- `pre-push` hook rewritten to Node.js.
|
|
781
|
+
- `state.js` install step added to the installer.
|
|
782
|
+
- `gap_cycles` counter added to the `tracking.json` template.
|
|
783
|
+
|
|
784
|
+
## [2.1.2] — 2026-04-08
|
|
785
|
+
|
|
786
|
+
### Added
|
|
787
|
+
- Install codes for Rama and Sally (team expansion).
|
|
788
|
+
|
|
789
|
+
## [2.1.1] — 2026-04-07
|
|
790
|
+
|
|
791
|
+
Safeguards release, incorporating lessons from the v1 code review.
|
|
792
|
+
|
|
793
|
+
### Added
|
|
794
|
+
- Task validation at plan-time.
|
|
795
|
+
- Stub detection in the verifier (flags `// TODO` and placeholder-only files).
|
|
796
|
+
- Scope discipline checks.
|
|
797
|
+
- Explicit deviation criteria.
|
|
798
|
+
- Routing clarity improvements in `/qualia`.
|
|
799
|
+
- Gap-closure documentation.
|
|
800
|
+
- Hook tests (first pass).
|
|
801
|
+
|
|
802
|
+
## [2.1.0] — 2026-04-07
|
|
803
|
+
|
|
804
|
+
### Added
|
|
805
|
+
- Full agent wiring: planner, builder, verifier — each in an isolated
|
|
806
|
+
subagent context.
|
|
807
|
+
- Full hook system (first production-grade pass).
|
|
808
|
+
- Install codes and role-based access control (OWNER vs EMPLOYEE).
|
|
809
|
+
|
|
810
|
+
### Changed
|
|
811
|
+
- README rewritten with architecture rationale and accurate counts.
|
|
812
|
+
|
|
813
|
+
## [2.0.0] — 2026-04-07
|
|
814
|
+
|
|
815
|
+
Initial v2 release. Framework rewrite with agent wiring, full hook system,
|
|
816
|
+
and install codes.
|
|
817
|
+
|
|
818
|
+
### Added
|
|
819
|
+
- Initial `qualia-framework` repo with full hook system and agent wiring.
|
|
820
|
+
- Core skills, agents, hooks, rules, and templates.
|
|
821
|
+
- `bin/install.js` and `bin/cli.js` installer / CLI.
|
|
822
|
+
|
|
823
|
+
[Unreleased]: https://github.com/Qualiasolutions/qualia-framework/compare/v4.0.3...HEAD
|
|
824
|
+
[4.0.3]: https://github.com/Qualiasolutions/qualia-framework/compare/v4.0.2...v4.0.3
|
|
825
|
+
[4.0.2]: https://github.com/Qualiasolutions/qualia-framework/compare/v4.0.1...v4.0.2
|
|
826
|
+
[4.0.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v4.0.0...v4.0.1
|
|
827
|
+
[4.0.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.7.0...v4.0.0
|
|
828
|
+
[3.7.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.6.0...v3.7.0
|
|
829
|
+
[3.6.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.5.0...v3.6.0
|
|
830
|
+
[3.5.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.4.2...v3.5.0
|
|
831
|
+
[3.4.2]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.4.1...v3.4.2
|
|
832
|
+
[3.4.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.4.0...v3.4.1
|
|
833
|
+
[3.4.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.3.2...v3.4.0
|
|
834
|
+
[3.3.2]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.3.1...v3.3.2
|
|
835
|
+
[3.3.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.3.0...v3.3.1
|
|
836
|
+
[3.3.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.2.1...v3.3.0
|
|
837
|
+
[3.2.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.2.0...v3.2.1
|
|
838
|
+
[3.2.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.1.0...v3.2.0
|
|
839
|
+
[3.1.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v3.0.0...v3.1.0
|
|
840
|
+
[3.0.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.10.0...v3.0.0
|
|
841
|
+
[2.10.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.9.0...v2.10.0
|
|
842
|
+
[2.9.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.8.1...v2.9.0
|
|
843
|
+
[2.8.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.8.0...v2.8.1
|
|
844
|
+
[2.8.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.7.0...v2.8.0
|
|
845
|
+
[2.7.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.6.1...v2.7.0
|
|
846
|
+
[2.6.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.6.0...v2.6.1
|
|
847
|
+
[2.6.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.5.0...v2.6.0
|
|
848
|
+
[2.5.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.4.0...v2.5.0
|
|
849
|
+
[2.4.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.3.0...v2.4.0
|
|
850
|
+
[2.3.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.2.0...v2.3.0
|
|
851
|
+
[2.2.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.1.2...v2.2.0
|
|
852
|
+
[2.1.2]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.1.1...v2.1.2
|
|
853
|
+
[2.1.1]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.1.0...v2.1.1
|
|
854
|
+
[2.1.0]: https://github.com/Qualiasolutions/qualia-framework/compare/v2.0.0...v2.1.0
|
|
855
|
+
[2.0.0]: https://github.com/Qualiasolutions/qualia-framework/releases/tag/v2.0.0
|