@cliangdev/flux-plugin 0.2.0-dev.e34d43b → 0.2.0-dev.edce79d

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.
Files changed (39) hide show
  1. package/agents/coder.md +150 -25
  2. package/bin/install.cjs +22 -1
  3. package/commands/breakdown.md +44 -7
  4. package/commands/dashboard.md +29 -0
  5. package/commands/implement.md +165 -15
  6. package/commands/prd.md +176 -1
  7. package/manifest.json +2 -1
  8. package/package.json +4 -2
  9. package/skills/prd-writer/SKILL.md +184 -0
  10. package/skills/ux-ui-design/SKILL.md +346 -0
  11. package/skills/ux-ui-design/references/design-tokens.md +359 -0
  12. package/src/dashboard/__tests__/api.test.ts +211 -0
  13. package/src/dashboard/browser.ts +35 -0
  14. package/src/dashboard/public/app.js +869 -0
  15. package/src/dashboard/public/index.html +90 -0
  16. package/src/dashboard/public/styles.css +807 -0
  17. package/src/dashboard/public/vendor/highlight.css +10 -0
  18. package/src/dashboard/public/vendor/highlight.min.js +8422 -0
  19. package/src/dashboard/public/vendor/marked.min.js +2210 -0
  20. package/src/dashboard/server.ts +296 -0
  21. package/src/dashboard/watchers.ts +83 -0
  22. package/src/server/adapters/__tests__/dependency-ops.test.ts +52 -18
  23. package/src/server/adapters/linear/adapter.ts +19 -14
  24. package/src/server/adapters/local-adapter.ts +48 -7
  25. package/src/server/db/__tests__/queries.test.ts +2 -1
  26. package/src/server/db/schema.ts +9 -0
  27. package/src/server/tools/__tests__/crud.test.ts +111 -1
  28. package/src/server/tools/__tests__/mcp-interface.test.ts +2 -1
  29. package/src/server/tools/__tests__/query.test.ts +73 -2
  30. package/src/server/tools/__tests__/z-configure-linear.test.ts +1 -1
  31. package/src/server/tools/__tests__/z-get-linear-url.test.ts +1 -1
  32. package/src/server/tools/create-epic.ts +11 -2
  33. package/src/server/tools/create-prd.ts +11 -2
  34. package/src/server/tools/create-task.ts +11 -2
  35. package/src/server/tools/dependencies.ts +2 -2
  36. package/src/server/tools/get-entity.ts +12 -10
  37. package/src/server/tools/render-status.ts +38 -20
  38. package/src/status-line/__tests__/status-line.test.ts +1 -1
  39. package/src/utils/status-renderer.ts +32 -6
package/agents/coder.md CHANGED
@@ -20,30 +20,41 @@ You receive only:
20
20
 
21
21
  This keeps your context clean for high-quality code output.
22
22
 
23
- ## Step 1: Detect Project Type & Apply Skill
23
+ ## Step 1: Apply Project Skill
24
24
 
25
- Before coding, detect the project type and apply the matching skill:
25
+ The orchestrator should provide a **Project Skill** section in your prompt with patterns to follow. If provided, strictly follow those patterns for:
26
+ - Code structure and organization
27
+ - Error handling conventions
28
+ - Testing patterns
29
+ - Naming conventions
30
+
31
+ ### Fallback: Discover Skill Yourself
32
+
33
+ If no skill was provided in your prompt, discover and load it:
26
34
 
27
35
  ```bash
28
- # Check for project indicators
36
+ # 1. Detect project type
29
37
  ls -la | head -20
38
+
39
+ # 2. Check for matching skill in .claude/skills/
40
+ ls .claude/skills/ 2>/dev/null
30
41
  ```
31
42
 
32
- | File Found | Project Type | Skill to Apply |
33
- |------------|--------------|----------------|
34
- | `pom.xml` | Java/Spring Boot | `springboot-patterns` |
35
- | `build.gradle` | Java/Gradle | `springboot-patterns` |
36
- | `tsconfig.json` | TypeScript | `typescript-patterns` |
37
- | `package.json` + `react` | React | `ui-patterns` |
38
- | `go.mod` | Go | Go idioms |
39
- | `Cargo.toml` | Rust | Rust idioms |
40
- | `requirements.txt` / `pyproject.toml` | Python | Python idioms |
43
+ | File Found | Project Type | Skill Search Pattern |
44
+ |------------|--------------|---------------------|
45
+ | `go.mod` | Go | `golang*`, `go-*` |
46
+ | `tsconfig.json` | TypeScript | `typescript*`, `ts-*` |
47
+ | `pom.xml` / `build.gradle` | Java/Spring | `java*`, `spring*` |
48
+ | `package.json` + react | React | `react*`, `ui-*` |
49
+ | `Cargo.toml` | Rust | `rust*` |
50
+ | `requirements.txt` | Python | `python*`, `py-*` |
41
51
 
42
- **Apply the skill mentally** - follow its patterns for:
43
- - Code structure and organization
44
- - Error handling conventions
45
- - Testing patterns
46
- - Naming conventions
52
+ ```bash
53
+ # 3. Read matching skill
54
+ cat .claude/skills/{matched-skill}/SKILL.md
55
+ ```
56
+
57
+ **Apply the loaded skill patterns** - if no matching skill exists, use general best practices for that language.
47
58
 
48
59
  ## Step 2: Understand the Task
49
60
 
@@ -61,10 +72,11 @@ Acceptance Criteria:
61
72
 
62
73
  ## Step 3: Write Tests First (TDD)
63
74
 
75
+ ### 3.1 Tests for Acceptance Criteria
76
+
64
77
  For each `[auto]` criterion, write a failing test:
65
78
 
66
79
  ```typescript
67
- // Example for TypeScript
68
80
  describe('Login API', () => {
69
81
  it('returns 401 for invalid credentials', async () => {
70
82
  const response = await api.post('/login', {
@@ -82,6 +94,34 @@ describe('Login API', () => {
82
94
  });
83
95
  ```
84
96
 
97
+ ### 3.2 Tests for Critical Components
98
+
99
+ Beyond acceptance criteria, also test:
100
+
101
+ - **Core business logic**: Functions that make important decisions
102
+ - **Data transformations**: Parsing, validation, mapping functions
103
+ - **Error paths**: Edge cases and failure scenarios
104
+ - **Integration points**: API handlers, database operations
105
+ - **Utilities used in multiple places**: Shared helpers and utils
106
+
107
+ ```typescript
108
+ describe('SessionManager', () => {
109
+ it('expires sessions after TTL', async () => {
110
+ const session = await sessionManager.create(userId);
111
+ await advanceTime(SESSION_TTL + 1000);
112
+ expect(await sessionManager.isValid(session.id)).toBe(false);
113
+ });
114
+
115
+ it('handles concurrent session creation', async () => {
116
+ const results = await Promise.all([
117
+ sessionManager.create(userId),
118
+ sessionManager.create(userId),
119
+ ]);
120
+ expect(results[0].id).not.toBe(results[1].id);
121
+ });
122
+ });
123
+ ```
124
+
85
125
  Run tests to confirm they fail:
86
126
  ```bash
87
127
  bun test login.test.ts
@@ -103,6 +143,81 @@ Write minimal code to make tests pass:
103
143
  bun test
104
144
  ```
105
145
 
146
+ ## Code Quality Standards
147
+
148
+ ### Write Clean, Modular, Testable Code
149
+
150
+ **Modularity**
151
+ - Small, focused functions that do one thing well
152
+ - Clear separation of concerns (business logic vs I/O vs presentation)
153
+ - Dependencies injected, not hardcoded - makes testing easy
154
+ - Extract reusable logic into well-named helper functions
155
+
156
+ ```typescript
157
+ // ✅ Good: Modular, testable
158
+ function validateCredentials(email: string, password: string): ValidationResult {
159
+ if (!isValidEmail(email)) return { valid: false, error: 'Invalid email' };
160
+ if (password.length < 8) return { valid: false, error: 'Password too short' };
161
+ return { valid: true };
162
+ }
163
+
164
+ async function login(credentials: Credentials, userRepo: UserRepository) {
165
+ const validation = validateCredentials(credentials.email, credentials.password);
166
+ if (!validation.valid) throw new ValidationError(validation.error);
167
+ return userRepo.findByEmail(credentials.email);
168
+ }
169
+
170
+ // ❌ Bad: Monolithic, hard to test
171
+ async function login(email: string, password: string) {
172
+ // validation mixed with business logic mixed with database calls
173
+ const db = getDatabase();
174
+ if (!email.includes('@')) throw new Error('bad email');
175
+ const user = await db.query('SELECT * FROM users WHERE email = ?', [email]);
176
+ // ... more mixed concerns
177
+ }
178
+ ```
179
+
180
+ **Testability**
181
+ - Pure functions where possible (same input → same output)
182
+ - Side effects isolated and explicit
183
+ - Avoid global state
184
+ - Use interfaces/types for dependencies
185
+
186
+ ### No Unnecessary Comments
187
+
188
+ Let code be self-documenting. Comments should explain **why**, not **what**.
189
+
190
+ ```typescript
191
+ // ❌ Bad: Comments that restate the code
192
+ // Check if user is admin
193
+ if (user.role === 'admin') {
194
+ // Grant admin access
195
+ grantAdminAccess(user);
196
+ }
197
+
198
+ // ✅ Good: Code explains itself
199
+ if (user.role === 'admin') {
200
+ grantAdminAccess(user);
201
+ }
202
+
203
+ // ✅ Good: Comment explains non-obvious "why"
204
+ // Rate limit bypass for internal services to prevent cascade failures
205
+ if (request.source === 'internal') {
206
+ skipRateLimit = true;
207
+ }
208
+ ```
209
+
210
+ **When to comment:**
211
+ - Non-obvious business rules or edge cases
212
+ - Workarounds for external bugs/limitations
213
+ - Performance optimizations that sacrifice readability
214
+ - Public API documentation (JSDoc for library interfaces)
215
+
216
+ **Never comment:**
217
+ - What the code does (let naming convey this)
218
+ - Obvious operations
219
+ - Commented-out code (delete it, git has history)
220
+
106
221
  ## Step 5: Handle Manual Criteria
107
222
 
108
223
  For `[manual]` criteria, add a comment or doc noting verification steps:
@@ -174,13 +289,23 @@ Needs:
174
289
 
175
290
  ## Boundaries
176
291
 
177
- - **DO** focus only on the assigned task
178
- - **DO** write tests before implementation
179
- - **DO** follow detected skill patterns
180
- - **DON'T** refactor unrelated code
181
- - **DON'T** add features not in acceptance criteria
182
- - **DON'T** skip tests for `[auto]` criteria
183
- - **DON'T** make commits without running tests
292
+ **DO:**
293
+ - Focus only on the assigned task
294
+ - Apply project skill patterns from your prompt (or discover them from `.claude/skills/`)
295
+ - Write tests before implementation
296
+ - Test critical components beyond just acceptance criteria
297
+ - Write clean, modular, testable code
298
+ - Use clear naming that makes code self-documenting
299
+
300
+ **DON'T:**
301
+ - Ignore provided skill patterns - they contain project-specific conventions
302
+ - Refactor unrelated code
303
+ - Add features not in acceptance criteria
304
+ - Skip tests for `[auto]` criteria
305
+ - Make commits without running tests
306
+ - Add comments that restate what code does
307
+ - Add unnecessary JSDoc/docstrings for simple functions
308
+ - Leave commented-out code
184
309
 
185
310
  ## Context Escalation
186
311
 
package/bin/install.cjs CHANGED
@@ -21,6 +21,19 @@ if (args[0] === "serve") {
21
21
  process.exit(1);
22
22
  });
23
23
  child.on("close", (code) => process.exit(code || 0));
24
+ } else if (args[0] === "dashboard") {
25
+ const dashboardSrc = path.join(__dirname, "..", "src", "dashboard", "server.ts");
26
+ const bunPath = getBunPath();
27
+ if (!bunPath) {
28
+ console.error("Failed to start Flux Dashboard: Bun is required but not found");
29
+ process.exit(1);
30
+ }
31
+ const child = spawn(bunPath, ["run", dashboardSrc], { stdio: "inherit" });
32
+ child.on("error", (err) => {
33
+ console.error("Failed to start Flux Dashboard:", err.message);
34
+ process.exit(1);
35
+ });
36
+ child.on("close", (code) => process.exit(code || 0));
24
37
  } else {
25
38
  runInstaller();
26
39
  }
@@ -66,7 +79,12 @@ ${cyan} ███████╗██╗ ██╗ ██╗██╗
66
79
  console.log(banner);
67
80
 
68
81
  if (hasHelp) {
69
- console.log(` ${yellow}Usage:${reset} bunx @cliangdev/flux-plugin [options]
82
+ console.log(` ${yellow}Usage:${reset} bunx @cliangdev/flux-plugin [command] [options]
83
+
84
+ ${yellow}Commands:${reset}
85
+ ${cyan}(none)${reset} Run the installer (default)
86
+ ${cyan}serve${reset} Start the MCP server
87
+ ${cyan}dashboard${reset} Open the Flux Dashboard in browser
70
88
 
71
89
  ${yellow}Options:${reset}
72
90
  ${cyan}-g, --global${reset} Install globally (to ~/.claude)
@@ -83,6 +101,9 @@ ${cyan} ███████╗██╗ ██╗ ██╗██╗
83
101
  ${dim}# Install locally (current project only)${reset}
84
102
  bunx @cliangdev/flux-plugin --local
85
103
 
104
+ ${dim}# Open the dashboard${reset}
105
+ bunx @cliangdev/flux-plugin dashboard
106
+
86
107
  ${yellow}Note:${reset} This plugin requires Bun. Install from https://bun.sh
87
108
  `);
88
109
  process.exit(0);
@@ -21,7 +21,21 @@ Check if arguments were provided:
21
21
 
22
22
  2. If query successful but no approved PRDs found:
23
23
  - If no approved PRDs, tell user: "No approved PRDs found. Approve a PRD first or run `/flux:prd` to create one."
24
- - If multiple approved PRDs, use AskUserQuestion to let user select which one
24
+ - If multiple approved PRDs, use AskUserQuestion to let user select:
25
+ ```json
26
+ {
27
+ "questions": [{
28
+ "question": "Which PRD would you like to break down?",
29
+ "header": "Select PRD",
30
+ "options": [
31
+ {"label": "{PRD-1 title}", "description": "{ref} - {brief description}"},
32
+ {"label": "{PRD-2 title}", "description": "{ref} - {brief description}"}
33
+ ],
34
+ "multiSelect": false
35
+ }]
36
+ }
37
+ ```
38
+ Note: Dynamically populate options from the query results.
25
39
 
26
40
  3. If ref provided, call `get_entity` with the ref
27
41
  - Verify status is APPROVED
@@ -78,9 +92,21 @@ Which approach do you prefer?
78
92
 
79
93
  1. Get PRD entity with `get_entity` including `include: ['epics']`
80
94
  2. Read full PRD content from `folder_path + '/prd.md'` using Read tool
81
- 3. If PRD already has epics, inform user:
82
- - "This PRD already has {count} epics. Continue adding more or start fresh?"
83
- - Use AskUserQuestion with options: "Add more epics", "View existing", "Start fresh (delete existing)"
95
+ 3. If PRD already has epics, inform user and use AskUserQuestion:
96
+ ```json
97
+ {
98
+ "questions": [{
99
+ "question": "This PRD already has {count} epics. What would you like to do?",
100
+ "header": "Epics",
101
+ "options": [
102
+ {"label": "Add more epics", "description": "Keep existing epics and add new ones"},
103
+ {"label": "View existing", "description": "See current epic structure before deciding"},
104
+ {"label": "Start fresh", "description": "Delete existing epics and recreate from scratch"}
105
+ ],
106
+ "multiSelect": false
107
+ }]
108
+ }
109
+ ```
84
110
 
85
111
  ### Step 2: Analyze & Identify Epics
86
112
 
@@ -142,9 +168,20 @@ Ready to create these epics?
142
168
  ```
143
169
 
144
170
  Use AskUserQuestion only when uncertain:
145
- - Create all epics (Recommended)
146
- - Modify structure first
147
- - Add/remove epics
171
+ ```json
172
+ {
173
+ "questions": [{
174
+ "question": "Ready to create these epics?",
175
+ "header": "Confirm",
176
+ "options": [
177
+ {"label": "Create all epics (Recommended)", "description": "Proceed with the proposed structure"},
178
+ {"label": "Modify structure first", "description": "Adjust epic boundaries or dependencies"},
179
+ {"label": "Add/remove epics", "description": "Change the number of epics"}
180
+ ],
181
+ "multiSelect": false
182
+ }]
183
+ }
184
+ ```
148
185
 
149
186
  ### Step 4: Create Epics
150
187
 
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: flux:dashboard
3
+ description: Open the Flux Dashboard to visualize PRDs, epics, and tasks
4
+ allowed-tools: Bash
5
+ ---
6
+
7
+ # Flux Dashboard
8
+
9
+ Launch the Flux Dashboard web interface to visualize project status.
10
+
11
+ ## Instructions
12
+
13
+ Run the dashboard server:
14
+
15
+ ```bash
16
+ bunx @cliangdev/flux-plugin dashboard
17
+ ```
18
+
19
+ This will:
20
+ 1. Start the dashboard server on port 3333 (or next available)
21
+ 2. Open the dashboard in the default browser
22
+
23
+ The dashboard shows:
24
+ - All PRDs with their epics and tasks
25
+ - Status indicators and progress
26
+ - Dependency graph visualization
27
+ - Detailed views for each entity
28
+
29
+ Tell the user the dashboard is starting and they can close it with Ctrl+C when done.
@@ -61,8 +61,100 @@ The orchestrator resolves all refs to tasks, builds a dependency-ordered queue,
61
61
  - Mixed refs: Resolve each, deduplicate, merge
62
62
  - `tag:{name}`: Query PRDs by tag → expand all
63
63
 
64
+ 2. Git state check (REQUIRED before any implementation):
65
+ - Run `git status` to check for uncommitted changes
66
+ - If dirty working tree: Ask user whether to commit, stash, or abort
67
+ - Never proceed with uncommitted changes
68
+
64
69
  ## Workflow
65
70
 
71
+ ### Step 0: Git Branch Setup
72
+
73
+ **Always start from latest main with a fresh branch.** This ensures clean PRs and avoids merge conflicts.
74
+
75
+ #### 0.1 Ensure Clean State
76
+
77
+ ```bash
78
+ # Check for uncommitted changes
79
+ git status --porcelain
80
+ ```
81
+
82
+ If output is non-empty, use AskUserQuestion:
83
+ ```json
84
+ {
85
+ "questions": [{
86
+ "question": "You have uncommitted changes. How would you like to proceed?",
87
+ "header": "Git Status",
88
+ "options": [
89
+ {"label": "Commit them first", "description": "Stage and commit current changes before starting"},
90
+ {"label": "Stash them", "description": "Stash changes temporarily, restore after implementation"},
91
+ {"label": "Abort implementation", "description": "Stop here and handle changes manually"}
92
+ ],
93
+ "multiSelect": false
94
+ }]
95
+ }
96
+ ```
97
+
98
+ #### 0.2 Create Feature Branch from Latest Main
99
+
100
+ ```bash
101
+ # Fetch latest and create branch
102
+ git fetch origin main
103
+ git checkout -b {branch-name} origin/main
104
+ ```
105
+
106
+ #### 0.3 Branch Naming Convention
107
+
108
+ | Scope | Branch Name | Example |
109
+ |-------|-------------|---------|
110
+ | `tag:xxx` | `feat/tag-{tag}` | `feat/tag-phase-3` |
111
+ | Single PRD | `feat/{prd-ref}` | `feat/FLUX-P3` |
112
+ | Multiple PRDs | `feat/{first-prd-ref}` | `feat/FLUX-P3` |
113
+ | Single Epic | `feat/{epic-ref}` | `feat/FLUX-E14` |
114
+ | Multiple Epics | `feat/{first-epic-ref}` | `feat/FLUX-E14` |
115
+ | Single Task | `feat/{task-ref}` | `feat/FLUX-T31` |
116
+ | Multiple Tasks | `feat/{first-task-ref}` | `feat/FLUX-T31` |
117
+ | No args (next task) | `feat/{task-ref}` | `feat/FLUX-T42` |
118
+ | Mixed refs | `feat/{highest-level-ref}` | `feat/FLUX-P3` (PRD > Epic > Task) |
119
+
120
+ **Priority for mixed refs**: Use the highest-level entity (PRD > Epic > Task). If multiple of the same level, use the first one alphabetically.
121
+
122
+ #### 0.4 Handle Existing Branch
123
+
124
+ If the branch already exists:
125
+ ```bash
126
+ # Check if branch exists
127
+ git rev-parse --verify feat/FLUX-P3 2>/dev/null
128
+ ```
129
+
130
+ If branch exists, use AskUserQuestion:
131
+ ```json
132
+ {
133
+ "questions": [{
134
+ "question": "Branch 'feat/FLUX-P3' already exists. What would you like to do?",
135
+ "header": "Branch",
136
+ "options": [
137
+ {"label": "Continue on existing (Recommended)", "description": "Resume work on the existing branch"},
138
+ {"label": "Delete and recreate", "description": "Start fresh from latest main"},
139
+ {"label": "Use different name", "description": "Create a new branch with a different name"}
140
+ ],
141
+ "multiSelect": false
142
+ }]
143
+ }
144
+ ```
145
+
146
+ #### Example Output
147
+
148
+ ```
149
+ Git Setup:
150
+ ✓ Working tree clean
151
+ ✓ Fetched origin/main
152
+ ✓ Created branch: feat/tag-phase-3
153
+ └── Based on: origin/main (abc1234)
154
+
155
+ Ready to implement 3 PRDs (tag: phase-3)
156
+ ```
157
+
66
158
  ### Step 1: Gather Context
67
159
 
68
160
  Resolve all refs to a unified task list:
@@ -184,31 +276,87 @@ When spawning a coding subagent, provide this context:
184
276
  - Epic: {epic.ref} - {epic.title}
185
277
  - PRD: {prd.ref} (read if more context needed)
186
278
 
279
+ ## Project Skill (APPLY THESE PATTERNS)
280
+ {skillContent || "No project-specific skill found. Use general best practices for this language."}
281
+
187
282
  ## Workflow
188
- 1. Auto-detect project type and apply matching skill
283
+ 1. Apply the project skill patterns above (if provided)
189
284
  2. Write tests for each [auto] criterion FIRST
190
- 3. Implement until all tests pass
191
- 4. For [manual] criteria, document verification steps
192
- 5. Commit with message: "{task.ref}: {brief description}"
193
- 6. Report back: COMPLETED or BLOCKED (with reason)
285
+ 3. Write tests for critical components (business logic, data transformations, error paths)
286
+ 4. Implement until all tests pass
287
+ 5. For [manual] criteria, document verification steps
288
+ 6. Commit with message: "{task.ref}: {brief description}"
289
+ 7. Report back: COMPLETED or BLOCKED (with reason)
290
+
291
+ ## Code Quality Requirements
292
+ - Write clean, modular, testable code
293
+ - Small focused functions with clear separation of concerns
294
+ - Inject dependencies for testability
295
+ - NO unnecessary comments - let code be self-documenting
296
+ - Comments only for non-obvious "why", never for "what"
297
+ - No commented-out code
194
298
 
195
299
  ## Files to Focus On
196
300
  {relevantFiles}
197
301
  ```
198
302
 
199
- ## Skill Auto-Detection
303
+ **Note:** The orchestrator MUST discover and include skill content before spawning. See "Skill Discovery & Application" section above.
304
+
305
+ ## Skill Discovery & Application
306
+
307
+ Before spawning a coding subagent, discover and load relevant project skills.
308
+
309
+ ### Step 1: Detect Project Type
310
+
311
+ Check for project indicator files:
312
+
313
+ ```bash
314
+ ls -la | head -20
315
+ ```
316
+
317
+ | File Found | Project Type |
318
+ |------------|--------------|
319
+ | `go.mod` | Go |
320
+ | `tsconfig.json` | TypeScript |
321
+ | `pom.xml` / `build.gradle` | Java/Spring |
322
+ | `package.json` + react | React |
323
+ | `Cargo.toml` | Rust |
324
+ | `requirements.txt` / `pyproject.toml` | Python |
325
+
326
+ ### Step 2: Search for Matching Skills
327
+
328
+ Check `.claude/skills/` for project-specific skills:
329
+
330
+ ```bash
331
+ # List available skills
332
+ ls .claude/skills/ 2>/dev/null || echo "No skills directory"
333
+ ```
334
+
335
+ **Skill matching patterns:**
336
+
337
+ | Project Type | Skill Search Patterns |
338
+ |--------------|----------------------|
339
+ | Go | `golang*`, `go-*`, `go_*` |
340
+ | TypeScript | `typescript*`, `ts-*`, `ts_*` |
341
+ | Java/Spring | `java*`, `spring*`, `springboot*` |
342
+ | React | `react*`, `ui-*`, `frontend*` |
343
+ | Rust | `rust*` |
344
+ | Python | `python*`, `py-*` |
345
+
346
+ ### Step 3: Load Skill Content
347
+
348
+ If a matching skill is found, read its content:
349
+
350
+ ```bash
351
+ # Read skill content
352
+ cat .claude/skills/{skill-name}/SKILL.md
353
+ ```
200
354
 
201
- The coding subagent detects project type and applies matching skills:
355
+ ### Step 4: Pass Skill to Subagent
202
356
 
203
- | Detection | Skill | Patterns Applied |
204
- |-----------|-------|------------------|
205
- | `pom.xml` | `springboot-patterns` | DDD, transactions, Java style |
206
- | `tsconfig.json` | `typescript-patterns` | Async/await, typed errors |
207
- | `package.json` + React | `ui-patterns` | Components, Tailwind, dark mode |
208
- | `go.mod` | Go patterns | Error handling, interfaces |
209
- | `Cargo.toml` | Rust patterns | Result types, ownership |
357
+ Include the skill content in the coding subagent prompt (see template below).
210
358
 
211
- Detection happens at subagent spawn time by checking project root files.
359
+ **Important:** If no matching skill is found, the subagent falls back to general best practices for that language.
212
360
 
213
361
  ## Status Management
214
362
 
@@ -312,3 +460,5 @@ Action needed: Resolve blockers, then run `/flux:implement FP-T45`
312
460
  - **Fail fast**: Report blockers immediately
313
461
  - **One commit per task**: Keep history clean
314
462
  - **TDD always**: Tests before implementation
463
+ - **Test critical components**: Not just acceptance criteria - test business logic, transformations, error paths
464
+ - **Clean code**: Modular, testable, self-documenting - no unnecessary comments