maestro-flow 0.3.10 → 0.3.11
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/.claude/agents/workflow-collab-planner.md +1 -1
- package/.claude/agents/workflow-executor.md +1 -1
- package/.claude/agents/workflow-plan-checker.md +1 -1
- package/.claude/agents/workflow-planner.md +1 -1
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +1 -1
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue.md +2 -2
- package/.claude/commands/spec-add.md +67 -56
- package/.claude/commands/spec-load.md +66 -64
- package/.claude/commands/spec-setup.md +5 -9
- package/.codex/skills/learn-decompose/SKILL.md +119 -0
- package/.codex/skills/learn-follow/SKILL.md +83 -0
- package/.codex/skills/learn-investigate/SKILL.md +83 -0
- package/.codex/skills/learn-retro/SKILL.md +83 -0
- package/.codex/skills/learn-second-opinion/SKILL.md +86 -0
- package/.codex/skills/maestro/SKILL.md +151 -279
- package/.codex/skills/maestro-analyze/SKILL.md +59 -71
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +95 -110
- package/.codex/skills/maestro-coordinate/SKILL.md +68 -234
- package/.codex/skills/maestro-execute/SKILL.md +435 -446
- package/.codex/skills/maestro-fork/SKILL.md +68 -0
- package/.codex/skills/maestro-init/SKILL.md +171 -167
- package/.codex/skills/maestro-learn/SKILL.md +80 -0
- package/.codex/skills/maestro-link-coordinate/SKILL.md +224 -220
- package/.codex/skills/maestro-merge/SKILL.md +62 -0
- package/.codex/skills/maestro-milestone-audit/SKILL.md +108 -103
- package/.codex/skills/maestro-milestone-complete/SKILL.md +155 -149
- package/.codex/skills/maestro-milestone-release/SKILL.md +70 -0
- package/.codex/skills/maestro-overlay/SKILL.md +188 -185
- package/.codex/skills/maestro-plan/SKILL.md +58 -69
- package/.codex/skills/maestro-quick/SKILL.md +26 -23
- package/.codex/skills/maestro-roadmap/SKILL.md +65 -73
- package/.codex/skills/maestro-spec-generate/SKILL.md +66 -74
- package/.codex/skills/maestro-ui-design/SKILL.md +34 -31
- package/.codex/skills/maestro-verify/SKILL.md +556 -566
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +397 -405
- package/.codex/skills/manage-codebase-refresh/SKILL.md +93 -82
- package/.codex/skills/manage-harvest/SKILL.md +82 -0
- package/.codex/skills/manage-issue/SKILL.md +80 -65
- package/.codex/skills/manage-issue-discover/SKILL.md +491 -503
- package/.codex/skills/manage-learn/SKILL.md +190 -186
- package/.codex/skills/manage-memory/SKILL.md +95 -72
- package/.codex/skills/manage-memory-capture/SKILL.md +99 -86
- package/.codex/skills/manage-status/SKILL.md +102 -89
- package/.codex/skills/quality-business-test/SKILL.md +228 -223
- package/.codex/skills/quality-debug/SKILL.md +54 -66
- package/.codex/skills/quality-integration-test/SKILL.md +532 -544
- package/.codex/skills/quality-refactor/SKILL.md +197 -191
- package/.codex/skills/quality-retrospective/SKILL.md +512 -505
- package/.codex/skills/quality-review/SKILL.md +93 -105
- package/.codex/skills/quality-sync/SKILL.md +101 -89
- package/.codex/skills/quality-test/SKILL.md +202 -198
- package/.codex/skills/quality-test-gen/SKILL.md +93 -104
- package/.codex/skills/spec-add/SKILL.md +58 -39
- package/.codex/skills/spec-load/SKILL.md +45 -40
- package/.codex/skills/spec-map/SKILL.md +180 -182
- package/.codex/skills/spec-setup/SKILL.md +94 -76
- package/.codex/skills/team-coordinate/SKILL.md +346 -357
- package/.codex/skills/team-executor/SKILL.md +70 -112
- package/.codex/skills/team-lifecycle-v4/SKILL.md +311 -299
- package/.codex/skills/team-quality-assurance/SKILL.md +234 -227
- package/.codex/skills/team-review/SKILL.md +232 -225
- package/.codex/skills/team-tech-debt/SKILL.md +78 -100
- package/.codex/skills/team-testing/SKILL.md +242 -235
- package/.codex/skills/wiki-connect/SKILL.md +75 -0
- package/.codex/skills/wiki-digest/SKILL.md +87 -0
- package/README.md +7 -4
- package/README.zh-CN.md +7 -4
- package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +75 -30
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +5 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +21 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +3 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/src/hooks/constants.d.ts +2 -0
- package/dashboard/dist-server/src/hooks/constants.js +2 -0
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dist/src/commands/collab.js +4 -4
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +66 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +7 -2
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/hooks/constants.d.ts +2 -0
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +2 -0
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +1 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +1 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- package/dist/src/hooks/guards/spec-validator.d.ts +25 -0
- package/dist/src/hooks/guards/spec-validator.d.ts.map +1 -0
- package/dist/src/hooks/guards/spec-validator.js +66 -0
- package/dist/src/hooks/guards/spec-validator.js.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts +21 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.js +96 -0
- package/dist/src/hooks/keyword-spec-injector.js.map +1 -0
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts +2 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts.map +1 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.js +21 -12
- package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
- package/dist/src/hooks/spec-bridge.d.ts +40 -0
- package/dist/src/hooks/spec-bridge.d.ts.map +1 -0
- package/dist/src/hooks/spec-bridge.js +97 -0
- package/dist/src/hooks/spec-bridge.js.map +1 -0
- package/dist/src/hooks/spec-injector.d.ts.map +1 -1
- package/dist/src/hooks/spec-injector.js +18 -12
- package/dist/src/hooks/spec-injector.js.map +1 -1
- package/dist/src/team/phase-orchestrator.d.ts +52 -0
- package/dist/src/team/phase-orchestrator.d.ts.map +1 -0
- package/dist/src/team/phase-orchestrator.js +165 -0
- package/dist/src/team/phase-orchestrator.js.map +1 -0
- package/dist/src/team/phase-types.d.ts +51 -0
- package/dist/src/team/phase-types.d.ts.map +1 -0
- package/dist/src/team/phase-types.js +41 -0
- package/dist/src/team/phase-types.js.map +1 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/spec-entry-parser.d.ts +56 -0
- package/dist/src/tools/spec-entry-parser.d.ts.map +1 -0
- package/dist/src/tools/spec-entry-parser.js +196 -0
- package/dist/src/tools/spec-entry-parser.js.map +1 -0
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +66 -92
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-keyword-index.d.ts +30 -0
- package/dist/src/tools/spec-keyword-index.d.ts.map +1 -0
- package/dist/src/tools/spec-keyword-index.js +101 -0
- package/dist/src/tools/spec-keyword-index.js.map +1 -0
- package/dist/src/tools/spec-loader.d.ts +3 -3
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +49 -23
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/dist/src/tools/team-agents.d.ts +27 -0
- package/dist/src/tools/team-agents.d.ts.map +1 -0
- package/dist/src/tools/team-agents.js +362 -0
- package/dist/src/tools/team-agents.js.map +1 -0
- package/dist/src/tools/team-mailbox.d.ts +40 -0
- package/dist/src/tools/team-mailbox.d.ts.map +1 -0
- package/dist/src/tools/team-mailbox.js +384 -0
- package/dist/src/tools/team-mailbox.js.map +1 -0
- package/dist/src/tools/team-msg.d.ts +17 -8
- package/dist/src/tools/team-msg.d.ts.map +1 -1
- package/dist/src/tools/team-msg.js +110 -13
- package/dist/src/tools/team-msg.js.map +1 -1
- package/dist/src/tools/team-tasks-mcp.d.ts +27 -0
- package/dist/src/tools/team-tasks-mcp.d.ts.map +1 -0
- package/dist/src/tools/team-tasks-mcp.js +408 -0
- package/dist/src/tools/team-tasks-mcp.js.map +1 -0
- package/package.json +2 -1
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +471 -471
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/execute.md +1 -1
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +343 -343
- package/workflows/issue-discover.md +414 -414
- package/workflows/map.md +111 -111
- package/workflows/milestone-complete.md +176 -176
- package/workflows/plan.md +1 -1
- package/workflows/quick.md +497 -497
- package/workflows/refactor.md +300 -300
- package/workflows/roadmap.md +335 -335
- package/workflows/spec-generate.md +640 -640
- package/workflows/specs-add.md +46 -81
- package/workflows/specs-load.md +15 -17
- package/workflows/specs-setup.md +40 -161
|
@@ -1,414 +1,414 @@
|
|
|
1
|
-
# Workflow: Issue Discovery
|
|
2
|
-
|
|
3
|
-
Automated issue discovery via multi-perspective analysis or prompt-driven exploration.
|
|
4
|
-
|
|
5
|
-
## Input
|
|
6
|
-
|
|
7
|
-
- `$ARGUMENTS`: empty (multi-perspective) or `by-prompt [prompt text]`
|
|
8
|
-
- Operates on `.workflow/issues/`
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
### Step 1: Parse Mode
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
1. Extract mode from $ARGUMENTS:
|
|
16
|
-
- empty or no arguments → MULTI_PERSPECTIVE mode (Step 3)
|
|
17
|
-
- "by-prompt" → PROMPT_DRIVEN mode (Step 7)
|
|
18
|
-
|
|
19
|
-
2. Remaining tokens after mode keyword = DISCOVERY_ARGS
|
|
20
|
-
For by-prompt: join remaining tokens as USER_PROMPT
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
### Step 2: Validate Environment
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
1. Check .workflow/ exists
|
|
29
|
-
If not → fatal: "No project initialized. Run /maestro-init first."
|
|
30
|
-
|
|
31
|
-
2. Check .workflow/issues/ exists
|
|
32
|
-
If not → mkdir -p .workflow/issues/
|
|
33
|
-
|
|
34
|
-
3. Ensure issues.jsonl exists
|
|
35
|
-
If not → touch .workflow/issues/issues.jsonl
|
|
36
|
-
|
|
37
|
-
4. Generate discovery session ID:
|
|
38
|
-
DBP-{YYYYMMDD}-{HHmmss}
|
|
39
|
-
|
|
40
|
-
5. Create discovery session directory:
|
|
41
|
-
mkdir -p .workflow/issues/discoveries/{SESSION_ID}/
|
|
42
|
-
|
|
43
|
-
6. Initialize discovery-state.json:
|
|
44
|
-
{
|
|
45
|
-
"id": "{SESSION_ID}",
|
|
46
|
-
"mode": "{discover|discover-by-prompt}",
|
|
47
|
-
"status": "in_progress",
|
|
48
|
-
"started_at": "{NOW_ISO}",
|
|
49
|
-
"completed_at": null,
|
|
50
|
-
"perspectives_completed": [],
|
|
51
|
-
"issues_found": 0,
|
|
52
|
-
"issues_deduplicated": 0
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Multi-Perspective Discovery (discover)
|
|
59
|
-
|
|
60
|
-
### Step 3: Define Analysis Perspectives
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
8 analysis perspectives, each with a focus area and guiding questions:
|
|
64
|
-
|
|
65
|
-
1. SECURITY
|
|
66
|
-
Focus: Authentication, authorization, input validation, secrets, injection
|
|
67
|
-
Question: "What security vulnerabilities or unsafe patterns exist?"
|
|
68
|
-
|
|
69
|
-
2. PERFORMANCE
|
|
70
|
-
Focus: N+1 queries, unbounded loops, missing caching, memory leaks, large payloads
|
|
71
|
-
Question: "What performance bottlenecks or inefficiencies exist?"
|
|
72
|
-
|
|
73
|
-
3. RELIABILITY
|
|
74
|
-
Focus: Error handling, retry logic, race conditions, data integrity, graceful degradation
|
|
75
|
-
Question: "What failure modes are unhandled or could cause data loss?"
|
|
76
|
-
|
|
77
|
-
4. MAINTAINABILITY
|
|
78
|
-
Focus: Code duplication, tight coupling, missing abstractions, unclear naming, dead code
|
|
79
|
-
Question: "What makes this codebase harder to understand or change?"
|
|
80
|
-
|
|
81
|
-
5. SCALABILITY
|
|
82
|
-
Focus: Hardcoded limits, single-threaded bottlenecks, stateful assumptions, schema rigidity
|
|
83
|
-
Question: "What will break or degrade as load/data/users increase?"
|
|
84
|
-
|
|
85
|
-
6. UX
|
|
86
|
-
Focus: Confusing flows, missing feedback, inconsistent behavior, accessibility gaps
|
|
87
|
-
Question: "What creates friction or confusion for end users?"
|
|
88
|
-
|
|
89
|
-
7. ACCESSIBILITY
|
|
90
|
-
Focus: Screen reader support, keyboard navigation, color contrast, ARIA labels, focus management
|
|
91
|
-
Question: "What barriers exist for users with disabilities?"
|
|
92
|
-
|
|
93
|
-
8. COMPLIANCE
|
|
94
|
-
Focus: Logging gaps, audit trails, data retention, privacy controls, regulatory requirements
|
|
95
|
-
Question: "What regulatory or policy requirements are not met?"
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Step 3.5: Load Project Specs
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
specs_content = maestro spec load --category
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Pass to each analysis agent so severity assessments align with project quality standards.
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
### Step 4: Launch Parallel Analysis
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
Launch analysis agents in batches of up to 4 concurrent:
|
|
112
|
-
|
|
113
|
-
Batch 1: security, performance, reliability, maintainability
|
|
114
|
-
Batch 2: scalability, ux, accessibility, compliance
|
|
115
|
-
|
|
116
|
-
For each perspective, launch a CLI analysis:
|
|
117
|
-
|
|
118
|
-
maestro delegate "PURPOSE: Discover {PERSPECTIVE} issues in the codebase.
|
|
119
|
-
Focus: {FOCUS_AREA}
|
|
120
|
-
Guiding question: {QUESTION}
|
|
121
|
-
|
|
122
|
-
TASK:
|
|
123
|
-
- Scan all source files for {PERSPECTIVE}-related problems
|
|
124
|
-
- Identify concrete issues with file:line references
|
|
125
|
-
- Rate each finding: critical / high / medium / low severity
|
|
126
|
-
- Provide brief fix direction for each finding
|
|
127
|
-
|
|
128
|
-
MODE: analysis
|
|
129
|
-
CONTEXT: @**/*
|
|
130
|
-
EXPECTED: JSON array of findings, each with:
|
|
131
|
-
title, severity, description, location (file:line), fix_direction, affected_components[]
|
|
132
|
-
CONSTRAINTS: Only report real issues with evidence, no speculative findings
|
|
133
|
-
" --to gemini --mode analysis
|
|
134
|
-
|
|
135
|
-
Store results per perspective in:
|
|
136
|
-
.workflow/issues/discoveries/{SESSION_ID}/{PERSPECTIVE}-findings.json
|
|
137
|
-
|
|
138
|
-
Update discovery-state.json:
|
|
139
|
-
perspectives_completed += ["{PERSPECTIVE}"]
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### Step 5: Deduplicate Findings
|
|
143
|
-
|
|
144
|
-
```
|
|
145
|
-
1. Load all *-findings.json from the session directory
|
|
146
|
-
2. Merge all findings into a single list
|
|
147
|
-
3. Deduplicate by similarity:
|
|
148
|
-
- Group findings by affected file path
|
|
149
|
-
- Within each file group, compare descriptions
|
|
150
|
-
- If two findings describe the same issue (>80% description overlap
|
|
151
|
-
or same file:line), keep the one with higher severity
|
|
152
|
-
4. Track: issues_found (pre-dedup), issues_deduplicated (post-dedup)
|
|
153
|
-
5. Update discovery-state.json with counts
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Step 6: Create Issues from Findings
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
For each unique finding:
|
|
160
|
-
1. Generate ISS-YYYYMMDD-NNN ID (same logic as create handler in issue.md)
|
|
161
|
-
2. Build issue record:
|
|
162
|
-
{
|
|
163
|
-
"id": "{ID}",
|
|
164
|
-
"title": "{finding.title}",
|
|
165
|
-
"status": "registered",
|
|
166
|
-
"priority": {severity_to_priority},
|
|
167
|
-
"severity": "{finding.severity}",
|
|
168
|
-
"source": "discovery",
|
|
169
|
-
"phase_ref": null,
|
|
170
|
-
"gap_ref": null,
|
|
171
|
-
"description": "{finding.description}",
|
|
172
|
-
"fix_direction": "{finding.fix_direction}",
|
|
173
|
-
"context": {
|
|
174
|
-
"location": "{finding.location}",
|
|
175
|
-
"suggested_fix": "",
|
|
176
|
-
"notes": "Discovered by {PERSPECTIVE} analysis in session {SESSION_ID}"
|
|
177
|
-
},
|
|
178
|
-
"tags": ["{PERSPECTIVE}"],
|
|
179
|
-
"affected_components": {finding.affected_components},
|
|
180
|
-
"feedback": [],
|
|
181
|
-
"issue_history": [
|
|
182
|
-
{
|
|
183
|
-
"timestamp": "{NOW_ISO}",
|
|
184
|
-
"from_status": null,
|
|
185
|
-
"to_status": "registered",
|
|
186
|
-
"actor": "discovery-agent",
|
|
187
|
-
"note": "Auto-discovered via {PERSPECTIVE} perspective"
|
|
188
|
-
}
|
|
189
|
-
],
|
|
190
|
-
"created_at": "{NOW_ISO}",
|
|
191
|
-
"updated_at": "{NOW_ISO}",
|
|
192
|
-
"resolved_at": null,
|
|
193
|
-
"resolution": null
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
Severity-to-priority mapping:
|
|
197
|
-
critical → 1
|
|
198
|
-
high → 2
|
|
199
|
-
medium → 3
|
|
200
|
-
low → 4
|
|
201
|
-
|
|
202
|
-
3. Append to .workflow/issues/issues.jsonl
|
|
203
|
-
4. Also append to .workflow/issues/discoveries/{SESSION_ID}/discovery-issues.jsonl
|
|
204
|
-
|
|
205
|
-
5. Update discovery-state.json:
|
|
206
|
-
status = "completed"
|
|
207
|
-
completed_at = NOW_ISO
|
|
208
|
-
|
|
209
|
-
6. Display summary:
|
|
210
|
-
====================================================
|
|
211
|
-
DISCOVERY COMPLETE: {SESSION_ID}
|
|
212
|
-
Mode: multi-perspective (8 perspectives)
|
|
213
|
-
Findings: {issues_found} raw, {issues_deduplicated} unique
|
|
214
|
-
Issues created: {issues_deduplicated}
|
|
215
|
-
====================================================
|
|
216
|
-
|
|
217
|
-
BREAKDOWN BY PERSPECTIVE:
|
|
218
|
-
Security: {count}
|
|
219
|
-
Performance: {count}
|
|
220
|
-
Reliability: {count}
|
|
221
|
-
Maintainability: {count}
|
|
222
|
-
Scalability: {count}
|
|
223
|
-
UX: {count}
|
|
224
|
-
Accessibility: {count}
|
|
225
|
-
Compliance: {count}
|
|
226
|
-
|
|
227
|
-
BREAKDOWN BY SEVERITY:
|
|
228
|
-
Critical: {count}
|
|
229
|
-
High: {count}
|
|
230
|
-
Medium: {count}
|
|
231
|
-
Low: {count}
|
|
232
|
-
|
|
233
|
-
7. Suggest next steps:
|
|
234
|
-
- Skill({ skill: "manage-issue", args: "list --severity critical" }) -- Review critical issues
|
|
235
|
-
- Skill({ skill: "manage-issue", args: "list" }) -- View all issues
|
|
236
|
-
- Skill({ skill: "manage-issue-discover", args: "by-prompt \"...\"" }) -- Explore specific area deeper
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
## Prompt-Driven Discovery (discover-by-prompt)
|
|
242
|
-
|
|
243
|
-
### Step 7: Parse User Prompt
|
|
244
|
-
|
|
245
|
-
```
|
|
246
|
-
1. Extract USER_PROMPT from DISCOVERY_ARGS
|
|
247
|
-
If empty → AskUserQuestion({
|
|
248
|
-
question: "What kind of issues should I look for?",
|
|
249
|
-
options: [
|
|
250
|
-
{ label: "Error handling gaps", description: "Missing try/catch, unhandled promises, swallowed errors" },
|
|
251
|
-
{ label: "API contract violations", description: "Mismatched types, missing validation, undocumented endpoints" },
|
|
252
|
-
{ label: "Test coverage gaps", description: "Untested code paths, missing edge cases" },
|
|
253
|
-
{ label: "Custom", description: "Describe what to look for" }
|
|
254
|
-
]
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
2. Store USER_PROMPT for exploration context
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### Step 8: Plan Exploration Dimensions
|
|
261
|
-
|
|
262
|
-
```
|
|
263
|
-
Use Gemini CLI to decompose the user prompt into exploration dimensions:
|
|
264
|
-
|
|
265
|
-
maestro delegate "PURPOSE: Decompose this issue discovery prompt into 3-5 specific exploration dimensions.
|
|
266
|
-
|
|
267
|
-
User wants to find: {USER_PROMPT}
|
|
268
|
-
|
|
269
|
-
TASK:
|
|
270
|
-
- Break down the prompt into concrete, searchable dimensions
|
|
271
|
-
- For each dimension: provide search patterns (regex/keywords), file patterns, and what constitutes a finding
|
|
272
|
-
- Output as JSON array of dimensions
|
|
273
|
-
|
|
274
|
-
MODE: analysis
|
|
275
|
-
EXPECTED: JSON array:
|
|
276
|
-
[{
|
|
277
|
-
name: string,
|
|
278
|
-
description: string,
|
|
279
|
-
search_patterns: string[],
|
|
280
|
-
file_patterns: string[],
|
|
281
|
-
finding_criteria: string
|
|
282
|
-
}]
|
|
283
|
-
" --to gemini --mode analysis
|
|
284
|
-
|
|
285
|
-
Store dimensions in:
|
|
286
|
-
.workflow/issues/discoveries/{SESSION_ID}/exploration-plan.json
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### Step 9: Gather Codebase Context
|
|
290
|
-
|
|
291
|
-
```
|
|
292
|
-
For each exploration dimension:
|
|
293
|
-
|
|
294
|
-
1. Use @~/.maestro/templates/search-tool.json for semantic search:
|
|
295
|
-
{search_tool}(
|
|
296
|
-
project_root_path="{PROJECT_ROOT}",
|
|
297
|
-
query="{dimension.description}"
|
|
298
|
-
)
|
|
299
|
-
|
|
300
|
-
2. Use ripgrep for pattern-based search:
|
|
301
|
-
For each pattern in dimension.search_patterns:
|
|
302
|
-
rg "{pattern}" --type-add "src:*.{ts,tsx,js,jsx,py,java,go}" --type src -n
|
|
303
|
-
|
|
304
|
-
3. Collect matching files and code snippets
|
|
305
|
-
4. Store context per dimension in:
|
|
306
|
-
.workflow/issues/discoveries/{SESSION_ID}/{dimension.name}-context.md
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
### Step 10: Iterative Exploration Loop
|
|
310
|
-
|
|
311
|
-
```
|
|
312
|
-
Max 3 rounds of exploration:
|
|
313
|
-
|
|
314
|
-
Round 1: Initial analysis
|
|
315
|
-
- Analyze gathered context from Step 9
|
|
316
|
-
- Identify concrete issues with evidence
|
|
317
|
-
- Identify gaps in coverage (areas not yet explored)
|
|
318
|
-
|
|
319
|
-
Round 2: Deepen search (if gaps found)
|
|
320
|
-
- For each identified gap:
|
|
321
|
-
- Refine search patterns
|
|
322
|
-
- Search adjacent files/modules
|
|
323
|
-
- Cross-reference with related code
|
|
324
|
-
- Merge new findings with Round 1
|
|
325
|
-
|
|
326
|
-
Round 3: Final sweep (if significant gaps remain)
|
|
327
|
-
- Focus on high-severity patterns not yet covered
|
|
328
|
-
- Check cross-module interactions
|
|
329
|
-
- Finalize findings list
|
|
330
|
-
|
|
331
|
-
After each round:
|
|
332
|
-
- Log findings count and coverage assessment
|
|
333
|
-
- If no new gaps or no new findings → exit loop early
|
|
334
|
-
|
|
335
|
-
Store exploration log:
|
|
336
|
-
.workflow/issues/discoveries/{SESSION_ID}/exploration-log.md
|
|
337
|
-
|
|
338
|
-
## Round {N}
|
|
339
|
-
- Files analyzed: {count}
|
|
340
|
-
- Findings: {count} new, {total} cumulative
|
|
341
|
-
- Gaps remaining: {list or "none"}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### Step 11: Generate Issues from Findings
|
|
345
|
-
|
|
346
|
-
```
|
|
347
|
-
1. Collect all findings from exploration rounds
|
|
348
|
-
2. Deduplicate (same logic as Step 5):
|
|
349
|
-
- Group by affected file
|
|
350
|
-
- Merge similar descriptions
|
|
351
|
-
- Keep higher-severity duplicate
|
|
352
|
-
|
|
353
|
-
3. For each unique finding:
|
|
354
|
-
- Generate ISS-YYYYMMDD-NNN ID
|
|
355
|
-
- Build issue record (same structure as Step 6)
|
|
356
|
-
- Set source = "discovery"
|
|
357
|
-
- Set tags = ["prompt-discovery", "{relevant dimension name}"]
|
|
358
|
-
- Set context.notes = "Discovered via prompt: {USER_PROMPT}"
|
|
359
|
-
|
|
360
|
-
4. Append to .workflow/issues/issues.jsonl
|
|
361
|
-
5. Append to .workflow/issues/discoveries/{SESSION_ID}/discovery-issues.jsonl
|
|
362
|
-
|
|
363
|
-
6. Update discovery-state.json:
|
|
364
|
-
status = "completed"
|
|
365
|
-
completed_at = NOW_ISO
|
|
366
|
-
|
|
367
|
-
7. Display summary:
|
|
368
|
-
====================================================
|
|
369
|
-
DISCOVERY COMPLETE: {SESSION_ID}
|
|
370
|
-
Mode: prompt-driven
|
|
371
|
-
Prompt: "{USER_PROMPT}"
|
|
372
|
-
Rounds: {rounds_executed}
|
|
373
|
-
Findings: {raw_count} raw, {deduped_count} unique
|
|
374
|
-
Issues created: {deduped_count}
|
|
375
|
-
====================================================
|
|
376
|
-
|
|
377
|
-
FINDINGS BY DIMENSION:
|
|
378
|
-
{dimension.name}: {count}
|
|
379
|
-
...
|
|
380
|
-
|
|
381
|
-
BREAKDOWN BY SEVERITY:
|
|
382
|
-
Critical: {count}
|
|
383
|
-
High: {count}
|
|
384
|
-
Medium: {count}
|
|
385
|
-
Low: {count}
|
|
386
|
-
|
|
387
|
-
8. Suggest next steps:
|
|
388
|
-
- Skill({ skill: "manage-issue", args: "list --source discovery" }) -- View discovered issues
|
|
389
|
-
- Skill({ skill: "manage-issue-discover" }) -- Run full 8-perspective scan
|
|
390
|
-
- Skill({ skill: "manage-issue-discover", args: "by-prompt \"...\"" }) -- Explore another area
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
---
|
|
394
|
-
|
|
395
|
-
## Output
|
|
396
|
-
|
|
397
|
-
- **Session artifacts**: `.workflow/issues/discoveries/{SESSION_ID}/`
|
|
398
|
-
- `discovery-state.json` -- session metadata and progress
|
|
399
|
-
- `discovery-issues.jsonl` -- issues found in this session
|
|
400
|
-
- `*-findings.json` -- raw findings per perspective (discover mode)
|
|
401
|
-
- `exploration-plan.json` -- dimensions (discover-by-prompt mode)
|
|
402
|
-
- `*-context.md` -- gathered context per dimension
|
|
403
|
-
- `exploration-log.md` -- round-by-round exploration log
|
|
404
|
-
- **Issues**: appended to `.workflow/issues/issues.jsonl`
|
|
405
|
-
|
|
406
|
-
## Quality Criteria
|
|
407
|
-
|
|
408
|
-
- Multi-perspective mode covers all 8 analysis angles
|
|
409
|
-
- Prompt-driven mode decomposes user intent into searchable dimensions
|
|
410
|
-
- Findings backed by concrete file:line evidence
|
|
411
|
-
- Deduplication prevents duplicate issue records
|
|
412
|
-
- Discovery session fully traceable via session directory
|
|
413
|
-
- All created issues follow the issue.json template schema
|
|
414
|
-
- ID generation avoids collisions with existing issues
|
|
1
|
+
# Workflow: Issue Discovery
|
|
2
|
+
|
|
3
|
+
Automated issue discovery via multi-perspective analysis or prompt-driven exploration.
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
- `$ARGUMENTS`: empty (multi-perspective) or `by-prompt [prompt text]`
|
|
8
|
+
- Operates on `.workflow/issues/`
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
### Step 1: Parse Mode
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
1. Extract mode from $ARGUMENTS:
|
|
16
|
+
- empty or no arguments → MULTI_PERSPECTIVE mode (Step 3)
|
|
17
|
+
- "by-prompt" → PROMPT_DRIVEN mode (Step 7)
|
|
18
|
+
|
|
19
|
+
2. Remaining tokens after mode keyword = DISCOVERY_ARGS
|
|
20
|
+
For by-prompt: join remaining tokens as USER_PROMPT
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Step 2: Validate Environment
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
1. Check .workflow/ exists
|
|
29
|
+
If not → fatal: "No project initialized. Run /maestro-init first."
|
|
30
|
+
|
|
31
|
+
2. Check .workflow/issues/ exists
|
|
32
|
+
If not → mkdir -p .workflow/issues/
|
|
33
|
+
|
|
34
|
+
3. Ensure issues.jsonl exists
|
|
35
|
+
If not → touch .workflow/issues/issues.jsonl
|
|
36
|
+
|
|
37
|
+
4. Generate discovery session ID:
|
|
38
|
+
DBP-{YYYYMMDD}-{HHmmss}
|
|
39
|
+
|
|
40
|
+
5. Create discovery session directory:
|
|
41
|
+
mkdir -p .workflow/issues/discoveries/{SESSION_ID}/
|
|
42
|
+
|
|
43
|
+
6. Initialize discovery-state.json:
|
|
44
|
+
{
|
|
45
|
+
"id": "{SESSION_ID}",
|
|
46
|
+
"mode": "{discover|discover-by-prompt}",
|
|
47
|
+
"status": "in_progress",
|
|
48
|
+
"started_at": "{NOW_ISO}",
|
|
49
|
+
"completed_at": null,
|
|
50
|
+
"perspectives_completed": [],
|
|
51
|
+
"issues_found": 0,
|
|
52
|
+
"issues_deduplicated": 0
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Multi-Perspective Discovery (discover)
|
|
59
|
+
|
|
60
|
+
### Step 3: Define Analysis Perspectives
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
8 analysis perspectives, each with a focus area and guiding questions:
|
|
64
|
+
|
|
65
|
+
1. SECURITY
|
|
66
|
+
Focus: Authentication, authorization, input validation, secrets, injection
|
|
67
|
+
Question: "What security vulnerabilities or unsafe patterns exist?"
|
|
68
|
+
|
|
69
|
+
2. PERFORMANCE
|
|
70
|
+
Focus: N+1 queries, unbounded loops, missing caching, memory leaks, large payloads
|
|
71
|
+
Question: "What performance bottlenecks or inefficiencies exist?"
|
|
72
|
+
|
|
73
|
+
3. RELIABILITY
|
|
74
|
+
Focus: Error handling, retry logic, race conditions, data integrity, graceful degradation
|
|
75
|
+
Question: "What failure modes are unhandled or could cause data loss?"
|
|
76
|
+
|
|
77
|
+
4. MAINTAINABILITY
|
|
78
|
+
Focus: Code duplication, tight coupling, missing abstractions, unclear naming, dead code
|
|
79
|
+
Question: "What makes this codebase harder to understand or change?"
|
|
80
|
+
|
|
81
|
+
5. SCALABILITY
|
|
82
|
+
Focus: Hardcoded limits, single-threaded bottlenecks, stateful assumptions, schema rigidity
|
|
83
|
+
Question: "What will break or degrade as load/data/users increase?"
|
|
84
|
+
|
|
85
|
+
6. UX
|
|
86
|
+
Focus: Confusing flows, missing feedback, inconsistent behavior, accessibility gaps
|
|
87
|
+
Question: "What creates friction or confusion for end users?"
|
|
88
|
+
|
|
89
|
+
7. ACCESSIBILITY
|
|
90
|
+
Focus: Screen reader support, keyboard navigation, color contrast, ARIA labels, focus management
|
|
91
|
+
Question: "What barriers exist for users with disabilities?"
|
|
92
|
+
|
|
93
|
+
8. COMPLIANCE
|
|
94
|
+
Focus: Logging gaps, audit trails, data retention, privacy controls, regulatory requirements
|
|
95
|
+
Question: "What regulatory or policy requirements are not met?"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Step 3.5: Load Project Specs
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
specs_content = maestro spec load --category coding
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Pass to each analysis agent so severity assessments align with project quality standards.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Step 4: Launch Parallel Analysis
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
Launch analysis agents in batches of up to 4 concurrent:
|
|
112
|
+
|
|
113
|
+
Batch 1: security, performance, reliability, maintainability
|
|
114
|
+
Batch 2: scalability, ux, accessibility, compliance
|
|
115
|
+
|
|
116
|
+
For each perspective, launch a CLI analysis:
|
|
117
|
+
|
|
118
|
+
maestro delegate "PURPOSE: Discover {PERSPECTIVE} issues in the codebase.
|
|
119
|
+
Focus: {FOCUS_AREA}
|
|
120
|
+
Guiding question: {QUESTION}
|
|
121
|
+
|
|
122
|
+
TASK:
|
|
123
|
+
- Scan all source files for {PERSPECTIVE}-related problems
|
|
124
|
+
- Identify concrete issues with file:line references
|
|
125
|
+
- Rate each finding: critical / high / medium / low severity
|
|
126
|
+
- Provide brief fix direction for each finding
|
|
127
|
+
|
|
128
|
+
MODE: analysis
|
|
129
|
+
CONTEXT: @**/*
|
|
130
|
+
EXPECTED: JSON array of findings, each with:
|
|
131
|
+
title, severity, description, location (file:line), fix_direction, affected_components[]
|
|
132
|
+
CONSTRAINTS: Only report real issues with evidence, no speculative findings
|
|
133
|
+
" --to gemini --mode analysis
|
|
134
|
+
|
|
135
|
+
Store results per perspective in:
|
|
136
|
+
.workflow/issues/discoveries/{SESSION_ID}/{PERSPECTIVE}-findings.json
|
|
137
|
+
|
|
138
|
+
Update discovery-state.json:
|
|
139
|
+
perspectives_completed += ["{PERSPECTIVE}"]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Step 5: Deduplicate Findings
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
1. Load all *-findings.json from the session directory
|
|
146
|
+
2. Merge all findings into a single list
|
|
147
|
+
3. Deduplicate by similarity:
|
|
148
|
+
- Group findings by affected file path
|
|
149
|
+
- Within each file group, compare descriptions
|
|
150
|
+
- If two findings describe the same issue (>80% description overlap
|
|
151
|
+
or same file:line), keep the one with higher severity
|
|
152
|
+
4. Track: issues_found (pre-dedup), issues_deduplicated (post-dedup)
|
|
153
|
+
5. Update discovery-state.json with counts
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 6: Create Issues from Findings
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
For each unique finding:
|
|
160
|
+
1. Generate ISS-YYYYMMDD-NNN ID (same logic as create handler in issue.md)
|
|
161
|
+
2. Build issue record:
|
|
162
|
+
{
|
|
163
|
+
"id": "{ID}",
|
|
164
|
+
"title": "{finding.title}",
|
|
165
|
+
"status": "registered",
|
|
166
|
+
"priority": {severity_to_priority},
|
|
167
|
+
"severity": "{finding.severity}",
|
|
168
|
+
"source": "discovery",
|
|
169
|
+
"phase_ref": null,
|
|
170
|
+
"gap_ref": null,
|
|
171
|
+
"description": "{finding.description}",
|
|
172
|
+
"fix_direction": "{finding.fix_direction}",
|
|
173
|
+
"context": {
|
|
174
|
+
"location": "{finding.location}",
|
|
175
|
+
"suggested_fix": "",
|
|
176
|
+
"notes": "Discovered by {PERSPECTIVE} analysis in session {SESSION_ID}"
|
|
177
|
+
},
|
|
178
|
+
"tags": ["{PERSPECTIVE}"],
|
|
179
|
+
"affected_components": {finding.affected_components},
|
|
180
|
+
"feedback": [],
|
|
181
|
+
"issue_history": [
|
|
182
|
+
{
|
|
183
|
+
"timestamp": "{NOW_ISO}",
|
|
184
|
+
"from_status": null,
|
|
185
|
+
"to_status": "registered",
|
|
186
|
+
"actor": "discovery-agent",
|
|
187
|
+
"note": "Auto-discovered via {PERSPECTIVE} perspective"
|
|
188
|
+
}
|
|
189
|
+
],
|
|
190
|
+
"created_at": "{NOW_ISO}",
|
|
191
|
+
"updated_at": "{NOW_ISO}",
|
|
192
|
+
"resolved_at": null,
|
|
193
|
+
"resolution": null
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
Severity-to-priority mapping:
|
|
197
|
+
critical → 1
|
|
198
|
+
high → 2
|
|
199
|
+
medium → 3
|
|
200
|
+
low → 4
|
|
201
|
+
|
|
202
|
+
3. Append to .workflow/issues/issues.jsonl
|
|
203
|
+
4. Also append to .workflow/issues/discoveries/{SESSION_ID}/discovery-issues.jsonl
|
|
204
|
+
|
|
205
|
+
5. Update discovery-state.json:
|
|
206
|
+
status = "completed"
|
|
207
|
+
completed_at = NOW_ISO
|
|
208
|
+
|
|
209
|
+
6. Display summary:
|
|
210
|
+
====================================================
|
|
211
|
+
DISCOVERY COMPLETE: {SESSION_ID}
|
|
212
|
+
Mode: multi-perspective (8 perspectives)
|
|
213
|
+
Findings: {issues_found} raw, {issues_deduplicated} unique
|
|
214
|
+
Issues created: {issues_deduplicated}
|
|
215
|
+
====================================================
|
|
216
|
+
|
|
217
|
+
BREAKDOWN BY PERSPECTIVE:
|
|
218
|
+
Security: {count}
|
|
219
|
+
Performance: {count}
|
|
220
|
+
Reliability: {count}
|
|
221
|
+
Maintainability: {count}
|
|
222
|
+
Scalability: {count}
|
|
223
|
+
UX: {count}
|
|
224
|
+
Accessibility: {count}
|
|
225
|
+
Compliance: {count}
|
|
226
|
+
|
|
227
|
+
BREAKDOWN BY SEVERITY:
|
|
228
|
+
Critical: {count}
|
|
229
|
+
High: {count}
|
|
230
|
+
Medium: {count}
|
|
231
|
+
Low: {count}
|
|
232
|
+
|
|
233
|
+
7. Suggest next steps:
|
|
234
|
+
- Skill({ skill: "manage-issue", args: "list --severity critical" }) -- Review critical issues
|
|
235
|
+
- Skill({ skill: "manage-issue", args: "list" }) -- View all issues
|
|
236
|
+
- Skill({ skill: "manage-issue-discover", args: "by-prompt \"...\"" }) -- Explore specific area deeper
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Prompt-Driven Discovery (discover-by-prompt)
|
|
242
|
+
|
|
243
|
+
### Step 7: Parse User Prompt
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
1. Extract USER_PROMPT from DISCOVERY_ARGS
|
|
247
|
+
If empty → AskUserQuestion({
|
|
248
|
+
question: "What kind of issues should I look for?",
|
|
249
|
+
options: [
|
|
250
|
+
{ label: "Error handling gaps", description: "Missing try/catch, unhandled promises, swallowed errors" },
|
|
251
|
+
{ label: "API contract violations", description: "Mismatched types, missing validation, undocumented endpoints" },
|
|
252
|
+
{ label: "Test coverage gaps", description: "Untested code paths, missing edge cases" },
|
|
253
|
+
{ label: "Custom", description: "Describe what to look for" }
|
|
254
|
+
]
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
2. Store USER_PROMPT for exploration context
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Step 8: Plan Exploration Dimensions
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
Use Gemini CLI to decompose the user prompt into exploration dimensions:
|
|
264
|
+
|
|
265
|
+
maestro delegate "PURPOSE: Decompose this issue discovery prompt into 3-5 specific exploration dimensions.
|
|
266
|
+
|
|
267
|
+
User wants to find: {USER_PROMPT}
|
|
268
|
+
|
|
269
|
+
TASK:
|
|
270
|
+
- Break down the prompt into concrete, searchable dimensions
|
|
271
|
+
- For each dimension: provide search patterns (regex/keywords), file patterns, and what constitutes a finding
|
|
272
|
+
- Output as JSON array of dimensions
|
|
273
|
+
|
|
274
|
+
MODE: analysis
|
|
275
|
+
EXPECTED: JSON array:
|
|
276
|
+
[{
|
|
277
|
+
name: string,
|
|
278
|
+
description: string,
|
|
279
|
+
search_patterns: string[],
|
|
280
|
+
file_patterns: string[],
|
|
281
|
+
finding_criteria: string
|
|
282
|
+
}]
|
|
283
|
+
" --to gemini --mode analysis
|
|
284
|
+
|
|
285
|
+
Store dimensions in:
|
|
286
|
+
.workflow/issues/discoveries/{SESSION_ID}/exploration-plan.json
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Step 9: Gather Codebase Context
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
For each exploration dimension:
|
|
293
|
+
|
|
294
|
+
1. Use @~/.maestro/templates/search-tool.json for semantic search:
|
|
295
|
+
{search_tool}(
|
|
296
|
+
project_root_path="{PROJECT_ROOT}",
|
|
297
|
+
query="{dimension.description}"
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
2. Use ripgrep for pattern-based search:
|
|
301
|
+
For each pattern in dimension.search_patterns:
|
|
302
|
+
rg "{pattern}" --type-add "src:*.{ts,tsx,js,jsx,py,java,go}" --type src -n
|
|
303
|
+
|
|
304
|
+
3. Collect matching files and code snippets
|
|
305
|
+
4. Store context per dimension in:
|
|
306
|
+
.workflow/issues/discoveries/{SESSION_ID}/{dimension.name}-context.md
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Step 10: Iterative Exploration Loop
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
Max 3 rounds of exploration:
|
|
313
|
+
|
|
314
|
+
Round 1: Initial analysis
|
|
315
|
+
- Analyze gathered context from Step 9
|
|
316
|
+
- Identify concrete issues with evidence
|
|
317
|
+
- Identify gaps in coverage (areas not yet explored)
|
|
318
|
+
|
|
319
|
+
Round 2: Deepen search (if gaps found)
|
|
320
|
+
- For each identified gap:
|
|
321
|
+
- Refine search patterns
|
|
322
|
+
- Search adjacent files/modules
|
|
323
|
+
- Cross-reference with related code
|
|
324
|
+
- Merge new findings with Round 1
|
|
325
|
+
|
|
326
|
+
Round 3: Final sweep (if significant gaps remain)
|
|
327
|
+
- Focus on high-severity patterns not yet covered
|
|
328
|
+
- Check cross-module interactions
|
|
329
|
+
- Finalize findings list
|
|
330
|
+
|
|
331
|
+
After each round:
|
|
332
|
+
- Log findings count and coverage assessment
|
|
333
|
+
- If no new gaps or no new findings → exit loop early
|
|
334
|
+
|
|
335
|
+
Store exploration log:
|
|
336
|
+
.workflow/issues/discoveries/{SESSION_ID}/exploration-log.md
|
|
337
|
+
|
|
338
|
+
## Round {N}
|
|
339
|
+
- Files analyzed: {count}
|
|
340
|
+
- Findings: {count} new, {total} cumulative
|
|
341
|
+
- Gaps remaining: {list or "none"}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Step 11: Generate Issues from Findings
|
|
345
|
+
|
|
346
|
+
```
|
|
347
|
+
1. Collect all findings from exploration rounds
|
|
348
|
+
2. Deduplicate (same logic as Step 5):
|
|
349
|
+
- Group by affected file
|
|
350
|
+
- Merge similar descriptions
|
|
351
|
+
- Keep higher-severity duplicate
|
|
352
|
+
|
|
353
|
+
3. For each unique finding:
|
|
354
|
+
- Generate ISS-YYYYMMDD-NNN ID
|
|
355
|
+
- Build issue record (same structure as Step 6)
|
|
356
|
+
- Set source = "discovery"
|
|
357
|
+
- Set tags = ["prompt-discovery", "{relevant dimension name}"]
|
|
358
|
+
- Set context.notes = "Discovered via prompt: {USER_PROMPT}"
|
|
359
|
+
|
|
360
|
+
4. Append to .workflow/issues/issues.jsonl
|
|
361
|
+
5. Append to .workflow/issues/discoveries/{SESSION_ID}/discovery-issues.jsonl
|
|
362
|
+
|
|
363
|
+
6. Update discovery-state.json:
|
|
364
|
+
status = "completed"
|
|
365
|
+
completed_at = NOW_ISO
|
|
366
|
+
|
|
367
|
+
7. Display summary:
|
|
368
|
+
====================================================
|
|
369
|
+
DISCOVERY COMPLETE: {SESSION_ID}
|
|
370
|
+
Mode: prompt-driven
|
|
371
|
+
Prompt: "{USER_PROMPT}"
|
|
372
|
+
Rounds: {rounds_executed}
|
|
373
|
+
Findings: {raw_count} raw, {deduped_count} unique
|
|
374
|
+
Issues created: {deduped_count}
|
|
375
|
+
====================================================
|
|
376
|
+
|
|
377
|
+
FINDINGS BY DIMENSION:
|
|
378
|
+
{dimension.name}: {count}
|
|
379
|
+
...
|
|
380
|
+
|
|
381
|
+
BREAKDOWN BY SEVERITY:
|
|
382
|
+
Critical: {count}
|
|
383
|
+
High: {count}
|
|
384
|
+
Medium: {count}
|
|
385
|
+
Low: {count}
|
|
386
|
+
|
|
387
|
+
8. Suggest next steps:
|
|
388
|
+
- Skill({ skill: "manage-issue", args: "list --source discovery" }) -- View discovered issues
|
|
389
|
+
- Skill({ skill: "manage-issue-discover" }) -- Run full 8-perspective scan
|
|
390
|
+
- Skill({ skill: "manage-issue-discover", args: "by-prompt \"...\"" }) -- Explore another area
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Output
|
|
396
|
+
|
|
397
|
+
- **Session artifacts**: `.workflow/issues/discoveries/{SESSION_ID}/`
|
|
398
|
+
- `discovery-state.json` -- session metadata and progress
|
|
399
|
+
- `discovery-issues.jsonl` -- issues found in this session
|
|
400
|
+
- `*-findings.json` -- raw findings per perspective (discover mode)
|
|
401
|
+
- `exploration-plan.json` -- dimensions (discover-by-prompt mode)
|
|
402
|
+
- `*-context.md` -- gathered context per dimension
|
|
403
|
+
- `exploration-log.md` -- round-by-round exploration log
|
|
404
|
+
- **Issues**: appended to `.workflow/issues/issues.jsonl`
|
|
405
|
+
|
|
406
|
+
## Quality Criteria
|
|
407
|
+
|
|
408
|
+
- Multi-perspective mode covers all 8 analysis angles
|
|
409
|
+
- Prompt-driven mode decomposes user intent into searchable dimensions
|
|
410
|
+
- Findings backed by concrete file:line evidence
|
|
411
|
+
- Deduplication prevents duplicate issue records
|
|
412
|
+
- Discovery session fully traceable via session directory
|
|
413
|
+
- All created issues follow the issue.json template schema
|
|
414
|
+
- ID generation avoids collisions with existing issues
|