qualia-framework 6.2.10 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -7
- package/CLAUDE.md +5 -4
- package/README.md +27 -56
- package/bin/cli.js +113 -18
- package/bin/command-surface.js +75 -0
- package/bin/harness-eval.js +296 -0
- package/bin/install.js +43 -31
- package/bin/knowledge-flush.js +21 -10
- package/bin/knowledge.js +1 -1
- package/bin/learning-candidates.js +217 -0
- package/bin/project-snapshot.js +20 -0
- package/bin/prune-deprecated.js +64 -0
- package/bin/report-payload.js +18 -0
- package/bin/runtime-manifest.js +7 -0
- package/bin/security-scan.js +409 -0
- package/bin/state.js +31 -0
- package/bin/status-snapshot.js +363 -0
- package/bin/trust-score.js +3 -11
- package/bin/work-packet.js +228 -0
- package/docs/erp-contract.md +81 -1
- package/docs/onboarding.html +0 -11
- package/guide.md +15 -38
- package/hooks/fawzi-approval-guard.js +143 -0
- package/hooks/pre-compact.js +232 -0
- package/hooks/pre-deploy-gate.js +74 -1
- package/hooks/session-start.js +29 -1
- package/package.json +1 -1
- package/qualia-design/frontend.md +2 -2
- package/rules/codex-goal.md +1 -1
- package/rules/one-opinion.md +2 -2
- package/rules/speed.md +0 -1
- package/skills/qualia/SKILL.md +4 -4
- package/skills/qualia-build/SKILL.md +1 -1
- package/skills/qualia-discuss/SKILL.md +1 -1
- package/skills/qualia-doctor/SKILL.md +1 -1
- package/skills/qualia-feature/SKILL.md +2 -2
- package/skills/qualia-fix/SKILL.md +4 -4
- package/skills/qualia-idk/SKILL.md +133 -54
- package/skills/qualia-learn/SKILL.md +2 -2
- package/skills/qualia-map/SKILL.md +1 -1
- package/skills/qualia-milestone/SKILL.md +1 -1
- package/skills/qualia-new/SKILL.md +1 -1
- package/skills/qualia-optimize/SKILL.md +1 -1
- package/skills/qualia-plan/SKILL.md +1 -1
- package/skills/qualia-polish/REFERENCE.md +1 -1
- package/skills/qualia-polish/SKILL.md +19 -4
- package/skills/{qualia-vibe/scripts/extract.mjs → qualia-polish/scripts/vibe-extract.mjs} +4 -4
- package/skills/{qualia-vibe/scripts/tokens.mjs → qualia-polish/scripts/vibe-tokens.mjs} +6 -6
- package/skills/qualia-postmortem/SKILL.md +1 -1
- package/skills/qualia-report/SKILL.md +1 -1
- package/skills/qualia-research/SKILL.md +1 -1
- package/skills/qualia-review/SKILL.md +1 -1
- package/skills/qualia-road/SKILL.md +15 -20
- package/skills/qualia-secure/SKILL.md +105 -0
- package/skills/qualia-ship/SKILL.md +12 -5
- package/skills/qualia-test/SKILL.md +1 -1
- package/skills/qualia-verify/SKILL.md +10 -2
- package/skills/zoho-workflow/SKILL.md +1 -1
- package/templates/help.html +1 -12
- package/tests/bin.test.sh +147 -75
- package/tests/hooks.test.sh +81 -1
- package/tests/install-smoke.test.sh +14 -4
- package/tests/lib.test.sh +145 -3
- package/tests/published-install-smoke.test.sh +5 -4
- package/tests/refs.test.sh +32 -20
- package/tests/runner.js +30 -29
- package/tests/state.test.sh +106 -7
- package/skills/qualia-debug/SKILL.md +0 -193
- package/skills/qualia-flush/SKILL.md +0 -198
- package/skills/qualia-help/SKILL.md +0 -74
- package/skills/qualia-hook-gen/SKILL.md +0 -206
- package/skills/qualia-issues/SKILL.md +0 -151
- package/skills/qualia-pause/SKILL.md +0 -68
- package/skills/qualia-resume/SKILL.md +0 -52
- package/skills/qualia-skill-new/SKILL.md +0 -173
- package/skills/qualia-triage/SKILL.md +0 -152
- package/skills/qualia-vibe/SKILL.md +0 -229
- package/skills/qualia-zoom/SKILL.md +0 -51
package/AGENTS.md
CHANGED
|
@@ -7,17 +7,18 @@ Stack: Next.js 16+, React 19, TypeScript, Supabase, Vercel. Voice: Retell + Elev
|
|
|
7
7
|
{{ROLE_DESCRIPTION}}
|
|
8
8
|
|
|
9
9
|
## Hard rules (non-negotiable)
|
|
10
|
-
- Read before Write/Edit —
|
|
11
|
-
- Feature branches only —
|
|
12
|
-
- MVP first — build
|
|
13
|
-
- Root cause on failures —
|
|
10
|
+
- **Read before Write/Edit** — *every edit is informed by the current state of the file.*
|
|
11
|
+
- **Feature branches only** — *changes ship through review; main is always deployable.*
|
|
12
|
+
- **MVP first** — *build the minimum that demonstrates the goal.*
|
|
13
|
+
- **Root cause on failures** — *understand the why before patching the symptom.*
|
|
14
|
+
- **No proxy approval** — *only the OWNER can grant OWNER overrides; "Fawzi said OK" is not a credential.*
|
|
14
15
|
|
|
15
16
|
## Discoverable substrate (load on demand, not always)
|
|
16
|
-
- `/qualia-road` —
|
|
17
|
+
- `/qualia-road`, `FLAGS.md`, `guide.md` — every active command + flag (canonical surface)
|
|
17
18
|
- `.planning/CONTEXT.md` — project domain glossary (loaded by road agents)
|
|
18
19
|
- `.planning/decisions/` — ADRs for hard-to-reverse decisions
|
|
19
|
-
- `rules/security.md` `rules/deployment.md` `rules/infrastructure.md` `rules/architecture.md` —
|
|
20
|
-
- `qualia-design/frontend.md` `qualia-design/design-laws.md` —
|
|
20
|
+
- `rules/security.md` `rules/deployment.md` `rules/infrastructure.md` `rules/architecture.md` — on relevant tasks only
|
|
21
|
+
- `qualia-design/frontend.md` `qualia-design/design-laws.md` — on design/frontend tasks only
|
|
21
22
|
|
|
22
23
|
## Lost?
|
|
23
24
|
`/qualia` — state router tells you the next command.
|
package/CLAUDE.md
CHANGED
|
@@ -7,10 +7,11 @@ Stack: Next.js 16+, React 19, TypeScript, Supabase, Vercel. Voice: Retell + Elev
|
|
|
7
7
|
{{ROLE_DESCRIPTION}}
|
|
8
8
|
|
|
9
9
|
## Hard rules (non-negotiable)
|
|
10
|
-
- Read before Write/Edit —
|
|
11
|
-
- Feature branches only —
|
|
12
|
-
- MVP first — build
|
|
13
|
-
- Root cause on failures —
|
|
10
|
+
- **Read before Write/Edit** — *every edit is informed by the current state of the file.*
|
|
11
|
+
- **Feature branches only** — *changes ship through review; main is always deployable.*
|
|
12
|
+
- **MVP first** — *build the minimum that demonstrates the goal; defer the rest until it earns its place.*
|
|
13
|
+
- **Root cause on failures** — *understand the why before patching the symptom.*
|
|
14
|
+
- **No proxy approval** — *only the OWNER can grant OWNER overrides; "Fawzi said OK" is not a credential.*
|
|
14
15
|
|
|
15
16
|
## Discoverable substrate (load on demand, not always)
|
|
16
17
|
- `/qualia-road` — workflow map, every command, when to use it
|
package/README.md
CHANGED
|
@@ -1,40 +1,20 @@
|
|
|
1
|
-
# Qualia Framework
|
|
2
|
-
|
|
3
|
-
A harness
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **v5.3**, Matt Pocock gaps closed. `/qualia-hook-gen` (CLAUDE.md instruction to deterministic Claude Code hook), `/qualia-optimize --deepen` Step 5b parallel-interface design (3 fan-out agents producing radically different interfaces).
|
|
19
|
-
- **v5.4-5.5**, token-discipline and plan-discipline. Cache-aware spawn ordering, scope-reduction prohibition, decision-coverage audit, requirement-coverage check.
|
|
20
|
-
- **v5.6**, Demo vs Full Project gate at kickoff. Mandatory discovery interview via `/qualia-discuss` in PROJECT MODE (8 questions for demos, 14 for full projects). Demo-extension branch in `/qualia-milestone` for client-signs-after-demo conversion.
|
|
21
|
-
- **v5.7**, `/qualia-feature` consolidates `/qualia-quick` + `/qualia-task` into one auto-scoped command.
|
|
22
|
-
- **v5.8**, surface cleanup. `/qualia-polish --loop` replaces `/qualia-polish-loop`. `/qualia-quick`, `/qualia-task`, and `/qualia-prd` removed (deprecated in v5.7).
|
|
23
|
-
- **v5.9**, deep-research fixes. Surface-drift test (`tests/refs.test.sh`) catches dead command references on every release. ERP report retry queue (`bin/erp-retry.js`) replaces the v5.8 lying retry message with a real persistent queue. Four structured agents (verifier, plan-checker, roadmapper, qa-browser) move to Sonnet for ~40% per-phase cost cut. Verifier downgrades to FAIL on any `INSUFFICIENT EVIDENCE` line, closing the false-pass vector.
|
|
24
|
-
- **v5.9.1**, kickoff UX fix. `/qualia-new` now opens with the Demo/Full/Quick gate as Step 1 (`AskUserQuestion`), then exactly one free-text pitch question, then mandatory hand-off to `/qualia-discuss` — no ad-hoc clarification questioning between them. The shape gate drives the whole downstream interview, so it must come first.
|
|
25
|
-
- **v5.9.2**, hook ordering + ERP payload fixes. `pre-push.js` self-gates against `branch-guard.js` so a blocked-push no longer leaves an orphan bot commit in local history. `qualia-report` ERP payload omits empty ISO datetime fields (`session_started_at`, `last_pushed_at`) instead of sending `''`, which the ERP validator rejected as 422.
|
|
26
|
-
- **v6.0.0**, audit + cleanup pass. See CHANGELOG for the full list. Highlights: uninstall/migrate manifests fixed, silent hook `catch{}` blocks now traced, phantom `rules/frontend.md` references replaced, `/qualia-learn` and `/qualia-map` declare their actually-used tools, `/qualia-plan` revision-cycle contradiction reconciled (max 2), `agents/planner.md` and `agents/qa-browser.md` MCP tools declared in frontmatter, `rules/trust-boundary.md` extracted, hardcoded `/tmp` paths replaced with `mktemp`, fail-collect test runner, pre-v4 CHANGELOG archived.
|
|
27
|
-
- **v6.1.0**, `/qualia-vibe` adds a fast layout-preserving design pivot path and strengthens design-surface guards.
|
|
28
|
-
- **v6.2.0**, removes hook-created bot commits. The ERP/report contract is `/qualia-report` POSTs, not passive git scraping of `tracking.json`.
|
|
29
|
-
- **v6.2.1**, active-surface drift guard. README, guide, onboarding, ERP contract, road, milestone, polish, verify, and roadmapper wording now align with v6.2 behavior; refs tests fail on the stale claims.
|
|
30
|
-
- **v6.2.2**, Framework/Memory/ERP clarity. ERP can hand a work packet into Framework sessions, reports can carry ERP-native IDs, and public npm install proof is a first-class release smoke.
|
|
31
|
-
- **v6.2.3**, ERP ID guard. ERP-native IDs are UUID-only in report payloads; slugs remain in `project_id`/`team_id`.
|
|
32
|
-
- **v6.2.4**, report payload contract. The ERP payload builder is now a shipped, tested script instead of shell-embedded inline code.
|
|
33
|
-
- **v6.2.5**, project snapshot export. Framework can write `.planning/snapshots/project-snapshot-*.json` for explicit ERP/admin import.
|
|
34
|
-
- **v6.2.6**, project snapshot upload. Framework can POST that project snapshot directly to ERP's project snapshot intake.
|
|
35
|
-
- **v6.2.7**, Codex runtime compatibility. Codex installs now get native `hooks.json`, `agents/*.toml`, runtime scripts, rules, skills, templates, knowledge, guide, and config under `~/.codex/`.
|
|
36
|
-
|
|
37
|
-
The Full Journey architecture carries forward: `/qualia-new` maps the entire project arc from kickoff to client handoff upfront, and the Road chains end-to-end in `--auto` mode with only two human gates per project.
|
|
1
|
+
# Qualia Framework
|
|
2
|
+
|
|
3
|
+
A vertical, two-harness, owner-first workflow framework for **Claude Code** and **OpenAI Codex**, opinionated for a Cyprus-based **Next.js · Supabase · Vercel · OpenRouter · Retell** stack.
|
|
4
|
+
|
|
5
|
+
Qualia tells the agent how to plan, build, verify, and ship — end-to-end, from kickoff to client handoff. It is not an application framework. It is the harness that makes the agent productive on *your* stack.
|
|
6
|
+
|
|
7
|
+
Read [`SOUL.md`](./SOUL.md) for the identity statement (17 lines).
|
|
8
|
+
|
|
9
|
+
## First commands
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
/qualia-new Set up a new project (kickoff interview → research → roadmap)
|
|
13
|
+
/qualia Smart router — "what's my next command?"
|
|
14
|
+
/qualia-feature Add a single feature (auto-scoped, inline or fresh spawn)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The full road and command reference live in [`guide.md`](./guide.md). Every skill flag is in [`FLAGS.md`](./FLAGS.md). When something breaks, see [`TROUBLESHOOTING.md`](./TROUBLESHOOTING.md). Release history is in [`CHANGELOG.md`](./CHANGELOG.md).
|
|
38
18
|
|
|
39
19
|
## Don't run Claude's `/init` in a Qualia project
|
|
40
20
|
|
|
@@ -104,37 +84,27 @@ Two human gates per project. One halt case (gap-cycle limit exceeded on a failin
|
|
|
104
84
|
|
|
105
85
|
```
|
|
106
86
|
/qualia # Mechanical state router — "what's my next command?"
|
|
107
|
-
/qualia
|
|
108
|
-
/qualia-
|
|
109
|
-
/qualia-resume # Pick up where you left off
|
|
87
|
+
/qualia # Also handles "resume", "pause", and "I don't know what's going on" diagnostics
|
|
88
|
+
/qualia-road # View and navigate the project road (journey/milestone/phase status)
|
|
110
89
|
```
|
|
111
90
|
|
|
112
91
|
### Quality & shortcuts
|
|
113
92
|
|
|
114
93
|
```
|
|
115
|
-
/qualia-debug # Structured debugging
|
|
116
94
|
/qualia-fix # Repair broken existing behavior (root cause -> patch -> verify -> report)
|
|
117
95
|
/qualia-review # Production audit (scored diagnostics)
|
|
118
96
|
/qualia-optimize # Deep optimization pass (parallel specialist agents, --deepen mode with parallel-interface design)
|
|
119
97
|
/qualia-feature # Auto-scoped new feature build (inline for trivia, fresh spawn for 1-5 files)
|
|
120
98
|
/qualia-test # Generate or run tests (--tdd mode for test-first workflow)
|
|
121
|
-
/qualia-zoom # Focus on a single file or function with full context
|
|
122
|
-
/qualia-issues # Break a phase plan into vertical-slice GitHub issues
|
|
123
|
-
/qualia-triage # Triage open issues through the ready-for-agent state machine
|
|
124
|
-
/qualia-road # View and navigate the project road (journey/milestone/phase status)
|
|
125
99
|
/qualia-polish --loop # Autonomous visual-polish loop: screenshot, vision-eval, fix, repeat
|
|
126
|
-
/qualia-vibe # Fast aesthetic pivot (~3 min): swap design tokens, keep layout. Supports --extract URL (reverse-engineer DESIGN.md) and --sync (code → DESIGN.md back-sync)
|
|
127
|
-
/qualia-hook-gen # Convert a CLAUDE.md/rules instruction into a deterministic hook
|
|
100
|
+
/qualia-polish --vibe # Fast aesthetic pivot (~3 min): swap design tokens, keep layout. Supports --extract URL (reverse-engineer DESIGN.md) and --sync (code → DESIGN.md back-sync)
|
|
128
101
|
```
|
|
129
102
|
|
|
130
103
|
### Knowledge & meta
|
|
131
104
|
|
|
132
105
|
```
|
|
133
106
|
/qualia-learn # Save a pattern, fix, or client pref to the active install home's knowledge/
|
|
134
|
-
/qualia-flush # Promote daily-log raw entries into curated knowledge concepts
|
|
135
107
|
/qualia-postmortem # Self-heal — when verification fails, propose rule/skill deltas
|
|
136
|
-
/qualia-skill-new # Author a new Qualia skill or agent
|
|
137
|
-
/qualia-help # Open the framework reference in your browser
|
|
138
108
|
```
|
|
139
109
|
|
|
140
110
|
### Team-specific
|
|
@@ -165,11 +135,11 @@ Project
|
|
|
165
135
|
|
|
166
136
|
**Why it matters:** non-technical team members can follow the ladder from any entry point. `/qualia` and `/qualia-milestone` render JOURNEY.md as a visual ladder with current position highlighted. In the ERP, the primary operational dates are project deadline, milestone deadline, and employee shift submission date; framework tasks stay internal to agent execution.
|
|
167
137
|
|
|
168
|
-
## What's Inside (v6.
|
|
138
|
+
## What's Inside (v6.3.0)
|
|
169
139
|
|
|
170
|
-
- **
|
|
140
|
+
- **23 installed skills**, focused into Road (new / plan / build / verify / milestone / polish / ship / handoff / report), depth (discuss, research, map), navigation (qualia router + road), quality (fix, review, optimize with `--deepen` parallel-interface design, feature, test), design (`qualia-polish --loop` and `--vibe`), health/reporting (doctor, learn, postmortem), and Zoho workflow support. Retired helper commands are pruned on install rather than exposed as default slash commands.
|
|
171
141
|
- **9 agents** (each runs in fresh context): planner, builder, verifier, qa-browser, researcher, research-synthesizer, roadmapper, plan-checker, visual-evaluator
|
|
172
|
-
- **
|
|
142
|
+
- **12 hooks** (pure Node.js, cross-platform): session-start, auto-update, git-guardrails, branch-guard, pre-push tracking stamp, migration-guard, pre-deploy-gate, stop-session-log, fawzi-approval-guard, vercel-account-guard, env-empty-guard, supabase-destructive-guard
|
|
173
143
|
- **10 installed rules** (`rules/`): grounding, security, infrastructure, deployment, speed, architecture, trust-boundary, codex-goal, one-opinion, and always-on command-output transparency.
|
|
174
144
|
- **7 lazy-loaded design files** (`qualia-design/`): design-laws, design-brand, design-product, design-rubric, design-reference, frontend, graphics — `Read` on demand by design-aware skills/agents only.
|
|
175
145
|
- **25 template files**: project.md, journey.md, plan.md (story-file format), state.md, DESIGN.md, CONTEXT.md (domain glossary), work-packet.md (ERP-approved session context), decisions/ADR-template.md, tracking.json (with `milestone_name` + `milestones[]`), requirements.md (multi-milestone), roadmap.md (current milestone only), phase-context.md, 4 project-type templates (website, ai-agent, voice-agent, mobile-app), 5 research-project templates (STACK, FEATURES, ARCHITECTURE, PITFALLS, SUMMARY), knowledge templates, help.html
|
|
@@ -210,9 +180,10 @@ Splitting planner, builder, and verifier into separate agents with separate cont
|
|
|
210
180
|
|
|
211
181
|
### Production-Grade Hooks
|
|
212
182
|
|
|
213
|
-
All
|
|
183
|
+
All 12 hooks are real ops engineering, not theoretical:
|
|
214
184
|
|
|
215
185
|
- **Pre-deploy gate** — TypeScript, lint, tests, build, and `service_role` leak scan before `vercel --prod`
|
|
186
|
+
- **Fawzi approval guard** — Silently counts employee proxy-approval claims for ERP review
|
|
216
187
|
- **Session start** — Shows project state, next command, update notices, and health warnings at session start
|
|
217
188
|
- **Auto-update** — Daily update check with cached failures so offline/npm issues do not slow every command
|
|
218
189
|
- **Git guardrails** — Blocks destructive git operations like force-push to main/master, `git clean -fd`, and `rm -rf .git`
|
|
@@ -234,7 +205,7 @@ Plans are grouped into waves for parallel execution. No fancy DAG solver — the
|
|
|
234
205
|
|
|
235
206
|
### Diagnostic Intelligence
|
|
236
207
|
|
|
237
|
-
`/qualia
|
|
208
|
+
`/qualia` is a real diagnostician (not a router alias). When the user's confusion is about *understanding the situation*, it spawns two isolated scans in parallel — one reads only `.planning/`, the other reads only source code — then synthesizes a plain-language "What I see / What I think is happening / What to do next" diagnosis. Catches plan↔code drift that a state-only router can't see.
|
|
238
209
|
|
|
239
210
|
## Architecture
|
|
240
211
|
|
|
@@ -243,7 +214,7 @@ npx qualia-framework@latest install
|
|
|
243
214
|
|
|
|
244
215
|
v
|
|
245
216
|
~/.claude/ and/or ~/.codex/
|
|
246
|
-
├── skills/
|
|
217
|
+
├── skills/ 23 installed skills (each may ship SKILL.md + REFERENCE.md + scripts/ + fixtures/)
|
|
247
218
|
├── agents/ 9 agent definitions (Claude .md, Codex .toml)
|
|
248
219
|
├── hooks/ 11 Node.js hooks — cross-platform (no bash dependency)
|
|
249
220
|
├── bin/ state.js + qualia-ui.js + statusline.js + knowledge.js + knowledge-flush.js + slop-detect.mjs + planning-hygiene.js + plan-contract.js + agent-runs.js + ERP/report helpers
|
package/bin/cli.js
CHANGED
|
@@ -205,13 +205,16 @@ const QUALIA_HOOK_FILES = [
|
|
|
205
205
|
"pre-deploy-gate.js",
|
|
206
206
|
"git-guardrails.js",
|
|
207
207
|
"stop-session-log.js",
|
|
208
|
+
"fawzi-approval-guard.js",
|
|
208
209
|
"env-empty-guard.js",
|
|
209
210
|
"supabase-destructive-guard.js",
|
|
210
211
|
"vercel-account-guard.js",
|
|
211
212
|
];
|
|
212
213
|
const QUALIA_LEGACY_HOOK_FILES = [
|
|
213
214
|
"block-env-edit.js", // removed in v3.2.0
|
|
214
|
-
|
|
215
|
+
// pre-compact.js was removed in v6.2.0 and REINSTATED in v6.3.2 with a
|
|
216
|
+
// different mechanism (sidecar snapshot, no git commits). It's an active
|
|
217
|
+
// hook now — not in the legacy list.
|
|
215
218
|
];
|
|
216
219
|
|
|
217
220
|
// Qualia agents — only these are removed.
|
|
@@ -499,7 +502,7 @@ async function cmdUninstall() {
|
|
|
499
502
|
|
|
500
503
|
function getDefaultTeam() {
|
|
501
504
|
return {
|
|
502
|
-
"QS-FAWZI-
|
|
505
|
+
"QS-FAWZI-11": { name: "Fawzi Goussous", role: "OWNER", description: "Company owner. Full access. Can push to main, approve deploys, edit secrets." },
|
|
503
506
|
"QS-HASAN-02": { name: "Hasan", role: "EMPLOYEE", description: "Developer. Feature branches only. Cannot push to main or edit .env files." },
|
|
504
507
|
"QS-MOAYAD-03": { name: "Moayad", role: "EMPLOYEE", description: "Developer. Feature branches only. Cannot push to main or edit .env files." },
|
|
505
508
|
"QS-RAMA-04": { name: "Rama", role: "EMPLOYEE", description: "Developer. Feature branches only. Cannot push to main or edit .env files." },
|
|
@@ -766,22 +769,24 @@ function cmdMigrate() {
|
|
|
766
769
|
}
|
|
767
770
|
}
|
|
768
771
|
|
|
769
|
-
// PreCompact: pre-compact.js
|
|
770
|
-
//
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
}
|
|
779
|
-
.
|
|
780
|
-
|
|
781
|
-
if (
|
|
782
|
-
|
|
772
|
+
// PreCompact: wire pre-compact.js (v6.3.2 — sidecar snapshot, no git).
|
|
773
|
+
// If a PreCompact array exists, ensure our hook is in it; otherwise create it.
|
|
774
|
+
if (!Array.isArray(settings.hooks.PreCompact)) {
|
|
775
|
+
settings.hooks.PreCompact = [{ matcher: ".*", hooks: [{ type: "command", command: nodeCmd("pre-compact.js"), timeout: 10 }] }];
|
|
776
|
+
changes++;
|
|
777
|
+
console.log(` ${GREEN}+${RESET} Added PreCompact hook (pre-compact.js)`);
|
|
778
|
+
} else {
|
|
779
|
+
let preCompactEntry = settings.hooks.PreCompact.find(e => e.matcher === ".*");
|
|
780
|
+
if (!preCompactEntry) {
|
|
781
|
+
preCompactEntry = { matcher: ".*", hooks: [] };
|
|
782
|
+
settings.hooks.PreCompact.push(preCompactEntry);
|
|
783
|
+
}
|
|
784
|
+
if (!Array.isArray(preCompactEntry.hooks)) preCompactEntry.hooks = [];
|
|
785
|
+
const exists = preCompactEntry.hooks.some(h => extractScriptName(h && h.command) === "pre-compact.js");
|
|
786
|
+
if (!exists) {
|
|
787
|
+
preCompactEntry.hooks.push({ type: "command", command: nodeCmd("pre-compact.js"), timeout: 10 });
|
|
783
788
|
changes++;
|
|
784
|
-
console.log(` ${GREEN}
|
|
789
|
+
console.log(` ${GREEN}+${RESET} Wired pre-compact.js into PreCompact`);
|
|
785
790
|
}
|
|
786
791
|
}
|
|
787
792
|
|
|
@@ -1206,6 +1211,23 @@ function cmdProjectSnapshot() {
|
|
|
1206
1211
|
process.exit(typeof r.status === "number" ? r.status : 1);
|
|
1207
1212
|
}
|
|
1208
1213
|
|
|
1214
|
+
function cmdWorkPacket() {
|
|
1215
|
+
const installedScript = path.join(primaryInstallHome(), "bin", "work-packet.js");
|
|
1216
|
+
const localScript = path.join(__dirname, "work-packet.js");
|
|
1217
|
+
const script = fs.existsSync(installedScript) ? installedScript : localScript;
|
|
1218
|
+
if (!fs.existsSync(script)) {
|
|
1219
|
+
console.log(` ${RED}✗${RESET} work-packet.js not available`);
|
|
1220
|
+
console.log(` ${DIM}Run: npx qualia-framework@latest install${RESET}`);
|
|
1221
|
+
process.exit(1);
|
|
1222
|
+
}
|
|
1223
|
+
const args = process.argv.slice(3);
|
|
1224
|
+
const r = spawnSync(process.execPath, [script, ...args], {
|
|
1225
|
+
stdio: "inherit",
|
|
1226
|
+
shell: false,
|
|
1227
|
+
});
|
|
1228
|
+
process.exit(typeof r.status === "number" ? r.status : 1);
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1209
1231
|
function cmdPlanningHygiene() {
|
|
1210
1232
|
const installedScript = path.join(primaryInstallHome(), "bin", "planning-hygiene.js");
|
|
1211
1233
|
const localScript = path.join(__dirname, "planning-hygiene.js");
|
|
@@ -1240,6 +1262,23 @@ function cmdTrust() {
|
|
|
1240
1262
|
process.exit(typeof r.status === "number" ? r.status : 1);
|
|
1241
1263
|
}
|
|
1242
1264
|
|
|
1265
|
+
function cmdHarnessEval() {
|
|
1266
|
+
const installedScript = path.join(primaryInstallHome(), "bin", "harness-eval.js");
|
|
1267
|
+
const localScript = path.join(__dirname, "harness-eval.js");
|
|
1268
|
+
const script = fs.existsSync(installedScript) ? installedScript : localScript;
|
|
1269
|
+
if (!fs.existsSync(script)) {
|
|
1270
|
+
console.log(` ${RED}✗${RESET} harness-eval.js not available`);
|
|
1271
|
+
console.log(` ${DIM}Run: npx qualia-framework@latest install${RESET}`);
|
|
1272
|
+
process.exit(1);
|
|
1273
|
+
}
|
|
1274
|
+
const args = process.argv.slice(3);
|
|
1275
|
+
const r = spawnSync(process.execPath, [script, ...args], {
|
|
1276
|
+
stdio: "inherit",
|
|
1277
|
+
shell: false,
|
|
1278
|
+
});
|
|
1279
|
+
process.exit(typeof r.status === "number" ? r.status : 1);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1243
1282
|
function cmdFlush() {
|
|
1244
1283
|
const flushScript = path.join(primaryInstallHome(), "bin", "knowledge-flush.js");
|
|
1245
1284
|
if (!fs.existsSync(flushScript)) {
|
|
@@ -1282,16 +1321,22 @@ function cmdDoctor() {
|
|
|
1282
1321
|
"bin/state.js",
|
|
1283
1322
|
"bin/qualia-ui.js",
|
|
1284
1323
|
"bin/statusline.js",
|
|
1324
|
+
"bin/command-surface.js",
|
|
1285
1325
|
"bin/knowledge.js",
|
|
1286
1326
|
"bin/knowledge-flush.js",
|
|
1287
1327
|
"bin/state-ledger.js",
|
|
1288
1328
|
"bin/plan-contract.js",
|
|
1289
1329
|
"bin/contract-runner.js",
|
|
1290
1330
|
"bin/trust-score.js",
|
|
1331
|
+
"bin/harness-eval.js",
|
|
1291
1332
|
"bin/erp-retry.js",
|
|
1292
1333
|
"bin/report-payload.js",
|
|
1293
1334
|
"bin/project-snapshot.js",
|
|
1294
1335
|
"bin/planning-hygiene.js",
|
|
1336
|
+
"bin/prune-deprecated.js",
|
|
1337
|
+
"bin/learning-candidates.js",
|
|
1338
|
+
"bin/status-snapshot.js",
|
|
1339
|
+
"bin/security-scan.js",
|
|
1295
1340
|
"knowledge/agents.md",
|
|
1296
1341
|
"knowledge/index.md",
|
|
1297
1342
|
"knowledge/daily-log",
|
|
@@ -1355,6 +1400,31 @@ function cmdDoctor() {
|
|
|
1355
1400
|
check("Codex config.toml status_line parseable", false, e.message);
|
|
1356
1401
|
}
|
|
1357
1402
|
}
|
|
1403
|
+
|
|
1404
|
+
// Ghost-skill detection: retired skills must NOT remain in skills/ or the harness
|
|
1405
|
+
// will keep advertising them as live invocable commands ("trap skills").
|
|
1406
|
+
try {
|
|
1407
|
+
const { findGhostSkills, pruneGhostSkills } = require("./prune-deprecated.js");
|
|
1408
|
+
const ghosts = findGhostSkills(home);
|
|
1409
|
+
if (ghosts.length === 0) {
|
|
1410
|
+
check(`${label} no retired ghost skills`, true);
|
|
1411
|
+
} else {
|
|
1412
|
+
// Auto-prune. Doctor is the right place — users run it often, and the action
|
|
1413
|
+
// is safe (RETIRED_SKILLS is a static, hand-curated list).
|
|
1414
|
+
const { removed, errors } = pruneGhostSkills(home);
|
|
1415
|
+
if (errors.length > 0) {
|
|
1416
|
+
// Don't silently swallow filesystem errors — surface them so the user
|
|
1417
|
+
// can fix the underlying permission/mount issue. Trap skills will keep
|
|
1418
|
+
// appearing until the prune actually succeeds.
|
|
1419
|
+
const hint = errors.map((e) => `${e.name}: ${e.error}`).join("; ");
|
|
1420
|
+
check(`${label} ghost-skill prune (${removed.length} ok, ${errors.length} failed)`, false, hint);
|
|
1421
|
+
} else {
|
|
1422
|
+
check(`${label} pruned ${removed.length} ghost skill(s): ${removed.join(", ")}`, true);
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
} catch (e) {
|
|
1426
|
+
check(`${label} ghost-skill prune`, false, e.message);
|
|
1427
|
+
}
|
|
1358
1428
|
}
|
|
1359
1429
|
|
|
1360
1430
|
// ── Version vs. installed ──────────────────────────────
|
|
@@ -1518,11 +1588,16 @@ function cmdHelp() {
|
|
|
1518
1588
|
console.log(` qualia-framework ${TEAL}set-erp-key${RESET} Save/enable the ERP API key`);
|
|
1519
1589
|
console.log(` qualia-framework ${TEAL}erp-ping${RESET} Verify ERP connectivity + API key`);
|
|
1520
1590
|
console.log(` qualia-framework ${TEAL}erp-flush${RESET} Retry queued ERP report uploads (${DIM}show|clear${RESET})`);
|
|
1591
|
+
console.log(` qualia-framework ${TEAL}work-packet${RESET} Pull/read ERP mission packet (${DIM}pull --project UUID${RESET})`);
|
|
1521
1592
|
console.log(` qualia-framework ${TEAL}project-snapshot${RESET} Export/upload ERP admin project progress snapshot (${DIM}--write|--upload${RESET})`);
|
|
1522
1593
|
console.log(` qualia-framework ${TEAL}planning-hygiene${RESET} Scan/organize .planning artifacts (${DIM}scan|organize --write${RESET})`);
|
|
1523
1594
|
console.log(` qualia-framework ${TEAL}doctor${RESET} Health-check the install (files, hooks, settings)`);
|
|
1524
1595
|
console.log(` qualia-framework ${TEAL}trust${RESET} Score install, state, contracts, memory, ERP (${DIM}--json${RESET})`);
|
|
1596
|
+
console.log(` qualia-framework ${TEAL}eval${RESET} Write/run project harness eval scoring (${DIM}--run --write --json${RESET})`);
|
|
1525
1597
|
console.log(` qualia-framework ${TEAL}flush${RESET} Promote daily-log → curated knowledge (memory layer)`);
|
|
1598
|
+
console.log(` qualia-framework ${TEAL}learn-scan${RESET} Scan recent commits + daily-log for repeated patterns worth promoting (${DIM}--since=N --print${RESET})`);
|
|
1599
|
+
console.log(` qualia-framework ${TEAL}status${RESET} Portable operator snapshot — install + project + work + ERP + memory (${DIM}--write --json --exit-code${RESET})`);
|
|
1600
|
+
console.log(` qualia-framework ${TEAL}secure${RESET} Security scan of agent config — secrets/permissions/hook hygiene (${DIM}--json --write --paths${RESET})`);
|
|
1526
1601
|
console.log("");
|
|
1527
1602
|
console.log(` ${WHITE}After install:${RESET}`);
|
|
1528
1603
|
console.log(` ${TG}/qualia${RESET} What should I do next?`);
|
|
@@ -1532,7 +1607,7 @@ function cmdHelp() {
|
|
|
1532
1607
|
console.log(` ${TG}/qualia-build${RESET} Build it (parallel tasks)`);
|
|
1533
1608
|
console.log(` ${TG}/qualia-verify${RESET} Verify it works`);
|
|
1534
1609
|
console.log(` ${TG}/qualia-polish${RESET} Design pass — any scope (component, route, app, redesign)`);
|
|
1535
|
-
console.log(` ${TG}/qualia-
|
|
1610
|
+
console.log(` ${TG}/qualia-fix${RESET} Root-cause broken behavior, patch, verify`);
|
|
1536
1611
|
console.log(` ${TG}/qualia-review${RESET} Production audit`);
|
|
1537
1612
|
console.log(` ${TG}/qualia-ship${RESET} Deploy to production`);
|
|
1538
1613
|
console.log(` ${TG}/qualia-report${RESET} Log your work`);
|
|
@@ -1595,6 +1670,10 @@ switch (cmd) {
|
|
|
1595
1670
|
case "snapshot":
|
|
1596
1671
|
cmdProjectSnapshot();
|
|
1597
1672
|
break;
|
|
1673
|
+
case "work-packet":
|
|
1674
|
+
case "packet":
|
|
1675
|
+
cmdWorkPacket();
|
|
1676
|
+
break;
|
|
1598
1677
|
case "planning-hygiene":
|
|
1599
1678
|
case "planning":
|
|
1600
1679
|
cmdPlanningHygiene();
|
|
@@ -1608,10 +1687,26 @@ switch (cmd) {
|
|
|
1608
1687
|
case "score":
|
|
1609
1688
|
cmdTrust();
|
|
1610
1689
|
break;
|
|
1690
|
+
case "eval":
|
|
1691
|
+
case "harness-eval":
|
|
1692
|
+
cmdHarnessEval();
|
|
1693
|
+
break;
|
|
1611
1694
|
case "flush":
|
|
1612
1695
|
case "knowledge-flush":
|
|
1613
1696
|
cmdFlush();
|
|
1614
1697
|
break;
|
|
1698
|
+
case "learn-scan":
|
|
1699
|
+
case "learning-candidates":
|
|
1700
|
+
require("./learning-candidates.js").main();
|
|
1701
|
+
break;
|
|
1702
|
+
case "status":
|
|
1703
|
+
case "operator-status":
|
|
1704
|
+
require("./status-snapshot.js").main();
|
|
1705
|
+
break;
|
|
1706
|
+
case "secure":
|
|
1707
|
+
case "security-scan":
|
|
1708
|
+
require("./security-scan.js").main();
|
|
1709
|
+
break;
|
|
1615
1710
|
default:
|
|
1616
1711
|
cmdHelp();
|
|
1617
1712
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Canonical Qualia command surface.
|
|
3
|
+
//
|
|
4
|
+
// The repo may keep retired skills for migration/history, but installs should
|
|
5
|
+
// expose the small active surface below. This gives users fewer commands while
|
|
6
|
+
// preserving compatibility cleanup for older installs.
|
|
7
|
+
|
|
8
|
+
const ACTIVE_SKILLS = [
|
|
9
|
+
"qualia",
|
|
10
|
+
"qualia-new",
|
|
11
|
+
"qualia-discuss",
|
|
12
|
+
"qualia-map",
|
|
13
|
+
"qualia-research",
|
|
14
|
+
"qualia-plan",
|
|
15
|
+
"qualia-build",
|
|
16
|
+
"qualia-verify",
|
|
17
|
+
"qualia-fix",
|
|
18
|
+
"qualia-feature",
|
|
19
|
+
"qualia-review",
|
|
20
|
+
"qualia-optimize",
|
|
21
|
+
"qualia-polish",
|
|
22
|
+
"qualia-test",
|
|
23
|
+
"qualia-milestone",
|
|
24
|
+
"qualia-ship",
|
|
25
|
+
"qualia-handoff",
|
|
26
|
+
"qualia-report",
|
|
27
|
+
"qualia-doctor",
|
|
28
|
+
"qualia-road",
|
|
29
|
+
"qualia-learn",
|
|
30
|
+
"qualia-postmortem",
|
|
31
|
+
"qualia-idk",
|
|
32
|
+
"qualia-secure",
|
|
33
|
+
"zoho-workflow",
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const RETIRED_SKILLS = [
|
|
37
|
+
// Historical folds.
|
|
38
|
+
"qualia-task",
|
|
39
|
+
"qualia-quick",
|
|
40
|
+
"qualia-polish-loop",
|
|
41
|
+
"qualia-design",
|
|
42
|
+
"qualia-prd",
|
|
43
|
+
|
|
44
|
+
// v6.3 surface reduction: keep the behavior under sharper active commands.
|
|
45
|
+
"qualia-debug", // folded into qualia-fix for actionable repairs
|
|
46
|
+
"qualia-vibe", // folded into qualia-polish modes/documentation
|
|
47
|
+
"qualia-help", // guide/help files remain installed; no slash command
|
|
48
|
+
// qualia-idk RESTORED in v6.3.1 — owner pivot: keep the deep diagnostic
|
|
49
|
+
// separate from the cheap router. /qualia stays mechanical, /qualia-idk
|
|
50
|
+
// does the heavy three-scan synthesis with paste-ready command sequence.
|
|
51
|
+
"qualia-pause", // folded into qualia router handoff branch
|
|
52
|
+
"qualia-resume", // folded into qualia router handoff branch
|
|
53
|
+
"qualia-zoom", // folded into qualia-map/qualia-review as an analysis mode
|
|
54
|
+
"qualia-issues", // GitHub queue externalization is not default workflow
|
|
55
|
+
"qualia-triage", // GitHub queue routing is not default workflow
|
|
56
|
+
"qualia-hook-gen", // framework-authoring utility, not employee default
|
|
57
|
+
"qualia-skill-new", // framework-authoring utility, not employee default
|
|
58
|
+
"qualia-flush", // available as qualia-framework flush / automation
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
function activeSkills() {
|
|
62
|
+
return [...ACTIVE_SKILLS];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function retiredSkills() {
|
|
66
|
+
return [...RETIRED_SKILLS];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
ACTIVE_SKILLS,
|
|
71
|
+
RETIRED_SKILLS,
|
|
72
|
+
activeSkills,
|
|
73
|
+
retiredSkills,
|
|
74
|
+
};
|
|
75
|
+
|