devflow-kit 1.6.1 → 1.8.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/CHANGELOG.md +45 -0
- package/README.md +31 -0
- package/dist/cli.js +3 -1
- package/dist/commands/hud.d.ts +22 -0
- package/dist/commands/hud.js +180 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +114 -5
- package/dist/commands/list.js +1 -0
- package/dist/commands/uninstall.js +9 -16
- package/dist/hud/cache.d.ts +14 -0
- package/dist/hud/cache.js +54 -0
- package/dist/hud/colors.d.ts +23 -0
- package/dist/hud/colors.js +62 -0
- package/dist/hud/components/config-counts.d.ts +8 -0
- package/dist/hud/components/config-counts.js +91 -0
- package/dist/hud/components/context-usage.d.ts +8 -0
- package/dist/hud/components/context-usage.js +49 -0
- package/dist/hud/components/diff-stats.d.ts +3 -0
- package/dist/hud/components/diff-stats.js +36 -0
- package/dist/hud/components/directory.d.ts +3 -0
- package/dist/hud/components/directory.js +10 -0
- package/dist/hud/components/git-ahead-behind.d.ts +3 -0
- package/dist/hud/components/git-ahead-behind.js +16 -0
- package/dist/hud/components/git-branch.d.ts +3 -0
- package/dist/hud/components/git-branch.js +14 -0
- package/dist/hud/components/model.d.ts +3 -0
- package/dist/hud/components/model.js +21 -0
- package/dist/hud/components/release-info.d.ts +3 -0
- package/dist/hud/components/release-info.js +9 -0
- package/dist/hud/components/session-cost.d.ts +3 -0
- package/dist/hud/components/session-cost.js +9 -0
- package/dist/hud/components/session-duration.d.ts +3 -0
- package/dist/hud/components/session-duration.js +18 -0
- package/dist/hud/components/todo-progress.d.ts +3 -0
- package/dist/hud/components/todo-progress.js +11 -0
- package/dist/hud/components/usage-quota.d.ts +3 -0
- package/dist/hud/components/usage-quota.js +45 -0
- package/dist/hud/components/version-badge.d.ts +3 -0
- package/dist/hud/components/version-badge.js +80 -0
- package/dist/hud/components/worktree-count.d.ts +3 -0
- package/dist/hud/components/worktree-count.js +8 -0
- package/dist/hud/config.d.ts +10 -0
- package/dist/hud/config.js +55 -0
- package/dist/hud/credentials.d.ts +17 -0
- package/dist/hud/credentials.js +99 -0
- package/dist/hud/git.d.ts +7 -0
- package/dist/hud/git.js +153 -0
- package/dist/hud/index.d.ts +2 -0
- package/dist/hud/index.js +81 -0
- package/dist/hud/render.d.ts +7 -0
- package/dist/hud/render.js +111 -0
- package/dist/hud/stdin.d.ts +6 -0
- package/dist/hud/stdin.js +25 -0
- package/dist/hud/transcript.d.ts +7 -0
- package/dist/hud/transcript.js +130 -0
- package/dist/hud/types.d.ts +116 -0
- package/dist/hud/types.js +2 -0
- package/dist/hud/usage-api.d.ts +7 -0
- package/dist/hud/usage-api.js +84 -0
- package/dist/utils/manifest.d.ts +1 -0
- package/package.json +5 -2
- package/plugins/devflow-accessibility/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-ambient/agents/scrutinizer.md +6 -4
- package/plugins/devflow-ambient/agents/shepherd.md +26 -12
- package/plugins/devflow-ambient/agents/simplifier.md +24 -15
- package/plugins/devflow-ambient/agents/skimmer.md +71 -21
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-debug/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-go/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-implement/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-implement/agents/scrutinizer.md +6 -4
- package/plugins/devflow-implement/agents/shepherd.md +26 -12
- package/plugins/devflow-implement/agents/simplifier.md +24 -15
- package/plugins/devflow-implement/agents/skimmer.md +71 -21
- package/plugins/devflow-implement/commands/implement-teams.md +1 -1
- package/plugins/devflow-implement/commands/implement.md +1 -1
- package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +135 -0
- package/plugins/devflow-java/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-python/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-react/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-resolve/agents/simplifier.md +24 -15
- package/plugins/devflow-rust/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-self-review/agents/scrutinizer.md +6 -4
- package/plugins/devflow-self-review/agents/simplifier.md +24 -15
- package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +135 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-specify/agents/skimmer.md +71 -21
- package/plugins/devflow-specify/commands/specify-teams.md +1 -1
- package/plugins/devflow-specify/commands/specify.md +1 -1
- package/plugins/devflow-typescript/.claude-plugin/plugin.json +1 -1
- package/scripts/hud/cache.d.ts +14 -0
- package/scripts/hud/cache.d.ts.map +1 -0
- package/scripts/hud/cache.js +54 -0
- package/scripts/hud/cache.js.map +1 -0
- package/scripts/hud/colors.d.ts +23 -0
- package/scripts/hud/colors.d.ts.map +1 -0
- package/scripts/hud/colors.js +62 -0
- package/scripts/hud/colors.js.map +1 -0
- package/scripts/hud/components/config-counts.d.ts +8 -0
- package/scripts/hud/components/config-counts.d.ts.map +1 -0
- package/scripts/hud/components/config-counts.js +91 -0
- package/scripts/hud/components/config-counts.js.map +1 -0
- package/scripts/hud/components/context-usage.d.ts +8 -0
- package/scripts/hud/components/context-usage.d.ts.map +1 -0
- package/scripts/hud/components/context-usage.js +49 -0
- package/scripts/hud/components/context-usage.js.map +1 -0
- package/scripts/hud/components/diff-stats.d.ts +3 -0
- package/scripts/hud/components/diff-stats.d.ts.map +1 -0
- package/scripts/hud/components/diff-stats.js +36 -0
- package/scripts/hud/components/diff-stats.js.map +1 -0
- package/scripts/hud/components/directory.d.ts +3 -0
- package/scripts/hud/components/directory.d.ts.map +1 -0
- package/scripts/hud/components/directory.js +10 -0
- package/scripts/hud/components/directory.js.map +1 -0
- package/scripts/hud/components/git-ahead-behind.d.ts +3 -0
- package/scripts/hud/components/git-ahead-behind.d.ts.map +1 -0
- package/scripts/hud/components/git-ahead-behind.js +16 -0
- package/scripts/hud/components/git-ahead-behind.js.map +1 -0
- package/scripts/hud/components/git-branch.d.ts +3 -0
- package/scripts/hud/components/git-branch.d.ts.map +1 -0
- package/scripts/hud/components/git-branch.js +14 -0
- package/scripts/hud/components/git-branch.js.map +1 -0
- package/scripts/hud/components/model.d.ts +3 -0
- package/scripts/hud/components/model.d.ts.map +1 -0
- package/scripts/hud/components/model.js +21 -0
- package/scripts/hud/components/model.js.map +1 -0
- package/scripts/hud/components/release-info.d.ts +3 -0
- package/scripts/hud/components/release-info.d.ts.map +1 -0
- package/scripts/hud/components/release-info.js +9 -0
- package/scripts/hud/components/release-info.js.map +1 -0
- package/scripts/hud/components/session-cost.d.ts +3 -0
- package/scripts/hud/components/session-cost.d.ts.map +1 -0
- package/scripts/hud/components/session-cost.js +9 -0
- package/scripts/hud/components/session-cost.js.map +1 -0
- package/scripts/hud/components/session-duration.d.ts +3 -0
- package/scripts/hud/components/session-duration.d.ts.map +1 -0
- package/scripts/hud/components/session-duration.js +18 -0
- package/scripts/hud/components/session-duration.js.map +1 -0
- package/scripts/hud/components/todo-progress.d.ts +3 -0
- package/scripts/hud/components/todo-progress.d.ts.map +1 -0
- package/scripts/hud/components/todo-progress.js +11 -0
- package/scripts/hud/components/todo-progress.js.map +1 -0
- package/scripts/hud/components/usage-quota.d.ts +3 -0
- package/scripts/hud/components/usage-quota.d.ts.map +1 -0
- package/scripts/hud/components/usage-quota.js +45 -0
- package/scripts/hud/components/usage-quota.js.map +1 -0
- package/scripts/hud/components/version-badge.d.ts +3 -0
- package/scripts/hud/components/version-badge.d.ts.map +1 -0
- package/scripts/hud/components/version-badge.js +80 -0
- package/scripts/hud/components/version-badge.js.map +1 -0
- package/scripts/hud/components/worktree-count.d.ts +3 -0
- package/scripts/hud/components/worktree-count.d.ts.map +1 -0
- package/scripts/hud/components/worktree-count.js +8 -0
- package/scripts/hud/components/worktree-count.js.map +1 -0
- package/scripts/hud/config.d.ts +10 -0
- package/scripts/hud/config.d.ts.map +1 -0
- package/scripts/hud/config.js +55 -0
- package/scripts/hud/config.js.map +1 -0
- package/scripts/hud/credentials.d.ts +17 -0
- package/scripts/hud/credentials.d.ts.map +1 -0
- package/scripts/hud/credentials.js +99 -0
- package/scripts/hud/credentials.js.map +1 -0
- package/scripts/hud/git.d.ts +7 -0
- package/scripts/hud/git.d.ts.map +1 -0
- package/scripts/hud/git.js +153 -0
- package/scripts/hud/git.js.map +1 -0
- package/scripts/hud/index.d.ts +2 -0
- package/scripts/hud/index.d.ts.map +1 -0
- package/scripts/hud/index.js +81 -0
- package/scripts/hud/index.js.map +1 -0
- package/scripts/hud/render.d.ts +7 -0
- package/scripts/hud/render.d.ts.map +1 -0
- package/scripts/hud/render.js +111 -0
- package/scripts/hud/render.js.map +1 -0
- package/scripts/hud/stdin.d.ts +6 -0
- package/scripts/hud/stdin.d.ts.map +1 -0
- package/scripts/hud/stdin.js +25 -0
- package/scripts/hud/stdin.js.map +1 -0
- package/scripts/hud/transcript.d.ts +7 -0
- package/scripts/hud/transcript.d.ts.map +1 -0
- package/scripts/hud/transcript.js +130 -0
- package/scripts/hud/transcript.js.map +1 -0
- package/scripts/hud/types.d.ts +116 -0
- package/scripts/hud/types.d.ts.map +1 -0
- package/scripts/hud/types.js +2 -0
- package/scripts/hud/types.js.map +1 -0
- package/scripts/hud/usage-api.d.ts +7 -0
- package/scripts/hud/usage-api.d.ts.map +1 -0
- package/scripts/hud/usage-api.js +84 -0
- package/scripts/hud/usage-api.js.map +1 -0
- package/scripts/hud.sh +5 -0
- package/shared/agents/scrutinizer.md +6 -4
- package/shared/agents/shepherd.md +26 -12
- package/shared/agents/simplifier.md +24 -15
- package/shared/agents/skimmer.md +71 -21
- package/shared/skills/self-review/references/stub-detection.md +135 -0
- package/src/templates/settings.json +1 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Stub Detection Patterns
|
|
2
|
+
|
|
3
|
+
Placeholder implementations that compile but don't deliver real functionality. Flag as **P0-Functionality** issues.
|
|
4
|
+
|
|
5
|
+
Cross-reference: `core-patterns/references/code-smell-violations.md` covers hardcoded data and fake functionality labeling. This file focuses on structural stub patterns.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Component Stubs
|
|
10
|
+
|
|
11
|
+
Render nothing meaningful or return placeholder markup.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
// STUB — returns static text, no real rendering
|
|
15
|
+
function UserProfile({ userId }: Props) {
|
|
16
|
+
return <div>Name</div>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// REAL — fetches and renders actual data
|
|
20
|
+
function UserProfile({ userId }: Props) {
|
|
21
|
+
const user = useUser(userId);
|
|
22
|
+
if (!user) return <Skeleton />;
|
|
23
|
+
return <div><h2>{user.name}</h2><p>{user.email}</p></div>;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Patterns to flag:**
|
|
28
|
+
- `return null` / `return <></>` in components that should render content
|
|
29
|
+
- Empty function bodies (`{}`) for handlers or lifecycle methods
|
|
30
|
+
- Components returning only hardcoded strings with no data binding
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. API / Service Stubs
|
|
35
|
+
|
|
36
|
+
Functions that exist in signature but throw, return hardcoded values, or do nothing.
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// STUB — throws instead of implementing
|
|
40
|
+
async function createOrder(items: CartItem[]): Promise<Order> {
|
|
41
|
+
throw new Error("TODO: implement");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// STUB — hardcoded return, no real logic
|
|
45
|
+
async function getUser(id: string): Promise<User> {
|
|
46
|
+
return { id, name: "Test User", email: "test@test.com" };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// REAL — actual implementation
|
|
50
|
+
async function createOrder(items: CartItem[]): Promise<Result<Order, OrderError>> {
|
|
51
|
+
const validated = validateItems(items);
|
|
52
|
+
if (!validated.ok) return validated;
|
|
53
|
+
const order = await db.orders.create({ items: validated.value });
|
|
54
|
+
await queue.publish("order.created", order);
|
|
55
|
+
return { ok: true, value: order };
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Patterns to flag:**
|
|
60
|
+
- `throw new Error("TODO")` / `throw new Error("Not implemented")`
|
|
61
|
+
- Functions returning hardcoded objects (no DB/API/computation)
|
|
62
|
+
- `"Not implemented"` strings in response bodies
|
|
63
|
+
- Empty async functions (`async function foo() {}`)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. Hook / Effect Stubs
|
|
68
|
+
|
|
69
|
+
State and effects declared but not wired to behavior.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// STUB — effect does nothing
|
|
73
|
+
useEffect(() => {}, [userId]);
|
|
74
|
+
|
|
75
|
+
// STUB — state declared, setter never called
|
|
76
|
+
const [items, setItems] = useState<Item[]>([]);
|
|
77
|
+
// ... setItems never appears in the component
|
|
78
|
+
|
|
79
|
+
// STUB — custom hook returns static value
|
|
80
|
+
function usePermissions(): Permissions {
|
|
81
|
+
return { canEdit: true, canDelete: false };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// REAL — custom hook with actual logic
|
|
85
|
+
function usePermissions(): Permissions {
|
|
86
|
+
const { user } = useAuth();
|
|
87
|
+
const { data } = useQuery(["permissions", user.role], fetchPermissions);
|
|
88
|
+
return data ?? DEFAULT_PERMISSIONS;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Patterns to flag:**
|
|
93
|
+
- `useEffect(() => {}, [...])` — empty effect body
|
|
94
|
+
- `useState` where the setter is never called in the component
|
|
95
|
+
- Custom hooks returning static/hardcoded values
|
|
96
|
+
- `useMemo`/`useCallback` wrapping static values
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 4. Wiring Gaps
|
|
101
|
+
|
|
102
|
+
Individual pieces exist but aren't connected to the running application. **Highest-value detection** — these pass compilation and individual tests but the feature doesn't work end-to-end.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// GAP — fetch without await (result discarded)
|
|
106
|
+
function loadDashboard() {
|
|
107
|
+
fetchMetrics(); // Promise floats, never awaited
|
|
108
|
+
return <Dashboard />;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// GAP — state declared but never rendered
|
|
112
|
+
const [error, setError] = useState<string | null>(null);
|
|
113
|
+
// ... error never appears in JSX
|
|
114
|
+
|
|
115
|
+
// GAP — handler defined but not bound
|
|
116
|
+
function handleSubmit(data: FormData) { /* real logic */ }
|
|
117
|
+
// ... <form onSubmit={handleSubmit}> never appears
|
|
118
|
+
|
|
119
|
+
// GAP — route defined with no-op handler
|
|
120
|
+
app.post("/api/orders", (_req, res) => {
|
|
121
|
+
res.status(200).json({ ok: true });
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// GAP — env var read but unused
|
|
125
|
+
const API_KEY = process.env.STRIPE_API_KEY;
|
|
126
|
+
// ... API_KEY never passed to any client or fetch call
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Patterns to flag:**
|
|
130
|
+
- `fetch`/`axios`/API call without `await` or `.then` (result discarded)
|
|
131
|
+
- State variable (`useState`, `useRef`) never rendered or read in output
|
|
132
|
+
- Event handler defined but not bound to any element/listener
|
|
133
|
+
- Route/endpoint registered with empty or no-op handler
|
|
134
|
+
- Environment variable or config read but never used downstream
|
|
135
|
+
- Import used only in type position but imported as value (in non-type-only import)
|
|
@@ -30,31 +30,39 @@ Analyze recently modified code and apply refinements that:
|
|
|
30
30
|
- Use proper error handling patterns (avoid try/catch when possible)
|
|
31
31
|
- Maintain consistent naming conventions
|
|
32
32
|
|
|
33
|
-
3. **
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
33
|
+
3. **Remove Slop**: Detect and remove these categories:
|
|
34
|
+
|
|
35
|
+
| Category | Pattern |
|
|
36
|
+
|----------|---------|
|
|
37
|
+
| Language-behavior tests | Tests verifying built-in language features work as documented |
|
|
38
|
+
| Redundant type checks | Runtime checks for types TypeScript already enforces |
|
|
39
|
+
| Over-defensive handling | try/catch around code that cannot throw |
|
|
40
|
+
| Debug remnants | console.log, debugger, alert() left behind |
|
|
41
|
+
| Commented-out code | Dead code preserved in comments |
|
|
42
|
+
| Unused imports | Imports not referenced anywhere in file |
|
|
43
|
+
| Verbose names | Unnecessarily long names (`currentUserDataObject` → `user`) |
|
|
44
|
+
| Unnecessary intermediates | Variables used once, immediately after assignment |
|
|
45
|
+
|
|
46
|
+
4. **Enhance Clarity**: Simplify code structure by:
|
|
47
|
+
|
|
48
|
+
- Reducing unnecessary nesting (early returns, guard clauses)
|
|
38
49
|
- Consolidating related logic
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
- Choose clarity over brevity - explicit code is often better than overly compact code
|
|
50
|
+
- Avoiding nested ternary operators — prefer switch or if/else
|
|
51
|
+
- Choosing clarity over brevity — explicit code beats compact code
|
|
42
52
|
|
|
43
|
-
|
|
53
|
+
5. **Maintain Balance**: Avoid over-simplification that could:
|
|
44
54
|
|
|
45
|
-
- Reduce code clarity or maintainability
|
|
46
55
|
- Create overly clever solutions that are hard to understand
|
|
47
56
|
- Combine too many concerns into single functions or components
|
|
48
57
|
- Remove helpful abstractions that improve code organization
|
|
49
|
-
- Prioritize "fewer lines" over readability (e.g., nested ternaries, dense one-liners)
|
|
50
58
|
- Make the code harder to debug or extend
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
6. **Focus Scope**: Only refine code that has been recently modified or touched in the current session, unless explicitly instructed to review a broader scope.
|
|
53
61
|
|
|
54
62
|
Your refinement process:
|
|
55
63
|
|
|
56
64
|
1. Identify the recently modified code sections
|
|
57
|
-
2. Analyze for
|
|
65
|
+
2. Analyze for slop categories and clarity improvements
|
|
58
66
|
3. Apply project-specific best practices and coding standards
|
|
59
67
|
4. Ensure all functionality remains unchanged
|
|
60
68
|
5. Verify the refined code is simpler and more maintainable
|
|
@@ -87,7 +95,8 @@ Return structured completion status:
|
|
|
87
95
|
- Files outside the recently modified scope (unless instructed)
|
|
88
96
|
|
|
89
97
|
**Handle autonomously:**
|
|
90
|
-
-
|
|
98
|
+
- Slop removal (all 8 categories)
|
|
99
|
+
- Naming improvements, nesting reduction
|
|
91
100
|
- Import sorting and organization
|
|
92
101
|
- Redundant abstraction elimination
|
|
93
|
-
- Comment cleanup (remove obvious, keep non-obvious)
|
|
102
|
+
- Comment cleanup (remove obvious, keep non-obvious)
|
|
@@ -21,13 +21,15 @@ You receive from orchestrator:
|
|
|
21
21
|
|
|
22
22
|
2. **Evaluate P0 pillars** (Design, Functionality, Security): These MUST pass. Fix all issues found.
|
|
23
23
|
|
|
24
|
-
3. **
|
|
24
|
+
3. **Detect stubs and wiring gaps**: Check for placeholder implementations that compile but don't deliver real functionality. See `references/stub-detection.md` for patterns. Flag as P0-Functionality issues.
|
|
25
25
|
|
|
26
|
-
4. **Evaluate
|
|
26
|
+
4. **Evaluate P1 pillars** (Complexity, Error Handling, Tests): These SHOULD pass. Fix all issues found.
|
|
27
27
|
|
|
28
|
-
5. **
|
|
28
|
+
5. **Evaluate P2 pillars** (Naming, Consistency, Documentation): Report as suggestions. Fix if straightforward.
|
|
29
29
|
|
|
30
|
-
6. **
|
|
30
|
+
6. **Commit fixes**: If any changes were made, create a commit with message "fix: address self-review issues".
|
|
31
|
+
|
|
32
|
+
7. **Report status**: Return structured report with pillar evaluations and changes made.
|
|
31
33
|
|
|
32
34
|
## Principles
|
|
33
35
|
|
|
@@ -30,31 +30,39 @@ Analyze recently modified code and apply refinements that:
|
|
|
30
30
|
- Use proper error handling patterns (avoid try/catch when possible)
|
|
31
31
|
- Maintain consistent naming conventions
|
|
32
32
|
|
|
33
|
-
3. **
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
33
|
+
3. **Remove Slop**: Detect and remove these categories:
|
|
34
|
+
|
|
35
|
+
| Category | Pattern |
|
|
36
|
+
|----------|---------|
|
|
37
|
+
| Language-behavior tests | Tests verifying built-in language features work as documented |
|
|
38
|
+
| Redundant type checks | Runtime checks for types TypeScript already enforces |
|
|
39
|
+
| Over-defensive handling | try/catch around code that cannot throw |
|
|
40
|
+
| Debug remnants | console.log, debugger, alert() left behind |
|
|
41
|
+
| Commented-out code | Dead code preserved in comments |
|
|
42
|
+
| Unused imports | Imports not referenced anywhere in file |
|
|
43
|
+
| Verbose names | Unnecessarily long names (`currentUserDataObject` → `user`) |
|
|
44
|
+
| Unnecessary intermediates | Variables used once, immediately after assignment |
|
|
45
|
+
|
|
46
|
+
4. **Enhance Clarity**: Simplify code structure by:
|
|
47
|
+
|
|
48
|
+
- Reducing unnecessary nesting (early returns, guard clauses)
|
|
38
49
|
- Consolidating related logic
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
- Choose clarity over brevity - explicit code is often better than overly compact code
|
|
50
|
+
- Avoiding nested ternary operators — prefer switch or if/else
|
|
51
|
+
- Choosing clarity over brevity — explicit code beats compact code
|
|
42
52
|
|
|
43
|
-
|
|
53
|
+
5. **Maintain Balance**: Avoid over-simplification that could:
|
|
44
54
|
|
|
45
|
-
- Reduce code clarity or maintainability
|
|
46
55
|
- Create overly clever solutions that are hard to understand
|
|
47
56
|
- Combine too many concerns into single functions or components
|
|
48
57
|
- Remove helpful abstractions that improve code organization
|
|
49
|
-
- Prioritize "fewer lines" over readability (e.g., nested ternaries, dense one-liners)
|
|
50
58
|
- Make the code harder to debug or extend
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
6. **Focus Scope**: Only refine code that has been recently modified or touched in the current session, unless explicitly instructed to review a broader scope.
|
|
53
61
|
|
|
54
62
|
Your refinement process:
|
|
55
63
|
|
|
56
64
|
1. Identify the recently modified code sections
|
|
57
|
-
2. Analyze for
|
|
65
|
+
2. Analyze for slop categories and clarity improvements
|
|
58
66
|
3. Apply project-specific best practices and coding standards
|
|
59
67
|
4. Ensure all functionality remains unchanged
|
|
60
68
|
5. Verify the refined code is simpler and more maintainable
|
|
@@ -87,7 +95,8 @@ Return structured completion status:
|
|
|
87
95
|
- Files outside the recently modified scope (unless instructed)
|
|
88
96
|
|
|
89
97
|
**Handle autonomously:**
|
|
90
|
-
-
|
|
98
|
+
- Slop removal (all 8 categories)
|
|
99
|
+
- Naming improvements, nesting reduction
|
|
91
100
|
- Import sorting and organization
|
|
92
101
|
- Redundant abstraction elimination
|
|
93
|
-
- Comment cleanup (remove obvious, keep non-obvious)
|
|
102
|
+
- Comment cleanup (remove obvious, keep non-obvious)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Stub Detection Patterns
|
|
2
|
+
|
|
3
|
+
Placeholder implementations that compile but don't deliver real functionality. Flag as **P0-Functionality** issues.
|
|
4
|
+
|
|
5
|
+
Cross-reference: `core-patterns/references/code-smell-violations.md` covers hardcoded data and fake functionality labeling. This file focuses on structural stub patterns.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Component Stubs
|
|
10
|
+
|
|
11
|
+
Render nothing meaningful or return placeholder markup.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
// STUB — returns static text, no real rendering
|
|
15
|
+
function UserProfile({ userId }: Props) {
|
|
16
|
+
return <div>Name</div>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// REAL — fetches and renders actual data
|
|
20
|
+
function UserProfile({ userId }: Props) {
|
|
21
|
+
const user = useUser(userId);
|
|
22
|
+
if (!user) return <Skeleton />;
|
|
23
|
+
return <div><h2>{user.name}</h2><p>{user.email}</p></div>;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Patterns to flag:**
|
|
28
|
+
- `return null` / `return <></>` in components that should render content
|
|
29
|
+
- Empty function bodies (`{}`) for handlers or lifecycle methods
|
|
30
|
+
- Components returning only hardcoded strings with no data binding
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. API / Service Stubs
|
|
35
|
+
|
|
36
|
+
Functions that exist in signature but throw, return hardcoded values, or do nothing.
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// STUB — throws instead of implementing
|
|
40
|
+
async function createOrder(items: CartItem[]): Promise<Order> {
|
|
41
|
+
throw new Error("TODO: implement");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// STUB — hardcoded return, no real logic
|
|
45
|
+
async function getUser(id: string): Promise<User> {
|
|
46
|
+
return { id, name: "Test User", email: "test@test.com" };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// REAL — actual implementation
|
|
50
|
+
async function createOrder(items: CartItem[]): Promise<Result<Order, OrderError>> {
|
|
51
|
+
const validated = validateItems(items);
|
|
52
|
+
if (!validated.ok) return validated;
|
|
53
|
+
const order = await db.orders.create({ items: validated.value });
|
|
54
|
+
await queue.publish("order.created", order);
|
|
55
|
+
return { ok: true, value: order };
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Patterns to flag:**
|
|
60
|
+
- `throw new Error("TODO")` / `throw new Error("Not implemented")`
|
|
61
|
+
- Functions returning hardcoded objects (no DB/API/computation)
|
|
62
|
+
- `"Not implemented"` strings in response bodies
|
|
63
|
+
- Empty async functions (`async function foo() {}`)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. Hook / Effect Stubs
|
|
68
|
+
|
|
69
|
+
State and effects declared but not wired to behavior.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// STUB — effect does nothing
|
|
73
|
+
useEffect(() => {}, [userId]);
|
|
74
|
+
|
|
75
|
+
// STUB — state declared, setter never called
|
|
76
|
+
const [items, setItems] = useState<Item[]>([]);
|
|
77
|
+
// ... setItems never appears in the component
|
|
78
|
+
|
|
79
|
+
// STUB — custom hook returns static value
|
|
80
|
+
function usePermissions(): Permissions {
|
|
81
|
+
return { canEdit: true, canDelete: false };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// REAL — custom hook with actual logic
|
|
85
|
+
function usePermissions(): Permissions {
|
|
86
|
+
const { user } = useAuth();
|
|
87
|
+
const { data } = useQuery(["permissions", user.role], fetchPermissions);
|
|
88
|
+
return data ?? DEFAULT_PERMISSIONS;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Patterns to flag:**
|
|
93
|
+
- `useEffect(() => {}, [...])` — empty effect body
|
|
94
|
+
- `useState` where the setter is never called in the component
|
|
95
|
+
- Custom hooks returning static/hardcoded values
|
|
96
|
+
- `useMemo`/`useCallback` wrapping static values
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 4. Wiring Gaps
|
|
101
|
+
|
|
102
|
+
Individual pieces exist but aren't connected to the running application. **Highest-value detection** — these pass compilation and individual tests but the feature doesn't work end-to-end.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// GAP — fetch without await (result discarded)
|
|
106
|
+
function loadDashboard() {
|
|
107
|
+
fetchMetrics(); // Promise floats, never awaited
|
|
108
|
+
return <Dashboard />;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// GAP — state declared but never rendered
|
|
112
|
+
const [error, setError] = useState<string | null>(null);
|
|
113
|
+
// ... error never appears in JSX
|
|
114
|
+
|
|
115
|
+
// GAP — handler defined but not bound
|
|
116
|
+
function handleSubmit(data: FormData) { /* real logic */ }
|
|
117
|
+
// ... <form onSubmit={handleSubmit}> never appears
|
|
118
|
+
|
|
119
|
+
// GAP — route defined with no-op handler
|
|
120
|
+
app.post("/api/orders", (_req, res) => {
|
|
121
|
+
res.status(200).json({ ok: true });
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// GAP — env var read but unused
|
|
125
|
+
const API_KEY = process.env.STRIPE_API_KEY;
|
|
126
|
+
// ... API_KEY never passed to any client or fetch call
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Patterns to flag:**
|
|
130
|
+
- `fetch`/`axios`/API call without `await` or `.then` (result discarded)
|
|
131
|
+
- State variable (`useState`, `useRef`) never rendered or read in output
|
|
132
|
+
- Event handler defined but not bound to any element/listener
|
|
133
|
+
- Route/endpoint registered with empty or no-op handler
|
|
134
|
+
- Environment variable or config read but never used downstream
|
|
135
|
+
- Import used only in type position but imported as value (in non-type-only import)
|
|
@@ -1,39 +1,88 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Skimmer
|
|
3
|
-
description: Codebase orientation using
|
|
3
|
+
description: Codebase orientation using rskim to identify relevant files, functions, and patterns for a feature or task
|
|
4
|
+
tools: ["Bash", "Read"]
|
|
4
5
|
skills: knowledge-persistence
|
|
5
6
|
model: inherit
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# Skimmer Agent
|
|
9
10
|
|
|
10
|
-
You are a codebase orientation specialist
|
|
11
|
+
You are a codebase orientation specialist. You use `npx rskim` exclusively for code exploration — never Grep, Glob, or manual file searches. Your output gives implementation agents a clear map of relevant files, functions, and integration points.
|
|
11
12
|
|
|
12
13
|
## Input Context
|
|
13
14
|
|
|
14
15
|
You receive from orchestrator:
|
|
15
16
|
- **TASK_DESCRIPTION**: What feature/task needs to be implemented or understood
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## Workflow
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
2. **Skim key directories** - Extract structure from src/, lib/, or app/ with `npx rskim --mode structure --show-stats`
|
|
21
|
-
3. **Search for task-relevant code** - Find files matching task keywords
|
|
22
|
-
4. **Identify integration points** - Exports, entry points, import patterns
|
|
23
|
-
5. **Generate orientation summary** - Structured output for implementation planning
|
|
24
|
-
6. **Check project knowledge** - If `.memory/knowledge/decisions.md` exists, read its `<!-- TL;DR: ... -->` first-line comment and include active decision count in orientation under "### Active Decisions". Only the TL;DR is read here (not full entries) — this is intentional for token efficiency; agents that need full entries read the file themselves.
|
|
20
|
+
Execute these steps in order. Do NOT skip steps or reorder.
|
|
25
21
|
|
|
26
|
-
|
|
22
|
+
### Step 1: Project Overview
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
Run `ls` on the project root via Bash to identify source directories and project type. Then Read the project manifest (`package.json`, `Cargo.toml`, `go.mod`, `pyproject.toml`, etc.) to understand the project.
|
|
29
25
|
|
|
30
|
-
|
|
26
|
+
**CRITICAL**: Never run `npx rskim .` or `npx rskim` on the repo root — it scans ALL files including `node_modules/` and produces millions of tokens. Always target specific source directories.
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
### Step 2: Primary Source Skim
|
|
29
|
+
|
|
30
|
+
Run rskim on the main source directory with a token budget:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx rskim src/ --tokens 15000 --show-stats
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The `--tokens` flag auto-cascades through modes (full → minimal → structure → signatures → types) to fit within the budget. Let it choose the mode — do not specify `--mode` when using `--tokens`.
|
|
37
|
+
|
|
38
|
+
If `--tokens` flag errors (older rskim version), fall back to:
|
|
39
|
+
```bash
|
|
40
|
+
npx rskim src/ --mode structure --show-stats
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Step 3: Secondary Directories (if relevant to task)
|
|
44
|
+
|
|
45
|
+
Skim additional directories with smaller budgets:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx rskim tests/ --tokens 5000 --show-stats
|
|
49
|
+
npx rskim scripts/ --tokens 5000 --show-stats
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Only skim directories relevant to the task description.
|
|
53
|
+
|
|
54
|
+
### Step 4: Deep Inspection
|
|
55
|
+
|
|
56
|
+
For specific files needing detailed view, use rskim with full mode:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx rskim path/to/file.ts --mode full
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Use this instead of Read for code files.
|
|
63
|
+
|
|
64
|
+
### Step 5: Project Knowledge
|
|
65
|
+
|
|
66
|
+
If `.memory/knowledge/decisions.md` exists, Read its `<!-- TL;DR: ... -->` first-line comment and include active decision count in orientation under "### Active Decisions". Only the TL;DR is read here — this is intentional for token efficiency.
|
|
67
|
+
|
|
68
|
+
### Step 6: Generate Summary
|
|
69
|
+
|
|
70
|
+
Produce the orientation summary in the output format below.
|
|
71
|
+
|
|
72
|
+
## rskim Reference
|
|
73
|
+
|
|
74
|
+
| Flag | Effect |
|
|
75
|
+
|------|--------|
|
|
76
|
+
| `--tokens N` | Token budget — auto-selects best mode to fit within N tokens |
|
|
77
|
+
| `--mode minimal` | Maximum compression (~85-90% reduction) |
|
|
78
|
+
| `--mode structure` | Architecture overview (~60-70% reduction) |
|
|
79
|
+
| `--mode signatures` | API/function details (~85-92% reduction) |
|
|
80
|
+
| `--mode types` | Type definitions only (~90-95% reduction) |
|
|
81
|
+
| `--mode full` | Complete file content (0% reduction) |
|
|
82
|
+
| `--show-stats` | Show original vs skimmed token counts |
|
|
83
|
+
| `--max-lines N` | AST-aware truncation (keeps types/signatures over imports/bodies) |
|
|
84
|
+
|
|
85
|
+
**Preferred**: Use `--tokens N` instead of choosing modes manually.
|
|
37
86
|
|
|
38
87
|
## Output
|
|
39
88
|
|
|
@@ -41,10 +90,10 @@ Always invoke skim via `npx rskim`. This works whether or not skim is globally i
|
|
|
41
90
|
## Codebase Orientation
|
|
42
91
|
|
|
43
92
|
### Project Type
|
|
44
|
-
{Language/framework from
|
|
93
|
+
{Language/framework from manifest}
|
|
45
94
|
|
|
46
95
|
### Token Statistics
|
|
47
|
-
{From
|
|
96
|
+
{From rskim --show-stats: original vs skimmed tokens}
|
|
48
97
|
|
|
49
98
|
### Directory Structure
|
|
50
99
|
| Directory | Purpose |
|
|
@@ -78,16 +127,17 @@ Always invoke skim via `npx rskim`. This works whether or not skim is globally i
|
|
|
78
127
|
1. **Speed over depth** - Get oriented quickly, don't deep dive everything
|
|
79
128
|
2. **Pattern discovery first** - Find existing patterns before recommending approaches
|
|
80
129
|
3. **Be decisive** - Make confident recommendations about where to integrate
|
|
81
|
-
4. **Token efficiency** - Use
|
|
130
|
+
4. **Token efficiency** - Use rskim token budgets and stats to show compression ratio
|
|
82
131
|
5. **Task-focused** - Only explore what's relevant to the task
|
|
83
132
|
|
|
84
133
|
## Boundaries
|
|
85
134
|
|
|
86
135
|
**Handle autonomously:**
|
|
87
|
-
- Directory structure exploration
|
|
136
|
+
- Directory structure exploration via rskim
|
|
88
137
|
- Pattern identification
|
|
89
138
|
- Generating orientation summaries
|
|
90
139
|
|
|
91
140
|
**Escalate to orchestrator:**
|
|
141
|
+
- If `npx rskim` fails, report the error (do not attempt manual fallbacks with other tools) — orchestrators should spawn an ad-hoc Explore agent if Skimmer reports rskim failure
|
|
92
142
|
- No source directories found (ask user for structure)
|
|
93
143
|
- Ambiguous project structure (report findings, ask for clarification)
|
|
@@ -53,7 +53,7 @@ Spawn Skimmer agent for codebase context:
|
|
|
53
53
|
```
|
|
54
54
|
Task(subagent_type="Skimmer"):
|
|
55
55
|
"Orient in codebase for requirements exploration: {feature}
|
|
56
|
-
|
|
56
|
+
Run rskim on source directories (NOT repo root) to find: project structure, similar features, patterns, integration points
|
|
57
57
|
Return: codebase context for requirements (not implementation details)"
|
|
58
58
|
```
|
|
59
59
|
|
|
@@ -53,7 +53,7 @@ Spawn Skimmer agent for codebase context:
|
|
|
53
53
|
```
|
|
54
54
|
Task(subagent_type="Skimmer"):
|
|
55
55
|
"Orient in codebase for requirements exploration: {feature}
|
|
56
|
-
|
|
56
|
+
Run rskim on source directories (NOT repo root) to find: project structure, similar features, patterns, integration points
|
|
57
57
|
Return: codebase context for requirements (not implementation details)"
|
|
58
58
|
```
|
|
59
59
|
|