@engramm/dev-workflow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/context-builder.d.ts +11 -0
- package/dist/agents/context-builder.d.ts.map +1 -0
- package/dist/agents/context-builder.js +62 -0
- package/dist/agents/context-builder.js.map +1 -0
- package/dist/agents/loader.d.ts +3 -0
- package/dist/agents/loader.d.ts.map +1 -0
- package/dist/agents/loader.js +54 -0
- package/dist/agents/loader.js.map +1 -0
- package/dist/agents/registry.d.ts +10 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +35 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +20 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/agent.d.ts +2 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +101 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +100 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +123 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +94 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +177 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +4 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +191 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/search.d.ts +2 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +75 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/serve.d.ts +2 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +34 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +89 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/task.d.ts +2 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +153 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/vault-io.d.ts +3 -0
- package/dist/cli/vault-io.d.ts.map +1 -0
- package/dist/cli/vault-io.js +75 -0
- package/dist/cli/vault-io.js.map +1 -0
- package/dist/hooks/post-edit.d.ts +3 -0
- package/dist/hooks/post-edit.d.ts.map +1 -0
- package/dist/hooks/post-edit.js +43 -0
- package/dist/hooks/post-edit.js.map +1 -0
- package/dist/hooks/post-task.d.ts +3 -0
- package/dist/hooks/post-task.d.ts.map +1 -0
- package/dist/hooks/post-task.js +25 -0
- package/dist/hooks/post-task.js.map +1 -0
- package/dist/hooks/pre-compact.d.ts +7 -0
- package/dist/hooks/pre-compact.d.ts.map +1 -0
- package/dist/hooks/pre-compact.js +34 -0
- package/dist/hooks/pre-compact.js.map +1 -0
- package/dist/hooks/session-end.d.ts +3 -0
- package/dist/hooks/session-end.d.ts.map +1 -0
- package/dist/hooks/session-end.js +80 -0
- package/dist/hooks/session-end.js.map +1 -0
- package/dist/hooks/session-start.d.ts +3 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +108 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligence/collector.d.ts +12 -0
- package/dist/intelligence/collector.d.ts.map +1 -0
- package/dist/intelligence/collector.js +93 -0
- package/dist/intelligence/collector.js.map +1 -0
- package/dist/intelligence/ranker.d.ts +5 -0
- package/dist/intelligence/ranker.d.ts.map +1 -0
- package/dist/intelligence/ranker.js +107 -0
- package/dist/intelligence/ranker.js.map +1 -0
- package/dist/intelligence/store.d.ts +17 -0
- package/dist/intelligence/store.d.ts.map +1 -0
- package/dist/intelligence/store.js +75 -0
- package/dist/intelligence/store.js.map +1 -0
- package/dist/intelligence/sync.d.ts +3 -0
- package/dist/intelligence/sync.d.ts.map +1 -0
- package/dist/intelligence/sync.js +83 -0
- package/dist/intelligence/sync.js.map +1 -0
- package/dist/intelligence/types.d.ts +35 -0
- package/dist/intelligence/types.d.ts.map +1 -0
- package/dist/intelligence/types.js +2 -0
- package/dist/intelligence/types.js.map +1 -0
- package/dist/lib/context.d.ts +3 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +56 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/conventions-detect.d.ts +12 -0
- package/dist/lib/conventions-detect.d.ts.map +1 -0
- package/dist/lib/conventions-detect.js +337 -0
- package/dist/lib/conventions-detect.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +7 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +45 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/fs-helpers.d.ts +6 -0
- package/dist/lib/fs-helpers.d.ts.map +1 -0
- package/dist/lib/fs-helpers.js +24 -0
- package/dist/lib/fs-helpers.js.map +1 -0
- package/dist/lib/interpolate.d.ts +2 -0
- package/dist/lib/interpolate.d.ts.map +1 -0
- package/dist/lib/interpolate.js +4 -0
- package/dist/lib/interpolate.js.map +1 -0
- package/dist/lib/output.d.ts +27 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +85 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/reader.d.ts +14 -0
- package/dist/lib/reader.d.ts.map +1 -0
- package/dist/lib/reader.js +75 -0
- package/dist/lib/reader.js.map +1 -0
- package/dist/lib/stack-detect.d.ts +12 -0
- package/dist/lib/stack-detect.d.ts.map +1 -0
- package/dist/lib/stack-detect.js +302 -0
- package/dist/lib/stack-detect.js.map +1 -0
- package/dist/lib/statusline.d.ts +3 -0
- package/dist/lib/statusline.d.ts.map +1 -0
- package/dist/lib/statusline.js +40 -0
- package/dist/lib/statusline.js.map +1 -0
- package/dist/lib/templates.d.ts +3 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +174 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/types.d.ts +44 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/writer.d.ts +13 -0
- package/dist/lib/writer.d.ts.map +1 -0
- package/dist/lib/writer.js +97 -0
- package/dist/lib/writer.js.map +1 -0
- package/dist/mcp/handlers.d.ts +34 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +256 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/server.d.ts +20 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +89 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +148 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/tasks/manager.d.ts +14 -0
- package/dist/tasks/manager.d.ts.map +1 -0
- package/dist/tasks/manager.js +151 -0
- package/dist/tasks/manager.js.map +1 -0
- package/dist/tasks/tracker.d.ts +11 -0
- package/dist/tasks/tracker.d.ts.map +1 -0
- package/dist/tasks/tracker.js +31 -0
- package/dist/tasks/tracker.js.map +1 -0
- package/dist/tasks/types.d.ts +19 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +2 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/workflow/builtin.d.ts +4 -0
- package/dist/workflow/builtin.d.ts.map +1 -0
- package/dist/workflow/builtin.js +93 -0
- package/dist/workflow/builtin.js.map +1 -0
- package/dist/workflow/engine.d.ts +38 -0
- package/dist/workflow/engine.d.ts.map +1 -0
- package/dist/workflow/engine.js +217 -0
- package/dist/workflow/engine.js.map +1 -0
- package/dist/workflow/loader.d.ts +4 -0
- package/dist/workflow/loader.d.ts.map +1 -0
- package/dist/workflow/loader.js +106 -0
- package/dist/workflow/loader.js.map +1 -0
- package/dist/workflow/state.d.ts +11 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +49 -0
- package/dist/workflow/state.js.map +1 -0
- package/dist/workflow/types.d.ts +36 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -0
- package/package.json +54 -0
- package/templates/agents/architect.md +46 -0
- package/templates/agents/coder.md +46 -0
- package/templates/agents/committer.md +29 -0
- package/templates/agents/debugger.md +54 -0
- package/templates/agents/planner.md +45 -0
- package/templates/agents/reader.md +48 -0
- package/templates/agents/reviewer.md +48 -0
- package/templates/agents/tester.md +41 -0
- package/templates/claude/agents/researcher.md +47 -0
- package/templates/claude/agents/writer.md +29 -0
- package/templates/claude/commands/git/changelog.md +41 -0
- package/templates/claude/commands/git/merge.md +37 -0
- package/templates/claude/commands/git/new-branch.md +34 -0
- package/templates/claude/commands/git/pr-review.md +64 -0
- package/templates/claude/commands/session/handover.md +49 -0
- package/templates/claude/commands/session/resume.md +43 -0
- package/templates/claude/commands/session/review.md +81 -0
- package/templates/claude/commands/task.md +52 -0
- package/templates/claude/commands/vault/adr.md +39 -0
- package/templates/claude/commands/vault/analyze.md +110 -0
- package/templates/claude/commands/vault/bug.md +31 -0
- package/templates/claude/commands/vault/debt.md +28 -0
- package/templates/claude/commands/vault/deps.md +36 -0
- package/templates/claude/commands/vault/from-spec.md +306 -0
- package/templates/claude/commands/vault/search.md +31 -0
- package/templates/claude/commands/vault/security-scan.md +50 -0
- package/templates/claude/commands/vault/test-gaps.md +38 -0
- package/templates/claude/commands/workflow/dev.md +913 -0
- package/templates/claude/commands/workflow.md +47 -0
- package/templates/claude/settings.json +52 -0
- package/templates/claude/skills/obsidian-markdown/SKILL.md +196 -0
- package/templates/claude/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/templates/claude/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/templates/claude/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/templates/workflows/deploy.yaml +21 -0
- package/templates/workflows/release.yaml +26 -0
- package/templates/workflows/spike.yaml +14 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const VALID_GATES = new Set(["none", "user-approve", "tests-pass", "review-pass"]);
|
|
4
|
+
function parseYamlLine(line) {
|
|
5
|
+
const match = line.match(/^(\s*)(\w[\w-]*):\s*(.*)$/);
|
|
6
|
+
if (!match)
|
|
7
|
+
return null;
|
|
8
|
+
return { key: match[2], value: match[3].trim() };
|
|
9
|
+
}
|
|
10
|
+
function parseYamlArray(value) {
|
|
11
|
+
const match = value.match(/^\[(.*)]\s*$/);
|
|
12
|
+
if (match) {
|
|
13
|
+
return match[1].split(",").map((item) => item.trim()).filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
export function parseWorkflowYaml(content) {
|
|
18
|
+
const lines = content.split("\n");
|
|
19
|
+
let name = "";
|
|
20
|
+
let description = "";
|
|
21
|
+
const steps = [];
|
|
22
|
+
let currentStep = null;
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
const trimmed = line.trimStart();
|
|
25
|
+
if (trimmed.startsWith("- name:")) {
|
|
26
|
+
if (currentStep?.name) {
|
|
27
|
+
steps.push(finalizeStep(currentStep));
|
|
28
|
+
}
|
|
29
|
+
currentStep = { name: trimmed.replace("- name:", "").trim() };
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (currentStep) {
|
|
33
|
+
const parsed = parseYamlLine(trimmed);
|
|
34
|
+
if (!parsed)
|
|
35
|
+
continue;
|
|
36
|
+
switch (parsed.key) {
|
|
37
|
+
case "agent":
|
|
38
|
+
currentStep.agent = parsed.value;
|
|
39
|
+
break;
|
|
40
|
+
case "gate":
|
|
41
|
+
if (VALID_GATES.has(parsed.value)) {
|
|
42
|
+
currentStep.gate = parsed.value;
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case "onFail":
|
|
46
|
+
currentStep.onFail = parsed.value || null;
|
|
47
|
+
break;
|
|
48
|
+
case "maxAttempts":
|
|
49
|
+
currentStep.maxAttempts = parseInt(parsed.value, 10) || 3;
|
|
50
|
+
break;
|
|
51
|
+
case "input":
|
|
52
|
+
currentStep.input = parseYamlArray(parsed.value);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const parsed = parseYamlLine(trimmed);
|
|
58
|
+
if (!parsed)
|
|
59
|
+
continue;
|
|
60
|
+
switch (parsed.key) {
|
|
61
|
+
case "name":
|
|
62
|
+
name = parsed.value;
|
|
63
|
+
break;
|
|
64
|
+
case "description":
|
|
65
|
+
description = parsed.value;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (currentStep?.name) {
|
|
70
|
+
steps.push(finalizeStep(currentStep));
|
|
71
|
+
}
|
|
72
|
+
if (!name)
|
|
73
|
+
throw new Error("Workflow yaml missing 'name' field");
|
|
74
|
+
if (steps.length === 0)
|
|
75
|
+
throw new Error("Workflow yaml has no steps");
|
|
76
|
+
return { name, description, steps };
|
|
77
|
+
}
|
|
78
|
+
function finalizeStep(partial) {
|
|
79
|
+
return {
|
|
80
|
+
name: partial.name ?? "",
|
|
81
|
+
agent: partial.agent ?? partial.name ?? "",
|
|
82
|
+
input: partial.input ?? [],
|
|
83
|
+
gate: partial.gate ?? "none",
|
|
84
|
+
onFail: partial.onFail ?? null,
|
|
85
|
+
maxAttempts: partial.maxAttempts ?? 3,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function loadCustomWorkflows(vaultPath) {
|
|
89
|
+
const workflowsDir = join(vaultPath, "workflows");
|
|
90
|
+
if (!existsSync(workflowsDir))
|
|
91
|
+
return [];
|
|
92
|
+
const files = readdirSync(workflowsDir)
|
|
93
|
+
.filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"));
|
|
94
|
+
const workflows = [];
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
try {
|
|
97
|
+
const content = readFileSync(join(workflowsDir, file), "utf-8");
|
|
98
|
+
workflows.push(parseWorkflowYaml(content));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return workflows;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/workflow/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { WorkflowRun } from "./types.js";
|
|
2
|
+
export declare class WorkflowState {
|
|
3
|
+
private readonly workflowsDir;
|
|
4
|
+
constructor(vaultPath: string);
|
|
5
|
+
save(run: WorkflowRun): void;
|
|
6
|
+
load(runId: string): WorkflowRun;
|
|
7
|
+
loadCurrent(): WorkflowRun | null;
|
|
8
|
+
list(): WorkflowRun[];
|
|
9
|
+
delete(runId: string): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/workflow/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,SAAS,EAAE,MAAM;IAI7B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAK5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAQhC,WAAW,IAAI,WAAW,GAAG,IAAI;IAQjC,IAAI,IAAI,WAAW,EAAE;IAmBrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAM5B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, existsSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { writeFileSafe } from "../lib/fs-helpers.js";
|
|
4
|
+
export class WorkflowState {
|
|
5
|
+
workflowsDir;
|
|
6
|
+
constructor(vaultPath) {
|
|
7
|
+
this.workflowsDir = join(vaultPath, "workflows");
|
|
8
|
+
}
|
|
9
|
+
save(run) {
|
|
10
|
+
const filepath = join(this.workflowsDir, `${run.id}.json`);
|
|
11
|
+
writeFileSafe(filepath, JSON.stringify(run, null, 2));
|
|
12
|
+
}
|
|
13
|
+
load(runId) {
|
|
14
|
+
const filepath = join(this.workflowsDir, `${runId}.json`);
|
|
15
|
+
if (!existsSync(filepath)) {
|
|
16
|
+
throw new Error(`Workflow run not found: ${runId}`);
|
|
17
|
+
}
|
|
18
|
+
return JSON.parse(readFileSync(filepath, "utf-8"));
|
|
19
|
+
}
|
|
20
|
+
loadCurrent() {
|
|
21
|
+
const runs = this.list();
|
|
22
|
+
const active = runs.find((run) => run.status === "running" || run.status === "paused");
|
|
23
|
+
return active ?? null;
|
|
24
|
+
}
|
|
25
|
+
list() {
|
|
26
|
+
if (!existsSync(this.workflowsDir))
|
|
27
|
+
return [];
|
|
28
|
+
const files = readdirSync(this.workflowsDir)
|
|
29
|
+
.filter((file) => file.startsWith("run-") && file.endsWith(".json"));
|
|
30
|
+
const runs = [];
|
|
31
|
+
for (const file of files) {
|
|
32
|
+
try {
|
|
33
|
+
const content = readFileSync(join(this.workflowsDir, file), "utf-8");
|
|
34
|
+
runs.push(JSON.parse(content));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return runs.sort((a, b) => b.startedAt.localeCompare(a.startedAt));
|
|
41
|
+
}
|
|
42
|
+
delete(runId) {
|
|
43
|
+
const filepath = join(this.workflowsDir, `${runId}.json`);
|
|
44
|
+
if (existsSync(filepath)) {
|
|
45
|
+
unlinkSync(filepath);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/workflow/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,OAAO,aAAa;IACP,YAAY,CAAS;IAEtC,YAAY,SAAiB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,GAAgB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAgB,CAAC;IACpE,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CACtB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAC7D,CAAC;QACF,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,EAAE,CAAC;QAE9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;aACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type GateType = "none" | "user-approve" | "tests-pass" | "review-pass";
|
|
2
|
+
export interface StepDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
agent: string;
|
|
5
|
+
input: string[];
|
|
6
|
+
gate: GateType;
|
|
7
|
+
onFail: string | null;
|
|
8
|
+
maxAttempts: number;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkflowDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
steps: StepDefinition[];
|
|
14
|
+
}
|
|
15
|
+
export type StepStatus = "pending" | "running" | "completed" | "failed" | "skipped";
|
|
16
|
+
export type WorkflowStatus = "running" | "completed" | "failed" | "paused";
|
|
17
|
+
export interface StepState {
|
|
18
|
+
status: StepStatus;
|
|
19
|
+
output: string | null;
|
|
20
|
+
startedAt: string | null;
|
|
21
|
+
completedAt: string | null;
|
|
22
|
+
durationMs: number | null;
|
|
23
|
+
attempt: number;
|
|
24
|
+
}
|
|
25
|
+
export interface WorkflowRun {
|
|
26
|
+
id: string;
|
|
27
|
+
workflowName: string;
|
|
28
|
+
taskId: string | null;
|
|
29
|
+
taskDescription: string;
|
|
30
|
+
currentStep: string;
|
|
31
|
+
startedAt: string;
|
|
32
|
+
completedAt: string | null;
|
|
33
|
+
status: WorkflowStatus;
|
|
34
|
+
steps: Record<string, StepState>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,cAAc,GACd,YAAY,GACZ,aAAa,CAAC;AAElB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflow/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@engramm/dev-workflow",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Development workflow engine with agents and vault for Claude Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dev-workflow": "./dist/cli/index.js",
|
|
8
|
+
"dev-vault": "./dist/cli/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"lint": "tsc --noEmit",
|
|
24
|
+
"prepublishOnly": "pnpm run build"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"templates"
|
|
29
|
+
],
|
|
30
|
+
"keywords": [
|
|
31
|
+
"claude-code",
|
|
32
|
+
"developer-tools",
|
|
33
|
+
"workflow",
|
|
34
|
+
"agents",
|
|
35
|
+
"mcp",
|
|
36
|
+
"vault",
|
|
37
|
+
"obsidian"
|
|
38
|
+
],
|
|
39
|
+
"author": "Igor Pugachev",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/supostat/dev-workflow.git"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=20"
|
|
47
|
+
},
|
|
48
|
+
"packageManager": "pnpm@10.22.0",
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^25.5.0",
|
|
51
|
+
"typescript": "^6.0.2",
|
|
52
|
+
"vitest": "^4.1.2"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architect
|
|
3
|
+
description: Designs system architecture and evaluates trade-offs
|
|
4
|
+
vault: [stack, conventions, knowledge, gameplan]
|
|
5
|
+
read: true
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are an architect agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Analyze the codebase and design system architecture. You read code,
|
|
16
|
+
evaluate trade-offs, and propose 2-3 solutions with pros/cons.
|
|
17
|
+
You do NOT modify any files.
|
|
18
|
+
|
|
19
|
+
## Project Context
|
|
20
|
+
|
|
21
|
+
### Stack
|
|
22
|
+
{{stack}}
|
|
23
|
+
|
|
24
|
+
### Conventions
|
|
25
|
+
{{conventions}}
|
|
26
|
+
|
|
27
|
+
### Knowledge
|
|
28
|
+
{{knowledge}}
|
|
29
|
+
|
|
30
|
+
### Gameplan
|
|
31
|
+
{{gameplan}}
|
|
32
|
+
|
|
33
|
+
## Task
|
|
34
|
+
|
|
35
|
+
{{taskDescription}}
|
|
36
|
+
|
|
37
|
+
## Output Format
|
|
38
|
+
|
|
39
|
+
For each proposed solution:
|
|
40
|
+
1. Summary (1-2 sentences)
|
|
41
|
+
2. Architecture diagram (text-based)
|
|
42
|
+
3. Pros and cons
|
|
43
|
+
4. Files affected
|
|
44
|
+
5. Estimated complexity: low / medium / high
|
|
45
|
+
|
|
46
|
+
End with a recommendation and reasoning.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coder
|
|
3
|
+
description: Writes code following project conventions
|
|
4
|
+
vault: [stack, conventions, branch]
|
|
5
|
+
read: true
|
|
6
|
+
write: [src/**, tests/**]
|
|
7
|
+
shell: [npm run build, npm run lint]
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a coder agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Write code strictly following the plan. You may read any file
|
|
16
|
+
but only modify files matching your write patterns.
|
|
17
|
+
Run build and lint after changes.
|
|
18
|
+
|
|
19
|
+
## Project Context
|
|
20
|
+
|
|
21
|
+
### Stack
|
|
22
|
+
{{stack}}
|
|
23
|
+
|
|
24
|
+
### Conventions
|
|
25
|
+
{{conventions}}
|
|
26
|
+
|
|
27
|
+
### Branch: {{branch}}
|
|
28
|
+
{{branchContext}}
|
|
29
|
+
|
|
30
|
+
## Plan
|
|
31
|
+
|
|
32
|
+
{{plan}}
|
|
33
|
+
|
|
34
|
+
## Task
|
|
35
|
+
|
|
36
|
+
{{taskDescription}}
|
|
37
|
+
|
|
38
|
+
## Rules
|
|
39
|
+
|
|
40
|
+
- Follow conventions strictly — consistency over local optimization
|
|
41
|
+
- Run build after changes to verify compilation
|
|
42
|
+
- Run lint to check code style
|
|
43
|
+
- Do NOT commit — committer handles this
|
|
44
|
+
- Do NOT modify files outside src/** and tests/**
|
|
45
|
+
- Write tests for new functionality
|
|
46
|
+
- Keep files under 500 lines
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: committer
|
|
3
|
+
description: Creates clean git commits with descriptive messages
|
|
4
|
+
vault: [branch]
|
|
5
|
+
read: false
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: [status, diff, add, commit]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a committer agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Create a clean git commit. Review staged changes, write a
|
|
16
|
+
descriptive commit message, and commit.
|
|
17
|
+
|
|
18
|
+
## Branch: {{branch}}
|
|
19
|
+
{{branchContext}}
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- Imperative mood in commit summary: "Add feature", not "Added"
|
|
24
|
+
- Summary max 70 characters
|
|
25
|
+
- Blank line between summary and description
|
|
26
|
+
- Description explains what and why in 1-3 sentences
|
|
27
|
+
- Do NOT commit .env, secrets, or credentials
|
|
28
|
+
- Do NOT push — only local commit
|
|
29
|
+
- One commit per logical change
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debugger
|
|
3
|
+
description: Diagnoses bugs through systematic root cause analysis
|
|
4
|
+
vault: [stack, conventions, knowledge]
|
|
5
|
+
read: true
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a debugger agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Systematically diagnose bugs by tracing execution, inspecting state,
|
|
16
|
+
and identifying root causes. You read code and logs but do NOT modify
|
|
17
|
+
any files. Your output is the diagnosis and fix recommendation.
|
|
18
|
+
|
|
19
|
+
## Project Context
|
|
20
|
+
|
|
21
|
+
### Stack
|
|
22
|
+
{{stack}}
|
|
23
|
+
|
|
24
|
+
### Conventions
|
|
25
|
+
{{conventions}}
|
|
26
|
+
|
|
27
|
+
### Knowledge (gotchas)
|
|
28
|
+
{{knowledge}}
|
|
29
|
+
|
|
30
|
+
## Bug Report
|
|
31
|
+
|
|
32
|
+
{{taskDescription}}
|
|
33
|
+
|
|
34
|
+
## Procedure
|
|
35
|
+
|
|
36
|
+
1. Reproduce: identify the exact steps or conditions
|
|
37
|
+
2. Trace: follow the execution path from input to error
|
|
38
|
+
3. Isolate: narrow down to the specific component/function
|
|
39
|
+
4. Root cause: identify WHY it fails, not just WHERE
|
|
40
|
+
5. Fix: propose the minimal change that resolves the root cause
|
|
41
|
+
|
|
42
|
+
## Output Format
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
DIAGNOSIS:
|
|
46
|
+
Symptoms: <what the user sees>
|
|
47
|
+
Trace: <execution path leading to the bug>
|
|
48
|
+
Root cause: <the actual problem>
|
|
49
|
+
File: <path:line>
|
|
50
|
+
Fix: <proposed change>
|
|
51
|
+
Risk: <what else might break>
|
|
52
|
+
Prevention: <how to avoid this in the future>
|
|
53
|
+
END_DIAGNOSIS
|
|
54
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planner
|
|
3
|
+
description: Creates implementation plans with clear steps
|
|
4
|
+
vault: [stack, conventions, knowledge, gameplan]
|
|
5
|
+
read: true
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a planner agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Create a detailed implementation plan. You read code and docs
|
|
16
|
+
but do NOT modify any files. Your output is the plan itself.
|
|
17
|
+
|
|
18
|
+
## Project Context
|
|
19
|
+
|
|
20
|
+
### Stack
|
|
21
|
+
{{stack}}
|
|
22
|
+
|
|
23
|
+
### Conventions
|
|
24
|
+
{{conventions}}
|
|
25
|
+
|
|
26
|
+
### Knowledge
|
|
27
|
+
{{knowledge}}
|
|
28
|
+
|
|
29
|
+
### Gameplan
|
|
30
|
+
{{gameplan}}
|
|
31
|
+
|
|
32
|
+
## Task
|
|
33
|
+
|
|
34
|
+
{{taskDescription}}
|
|
35
|
+
|
|
36
|
+
## Output Format
|
|
37
|
+
|
|
38
|
+
Produce a plan with:
|
|
39
|
+
1. Summary (1-2 sentences)
|
|
40
|
+
2. Files to create or modify (with paths)
|
|
41
|
+
3. Step-by-step implementation order
|
|
42
|
+
4. Test strategy
|
|
43
|
+
5. Risks and mitigations
|
|
44
|
+
|
|
45
|
+
Mark each step with estimated complexity: low / medium / high.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reader
|
|
3
|
+
description: Reads and summarizes project context for other agents
|
|
4
|
+
vault: [stack, conventions, knowledge, gameplan, branch, dailyLogs]
|
|
5
|
+
read: true
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a reader agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Gather and summarize project context. You read code, documentation,
|
|
16
|
+
and vault data to build a complete picture of the current state.
|
|
17
|
+
|
|
18
|
+
## Project Context
|
|
19
|
+
|
|
20
|
+
### Stack
|
|
21
|
+
{{stack}}
|
|
22
|
+
|
|
23
|
+
### Conventions
|
|
24
|
+
{{conventions}}
|
|
25
|
+
|
|
26
|
+
### Knowledge
|
|
27
|
+
{{knowledge}}
|
|
28
|
+
|
|
29
|
+
### Gameplan
|
|
30
|
+
{{gameplan}}
|
|
31
|
+
|
|
32
|
+
### Branch: {{branch}}
|
|
33
|
+
{{branchContext}}
|
|
34
|
+
|
|
35
|
+
### Recent Sessions
|
|
36
|
+
{{dailyLogs}}
|
|
37
|
+
|
|
38
|
+
## Task
|
|
39
|
+
|
|
40
|
+
{{taskDescription}}
|
|
41
|
+
|
|
42
|
+
## Output Format
|
|
43
|
+
|
|
44
|
+
Produce a structured summary:
|
|
45
|
+
1. Relevant files and their purpose
|
|
46
|
+
2. Key patterns and conventions to follow
|
|
47
|
+
3. Potential risks or gotchas
|
|
48
|
+
4. Dependencies and affected areas
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reviewer
|
|
3
|
+
description: Reviews code for quality, security, and convention compliance
|
|
4
|
+
vault: [conventions, knowledge]
|
|
5
|
+
read: true
|
|
6
|
+
write: []
|
|
7
|
+
shell: []
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a reviewer agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Review code changes for quality, security, and convention compliance.
|
|
16
|
+
You do NOT modify any files. Your output is a review report.
|
|
17
|
+
|
|
18
|
+
## Project Context
|
|
19
|
+
|
|
20
|
+
### Conventions
|
|
21
|
+
{{conventions}}
|
|
22
|
+
|
|
23
|
+
### Knowledge (gotchas, patterns)
|
|
24
|
+
{{knowledge}}
|
|
25
|
+
|
|
26
|
+
## Changes to Review
|
|
27
|
+
|
|
28
|
+
{{codeChanges}}
|
|
29
|
+
|
|
30
|
+
## Review Checklist
|
|
31
|
+
|
|
32
|
+
1. Security: OWASP Top 10, input validation, no hardcoded secrets
|
|
33
|
+
2. Correctness: logic errors, edge cases, error handling
|
|
34
|
+
3. Conventions: naming, structure, patterns per project conventions
|
|
35
|
+
4. Tests: coverage, edge cases, meaningful assertions
|
|
36
|
+
5. Simplicity: no premature abstractions, no unnecessary complexity
|
|
37
|
+
|
|
38
|
+
## Output Format
|
|
39
|
+
|
|
40
|
+
For each finding:
|
|
41
|
+
|
|
42
|
+
severity: low | medium | high | critical
|
|
43
|
+
file: path/to/file.ts
|
|
44
|
+
line: 42
|
|
45
|
+
issue: Description of the issue
|
|
46
|
+
suggestion: How to fix it
|
|
47
|
+
|
|
48
|
+
End with a summary: APPROVE or REQUEST_CHANGES with blocking issues listed.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tester
|
|
3
|
+
description: Writes and runs tests for code changes
|
|
4
|
+
vault: [stack, conventions]
|
|
5
|
+
read: true
|
|
6
|
+
write: [tests/**]
|
|
7
|
+
shell: [npm test]
|
|
8
|
+
git: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a tester agent for {{projectName}}.
|
|
12
|
+
|
|
13
|
+
## Your Role
|
|
14
|
+
|
|
15
|
+
Write tests and verify they pass. You may read any file
|
|
16
|
+
but only create or modify files in tests/.
|
|
17
|
+
|
|
18
|
+
## Project Context
|
|
19
|
+
|
|
20
|
+
### Stack
|
|
21
|
+
{{stack}}
|
|
22
|
+
|
|
23
|
+
### Conventions
|
|
24
|
+
{{conventions}}
|
|
25
|
+
|
|
26
|
+
## Task
|
|
27
|
+
|
|
28
|
+
{{taskDescription}}
|
|
29
|
+
|
|
30
|
+
## Code to Test
|
|
31
|
+
|
|
32
|
+
{{codeChanges}}
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- Tests are specifications, not scripts
|
|
37
|
+
- Test behavior, not implementation
|
|
38
|
+
- Cover edge cases and error paths
|
|
39
|
+
- Use descriptive test names that explain the scenario
|
|
40
|
+
- Run npm test after writing tests
|
|
41
|
+
- If tests fail, fix them before completing
|