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 CHANGED
@@ -393,9 +393,15 @@ function cmdTransition(opts) {
393
393
  { ...opts, phase }
394
394
  );
395
395
  if (!check.ok) {
396
- // Force only bypasses status-ordering errors (PRECONDITION_FAILED, GAP_CYCLE_LIMIT).
397
- // Never bypass MISSING_FILE, MISSING_ARG, INVALID_PLAN those cause broken state.
398
- const forceableErrors = ["PRECONDITION_FAILED", "GAP_CYCLE_LIMIT"];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qualia-framework",
3
- "version": "3.3.0",
3
+ "version": "3.3.2",
4
4
  "description": "Claude Code workflow framework by Qualia Solutions. Plan, build, verify, ship.",
5
5
  "bin": {
6
6
  "qualia-framework": "./bin/cli.js"
@@ -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/qualia-roadmapper.md
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/qualia-researcher.md
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/qualia-researcher.md
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/qualia-researcher.md
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/qualia-researcher.md
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/qualia-research-synthesizer.md
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/qualia-roadmapper.md
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
- node ~/.claude/qualia-framework/bin/qualia-tools.js commit "docs: optimization report ({mode} mode, {critical} critical)" --files .planning/OPTIMIZE.md
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/qualia-planner.md
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/qualia-plan-checker.md
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/qualia-planner.md
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>
@@ -50,7 +50,7 @@ Wait for their answer. Their answer defines the research question.
50
50
 
51
51
  ```
52
52
  Agent(prompt="
53
- Read your role: @~/.claude/agents/qualia-researcher.md
53
+ Read your role: @~/.claude/agents/researcher.md
54
54
 
55
55
  <dimension>phase-specific</dimension>
56
56
 
package/tests/runner.js CHANGED
@@ -774,14 +774,31 @@ waves: 1
774
774
  }
775
775
  });
776
776
 
777
- it("--force does NOT bypass INVALID_PLAN", () => {
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, "INVALID_PLAN");
801
+ assert.equal(out.error, "MISSING_FILE");
785
802
  } finally {
786
803
  fs.rmSync(tmpDir, { recursive: true, force: true });
787
804
  }