@mrciphersmith/keryx 0.2.75 → 0.2.77
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 +15 -10
- package/dist/cli.js +11809 -9037
- package/dist/proxy-worker.js +12 -12
- package/package.json +1 -1
- package/src/gdgraph/build.ts +12 -0
- package/src/gdgraph/query.ts +51 -1
- package/src/gdgraph/types.ts +77 -0
- package/src/gdgraph/wiki-layer-no-git.test.ts +73 -0
- package/src/gdgraph/wiki-layer.test.ts +211 -0
- package/src/gdgraph/wiki-layer.ts +213 -0
- package/src/gdskills/bundled/rules/core/api-contracts.mdc +6 -4
- package/src/gdskills/bundled/rules/core/model-selection.mdc +4 -5
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +4 -38
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +4 -38
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +4 -38
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +4 -38
- package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +4 -38
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +1 -3
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +1 -3
- package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +1 -3
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +35 -34
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +35 -34
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +35 -34
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +35 -34
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +35 -34
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/input-contract.schema.json +1 -1
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +2 -4
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +2 -4
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +2 -4
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +2 -4
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +2 -4
- package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +10 -6
- package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/planning/interview/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +1 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +1 -1
- package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +1 -2
- package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +2 -2
- package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +1 -2
- package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +4 -0
- package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +1 -2
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +108 -23
- package/src/gdskills/bundled/skills/review/review-orchestrator/review-context.schema.json +175 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +7 -0
- package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +2 -3
- package/src/gdskills/bundled/skills/review/review-style/SKILL.md +2 -3
- package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +5 -0
- package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +1 -2
- package/src/gdskills/contracts/review-finding.schema.json +4 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// LWG wiki layer builder (flow 223, phase 0).
|
|
2
|
+
//
|
|
3
|
+
// Turns wiki pages into `WikiPageNode`s and their describe-sets into
|
|
4
|
+
// `DescribesEdge`s, written to `storage/wiki-pages.jsonl` /
|
|
5
|
+
// `storage/describes.jsonl`. Mirrors the tree-sitter symbol layer: an
|
|
6
|
+
// additive pass AFTER the unchanged file-level build, into its own files.
|
|
7
|
+
// `nodes.jsonl` and `edges.jsonl` are never touched (flow 223 AC13) —
|
|
8
|
+
// see the "why a separate layer" note in `types.ts` for the regression that
|
|
9
|
+
// forced this.
|
|
10
|
+
//
|
|
11
|
+
// Also writes `storage/build-manifest.json` (LWG-2): a `FileFingerprint` per
|
|
12
|
+
// source file, for the incremental rebuild in phase 4. Free of extra I/O
|
|
13
|
+
// because `buildGraph` already holds every file's content in memory.
|
|
14
|
+
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { mkdir, stat, writeFile } from "node:fs/promises";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { collectPages } from "../wiki/collect";
|
|
19
|
+
import { computeModuleKeyFiles } from "../wiki/collect";
|
|
20
|
+
import { resolveDescribeSet } from "../wiki/describes";
|
|
21
|
+
import type { DescribesEdge, FileFingerprint, GraphData, WikiLayer, WikiPageNode } from "./types";
|
|
22
|
+
|
|
23
|
+
export const WIKI_PAGES_FILE = "wiki-pages.jsonl";
|
|
24
|
+
export const DESCRIBES_FILE = "describes.jsonl";
|
|
25
|
+
export const BUILD_MANIFEST_FILE = "build-manifest.json";
|
|
26
|
+
|
|
27
|
+
function storageDir(projectRoot: string): string {
|
|
28
|
+
return path.join(projectRoot, ".metaproject", "data", "gdgraph", "storage");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Stable id for a page node. */
|
|
32
|
+
export function wikiPageId(relativePath: string): string {
|
|
33
|
+
return `wiki:${relativePath}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface BuildWikiLayerInput {
|
|
37
|
+
projectRoot: string;
|
|
38
|
+
graph: GraphData;
|
|
39
|
+
/**
|
|
40
|
+
* The current module set, from `validModuleNames`. `undefined` means the
|
|
41
|
+
* graph has not been built — see {@link buildWikiLayer} for why that is not
|
|
42
|
+
* the same as an empty set.
|
|
43
|
+
*/
|
|
44
|
+
validModules: Set<string> | undefined;
|
|
45
|
+
/** Page contents keyed by wiki-relative path. Injected for testability. */
|
|
46
|
+
pageContents: ReadonlyMap<string, string>;
|
|
47
|
+
pages: Array<{
|
|
48
|
+
relativePath: string;
|
|
49
|
+
title: string;
|
|
50
|
+
pageType: string;
|
|
51
|
+
status: string | null;
|
|
52
|
+
version: string | null;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Build the layer in memory. Pure apart from its inputs.
|
|
58
|
+
*
|
|
59
|
+
* **Graph-unavailable posture.** `validModules === undefined` means the graph
|
|
60
|
+
* has not been built yet, and the layer is skipped entirely — an empty layer
|
|
61
|
+
* is emitted, not a layer full of "describes nothing" pages. This inherits
|
|
62
|
+
* the rule `validModuleNames` states in its own doc comment: an empty module
|
|
63
|
+
* set would make every scoped item look orphaned, so callers must read
|
|
64
|
+
* "graph unavailable" as *nothing to say yet*, never as *everything is
|
|
65
|
+
* invalid* (flow 223 AC6).
|
|
66
|
+
*/
|
|
67
|
+
export function buildWikiLayer(input: BuildWikiLayerInput): WikiLayer {
|
|
68
|
+
if (input.validModules === undefined) {
|
|
69
|
+
return { pages: [], describes: [] };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Explicitly `=== "file"`, not `!== "asset"`. The negative form is exactly
|
|
73
|
+
// the over-broad filter that made putting wiki nodes into `nodes.jsonl`
|
|
74
|
+
// dangerous in the first place (see `types.ts`); repeating it here would
|
|
75
|
+
// silently admit any future node kind as a describable target.
|
|
76
|
+
const knownPaths = new Set(
|
|
77
|
+
input.graph.nodes.filter((node) => node.kind === "file").map((node) => node.path),
|
|
78
|
+
);
|
|
79
|
+
const keyFilesIndex = computeModuleKeyFiles(input.graph);
|
|
80
|
+
|
|
81
|
+
const pages: WikiPageNode[] = [];
|
|
82
|
+
const describes: DescribesEdge[] = [];
|
|
83
|
+
|
|
84
|
+
for (const page of input.pages) {
|
|
85
|
+
const content = input.pageContents.get(page.relativePath) ?? "";
|
|
86
|
+
const resolved = resolveDescribeSet({
|
|
87
|
+
page: { relativePath: page.relativePath },
|
|
88
|
+
content,
|
|
89
|
+
knownPaths,
|
|
90
|
+
keyFilesIndex,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const id = wikiPageId(page.relativePath);
|
|
94
|
+
pages.push({
|
|
95
|
+
id,
|
|
96
|
+
path: page.relativePath,
|
|
97
|
+
title: page.title,
|
|
98
|
+
pageType: page.pageType,
|
|
99
|
+
status: page.status,
|
|
100
|
+
version: page.version,
|
|
101
|
+
undecidable: resolved.undecidable,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
for (const entry of resolved.entries) {
|
|
105
|
+
for (const target of entry.resolvedPaths) {
|
|
106
|
+
describes.push({
|
|
107
|
+
id: `describes:${describes.length + 1}`,
|
|
108
|
+
from: id,
|
|
109
|
+
to: target,
|
|
110
|
+
pattern: entry.pattern,
|
|
111
|
+
origin: entry.origin,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
pages.sort((a, b) => a.path.localeCompare(b.path));
|
|
118
|
+
describes.sort((a, b) => (a.from === b.from ? a.to.localeCompare(b.to) : a.from.localeCompare(b.from)));
|
|
119
|
+
return { pages, describes };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Content fingerprints for the incremental rebuild (LWG-2, phase 4 reader). */
|
|
123
|
+
export function computeFingerprints(
|
|
124
|
+
fileRecords: ReadonlyArray<{ path: string; content: string }>,
|
|
125
|
+
mtimes: ReadonlyMap<string, number>,
|
|
126
|
+
): FileFingerprint[] {
|
|
127
|
+
return fileRecords
|
|
128
|
+
.map((record) => ({
|
|
129
|
+
path: record.path,
|
|
130
|
+
contentHash: createHash("sha256").update(record.content).digest("hex"),
|
|
131
|
+
mtimeMs: mtimes.get(record.path) ?? 0,
|
|
132
|
+
}))
|
|
133
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function writeJsonl(filePath: string, rows: unknown[]): Promise<void> {
|
|
137
|
+
const body = rows.map((row) => JSON.stringify(row)).join("\n");
|
|
138
|
+
await writeFile(filePath, rows.length > 0 ? `${body}\n` : "", "utf8");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Collect pages, build the layer and persist it. Called from `buildGraph`
|
|
143
|
+
* behind a defensive dynamic import, exactly as the symbol layer is: any
|
|
144
|
+
* failure here degrades to "no wiki layer", never to a failed graph build.
|
|
145
|
+
*/
|
|
146
|
+
export async function enrichBuildWithWikiLayer(input: {
|
|
147
|
+
projectRoot: string;
|
|
148
|
+
graph: GraphData;
|
|
149
|
+
fileRecords: ReadonlyArray<{ path: string; content: string }>;
|
|
150
|
+
/** Injected in tests; defaults to the real `validModuleNames`. */
|
|
151
|
+
validModules?: Set<string> | undefined;
|
|
152
|
+
loadValidModules?: (projectRoot: string) => Promise<Set<string> | undefined>;
|
|
153
|
+
}): Promise<WikiLayer> {
|
|
154
|
+
const dir = storageDir(input.projectRoot);
|
|
155
|
+
await mkdir(dir, { recursive: true });
|
|
156
|
+
|
|
157
|
+
const mtimes = new Map<string, number>();
|
|
158
|
+
for (const record of input.fileRecords) {
|
|
159
|
+
try {
|
|
160
|
+
const info = await stat(path.join(input.projectRoot, record.path));
|
|
161
|
+
mtimes.set(record.path, info.mtimeMs);
|
|
162
|
+
} catch {
|
|
163
|
+
// A file readable moments ago can be gone by now; a missing mtime is
|
|
164
|
+
// recorded as 0 rather than dropping the fingerprint, so the manifest
|
|
165
|
+
// keeps one row per file it hashed.
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
await writeFile(
|
|
169
|
+
path.join(dir, BUILD_MANIFEST_FILE),
|
|
170
|
+
`${JSON.stringify({ version: 1, files: computeFingerprints(input.fileRecords, mtimes) }, null, 2)}\n`,
|
|
171
|
+
"utf8",
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
const validModules =
|
|
175
|
+
input.validModules !== undefined
|
|
176
|
+
? input.validModules
|
|
177
|
+
: await (input.loadValidModules ?? defaultLoadValidModules)(input.projectRoot);
|
|
178
|
+
|
|
179
|
+
const wikiPages = await collectPages(input.projectRoot);
|
|
180
|
+
const contents = new Map<string, string>();
|
|
181
|
+
for (const page of wikiPages) {
|
|
182
|
+
try {
|
|
183
|
+
contents.set(page.relativePath, await Bun.file(page.absolutePath).text());
|
|
184
|
+
} catch {
|
|
185
|
+
contents.set(page.relativePath, "");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const layer = buildWikiLayer({
|
|
190
|
+
projectRoot: input.projectRoot,
|
|
191
|
+
graph: input.graph,
|
|
192
|
+
validModules,
|
|
193
|
+
pageContents: contents,
|
|
194
|
+
pages: wikiPages.map((page) => ({
|
|
195
|
+
relativePath: page.relativePath,
|
|
196
|
+
title: page.title,
|
|
197
|
+
pageType: page.pageType,
|
|
198
|
+
status: page.status,
|
|
199
|
+
version: page.version,
|
|
200
|
+
})),
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
await writeJsonl(path.join(dir, WIKI_PAGES_FILE), layer.pages);
|
|
204
|
+
await writeJsonl(path.join(dir, DESCRIBES_FILE), layer.describes);
|
|
205
|
+
return layer;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function defaultLoadValidModules(projectRoot: string): Promise<Set<string> | undefined> {
|
|
209
|
+
// Dynamic so `gdgraph` keeps no static dependency on `wiki/service`, which
|
|
210
|
+
// reads the graph itself — the same cycle-avoidance the symbol layer uses.
|
|
211
|
+
const { validModuleNames } = await import("../wiki/service");
|
|
212
|
+
return validModuleNames(projectRoot);
|
|
213
|
+
}
|
|
@@ -126,11 +126,13 @@ POST/PUT/PATCH endpoints that create or modify state MUST support idempotency vi
|
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
129
|
-
##
|
|
129
|
+
## The three that are not negotiable
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
Of the rules above, three carry consequences that outlive the change: no breaking
|
|
132
|
+
change ships without a major version bump and a deprecation period; the OpenAPI
|
|
133
|
+
spec is updated before the implementation, not after it as documentation; and
|
|
134
|
+
error responses use the standard `ApiError` envelope — never a raw exception or
|
|
135
|
+
an ad-hoc shape.
|
|
134
136
|
|
|
135
137
|
---
|
|
136
138
|
|
|
@@ -117,12 +117,11 @@ Two places, and they are not the same shape:
|
|
|
117
117
|
resolved provider/model, `tier_resolution` and `model_discovery`. `--json`
|
|
118
118
|
prints the block alone.
|
|
119
119
|
|
|
120
|
-
That second bullet used to say the orchestrator "calls `decideDispatchModel`".
|
|
121
120
|
An orchestrator is an agent following prose and **cannot call a TypeScript
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
function**: asked for a tier by hand it reads a table of signals and does the
|
|
122
|
+
arithmetic in its head — the exact mechanical work this programme moves out of
|
|
123
|
+
skills and into the code that consumes them. `keryx review tier` is that code's
|
|
124
|
+
entry point; `decideDispatchModel` is what it calls.
|
|
126
125
|
|
|
127
126
|
Nothing reads a recorded resolution back and checks it. These fields explain a
|
|
128
127
|
finished run; they do not gate one.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-analyzer
|
|
3
|
-
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts.
|
|
3
|
+
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts. Requires the source repository, target repository, and branch as confirmed input; the skill's PRE-STEP validates them before any analysis."
|
|
4
4
|
triggers:
|
|
5
5
|
- "Analyze branch"
|
|
6
6
|
- "Analyze changes"
|
|
@@ -25,40 +25,6 @@ Proceed directly with your assigned task.
|
|
|
25
25
|
|
|
26
26
|
# Feature Analyzer
|
|
27
27
|
|
|
28
|
-
## ⚠️ MANDATORY: DO NOT PROCEED WITHOUT CONTEXT
|
|
29
|
-
|
|
30
|
-
**CRITICAL RULE: You CANNOT start analysis until user explicitly provides:**
|
|
31
|
-
1. ✅ Source repository (local path)
|
|
32
|
-
2. ✅ Target repository (local path)
|
|
33
|
-
3. ✅ Branch to analyze
|
|
34
|
-
4. ✅ Confirmation of analysis scope
|
|
35
|
-
|
|
36
|
-
**DO NOT assume defaults. DO NOT use current directory. DO NOT proceed without asking.**
|
|
37
|
-
|
|
38
|
-
**If user says:** "Analyze everything related to variables in pipelines"
|
|
39
|
-
|
|
40
|
-
**You MUST respond:**
|
|
41
|
-
```
|
|
42
|
-
I'll help you analyze variables in pipelines. First, I need to clarify the context:
|
|
43
|
-
|
|
44
|
-
**SOURCE Repository** (where the changes exist):
|
|
45
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
46
|
-
- GitHub repo: [owner/repo]
|
|
47
|
-
- Branch to analyze: [branch-name]
|
|
48
|
-
|
|
49
|
-
**TARGET Repository** (where implementation will happen):
|
|
50
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
51
|
-
- GitHub repo: [owner/repo]
|
|
52
|
-
- Current branch: [branch-name]
|
|
53
|
-
|
|
54
|
-
**FOCUS** (from your request): "variables in pipelines"
|
|
55
|
-
- Keywords: variable, pipeline, param
|
|
56
|
-
|
|
57
|
-
Once you provide these details, I'll begin the focused analysis.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**If user doesn't provide all required info → STOP and ask again.**
|
|
61
|
-
|
|
62
28
|
---
|
|
63
29
|
|
|
64
30
|
## Purpose
|
|
@@ -267,7 +233,7 @@ git diff "${BASE_SHA}..HEAD"
|
|
|
267
233
|
|
|
268
234
|
### Priority Levels
|
|
269
235
|
|
|
270
|
-
**P0 —
|
|
236
|
+
**P0 — must analyze**:
|
|
271
237
|
- API contracts: DTOs, interfaces, type definitions
|
|
272
238
|
- Public API endpoints (controllers, routes)
|
|
273
239
|
- Database schema changes, auth changes, config changes
|
|
@@ -293,7 +259,7 @@ When focus specified: boost files matching focus keywords to P0; select ALL focu
|
|
|
293
259
|
|
|
294
260
|
## Step 5: Deep Dive Protocol
|
|
295
261
|
|
|
296
|
-
**
|
|
262
|
+
**A git diff alone does not support a conclusion. Also do this:**
|
|
297
263
|
|
|
298
264
|
1. **Read selected files**:
|
|
299
265
|
- Small/medium files: read completely
|
|
@@ -328,7 +294,7 @@ Before finalizing, consider running:
|
|
|
328
294
|
|
|
329
295
|
---
|
|
330
296
|
|
|
331
|
-
## Step 9: Intermediate Review
|
|
297
|
+
## Step 9: Intermediate Review
|
|
332
298
|
|
|
333
299
|
After completing analysis, **show user** before generating full report:
|
|
334
300
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-analyzer
|
|
3
|
-
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts.
|
|
3
|
+
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts. Requires the source repository, target repository, and branch as confirmed input; the skill's PRE-STEP validates them before any analysis."
|
|
4
4
|
triggers:
|
|
5
5
|
- "Analyze branch"
|
|
6
6
|
- "Analyze changes"
|
|
@@ -25,40 +25,6 @@ Proceed directly with your assigned task.
|
|
|
25
25
|
|
|
26
26
|
# Feature Analyzer
|
|
27
27
|
|
|
28
|
-
## ⚠️ MANDATORY: DO NOT PROCEED WITHOUT CONTEXT
|
|
29
|
-
|
|
30
|
-
**CRITICAL RULE: You CANNOT start analysis until user explicitly provides:**
|
|
31
|
-
1. ✅ Source repository (local path)
|
|
32
|
-
2. ✅ Target repository (local path)
|
|
33
|
-
3. ✅ Branch to analyze
|
|
34
|
-
4. ✅ Confirmation of analysis scope
|
|
35
|
-
|
|
36
|
-
**DO NOT assume defaults. DO NOT use current directory. DO NOT proceed without asking.**
|
|
37
|
-
|
|
38
|
-
**If user says:** "Analyze everything related to variables in pipelines"
|
|
39
|
-
|
|
40
|
-
**You MUST respond:**
|
|
41
|
-
```
|
|
42
|
-
I'll help you analyze variables in pipelines. First, I need to clarify the context:
|
|
43
|
-
|
|
44
|
-
**SOURCE Repository** (where the changes exist):
|
|
45
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
46
|
-
- GitHub repo: [owner/repo]
|
|
47
|
-
- Branch to analyze: [branch-name]
|
|
48
|
-
|
|
49
|
-
**TARGET Repository** (where implementation will happen):
|
|
50
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
51
|
-
- GitHub repo: [owner/repo]
|
|
52
|
-
- Current branch: [branch-name]
|
|
53
|
-
|
|
54
|
-
**FOCUS** (from your request): "variables in pipelines"
|
|
55
|
-
- Keywords: variable, pipeline, param
|
|
56
|
-
|
|
57
|
-
Once you provide these details, I'll begin the focused analysis.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**If user doesn't provide all required info → STOP and ask again.**
|
|
61
|
-
|
|
62
28
|
---
|
|
63
29
|
|
|
64
30
|
## Purpose
|
|
@@ -267,7 +233,7 @@ git diff "${BASE_SHA}..HEAD"
|
|
|
267
233
|
|
|
268
234
|
### Priority Levels
|
|
269
235
|
|
|
270
|
-
**P0 —
|
|
236
|
+
**P0 — must analyze**:
|
|
271
237
|
- API contracts: DTOs, interfaces, type definitions
|
|
272
238
|
- Public API endpoints (controllers, routes)
|
|
273
239
|
- Database schema changes, auth changes, config changes
|
|
@@ -293,7 +259,7 @@ When focus specified: boost files matching focus keywords to P0; select ALL focu
|
|
|
293
259
|
|
|
294
260
|
## Step 5: Deep Dive Protocol
|
|
295
261
|
|
|
296
|
-
**
|
|
262
|
+
**A git diff alone does not support a conclusion. Also do this:**
|
|
297
263
|
|
|
298
264
|
1. **Read selected files**:
|
|
299
265
|
- Small/medium files: read completely
|
|
@@ -328,7 +294,7 @@ Before finalizing, consider running:
|
|
|
328
294
|
|
|
329
295
|
---
|
|
330
296
|
|
|
331
|
-
## Step 9: Intermediate Review
|
|
297
|
+
## Step 9: Intermediate Review
|
|
332
298
|
|
|
333
299
|
After completing analysis, **show user** before generating full report:
|
|
334
300
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-analyzer
|
|
3
|
-
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts.
|
|
3
|
+
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts. Requires the source repository, target repository, and branch as confirmed input; the skill's PRE-STEP validates them before any analysis."
|
|
4
4
|
triggers:
|
|
5
5
|
- "Analyze branch"
|
|
6
6
|
- "Analyze changes"
|
|
@@ -25,40 +25,6 @@ Proceed directly with your assigned task.
|
|
|
25
25
|
|
|
26
26
|
# Feature Analyzer
|
|
27
27
|
|
|
28
|
-
## ⚠️ MANDATORY: DO NOT PROCEED WITHOUT CONTEXT
|
|
29
|
-
|
|
30
|
-
**CRITICAL RULE: You CANNOT start analysis until user explicitly provides:**
|
|
31
|
-
1. ✅ Source repository (local path)
|
|
32
|
-
2. ✅ Target repository (local path)
|
|
33
|
-
3. ✅ Branch to analyze
|
|
34
|
-
4. ✅ Confirmation of analysis scope
|
|
35
|
-
|
|
36
|
-
**DO NOT assume defaults. DO NOT use current directory. DO NOT proceed without asking.**
|
|
37
|
-
|
|
38
|
-
**If user says:** "Analyze everything related to variables in pipelines"
|
|
39
|
-
|
|
40
|
-
**You MUST respond:**
|
|
41
|
-
```
|
|
42
|
-
I'll help you analyze variables in pipelines. First, I need to clarify the context:
|
|
43
|
-
|
|
44
|
-
**SOURCE Repository** (where the changes exist):
|
|
45
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
46
|
-
- GitHub repo: [owner/repo]
|
|
47
|
-
- Branch to analyze: [branch-name]
|
|
48
|
-
|
|
49
|
-
**TARGET Repository** (where implementation will happen):
|
|
50
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
51
|
-
- GitHub repo: [owner/repo]
|
|
52
|
-
- Current branch: [branch-name]
|
|
53
|
-
|
|
54
|
-
**FOCUS** (from your request): "variables in pipelines"
|
|
55
|
-
- Keywords: variable, pipeline, param
|
|
56
|
-
|
|
57
|
-
Once you provide these details, I'll begin the focused analysis.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**If user doesn't provide all required info → STOP and ask again.**
|
|
61
|
-
|
|
62
28
|
---
|
|
63
29
|
|
|
64
30
|
## Purpose
|
|
@@ -267,7 +233,7 @@ git diff "${BASE_SHA}..HEAD"
|
|
|
267
233
|
|
|
268
234
|
### Priority Levels
|
|
269
235
|
|
|
270
|
-
**P0 —
|
|
236
|
+
**P0 — must analyze**:
|
|
271
237
|
- API contracts: DTOs, interfaces, type definitions
|
|
272
238
|
- Public API endpoints (controllers, routes)
|
|
273
239
|
- Database schema changes, auth changes, config changes
|
|
@@ -293,7 +259,7 @@ When focus specified: boost files matching focus keywords to P0; select ALL focu
|
|
|
293
259
|
|
|
294
260
|
## Step 5: Deep Dive Protocol
|
|
295
261
|
|
|
296
|
-
**
|
|
262
|
+
**A git diff alone does not support a conclusion. Also do this:**
|
|
297
263
|
|
|
298
264
|
1. **Read selected files**:
|
|
299
265
|
- Small/medium files: read completely
|
|
@@ -328,7 +294,7 @@ Before finalizing, consider running:
|
|
|
328
294
|
|
|
329
295
|
---
|
|
330
296
|
|
|
331
|
-
## Step 9: Intermediate Review
|
|
297
|
+
## Step 9: Intermediate Review
|
|
332
298
|
|
|
333
299
|
After completing analysis, **show user** before generating full report:
|
|
334
300
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-analyzer
|
|
3
|
-
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts.
|
|
3
|
+
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts. Requires the source repository, target repository, and branch as confirmed input; the skill's PRE-STEP validates them before any analysis."
|
|
4
4
|
triggers:
|
|
5
5
|
- "Analyze branch"
|
|
6
6
|
- "Analyze changes"
|
|
@@ -25,40 +25,6 @@ Proceed directly with your assigned task.
|
|
|
25
25
|
|
|
26
26
|
# Feature Analyzer
|
|
27
27
|
|
|
28
|
-
## ⚠️ MANDATORY: DO NOT PROCEED WITHOUT CONTEXT
|
|
29
|
-
|
|
30
|
-
**CRITICAL RULE: You CANNOT start analysis until user explicitly provides:**
|
|
31
|
-
1. ✅ Source repository (local path)
|
|
32
|
-
2. ✅ Target repository (local path)
|
|
33
|
-
3. ✅ Branch to analyze
|
|
34
|
-
4. ✅ Confirmation of analysis scope
|
|
35
|
-
|
|
36
|
-
**DO NOT assume defaults. DO NOT use current directory. DO NOT proceed without asking.**
|
|
37
|
-
|
|
38
|
-
**If user says:** "Analyze everything related to variables in pipelines"
|
|
39
|
-
|
|
40
|
-
**You MUST respond:**
|
|
41
|
-
```
|
|
42
|
-
I'll help you analyze variables in pipelines. First, I need to clarify the context:
|
|
43
|
-
|
|
44
|
-
**SOURCE Repository** (where the changes exist):
|
|
45
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
46
|
-
- GitHub repo: [owner/repo]
|
|
47
|
-
- Branch to analyze: [branch-name]
|
|
48
|
-
|
|
49
|
-
**TARGET Repository** (where implementation will happen):
|
|
50
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
51
|
-
- GitHub repo: [owner/repo]
|
|
52
|
-
- Current branch: [branch-name]
|
|
53
|
-
|
|
54
|
-
**FOCUS** (from your request): "variables in pipelines"
|
|
55
|
-
- Keywords: variable, pipeline, param
|
|
56
|
-
|
|
57
|
-
Once you provide these details, I'll begin the focused analysis.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**If user doesn't provide all required info → STOP and ask again.**
|
|
61
|
-
|
|
62
28
|
---
|
|
63
29
|
|
|
64
30
|
## Purpose
|
|
@@ -267,7 +233,7 @@ git diff "${BASE_SHA}..HEAD"
|
|
|
267
233
|
|
|
268
234
|
### Priority Levels
|
|
269
235
|
|
|
270
|
-
**P0 —
|
|
236
|
+
**P0 — must analyze**:
|
|
271
237
|
- API contracts: DTOs, interfaces, type definitions
|
|
272
238
|
- Public API endpoints (controllers, routes)
|
|
273
239
|
- Database schema changes, auth changes, config changes
|
|
@@ -293,7 +259,7 @@ When focus specified: boost files matching focus keywords to P0; select ALL focu
|
|
|
293
259
|
|
|
294
260
|
## Step 5: Deep Dive Protocol
|
|
295
261
|
|
|
296
|
-
**
|
|
262
|
+
**A git diff alone does not support a conclusion. Also do this:**
|
|
297
263
|
|
|
298
264
|
1. **Read selected files**:
|
|
299
265
|
- Small/medium files: read completely
|
|
@@ -328,7 +294,7 @@ Before finalizing, consider running:
|
|
|
328
294
|
|
|
329
295
|
---
|
|
330
296
|
|
|
331
|
-
## Step 9: Intermediate Review
|
|
297
|
+
## Step 9: Intermediate Review
|
|
332
298
|
|
|
333
299
|
After completing analysis, **show user** before generating full report:
|
|
334
300
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-analyzer
|
|
3
|
-
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts.
|
|
3
|
+
description: "Use when analyzing feature branch changes across repos, planning implementation, or understanding backend→frontend contracts. Requires the source repository, target repository, and branch as confirmed input; the skill's PRE-STEP validates them before any analysis."
|
|
4
4
|
triggers:
|
|
5
5
|
- "Analyze branch"
|
|
6
6
|
- "Analyze changes"
|
|
@@ -25,40 +25,6 @@ Proceed directly with your assigned task.
|
|
|
25
25
|
|
|
26
26
|
# Feature Analyzer
|
|
27
27
|
|
|
28
|
-
## ⚠️ MANDATORY: DO NOT PROCEED WITHOUT CONTEXT
|
|
29
|
-
|
|
30
|
-
**CRITICAL RULE: You CANNOT start analysis until user explicitly provides:**
|
|
31
|
-
1. ✅ Source repository (local path)
|
|
32
|
-
2. ✅ Target repository (local path)
|
|
33
|
-
3. ✅ Branch to analyze
|
|
34
|
-
4. ✅ Confirmation of analysis scope
|
|
35
|
-
|
|
36
|
-
**DO NOT assume defaults. DO NOT use current directory. DO NOT proceed without asking.**
|
|
37
|
-
|
|
38
|
-
**If user says:** "Analyze everything related to variables in pipelines"
|
|
39
|
-
|
|
40
|
-
**You MUST respond:**
|
|
41
|
-
```
|
|
42
|
-
I'll help you analyze variables in pipelines. First, I need to clarify the context:
|
|
43
|
-
|
|
44
|
-
**SOURCE Repository** (where the changes exist):
|
|
45
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
46
|
-
- GitHub repo: [owner/repo]
|
|
47
|
-
- Branch to analyze: [branch-name]
|
|
48
|
-
|
|
49
|
-
**TARGET Repository** (where implementation will happen):
|
|
50
|
-
- Local path: [user must provide, e.g., /Users/.../<PROJECT>]
|
|
51
|
-
- GitHub repo: [owner/repo]
|
|
52
|
-
- Current branch: [branch-name]
|
|
53
|
-
|
|
54
|
-
**FOCUS** (from your request): "variables in pipelines"
|
|
55
|
-
- Keywords: variable, pipeline, param
|
|
56
|
-
|
|
57
|
-
Once you provide these details, I'll begin the focused analysis.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**If user doesn't provide all required info → STOP and ask again.**
|
|
61
|
-
|
|
62
28
|
---
|
|
63
29
|
|
|
64
30
|
## Purpose
|
|
@@ -267,7 +233,7 @@ git diff "${BASE_SHA}..HEAD"
|
|
|
267
233
|
|
|
268
234
|
### Priority Levels
|
|
269
235
|
|
|
270
|
-
**P0 —
|
|
236
|
+
**P0 — must analyze**:
|
|
271
237
|
- API contracts: DTOs, interfaces, type definitions
|
|
272
238
|
- Public API endpoints (controllers, routes)
|
|
273
239
|
- Database schema changes, auth changes, config changes
|
|
@@ -293,7 +259,7 @@ When focus specified: boost files matching focus keywords to P0; select ALL focu
|
|
|
293
259
|
|
|
294
260
|
## Step 5: Deep Dive Protocol
|
|
295
261
|
|
|
296
|
-
**
|
|
262
|
+
**A git diff alone does not support a conclusion. Also do this:**
|
|
297
263
|
|
|
298
264
|
1. **Read selected files**:
|
|
299
265
|
- Small/medium files: read completely
|
|
@@ -328,7 +294,7 @@ Before finalizing, consider running:
|
|
|
328
294
|
|
|
329
295
|
---
|
|
330
296
|
|
|
331
|
-
## Step 9: Intermediate Review
|
|
297
|
+
## Step 9: Intermediate Review
|
|
332
298
|
|
|
333
299
|
After completing analysis, **show user** before generating full report:
|
|
334
300
|
|
|
@@ -160,6 +160,4 @@ At each phase transition, report progress:
|
|
|
160
160
|
| "This phase isn't needed for such a straightforward feature" | Every skipped phase is a deferred bug report |
|
|
161
161
|
| "I understand the requirements, confirmation is just a formality" | The confirmation step exists to catch the gap between what you understood and what was meant |
|
|
162
162
|
|
|
163
|
-
**
|
|
164
|
-
**IRON LAW 2: NEVER WRITE IMPLEMENTATION CODE BEFORE TESTS-CREATOR HAS GENERATED FAILING STUBS.**
|
|
165
|
-
**IRON LAW 3: NEVER DELIVER WITHOUT A PASSING CODE-VERIFIER GATE AND A CHANGE REPORT.**
|
|
163
|
+
**The three constraints that hold the pipeline together:** no implementation before the spec is written and confirmed; no implementation code before tests-creator has generated failing stubs; no delivery without a passing code-verifier gate and a Change Report.
|
|
@@ -160,6 +160,4 @@ At each phase transition, report progress:
|
|
|
160
160
|
| "This phase isn't needed for such a straightforward feature" | Every skipped phase is a deferred bug report |
|
|
161
161
|
| "I understand the requirements, confirmation is just a formality" | The confirmation step exists to catch the gap between what you understood and what was meant |
|
|
162
162
|
|
|
163
|
-
**
|
|
164
|
-
**IRON LAW 2: NEVER WRITE IMPLEMENTATION CODE BEFORE TESTS-CREATOR HAS GENERATED FAILING STUBS.**
|
|
165
|
-
**IRON LAW 3: NEVER DELIVER WITHOUT A PASSING CODE-VERIFIER GATE AND A CHANGE REPORT.**
|
|
163
|
+
**The three constraints that hold the pipeline together:** no implementation before the spec is written and confirmed; no implementation code before tests-creator has generated failing stubs; no delivery without a passing code-verifier gate and a Change Report.
|
|
@@ -160,6 +160,4 @@ At each phase transition, report progress:
|
|
|
160
160
|
| "This phase isn't needed for such a straightforward feature" | Every skipped phase is a deferred bug report |
|
|
161
161
|
| "I understand the requirements, confirmation is just a formality" | The confirmation step exists to catch the gap between what you understood and what was meant |
|
|
162
162
|
|
|
163
|
-
**
|
|
164
|
-
**IRON LAW 2: NEVER WRITE IMPLEMENTATION CODE BEFORE TESTS-CREATOR HAS GENERATED FAILING STUBS.**
|
|
165
|
-
**IRON LAW 3: NEVER DELIVER WITHOUT A PASSING CODE-VERIFIER GATE AND A CHANGE REPORT.**
|
|
163
|
+
**The three constraints that hold the pipeline together:** no implementation before the spec is written and confirmed; no implementation code before tests-creator has generated failing stubs; no delivery without a passing code-verifier gate and a Change Report.
|