opencodekit 0.23.2 → 0.23.4
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/README.md +7 -14
- package/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +92 -19
- package/dist/template/.opencode/README.md +43 -6
- package/dist/template/.opencode/artifacts/harness-workflows/plan.md +317 -0
- package/dist/template/.opencode/command/audit.md +65 -0
- package/dist/template/.opencode/command/init.md +19 -2
- package/dist/template/.opencode/command/research.md +67 -16
- package/dist/template/.opencode/command/ship.md +55 -5
- package/dist/template/.opencode/command/verify.md +5 -5
- package/dist/template/.opencode/opencode.json +12 -0
- package/dist/template/.opencode/plugin/README.md +0 -6
- package/dist/template/.opencode/plugin/codesearch.ts +730 -0
- package/dist/template/.opencode/plugin/memory/tools.ts +6 -6
- package/dist/template/.opencode/plugin/session-summary.ts +0 -2
- package/dist/template/.opencode/plugin/srcwalk.ts +22 -157
- package/dist/template/.opencode/skill/code-review-and-quality/SKILL.md +1 -1
- package/dist/template/.opencode/skill/debugging-and-error-recovery/SKILL.md +1 -1
- package/dist/template/.opencode/skill/deep-module-design/SKILL.md +1 -1
- package/dist/template/.opencode/skill/defense-in-depth/SKILL.md +0 -2
- package/dist/template/.opencode/skill/development-lifecycle/SKILL.md +11 -9
- package/dist/template/.opencode/skill/manifest.json +77 -0
- package/dist/template/.opencode/skill/planning-and-task-breakdown/SKILL.md +1 -1
- package/dist/template/.opencode/skill/srcwalk/SKILL.md +10 -13
- package/dist/template/.opencode/tool/grepsearch.ts +92 -103
- package/dist/template/.opencode/workflows/audit-pattern.md +51 -0
- package/dist/template/.opencode/workflows/batch-implement.md +82 -0
- package/dist/template/.opencode/workflows/deep-research.md +58 -0
- package/dist/template/.opencode/workflows/development-lifecycle-workflow.md +129 -0
- package/package.json +1 -1
- package/dist/template/.opencode/command/clarify.md +0 -46
- package/dist/template/.opencode/command/commit.md +0 -53
- package/dist/template/.opencode/command/design.md +0 -129
- package/dist/template/.opencode/command/explore.md +0 -169
- package/dist/template/.opencode/command/improve-architecture.md +0 -55
- package/dist/template/.opencode/command/pr.md +0 -148
- package/dist/template/.opencode/command/refactor.md +0 -65
- package/dist/template/.opencode/command/review-codebase.md +0 -128
- package/dist/template/.opencode/command/test.md +0 -66
- package/dist/template/.opencode/command/ui-review.md +0 -109
- package/dist/template/.opencode/opencodex-fast.jsonc +0 -3
- package/dist/template/.opencode/plugin/rtk.ts +0 -43
- package/dist/template/.opencode/skill/agent-teams/SKILL.md +0 -268
- package/dist/template/.opencode/skill/code-navigation/SKILL.md +0 -142
- package/dist/template/.opencode/skill/condition-based-waiting/SKILL.md +0 -135
- package/dist/template/.opencode/skill/condition-based-waiting/example.ts +0 -171
- package/dist/template/.opencode/skill/context-engineering/SKILL.md +0 -176
- package/dist/template/.opencode/skill/memory-system/SKILL.md +0 -147
- package/dist/template/.opencode/skill/structured-edit/SKILL.md +0 -191
- package/dist/template/.opencode/skill/ubiquitous-language/SKILL.md +0 -184
- package/dist/template/.opencode/skill/v0/SKILL.md +0 -158
|
@@ -114,23 +114,23 @@ Feedback mode examples:
|
|
|
114
114
|
// --- Feedback mode: observation #id marked helpful/harmful ---
|
|
115
115
|
if (args.id !== undefined && args.feedback !== undefined) {
|
|
116
116
|
const obsId = Number(args.id);
|
|
117
|
-
if (!Number.isInteger(obsId)) return "
|
|
117
|
+
if (!Number.isInteger(obsId)) return "id must be an integer.";
|
|
118
118
|
const fb = String(args.feedback);
|
|
119
119
|
if (fb !== "helpful" && fb !== "harmful")
|
|
120
|
-
return '
|
|
120
|
+
return 'feedback must be "helpful" or "harmful".';
|
|
121
121
|
|
|
122
122
|
const result = recordFeedback(obsId, fb, args.reason as string | undefined);
|
|
123
|
-
if (!result.success) return
|
|
123
|
+
if (!result.success) return `${result.error ?? "Failed to record feedback."}`;
|
|
124
124
|
|
|
125
125
|
return [
|
|
126
|
-
|
|
126
|
+
`Observation #${obsId} marked as ${fb}.`,
|
|
127
127
|
`- Feedback: ${result.helpfulCount} helpful / ${result.harmfulCount} harmful`,
|
|
128
128
|
].join("\n");
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
// --- Create mode: store a new observation ---
|
|
132
132
|
if (!args.type || !args.title) {
|
|
133
|
-
return "
|
|
133
|
+
return "Provide type+title to create an observation, or id+feedback to give feedback.";
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
const obsType = args.type as ObservationType;
|
|
@@ -200,7 +200,7 @@ Feedback mode examples:
|
|
|
200
200
|
|
|
201
201
|
const warnings =
|
|
202
202
|
validation.issues.length > 0
|
|
203
|
-
? `\
|
|
203
|
+
? `\nWarnings: ${validation.issues.map((i) => i.message).join("; ")}`
|
|
204
204
|
: "";
|
|
205
205
|
|
|
206
206
|
return `${TYPE_ICONS[obsType] ?? "📌"} Observation #${id} stored [${obsType}] "${args.title}" (confidence: ${confidence}, source: ${source})${warnings}`;
|
|
@@ -454,9 +454,7 @@ export const SessionSummaryPlugin: Plugin = async ({ client, directory }) => {
|
|
|
454
454
|
addRead(summary, normalized, "Code navigation");
|
|
455
455
|
break;
|
|
456
456
|
case "grep":
|
|
457
|
-
case "srcwalk_search":
|
|
458
457
|
case "glob":
|
|
459
|
-
case "srcwalk_files":
|
|
460
458
|
// Search tools — not tracking individual files
|
|
461
459
|
break;
|
|
462
460
|
}
|
|
@@ -5,9 +5,7 @@
|
|
|
5
5
|
* Wraps available CLI tools (rg/grep, find, cat, ls) into unified srcwalk_* tools.
|
|
6
6
|
*
|
|
7
7
|
* Tools (matching pikit srcwalk extension surface):
|
|
8
|
-
* - srcwalk_search — Search symbols/text/regex in codebase
|
|
9
8
|
* - srcwalk_read — Read files with optional section/range
|
|
10
|
-
* - srcwalk_files — Find files by glob pattern
|
|
11
9
|
* - srcwalk_deps — Show imports and dependents for a file
|
|
12
10
|
* - srcwalk_map — Directory tree overview
|
|
13
11
|
* - srcwalk_callers — Reverse call graph (grep-based)
|
|
@@ -23,7 +21,6 @@ import path from "node:path";
|
|
|
23
21
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
24
22
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
25
23
|
|
|
26
|
-
const BIN_RG = "rg";
|
|
27
24
|
const TIMEOUT_MS = 15_000;
|
|
28
25
|
const MAX_BUFFER = 5 * 1024 * 1024;
|
|
29
26
|
|
|
@@ -55,17 +52,25 @@ function run(
|
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
function hasRg(): boolean {
|
|
59
|
-
try {
|
|
60
|
-
execFileSync(BIN_RG, ["--version"], { encoding: "utf-8", timeout: 1000, stdio: "ignore" });
|
|
61
|
-
return true;
|
|
62
|
-
} catch {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
55
|
function plural(n: number, word: string): string {
|
|
68
|
-
return `${n} ${word}
|
|
56
|
+
if (n === 1) return `${n} ${word}`;
|
|
57
|
+
if (
|
|
58
|
+
word.endsWith("ch") ||
|
|
59
|
+
word.endsWith("s") ||
|
|
60
|
+
word.endsWith("sh") ||
|
|
61
|
+
word.endsWith("x") ||
|
|
62
|
+
word.endsWith("z")
|
|
63
|
+
) {
|
|
64
|
+
return `${n} ${word}es`;
|
|
65
|
+
}
|
|
66
|
+
if (
|
|
67
|
+
word.endsWith("y") &&
|
|
68
|
+
word.length > 1 &&
|
|
69
|
+
!["a", "e", "i", "o", "u"].includes(word[word.length - 2])
|
|
70
|
+
) {
|
|
71
|
+
return `${n} ${word.slice(0, -1)}ies`;
|
|
72
|
+
}
|
|
73
|
+
return `${n} ${word}s`;
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
// ---------------------------------------------------------------------------
|
|
@@ -73,68 +78,6 @@ function plural(n: number, word: string): string {
|
|
|
73
78
|
// ---------------------------------------------------------------------------
|
|
74
79
|
|
|
75
80
|
const srcwalkTools = {
|
|
76
|
-
// -----------------------------------------------------------------------
|
|
77
|
-
// srcwalk_search: Search codebase
|
|
78
|
-
// -----------------------------------------------------------------------
|
|
79
|
-
srcwalk_search: tool({
|
|
80
|
-
description: `Search for symbols, text, or regex patterns in code.\n\nUses ripgrep (rg) when available, falls back to grep.\nSupports symbol search (definitions first), content search, and regex.`,
|
|
81
|
-
args: {
|
|
82
|
-
query: tool.schema.string().describe("Search query or regex pattern"),
|
|
83
|
-
scope: tool.schema.string().optional().describe("Subdirectory scope (default: project root)"),
|
|
84
|
-
kind: tool.schema.string().optional().describe("Search type: text (default), regex, content"),
|
|
85
|
-
context: tool.schema.number().optional().describe("Lines of context before/after each match"),
|
|
86
|
-
limit: tool.schema.number().optional().describe("Max results (default: 30)"),
|
|
87
|
-
},
|
|
88
|
-
execute: async (args, context) => {
|
|
89
|
-
const query = String(args.query ?? "").trim();
|
|
90
|
-
if (!query) return "❌ query is required.";
|
|
91
|
-
const scope = args.scope ? String(args.scope) : context.directory;
|
|
92
|
-
const limit = Math.min(args.limit ?? 30, 100);
|
|
93
|
-
const ctxLines = args.context ?? 0;
|
|
94
|
-
const kind = String(args.kind ?? "text");
|
|
95
|
-
|
|
96
|
-
const searchDir = path.resolve(context.directory, scope);
|
|
97
|
-
|
|
98
|
-
if (hasRg()) {
|
|
99
|
-
const rgArgs = ["--no-heading", "--line-number", "--color", "never"];
|
|
100
|
-
rgArgs.push("--max-count", String(limit * 2));
|
|
101
|
-
if (ctxLines > 0) {
|
|
102
|
-
rgArgs.push("-C", String(ctxLines));
|
|
103
|
-
}
|
|
104
|
-
if (kind === "regex") {
|
|
105
|
-
rgArgs.push("-E", "rust");
|
|
106
|
-
} else {
|
|
107
|
-
rgArgs.push("-F"); // literal
|
|
108
|
-
}
|
|
109
|
-
rgArgs.push(query, searchDir);
|
|
110
|
-
|
|
111
|
-
const result = run(BIN_RG, rgArgs);
|
|
112
|
-
if (result.code !== 0 && result.stderr) {
|
|
113
|
-
// Try plain grep fallback
|
|
114
|
-
} else {
|
|
115
|
-
const lines = result.stdout.split("\n").filter(Boolean).slice(0, limit);
|
|
116
|
-
if (lines.length === 0) return "No matches found.";
|
|
117
|
-
return lines.join("\n");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Fallback to grep
|
|
122
|
-
const grepArgs = ["-rn", "--color=never"];
|
|
123
|
-
if (ctxLines > 0) grepArgs.push("-C", String(ctxLines));
|
|
124
|
-
if (kind === "regex") {
|
|
125
|
-
grepArgs.push("-E");
|
|
126
|
-
} else {
|
|
127
|
-
grepArgs.push("-F");
|
|
128
|
-
}
|
|
129
|
-
grepArgs.push(query, searchDir);
|
|
130
|
-
|
|
131
|
-
const result = run("grep", grepArgs);
|
|
132
|
-
const lines = result.stdout.split("\n").filter(Boolean).slice(0, limit);
|
|
133
|
-
if (lines.length === 0) return "No matches found.";
|
|
134
|
-
return lines.join("\n");
|
|
135
|
-
},
|
|
136
|
-
}),
|
|
137
|
-
|
|
138
81
|
// -----------------------------------------------------------------------
|
|
139
82
|
// srcwalk_read: Read files
|
|
140
83
|
// -----------------------------------------------------------------------
|
|
@@ -233,84 +176,6 @@ const srcwalkTools = {
|
|
|
233
176
|
},
|
|
234
177
|
}),
|
|
235
178
|
|
|
236
|
-
// -----------------------------------------------------------------------
|
|
237
|
-
// srcwalk_files: Find files
|
|
238
|
-
// -----------------------------------------------------------------------
|
|
239
|
-
srcwalk_files: tool({
|
|
240
|
-
description: `Find files by glob pattern. Returns matched file paths with size estimates, grouped by directory. Respects .gitignore.`,
|
|
241
|
-
args: {
|
|
242
|
-
pattern: tool.schema.string().describe("Glob pattern (e.g. '*.ts', 'src/**/*.ts')"),
|
|
243
|
-
scope: tool.schema
|
|
244
|
-
.string()
|
|
245
|
-
.optional()
|
|
246
|
-
.describe("Directory to search (default: project root)"),
|
|
247
|
-
},
|
|
248
|
-
execute: async (args, context) => {
|
|
249
|
-
const pattern = String(args.pattern ?? "").trim();
|
|
250
|
-
if (!pattern) return "❌ pattern is required.";
|
|
251
|
-
const scopeDir = path.resolve(context.directory, args.scope ? String(args.scope) : "");
|
|
252
|
-
|
|
253
|
-
// Use find with simple glob pattern
|
|
254
|
-
const findArgs: string[] = [scopeDir, "-type", "f"];
|
|
255
|
-
|
|
256
|
-
// Convert simple glob to -name pattern
|
|
257
|
-
if (pattern.includes("**")) {
|
|
258
|
-
// find handles ** naturally with -path
|
|
259
|
-
findArgs.push("-path", `*/${pattern.replace(/\*\*/g, "*")}`);
|
|
260
|
-
} else if (pattern.includes("*")) {
|
|
261
|
-
findArgs.push("-name", pattern);
|
|
262
|
-
} else if (pattern.includes(".")) {
|
|
263
|
-
findArgs.push("-name", pattern);
|
|
264
|
-
} else {
|
|
265
|
-
findArgs.push("-name", `*${pattern}*`);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Exclude common dirs
|
|
269
|
-
for (const dir of [
|
|
270
|
-
".git",
|
|
271
|
-
"node_modules",
|
|
272
|
-
"dist",
|
|
273
|
-
"build",
|
|
274
|
-
"coverage",
|
|
275
|
-
".next",
|
|
276
|
-
".opencode",
|
|
277
|
-
]) {
|
|
278
|
-
findArgs.push("-not", "-path", `*/${dir}/*`);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const result = run("find", findArgs);
|
|
282
|
-
const files = result.stdout.split("\n").filter(Boolean).slice(0, 200);
|
|
283
|
-
|
|
284
|
-
if (files.length === 0) return `No files matching "${pattern}" found.`;
|
|
285
|
-
|
|
286
|
-
// Group by directory
|
|
287
|
-
const groups: Record<string, string[]> = {};
|
|
288
|
-
for (const f of files) {
|
|
289
|
-
const dir = path.dirname(f);
|
|
290
|
-
if (!groups[dir]) groups[dir] = [];
|
|
291
|
-
groups[dir].push(path.basename(f));
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const lines: string[] = [`# Files matching "${pattern}" (${plural(files.length, "file")})\n`];
|
|
295
|
-
for (const [dir, files] of Object.entries(groups).sort()) {
|
|
296
|
-
const relDir = path.relative(context.directory, dir) || ".";
|
|
297
|
-
lines.push(`${relDir}/ (${plural(files.length, "file")})`);
|
|
298
|
-
for (const f of files) {
|
|
299
|
-
const fp = path.join(dir, f);
|
|
300
|
-
try {
|
|
301
|
-
const size = statSync(fp).size;
|
|
302
|
-
const tokenEst = Math.ceil(size / 4);
|
|
303
|
-
lines.push(` ${f} (~${tokenEst.toLocaleString()} tokens)`);
|
|
304
|
-
} catch {
|
|
305
|
-
lines.push(` ${f}`);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
lines.push("");
|
|
309
|
-
}
|
|
310
|
-
return lines.join("\n");
|
|
311
|
-
},
|
|
312
|
-
}),
|
|
313
|
-
|
|
314
179
|
// -----------------------------------------------------------------------
|
|
315
180
|
// srcwalk_deps: Import analysis
|
|
316
181
|
// -----------------------------------------------------------------------
|
|
@@ -419,7 +284,7 @@ const srcwalkTools = {
|
|
|
419
284
|
},
|
|
420
285
|
execute: async (args, context) => {
|
|
421
286
|
const symbol = String(args.symbol ?? "").trim();
|
|
422
|
-
if (!symbol) return "
|
|
287
|
+
if (!symbol) return "symbol is required.";
|
|
423
288
|
const scopeDir = path.resolve(context.directory, args.scope ? String(args.scope) : "");
|
|
424
289
|
const depth = Math.min(args.depth ?? 1, 3);
|
|
425
290
|
|
|
@@ -483,7 +348,7 @@ const srcwalkTools = {
|
|
|
483
348
|
},
|
|
484
349
|
execute: async (args, context) => {
|
|
485
350
|
const symbol = String(args.symbol ?? "").trim();
|
|
486
|
-
if (!symbol) return "
|
|
351
|
+
if (!symbol) return "symbol is required.";
|
|
487
352
|
const scopeDir = path.resolve(context.directory, args.scope ? String(args.scope) : "");
|
|
488
353
|
|
|
489
354
|
// Find the function definition
|
|
@@ -598,7 +463,7 @@ const srcwalkTools = {
|
|
|
598
463
|
},
|
|
599
464
|
execute: async (args, context) => {
|
|
600
465
|
const symbol = String(args.symbol ?? "").trim();
|
|
601
|
-
if (!symbol) return "
|
|
466
|
+
if (!symbol) return "symbol is required.";
|
|
602
467
|
const scopeDir = path.resolve(context.directory, args.scope ? String(args.scope) : "");
|
|
603
468
|
|
|
604
469
|
// Get callers
|
|
@@ -705,7 +570,7 @@ const srcwalkTools = {
|
|
|
705
570
|
},
|
|
706
571
|
execute: async (args, context) => {
|
|
707
572
|
const symbol = String(args.symbol ?? "").trim();
|
|
708
|
-
if (!symbol) return "
|
|
573
|
+
if (!symbol) return "symbol is required.";
|
|
709
574
|
const scopeDir = path.resolve(context.directory, args.scope ? String(args.scope) : "");
|
|
710
575
|
|
|
711
576
|
// Count usages per directory
|
|
@@ -5,7 +5,7 @@ version: 1.0.0
|
|
|
5
5
|
tags: [debugging, workflow, verification]
|
|
6
6
|
dependencies: [test-driven-development, verification-before-completion]
|
|
7
7
|
agent_types: [worker, reviewer]
|
|
8
|
-
tools: [bash,
|
|
8
|
+
tools: [bash, grep, srcwalk_deps]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Debugging & Error Recovery
|
|
@@ -172,5 +172,3 @@ All four layers were necessary. During testing, each layer caught bugs the other
|
|
|
172
172
|
- Remove one validation layer — the next layer should still catch the error.
|
|
173
173
|
|
|
174
174
|
## See Also
|
|
175
|
-
|
|
176
|
-
- **structured-edit** - Reliable read/verify/edit workflow when changing validation code across layers
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: development-lifecycle
|
|
3
|
-
description:
|
|
4
|
-
version: 1.
|
|
5
|
-
tags: [
|
|
3
|
+
description: Single-agent guide through the full feature development lifecycle (brainstorm → design → specify → plan → implement → verify). For parallel multi-agent execution, use the development-lifecycle-workflow instead.
|
|
4
|
+
version: 1.1.0
|
|
5
|
+
tags: [planning, single-agent]
|
|
6
6
|
dependencies:
|
|
7
7
|
[
|
|
8
8
|
brainstorming,
|
|
@@ -17,25 +17,27 @@ dependencies:
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# Development Lifecycle
|
|
20
|
+
# Development Lifecycle Guide (Single-Agent)
|
|
21
21
|
|
|
22
22
|
## When to Use
|
|
23
23
|
|
|
24
|
-
- Starting a new feature, migration, or refactor and need
|
|
25
|
-
-
|
|
24
|
+
- Starting a new feature, migration, or refactor and need phase-by-phase guidance
|
|
25
|
+
- Working alone or with a single agent through the full lifecycle
|
|
26
|
+
- You want to load appropriate sub-skills at each stage
|
|
26
27
|
|
|
27
28
|
## When NOT to Use
|
|
28
29
|
|
|
30
|
+
- You need parallel multi-agent execution (use `development-lifecycle-workflow` instead)
|
|
29
31
|
- You are already mid-phase and only need a specific sub-skill
|
|
30
32
|
- The change is trivial and can skip the full lifecycle
|
|
31
33
|
|
|
32
34
|
## Overview
|
|
33
35
|
|
|
34
|
-
This skill
|
|
36
|
+
This skill guides a single agent through the complete feature development workflow, loading the appropriate sub-skills at each phase.
|
|
35
37
|
|
|
36
|
-
**Note:** For
|
|
38
|
+
**Note:** For parallel multi-agent execution with specialized agents (scouts, reviewers, planners), use the `development-lifecycle-workflow` in `.opencode/workflows/`.
|
|
37
39
|
|
|
38
|
-
**Use when:** Starting any new feature, migration, refactor, or significant change.
|
|
40
|
+
**Use when:** Starting any new feature, migration, refactor, or significant change with a single agent.
|
|
39
41
|
|
|
40
42
|
**Announce at start:** "I'm using development-lifecycle to guide this work through all phases."
|
|
41
43
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "OpenCodeKit skill tier classification. Tiers determine visibility and loading strategy.",
|
|
4
|
+
"tiers": {
|
|
5
|
+
"1": {
|
|
6
|
+
"label": "Essential",
|
|
7
|
+
"description": "Always available — referenced in AGENTS.md, agents should consider these first for every task. Small, general-purpose skills that shape execution discipline.",
|
|
8
|
+
"skills": [
|
|
9
|
+
"behavioral-kernel",
|
|
10
|
+
"defense-in-depth",
|
|
11
|
+
"incremental-implementation",
|
|
12
|
+
"verification-before-completion"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"2": {
|
|
16
|
+
"label": "On-Demand",
|
|
17
|
+
"description": "Shipped with the template, loaded via `skill()` when relevant. Covers most domains — UI, testing, debugging, design, workflow, platform integration.",
|
|
18
|
+
"skills": [
|
|
19
|
+
"accessibility-audit",
|
|
20
|
+
"agent-code-quality-gate",
|
|
21
|
+
"api-and-interface-design",
|
|
22
|
+
"brainstorming",
|
|
23
|
+
"browser-testing-with-devtools",
|
|
24
|
+
"chrome-devtools",
|
|
25
|
+
"ci-cd-and-automation",
|
|
26
|
+
"cloudflare",
|
|
27
|
+
"code-cleanup",
|
|
28
|
+
"code-review-and-quality",
|
|
29
|
+
"core-data-expert",
|
|
30
|
+
"debugging-and-error-recovery",
|
|
31
|
+
"deep-module-design",
|
|
32
|
+
"deprecation-and-migration",
|
|
33
|
+
"design-system-audit",
|
|
34
|
+
"design-taste-frontend",
|
|
35
|
+
"development-lifecycle",
|
|
36
|
+
"documentation-and-adrs",
|
|
37
|
+
"fallow",
|
|
38
|
+
"figma",
|
|
39
|
+
"frontend-design",
|
|
40
|
+
"gemini-large-context",
|
|
41
|
+
"git-workflow-and-versioning",
|
|
42
|
+
"grill-me",
|
|
43
|
+
"high-end-visual-design",
|
|
44
|
+
"industrial-brutalist-ui",
|
|
45
|
+
"jira",
|
|
46
|
+
"minimalist-ui",
|
|
47
|
+
"mockup-to-code",
|
|
48
|
+
"opensrc",
|
|
49
|
+
"pdf-extract",
|
|
50
|
+
"performance-optimization",
|
|
51
|
+
"planning-and-task-breakdown",
|
|
52
|
+
"playwright",
|
|
53
|
+
"polar",
|
|
54
|
+
"react-best-practices",
|
|
55
|
+
"redesign-existing-projects",
|
|
56
|
+
"resend",
|
|
57
|
+
"root-cause-tracing",
|
|
58
|
+
"security-and-hardening",
|
|
59
|
+
"shipping-and-launch",
|
|
60
|
+
"source-driven-development",
|
|
61
|
+
"spec-driven-development",
|
|
62
|
+
"srcwalk",
|
|
63
|
+
"subagent-driven-development",
|
|
64
|
+
"supabase",
|
|
65
|
+
"supabase-postgres-best-practices",
|
|
66
|
+
"swift-concurrency",
|
|
67
|
+
"swiftui-expert-skill",
|
|
68
|
+
"test-driven-development",
|
|
69
|
+
"testing-anti-patterns",
|
|
70
|
+
"using-git-worktrees",
|
|
71
|
+
"vercel-deploy-claimable",
|
|
72
|
+
"webclaw",
|
|
73
|
+
"writing-skills"
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -5,7 +5,7 @@ version: 1.0.0
|
|
|
5
5
|
tags: [workflow, planning, agent-coordination]
|
|
6
6
|
dependencies: [spec-driven-development]
|
|
7
7
|
agent_types: [planner]
|
|
8
|
-
tools: [TaskCreate, TaskUpdate, memory,
|
|
8
|
+
tools: [TaskCreate, TaskUpdate, memory, grep]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Planning & Task Breakdown
|
|
@@ -6,7 +6,7 @@ version: 2.1.0
|
|
|
6
6
|
tags: [code-intelligence, search, cli, srcwalk]
|
|
7
7
|
dependencies: []
|
|
8
8
|
agent_types: [planner, worker, reviewer, explorer]
|
|
9
|
-
tools: [bash,
|
|
9
|
+
tools: [bash, srcwalk_read, srcwalk_deps, srcwalk_map, srcwalk_callers, srcwalk_callees, srcwalk_flow, srcwalk_impact]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Srcwalk — Code Navigation
|
|
@@ -41,9 +41,7 @@ Do not pipe, truncate, or summarize `srcwalk guide`.
|
|
|
41
41
|
|
|
42
42
|
| Tool | Srcwalk command | Purpose |
|
|
43
43
|
|---|---|---|
|
|
44
|
-
| `srcwalk_search` | `srcwalk discover` / `srcwalk trace callers` | AST-aware symbol/content/regex/callers search |
|
|
45
44
|
| `srcwalk_read` | `srcwalk <path>` | Smart file reading: outline or full with sections |
|
|
46
|
-
| `srcwalk_files` | `srcwalk discover --as file` | Glob file finding with token estimates, grouped by dir |
|
|
47
45
|
| `srcwalk_deps` | `srcwalk deps` + exact import scan | Blast-radius: importers + dep-aware dependents (v1.0.0) |
|
|
48
46
|
|
|
49
47
|
### Extended analysis tools
|
|
@@ -65,9 +63,9 @@ Do not pipe, truncate, or summarize `srcwalk guide`.
|
|
|
65
63
|
| Jump to exact line | `srcwalk_read({ path: "file:42" })` |
|
|
66
64
|
| Read a line range | `srcwalk_read({ path: "file:44-89" })` — v1.0.0 shortcut |
|
|
67
65
|
| Read by symbol name | `srcwalk_read({ section: "symbolName" })` |
|
|
68
|
-
| Find
|
|
69
|
-
| Find files by glob | `
|
|
70
|
-
| Multi-symbol search | `
|
|
66
|
+
| Find patterns and symbols | `grep` (exact), `csearch` (multi-keyword) |
|
|
67
|
+
| Find files by glob | `glob` |
|
|
68
|
+
| Multi-symbol search | `grep({ pattern: "A|B|C" })` |
|
|
71
69
|
| Who directly calls this? | `srcwalk_callers` |
|
|
72
70
|
| Who reaches this transitively? | `srcwalk_callers({ depth: 2 })` |
|
|
73
71
|
| What does this call? | `srcwalk_callees` |
|
|
@@ -82,7 +80,7 @@ Do not pipe, truncate, or summarize `srcwalk guide`.
|
|
|
82
80
|
|
|
83
81
|
```
|
|
84
82
|
srcwalk_map({ scope: "." })
|
|
85
|
-
|
|
83
|
+
grep({ pattern: "likely_symbol", path: "src/" })
|
|
86
84
|
srcwalk_read({ path: "src/file.ts:42" }) // jump to line
|
|
87
85
|
srcwalk_read({ path: "src/file.ts:44-89" }) // range shortcut (v1.0.0)
|
|
88
86
|
```
|
|
@@ -100,9 +98,9 @@ Prefer outline/section reads before `full: true`.
|
|
|
100
98
|
### Find and drill into symbols
|
|
101
99
|
|
|
102
100
|
```
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
grep({ pattern: "handleAuth", path: "src/" })
|
|
102
|
+
grep({ pattern: "A|B|C", path: "src/" }) // multi-symbol
|
|
103
|
+
csearch({ query: "auth token login middleware" }) // multi-keyword chunk search
|
|
106
104
|
```
|
|
107
105
|
|
|
108
106
|
### Trace call graph
|
|
@@ -123,7 +121,7 @@ srcwalk_callees({ symbol: "handleAuth", depth: 2, scope: "src" }) // trans
|
|
|
123
121
|
srcwalk_flow({ symbol: "handleAuth", scope: "src" })
|
|
124
122
|
```
|
|
125
123
|
|
|
126
|
-
Use `
|
|
124
|
+
Use `grep` for quick single-hop searches. Use `srcwalk_callers` when you need depth, filters, or aggregation.
|
|
127
125
|
|
|
128
126
|
> Note: `--count-by` and `--depth` are mutually exclusive in `srcwalk_callers` — use one or the other, not both.
|
|
129
127
|
|
|
@@ -143,8 +141,7 @@ srcwalk_impact({ symbol: "handleAuth", scope: "src" }) // heuristic; follow up
|
|
|
143
141
|
|
|
144
142
|
## Critical Rules
|
|
145
143
|
|
|
146
|
-
- **Do NOT** use built-in `read`/`
|
|
147
|
-
- **Do NOT** re-read files already shown in expanded `srcwalk_search` results
|
|
144
|
+
- **Do NOT** use built-in `read`/`find` when srcwalk_* tools can answer; `grep` is preferred for text searches
|
|
148
145
|
- `srcwalk_impact` is heuristic, not proof — verify with `srcwalk_callers` or exact reads
|
|
149
146
|
- `srcwalk_flow` may collapse nested/fluent chains — drill with `srcwalk_callees({ detailed: true })` when inner calls matter
|
|
150
147
|
- Follow `> Next:` footers in output — they suggest the best next command
|