orchestrix 16.1.1 → 16.1.3

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.
@@ -189,19 +189,57 @@ This creates a tmux session with 4 windows:
189
189
 
190
190
  ### HANDOFF Auto-Collaboration Flow
191
191
 
192
+ The HANDOFF chain depends on the story's **test_design_level** (set by SM based on complexity):
193
+
194
+ #### Standard/Comprehensive Stories (most stories)
195
+
192
196
  ```
193
197
  SM (win 1) *draft → Create Story
194
198
  ↓ 🎯 HANDOFF TO architect: *review {story_id}
195
199
  Architect (win 0) → Technical review
200
+ ↓ 🎯 HANDOFF TO qa: *test-design {story_id}
201
+ QA (win 3) → Design test scenarios & strategy BEFORE development
196
202
  ↓ 🎯 HANDOFF TO dev: *develop-story {story_id}
197
- Dev (win 2) → Code implementation
203
+ Dev (win 2) → Code implementation (guided by QA's test design)
198
204
  ↓ 🎯 HANDOFF TO qa: *review {story_id}
199
- QA (win 3) → Code review
200
- ↓ 🎯 HANDOFF TO sm: *draft (next Story)
205
+ QA (win 3) → Review implementation against test design
206
+ pass → 🎯 HANDOFF TO sm: *draft (next Story)
207
+ ↓ fail → 🎯 HANDOFF TO dev: *apply-qa-fixes {story_id}
201
208
  SM (win 1) → Create next Story
202
209
  ↓ ... loop until all stories complete
203
210
  ```
204
211
 
212
+ #### Simple Stories (low complexity, no security concerns)
213
+
214
+ ```
215
+ SM (win 1) *draft → Create Story
216
+ ↓ 🎯 HANDOFF TO architect: *review {story_id}
217
+ Architect (win 0) → Technical review
218
+ ↓ 🎯 HANDOFF TO dev: *develop-story {story_id} (skip test-design)
219
+ Dev (win 2) → Code implementation
220
+ ↓ 🎯 HANDOFF TO qa: *review {story_id}
221
+ QA (win 3) → Review implementation
222
+ ↓ ... same as above
223
+ ```
224
+
225
+ #### Quick Mode Stories (trivial, skip Architect + test-design)
226
+
227
+ ```
228
+ SM (win 1) *draft → Create Story (mode=quick)
229
+ ↓ 🎯 HANDOFF TO dev: *quick-develop {story_id}
230
+ Dev (win 2) → Quick implementation
231
+ ↓ 🎯 HANDOFF TO qa: *quick-verify {story_id}
232
+ QA (win 3) → Lightweight verification
233
+ ↓ ... next story
234
+ ```
235
+
236
+ #### QA Feedback Loops
237
+
238
+ When QA finds issues:
239
+ - **Code issues** → `🎯 HANDOFF TO dev: *apply-qa-fixes {story_id}` → Dev fixes → QA re-reviews
240
+ - **Architecture concerns** → `🎯 HANDOFF TO architect: *review-escalation {story_id}` → Architect resolves → back to Dev
241
+ - **Story issues** → `🎯 HANDOFF TO sm: *revise-story {story_id}` → SM revises → restart from Architect
242
+
205
243
  ### Monitoring
206
244
 
207
245
  ```bash
@@ -453,16 +491,16 @@ For unfamiliar projects, start with: `/o architect` → `*document-project`
453
491
 
454
492
  | Agent | ID | Commands | Output |
455
493
  |-------|----|----------|--------|
456
- | SM | `sm` | `*draft`, `*draft-bugfix {bug}` | `docs/stories/*.md` |
457
- | Architect | `architect` | `*review {story_id}` | Technical review |
458
- | Dev | `dev` | `*develop-story {id}`, `*solo "{desc}"`, `*quick-fix "{desc}"` | Code + git commit |
459
- | QA | `qa` | `*review {story_id}`, `*smoke-test {epic_id}` | Review report |
494
+ | SM | `sm` | `*draft`, `*draft-bugfix {bug}`, `*revise-story {id}`, `*apply-proposal {id}` | `docs/stories/*.md` |
495
+ | Architect | `architect` | `*review {id}`, `*review-escalation {id}` | Technical review |
496
+ | QA | `qa` | `*test-design {id}`, `*review {id}`, `*quick-verify {id}`, `*smoke-test {epic}` | Test design / review report |
497
+ | Dev | `dev` | `*develop-story {id}`, `*quick-develop {id}`, `*apply-qa-fixes {id}`, `*solo "{desc}"`, `*quick-fix "{desc}"` | Code + git commit |
460
498
 
461
499
  ### Management Agents
462
500
 
463
501
  | Agent | ID | Commands |
464
502
  |-------|----|----------|
465
- | PO | `po` | `*route-change` |
503
+ | PO | `po` | `*route-change`, `*execute-checklist`, `*shard` |
466
504
 
467
505
 
468
506
  ---
package/lib/license.js CHANGED
@@ -2,14 +2,24 @@
2
2
 
3
3
  const fs = require('fs');
4
4
  const path = require('path');
5
+ const os = require('os');
5
6
  const ui = require('./ui');
6
7
 
8
+ // License key format: orch_{tier}_{identifier}
9
+ // Examples: orch_live_xxx, orch_trial_xxx, ORCH-TEAM-xxx
10
+ const KEY_PATTERN = /^(orch_[a-z]+_[\w]+|ORCH-[A-Z]+-[\w-]+)$/;
11
+
12
+ function isValidKeyFormat(key) {
13
+ return KEY_PATTERN.test(key);
14
+ }
15
+
7
16
  /**
8
17
  * Resolve license key from multiple sources (priority order):
9
18
  * 1. --key CLI flag
10
19
  * 2. ORCHESTRIX_LICENSE_KEY env var
11
- * 3. .env.local file in cwd
12
- * 4. Interactive prompt
20
+ * 3. .orchestrix-key hidden file (project dir → home dir)
21
+ * 4. .env.local file in cwd
22
+ * 5. Interactive prompt (saves to .orchestrix-key for next time)
13
23
  */
14
24
  async function resolveKey(flags) {
15
25
  // 1. CLI flag
@@ -23,7 +33,23 @@ async function resolveKey(flags) {
23
33
  return process.env.ORCHESTRIX_LICENSE_KEY;
24
34
  }
25
35
 
26
- // 3. .env.local file
36
+ // 3. .orchestrix-key hidden file (project dir first, then home dir)
37
+ const keyLocations = [
38
+ path.join(process.cwd(), '.orchestrix-key'),
39
+ path.join(os.homedir(), '.orchestrix-key'),
40
+ ];
41
+ for (const keyPath of keyLocations) {
42
+ if (fs.existsSync(keyPath)) {
43
+ const raw = fs.readFileSync(keyPath, 'utf-8').trim();
44
+ if (raw && isValidKeyFormat(raw)) {
45
+ const rel = keyPath.startsWith(process.cwd()) ? '.orchestrix-key' : '~/.orchestrix-key';
46
+ ui.info(`Using license key from ${rel}`);
47
+ return raw;
48
+ }
49
+ }
50
+ }
51
+
52
+ // 4. .env.local file
27
53
  const envLocalPath = path.join(process.cwd(), '.env.local');
28
54
  if (fs.existsSync(envLocalPath)) {
29
55
  const content = fs.readFileSync(envLocalPath, 'utf-8');
@@ -34,11 +60,17 @@ async function resolveKey(flags) {
34
60
  }
35
61
  }
36
62
 
37
- // 4. Interactive prompt
63
+ // 5. Interactive prompt
38
64
  const key = await ui.prompt('Enter your Orchestrix license key');
39
65
  if (!key) {
40
66
  throw new Error('License key is required. Use --key <KEY> or set ORCHESTRIX_LICENSE_KEY env var.');
41
67
  }
68
+
69
+ // Save to ~/.orchestrix-key for future use
70
+ const globalKeyPath = path.join(os.homedir(), '.orchestrix-key');
71
+ fs.writeFileSync(globalKeyPath, key + '\n', { mode: 0o600 });
72
+ ui.success(`License key saved to ~/.orchestrix-key`);
73
+
42
74
  return key;
43
75
  }
44
76
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchestrix",
3
- "version": "16.1.1",
3
+ "version": "16.1.3",
4
4
  "description": "Install Orchestrix multi-agent infrastructure into any project. One command: npx orchestrix install",
5
5
  "bin": {
6
6
  "orchestrix": "bin/o8x.js"