qualia-framework 3.3.0 → 3.3.2
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/bin/state.js +9 -3
- package/package.json +1 -1
- package/skills/qualia-milestone/SKILL.md +1 -1
- package/skills/qualia-new/SKILL.md +6 -6
- package/skills/qualia-optimize/SKILL.md +1 -1
- package/skills/qualia-plan/SKILL.md +3 -3
- package/skills/qualia-research/SKILL.md +1 -1
- package/tests/runner.js +19 -2
package/bin/state.js
CHANGED
|
@@ -393,9 +393,15 @@ function cmdTransition(opts) {
|
|
|
393
393
|
{ ...opts, phase }
|
|
394
394
|
);
|
|
395
395
|
if (!check.ok) {
|
|
396
|
-
// Force
|
|
397
|
-
//
|
|
398
|
-
|
|
396
|
+
// Force bypasses status-ordering errors AND plan-content errors. The use case
|
|
397
|
+
// is retroactive bookkeeping: a phase was built without /qualia-plan and the
|
|
398
|
+
// user is catching STATE.md up to reality. `--force` never bypasses MISSING_FILE
|
|
399
|
+
// or MISSING_ARG — those would leave the state machine pointing at nothing.
|
|
400
|
+
const forceableErrors = [
|
|
401
|
+
"PRECONDITION_FAILED",
|
|
402
|
+
"GAP_CYCLE_LIMIT",
|
|
403
|
+
"INVALID_PLAN",
|
|
404
|
+
];
|
|
399
405
|
if (opts.force && forceableErrors.includes(check.error)) {
|
|
400
406
|
console.error(`WARNING: Forcing transition despite: ${check.message}`);
|
|
401
407
|
} else {
|
package/package.json
CHANGED
|
@@ -86,7 +86,7 @@ Spawn the roadmapper to create a new ROADMAP.md for the next milestone:
|
|
|
86
86
|
|
|
87
87
|
```
|
|
88
88
|
Agent(prompt="
|
|
89
|
-
Read your role: @~/.claude/agents/
|
|
89
|
+
Read your role: @~/.claude/agents/roadmapper.md
|
|
90
90
|
|
|
91
91
|
<task>
|
|
92
92
|
Create a new ROADMAP.md for the next milestone.
|
|
@@ -236,7 +236,7 @@ mkdir -p .planning/research
|
|
|
236
236
|
|
|
237
237
|
```
|
|
238
238
|
Agent(prompt="
|
|
239
|
-
Read your role: @~/.claude/agents/
|
|
239
|
+
Read your role: @~/.claude/agents/researcher.md
|
|
240
240
|
|
|
241
241
|
<dimension>stack</dimension>
|
|
242
242
|
<domain>{inferred domain from PROJECT.md}</domain>
|
|
@@ -246,7 +246,7 @@ Read your role: @~/.claude/agents/qualia-researcher.md
|
|
|
246
246
|
", subagent_type="qualia-researcher", description="Stack research")
|
|
247
247
|
|
|
248
248
|
Agent(prompt="
|
|
249
|
-
Read your role: @~/.claude/agents/
|
|
249
|
+
Read your role: @~/.claude/agents/researcher.md
|
|
250
250
|
|
|
251
251
|
<dimension>features</dimension>
|
|
252
252
|
<domain>{inferred domain}</domain>
|
|
@@ -256,7 +256,7 @@ Read your role: @~/.claude/agents/qualia-researcher.md
|
|
|
256
256
|
", subagent_type="qualia-researcher", description="Features research")
|
|
257
257
|
|
|
258
258
|
Agent(prompt="
|
|
259
|
-
Read your role: @~/.claude/agents/
|
|
259
|
+
Read your role: @~/.claude/agents/researcher.md
|
|
260
260
|
|
|
261
261
|
<dimension>architecture</dimension>
|
|
262
262
|
<domain>{inferred domain}</domain>
|
|
@@ -266,7 +266,7 @@ Read your role: @~/.claude/agents/qualia-researcher.md
|
|
|
266
266
|
", subagent_type="qualia-researcher", description="Architecture research")
|
|
267
267
|
|
|
268
268
|
Agent(prompt="
|
|
269
|
-
Read your role: @~/.claude/agents/
|
|
269
|
+
Read your role: @~/.claude/agents/researcher.md
|
|
270
270
|
|
|
271
271
|
<dimension>pitfalls</dimension>
|
|
272
272
|
<domain>{inferred domain}</domain>
|
|
@@ -280,7 +280,7 @@ Read your role: @~/.claude/agents/qualia-researcher.md
|
|
|
280
280
|
|
|
281
281
|
```
|
|
282
282
|
Agent(prompt="
|
|
283
|
-
Read your role: @~/.claude/agents/
|
|
283
|
+
Read your role: @~/.claude/agents/research-synthesizer.md
|
|
284
284
|
|
|
285
285
|
Merge the 4 research files at .planning/research/ into .planning/research/SUMMARY.md.
|
|
286
286
|
Include roadmap implications.
|
|
@@ -332,7 +332,7 @@ Spawn the roadmapper agent:
|
|
|
332
332
|
|
|
333
333
|
```
|
|
334
334
|
Agent(prompt="
|
|
335
|
-
Read your role: @~/.claude/agents/
|
|
335
|
+
Read your role: @~/.claude/agents/roadmapper.md
|
|
336
336
|
|
|
337
337
|
<task>
|
|
338
338
|
Create REQUIREMENTS.md and ROADMAP.md for this project.
|
|
@@ -367,7 +367,7 @@ status: {clean|needs_attention|critical_issues}
|
|
|
367
367
|
|
|
368
368
|
Commit:
|
|
369
369
|
```bash
|
|
370
|
-
|
|
370
|
+
git add .planning/OPTIMIZE.md && git commit -m "docs: optimization report ({mode} mode, {critical} critical)"
|
|
371
371
|
```
|
|
372
372
|
|
|
373
373
|
**Present results:**
|
|
@@ -61,7 +61,7 @@ Spawn the planner:
|
|
|
61
61
|
|
|
62
62
|
```
|
|
63
63
|
Agent(prompt="
|
|
64
|
-
Read your role: @~/.claude/agents/
|
|
64
|
+
Read your role: @~/.claude/agents/planner.md
|
|
65
65
|
|
|
66
66
|
<project_context>
|
|
67
67
|
@.planning/PROJECT.md
|
|
@@ -104,7 +104,7 @@ Read the generated plan. Spawn the plan-checker:
|
|
|
104
104
|
|
|
105
105
|
```
|
|
106
106
|
Agent(prompt="
|
|
107
|
-
Read your role: @~/.claude/agents/
|
|
107
|
+
Read your role: @~/.claude/agents/plan-checker.md
|
|
108
108
|
|
|
109
109
|
<plan_path>.planning/phase-{N}-plan.md</plan_path>
|
|
110
110
|
<phase_goal>{goal from ROADMAP.md}</phase_goal>
|
|
@@ -125,7 +125,7 @@ For each revision:
|
|
|
125
125
|
|
|
126
126
|
```
|
|
127
127
|
Agent(prompt="
|
|
128
|
-
Read your role: @~/.claude/agents/
|
|
128
|
+
Read your role: @~/.claude/agents/planner.md
|
|
129
129
|
|
|
130
130
|
<revision_mode>true</revision_mode>
|
|
131
131
|
<current_plan>@.planning/phase-{N}-plan.md</current_plan>
|
package/tests/runner.js
CHANGED
|
@@ -774,14 +774,31 @@ waves: 1
|
|
|
774
774
|
}
|
|
775
775
|
});
|
|
776
776
|
|
|
777
|
-
it("--force
|
|
777
|
+
it("--force bypasses INVALID_PLAN (retroactive bookkeeping)", () => {
|
|
778
|
+
// Use case: a phase was built without /qualia-plan and the user is
|
|
779
|
+
// catching STATE.md up to reality. The plan file exists as documentation
|
|
780
|
+
// but lacks `**Done when:**` markers — that should not block --force.
|
|
778
781
|
const tmpDir = makeProject();
|
|
779
782
|
try {
|
|
780
783
|
fs.writeFileSync(path.join(tmpDir, ".planning", "phase-1-plan.md"), "# No tasks here");
|
|
784
|
+
const r = runState(["transition", "--to", "planned", "--force"], tmpDir);
|
|
785
|
+
assert.equal(r.status, 0);
|
|
786
|
+
const out = JSON.parse(r.stdout);
|
|
787
|
+
assert.equal(out.ok, true);
|
|
788
|
+
assert.equal(out.status, "planned");
|
|
789
|
+
} finally {
|
|
790
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
791
|
+
}
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
it("--force still rejects MISSING_FILE", () => {
|
|
795
|
+
// Sanity: --force unblocks plan-content errors but not "no plan at all".
|
|
796
|
+
const tmpDir = makeProject();
|
|
797
|
+
try {
|
|
781
798
|
const r = runState(["transition", "--to", "planned", "--force"], tmpDir);
|
|
782
799
|
assert.equal(r.status, 1);
|
|
783
800
|
const out = JSON.parse(r.stdout);
|
|
784
|
-
assert.equal(out.error, "
|
|
801
|
+
assert.equal(out.error, "MISSING_FILE");
|
|
785
802
|
} finally {
|
|
786
803
|
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
787
804
|
}
|