@mrciphersmith/keryx 0.2.76 → 0.2.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +15 -10
  2. package/dist/cli.js +11401 -9120
  3. package/dist/proxy-worker.js +12 -12
  4. package/package.json +1 -1
  5. package/src/gdgraph/build.ts +12 -0
  6. package/src/gdgraph/query.ts +51 -1
  7. package/src/gdgraph/types.ts +77 -0
  8. package/src/gdgraph/wiki-layer-no-git.test.ts +73 -0
  9. package/src/gdgraph/wiki-layer.test.ts +211 -0
  10. package/src/gdgraph/wiki-layer.ts +213 -0
  11. package/src/gdskills/bundled/rules/core/api-contracts.mdc +6 -4
  12. package/src/gdskills/bundled/rules/core/model-selection.mdc +4 -5
  13. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +4 -38
  14. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +4 -38
  15. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +4 -38
  16. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +4 -38
  17. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +4 -38
  18. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +1 -3
  19. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +1 -3
  20. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +1 -3
  21. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +35 -34
  22. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +35 -34
  23. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +35 -34
  24. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +35 -34
  25. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +35 -34
  26. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/input-contract.schema.json +1 -1
  27. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +2 -4
  28. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +2 -4
  29. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +2 -4
  30. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +2 -4
  31. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +2 -4
  32. package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +10 -6
  33. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +1 -1
  34. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +1 -1
  35. package/src/gdskills/bundled/skills/planning/interview/SKILL.md +1 -1
  36. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +1 -1
  37. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +1 -1
  38. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +1 -1
  39. package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +4 -0
  40. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +1 -2
  41. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +2 -2
  42. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +1 -2
  43. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +4 -0
  44. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +4 -0
  45. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +4 -0
  46. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +1 -2
  47. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +8 -13
  48. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +2 -3
  49. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +2 -3
  50. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +5 -0
  51. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +1 -2
@@ -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
- ## Iron Laws
129
+ ## The three that are not negotiable
130
130
 
131
- **IRON LAW 1: NO breaking change may be deployed without a major version bump and a deprecation period.**
132
- **IRON LAW 2: The OpenAPI spec is updated BEFORE the implementation — not after as documentation.**
133
- **IRON LAW 3: Error responses MUST use the standard ApiError envelope — no raw exceptions, no ad-hoc shapes.**
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**, so what actually happened was a model reading a table of signals and
123
- doing the arithmetic in its head — the exact mechanical work this programme moves
124
- out of skills and into the code that consumes them. `keryx review tier` is that
125
- code's entry point; `decideDispatchModel` is what it calls.
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. NEVER start without explicit user confirmation of source, target, and branch."
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 — MUST ANALYZE (Critical)**:
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
- **You CANNOT make conclusions from git diff alone. You MUST:**
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 (CRITICAL)
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. NEVER start without explicit user confirmation of source, target, and branch."
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 — MUST ANALYZE (Critical)**:
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
- **You CANNOT make conclusions from git diff alone. You MUST:**
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 (CRITICAL)
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. NEVER start without explicit user confirmation of source, target, and branch."
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 — MUST ANALYZE (Critical)**:
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
- **You CANNOT make conclusions from git diff alone. You MUST:**
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 (CRITICAL)
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. NEVER start without explicit user confirmation of source, target, and branch."
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 — MUST ANALYZE (Critical)**:
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
- **You CANNOT make conclusions from git diff alone. You MUST:**
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 (CRITICAL)
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. NEVER start without explicit user confirmation of source, target, and branch."
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 — MUST ANALYZE (Critical)**:
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
- **You CANNOT make conclusions from git diff alone. You MUST:**
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 (CRITICAL)
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
- **IRON LAW 1: NEVER START IMPLEMENTING BEFORE THE SPEC IS WRITTEN AND CONFIRMED.**
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
- **IRON LAW 1: NEVER START IMPLEMENTING BEFORE THE SPEC IS WRITTEN AND CONFIRMED.**
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
- **IRON LAW 1: NEVER START IMPLEMENTING BEFORE THE SPEC IS WRITTEN AND CONFIRMED.**
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.