frontend-harness 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.
Files changed (77) hide show
  1. package/AGENTS.md +48 -0
  2. package/CLAUDE.md +48 -0
  3. package/README.md +262 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +380 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/runtime/builtin-skills.d.ts +6 -0
  8. package/dist/runtime/builtin-skills.js +269 -0
  9. package/dist/runtime/builtin-skills.js.map +1 -0
  10. package/dist/runtime/clean.d.ts +11 -0
  11. package/dist/runtime/clean.js +85 -0
  12. package/dist/runtime/clean.js.map +1 -0
  13. package/dist/runtime/command-taxonomy.d.ts +12 -0
  14. package/dist/runtime/command-taxonomy.js +72 -0
  15. package/dist/runtime/command-taxonomy.js.map +1 -0
  16. package/dist/runtime/context.d.ts +71 -0
  17. package/dist/runtime/context.js +153 -0
  18. package/dist/runtime/context.js.map +1 -0
  19. package/dist/runtime/graph.d.ts +12 -0
  20. package/dist/runtime/graph.js +211 -0
  21. package/dist/runtime/graph.js.map +1 -0
  22. package/dist/runtime/knowledge.d.ts +48 -0
  23. package/dist/runtime/knowledge.js +383 -0
  24. package/dist/runtime/knowledge.js.map +1 -0
  25. package/dist/runtime/plan.d.ts +18 -0
  26. package/dist/runtime/plan.js +571 -0
  27. package/dist/runtime/plan.js.map +1 -0
  28. package/dist/runtime/policy-provenance.d.ts +17 -0
  29. package/dist/runtime/policy-provenance.js +195 -0
  30. package/dist/runtime/policy-provenance.js.map +1 -0
  31. package/dist/runtime/project-discovery.d.ts +17 -0
  32. package/dist/runtime/project-discovery.js +166 -0
  33. package/dist/runtime/project-discovery.js.map +1 -0
  34. package/dist/runtime/project-paths.d.ts +6 -0
  35. package/dist/runtime/project-paths.js +47 -0
  36. package/dist/runtime/project-paths.js.map +1 -0
  37. package/dist/runtime/protocol-init.d.ts +50 -0
  38. package/dist/runtime/protocol-init.js +256 -0
  39. package/dist/runtime/protocol-init.js.map +1 -0
  40. package/dist/runtime/repair-decision.d.ts +3 -0
  41. package/dist/runtime/repair-decision.js +195 -0
  42. package/dist/runtime/repair-decision.js.map +1 -0
  43. package/dist/runtime/repair-packet.d.ts +7 -0
  44. package/dist/runtime/repair-packet.js +159 -0
  45. package/dist/runtime/repair-packet.js.map +1 -0
  46. package/dist/runtime/skills.d.ts +19 -0
  47. package/dist/runtime/skills.js +230 -0
  48. package/dist/runtime/skills.js.map +1 -0
  49. package/dist/runtime/state-explain.d.ts +2 -0
  50. package/dist/runtime/state-explain.js +106 -0
  51. package/dist/runtime/state-explain.js.map +1 -0
  52. package/dist/runtime/state.d.ts +10 -0
  53. package/dist/runtime/state.js +237 -0
  54. package/dist/runtime/state.js.map +1 -0
  55. package/dist/runtime/units.d.ts +10 -0
  56. package/dist/runtime/units.js +181 -0
  57. package/dist/runtime/units.js.map +1 -0
  58. package/dist/runtime/verification-commands.d.ts +11 -0
  59. package/dist/runtime/verification-commands.js +89 -0
  60. package/dist/runtime/verification-commands.js.map +1 -0
  61. package/dist/runtime/verify.d.ts +7 -0
  62. package/dist/runtime/verify.js +192 -0
  63. package/dist/runtime/verify.js.map +1 -0
  64. package/dist/schemas/types.d.ts +244 -0
  65. package/dist/schemas/types.js +2 -0
  66. package/dist/schemas/types.js.map +1 -0
  67. package/dist/schemas/validation.d.ts +2 -0
  68. package/dist/schemas/validation.js +21 -0
  69. package/dist/schemas/validation.js.map +1 -0
  70. package/dist/storage/json.d.ts +5 -0
  71. package/dist/storage/json.js +24 -0
  72. package/dist/storage/json.js.map +1 -0
  73. package/dist/storage/paths.d.ts +3 -0
  74. package/dist/storage/paths.js +9 -0
  75. package/dist/storage/paths.js.map +1 -0
  76. package/docs/DIRECTION.md +67 -0
  77. package/package.json +35 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-packet.js","sourceRoot":"","sources":["../../src/runtime/repair-packet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface ProjectSkill {
2
+ name: string;
3
+ title: string;
4
+ description: string | null;
5
+ path: string;
6
+ triggers?: string[];
7
+ intents?: string[];
8
+ examples?: string[];
9
+ }
10
+ export type SkillCheckStatus = "passed" | "failed" | "not_configured";
11
+ export interface SkillCheckResult {
12
+ status: SkillCheckStatus;
13
+ skillsRoot: string;
14
+ skillCount: number;
15
+ errors: string[];
16
+ warnings: string[];
17
+ }
18
+ export declare function discoverSkills(projectRoot: string): ProjectSkill[];
19
+ export declare function checkSkills(projectRoot: string): SkillCheckResult;
@@ -0,0 +1,230 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { harnessPath } from "../storage/paths.js";
4
+ export function discoverSkills(projectRoot) {
5
+ const skillsRoot = harnessPath(projectRoot, "skills");
6
+ if (!isReadableDirectory(skillsRoot)) {
7
+ return [];
8
+ }
9
+ return listMarkdownFiles(skillsRoot)
10
+ .flatMap((fullPath) => {
11
+ const skill = describeSkill(projectRoot, fullPath);
12
+ return skill ? [skill] : [];
13
+ })
14
+ .sort((left, right) => left.name.localeCompare(right.name));
15
+ }
16
+ export function checkSkills(projectRoot) {
17
+ const skillsRoot = harnessPath(projectRoot, "skills");
18
+ const relativeSkillsRoot = path.relative(projectRoot, skillsRoot).split(path.sep).join(path.posix.sep);
19
+ if (!fs.existsSync(skillsRoot)) {
20
+ return {
21
+ status: "not_configured",
22
+ skillsRoot: relativeSkillsRoot,
23
+ skillCount: 0,
24
+ errors: [],
25
+ warnings: ["Create .frontend-harness/skills before checking project-local skills."]
26
+ };
27
+ }
28
+ const errors = [];
29
+ const warnings = [];
30
+ if (!isReadableDirectory(skillsRoot)) {
31
+ errors.push(".frontend-harness/skills must be a readable directory.");
32
+ }
33
+ const skillFiles = isReadableDirectory(skillsRoot) ? listMarkdownFiles(skillsRoot, errors) : [];
34
+ const names = new Set();
35
+ const duplicateNames = new Set();
36
+ for (const fullPath of skillFiles) {
37
+ const relativePath = path.relative(projectRoot, fullPath).split(path.sep).join(path.posix.sep);
38
+ const skillPath = path.relative(skillsRoot, fullPath);
39
+ const name = slugFromSkillPath(skillPath);
40
+ if (names.has(name)) {
41
+ duplicateNames.add(name);
42
+ }
43
+ names.add(name);
44
+ let content;
45
+ try {
46
+ content = fs.readFileSync(fullPath, "utf8");
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : String(error);
50
+ errors.push(`${relativePath} cannot be read: ${message}`);
51
+ continue;
52
+ }
53
+ const title = extractTitle(content);
54
+ if (!title) {
55
+ errors.push(`${relativePath} must include a non-empty "# Title" heading.`);
56
+ }
57
+ if (!hasBodyGuidance(content)) {
58
+ errors.push(`${relativePath} must include non-empty body guidance after the title.`);
59
+ }
60
+ }
61
+ for (const duplicateName of duplicateNames) {
62
+ errors.push(`Duplicate project skill name: ${duplicateName}.`);
63
+ }
64
+ return {
65
+ status: errors.length > 0 ? "failed" : "passed",
66
+ skillsRoot: relativeSkillsRoot,
67
+ skillCount: skillFiles.length,
68
+ errors,
69
+ warnings
70
+ };
71
+ }
72
+ function describeSkill(projectRoot, fullPath) {
73
+ const relativePath = path.relative(projectRoot, fullPath).split(path.sep).join(path.posix.sep);
74
+ const skillsRoot = harnessPath(projectRoot, "skills");
75
+ const skillPath = path.relative(skillsRoot, fullPath);
76
+ let content;
77
+ try {
78
+ content = fs.readFileSync(fullPath, "utf8");
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ const name = slugFromSkillPath(skillPath);
84
+ const title = extractTitle(content) ?? name;
85
+ const metadata = parseFrontmatter(content);
86
+ return {
87
+ name: metadata.name ?? name,
88
+ title: metadata.title ?? title,
89
+ description: metadata.description ?? extractDescription(content),
90
+ path: relativePath,
91
+ ...(metadata.triggers.length ? { triggers: metadata.triggers } : {}),
92
+ ...(metadata.intents.length ? { intents: metadata.intents } : {}),
93
+ ...(metadata.examples.length ? { examples: metadata.examples } : {})
94
+ };
95
+ }
96
+ function parseFrontmatter(content) {
97
+ const empty = {
98
+ triggers: [],
99
+ intents: [],
100
+ examples: []
101
+ };
102
+ if (!content.startsWith("---\n")) {
103
+ return empty;
104
+ }
105
+ const endIndex = content.indexOf("\n---", 4);
106
+ if (endIndex < 0) {
107
+ return empty;
108
+ }
109
+ const lines = content.slice(4, endIndex).split("\n");
110
+ const result = {
111
+ triggers: [],
112
+ intents: [],
113
+ examples: []
114
+ };
115
+ let currentList = null;
116
+ for (const line of lines) {
117
+ const trimmed = line.trim();
118
+ if (!trimmed || trimmed.startsWith("#")) {
119
+ continue;
120
+ }
121
+ const listItem = trimmed.match(/^-\s+(.+)$/);
122
+ if (listItem && currentList) {
123
+ const value = listItem[1];
124
+ if (value) {
125
+ result[currentList].push(unquoteScalar(value));
126
+ }
127
+ continue;
128
+ }
129
+ const pair = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*):\s*(.*)$/);
130
+ if (!pair) {
131
+ currentList = null;
132
+ continue;
133
+ }
134
+ const key = pair[1] ?? "";
135
+ const value = (pair[2] ?? "").trim();
136
+ if (key === "name" || key === "title" || key === "description") {
137
+ result[key] = unquoteScalar(value);
138
+ currentList = null;
139
+ continue;
140
+ }
141
+ if (key === "triggers" || key === "intents" || key === "examples") {
142
+ result[key] = parseListValue(value);
143
+ currentList = value ? null : key;
144
+ continue;
145
+ }
146
+ currentList = null;
147
+ }
148
+ return result;
149
+ }
150
+ function parseListValue(value) {
151
+ if (!value) {
152
+ return [];
153
+ }
154
+ const inline = value.match(/^\[(.*)\]$/);
155
+ if (!inline) {
156
+ return [unquoteScalar(value)];
157
+ }
158
+ return (inline[1] ?? "")
159
+ .split(",")
160
+ .map((item) => unquoteScalar(item.trim()))
161
+ .filter(Boolean);
162
+ }
163
+ function unquoteScalar(value) {
164
+ return value.replace(/^["']|["']$/g, "").trim();
165
+ }
166
+ function extractTitle(content) {
167
+ const line = content.split("\n").find((item) => item.startsWith("# "));
168
+ return line ? line.replace(/^#\s+/, "").trim() || null : null;
169
+ }
170
+ function extractDescription(content) {
171
+ const lines = content.split("\n");
172
+ const titleIndex = lines.findIndex((line) => line.startsWith("# "));
173
+ const body = lines
174
+ .slice(titleIndex >= 0 ? titleIndex + 1 : 0)
175
+ .map((line) => line.trim())
176
+ .find((line) => line && !line.startsWith("#") && !line.startsWith("- "));
177
+ return body ?? null;
178
+ }
179
+ function hasBodyGuidance(content) {
180
+ const lines = content.split("\n");
181
+ const titleIndex = lines.findIndex((line) => line.startsWith("# "));
182
+ return lines
183
+ .slice(titleIndex >= 0 ? titleIndex + 1 : 0)
184
+ .some((line) => {
185
+ const trimmed = line.trim();
186
+ return trimmed && !trimmed.startsWith("#");
187
+ });
188
+ }
189
+ function isReadableDirectory(directory) {
190
+ try {
191
+ return fs.statSync(directory).isDirectory();
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
197
+ function slugFromSkillPath(skillPath) {
198
+ const parsed = path.parse(skillPath);
199
+ const parts = skillPath.split(path.sep);
200
+ const nameParts = parsed.name.toLowerCase() === "skill"
201
+ ? parts.slice(0, -1)
202
+ : [...parts.slice(0, -1), parsed.name];
203
+ return nameParts.join("-")
204
+ .toLowerCase()
205
+ .replace(/[^a-z0-9]+/g, "-")
206
+ .replace(/^-+|-+$/g, "") || "skill";
207
+ }
208
+ function listMarkdownFiles(directory, errors) {
209
+ try {
210
+ return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
211
+ const fullPath = path.join(directory, entry.name);
212
+ if (entry.isDirectory()) {
213
+ if (entry.name.startsWith(".")) {
214
+ return [];
215
+ }
216
+ return listMarkdownFiles(fullPath, errors);
217
+ }
218
+ return entry.name.endsWith(".md") ? [fullPath] : [];
219
+ });
220
+ }
221
+ catch (error) {
222
+ if (errors) {
223
+ const message = error instanceof Error ? error.message : String(error);
224
+ errors.push(`Cannot read .frontend-harness/skills: ${message}`);
225
+ return [];
226
+ }
227
+ return [];
228
+ }
229
+ }
230
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/runtime/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { StateExplainResult } from "../schemas/types.js";
2
+ export declare function explainState(projectRoot: string): StateExplainResult;
@@ -0,0 +1,106 @@
1
+ import { harnessPath, relativeHarnessPath } from "../storage/paths.js";
2
+ import { writeJson, writeText } from "../storage/json.js";
3
+ import { getNextAction } from "./state.js";
4
+ import { createRepairPacket } from "./repair-packet.js";
5
+ import { readAcceptedRepairDecision } from "./repair-decision.js";
6
+ export function explainState(projectRoot) {
7
+ const nextAction = getNextAction(projectRoot);
8
+ const repairDecision = readAcceptedRepairDecision(projectRoot);
9
+ const result = {
10
+ contractVersion: 1,
11
+ createdAt: new Date().toISOString(),
12
+ nextAction,
13
+ summary: buildSummary(nextAction),
14
+ rationale: buildRationale(nextAction),
15
+ requiredArtifacts: buildRequiredArtifacts(projectRoot, nextAction),
16
+ repairPacket: {
17
+ path: relativeHarnessPath("repair", "latest.json"),
18
+ markdownPath: relativeHarnessPath("repair", "latest.md"),
19
+ available: nextAction.action === "fix"
20
+ },
21
+ repairDecision: {
22
+ path: relativeHarnessPath("repair-decision", "latest.json"),
23
+ available: repairDecision !== null,
24
+ sourceArtifactPath: repairDecision?.sourceArtifactPath ?? null,
25
+ repairPacketArtifactPath: repairDecision?.repairPacketArtifactPath ?? null,
26
+ repairPacketSha256: repairDecision?.repairPacketSha256 ?? null,
27
+ verificationArtifactPath: repairDecision?.verificationArtifactPath ?? null,
28
+ verificationSha256: repairDecision?.verificationSha256 ?? null
29
+ },
30
+ recommendedCommands: buildRecommendedCommands(nextAction),
31
+ stopCondition: nextAction.stopCondition
32
+ };
33
+ writeJson(harnessPath(projectRoot, "state-explain", "latest.json"), result);
34
+ writeText(harnessPath(projectRoot, "state-explain", "latest.md"), renderStateExplain(result));
35
+ return result;
36
+ }
37
+ function buildRequiredArtifacts(projectRoot, nextAction) {
38
+ if (nextAction.action !== "fix") {
39
+ return nextAction.artifacts;
40
+ }
41
+ createRepairPacket(projectRoot, { nextAction });
42
+ return [
43
+ ...nextAction.artifacts,
44
+ relativeHarnessPath("repair", "latest.json"),
45
+ relativeHarnessPath("repair", "latest.md")
46
+ ];
47
+ }
48
+ function buildSummary(nextAction) {
49
+ return `Next action is ${nextAction.action}: ${nextAction.reason}.`;
50
+ }
51
+ function buildRationale(nextAction) {
52
+ return [
53
+ `State status is ${nextAction.stateStatus}.`,
54
+ `Verification status is ${nextAction.verificationStatus}.`,
55
+ `Recorded changed files: ${nextAction.changedFiles.length}.`,
56
+ ...nextAction.checks
57
+ ];
58
+ }
59
+ function buildRecommendedCommands(nextAction) {
60
+ const commands = nextAction.command ? [nextAction.command] : [];
61
+ if (nextAction.action !== "done") {
62
+ commands.push("frontend-harness state next --json");
63
+ }
64
+ return commands;
65
+ }
66
+ function renderStateExplain(result) {
67
+ return `# Frontend Harness State Explain
68
+
69
+ ## Summary
70
+
71
+ ${result.summary}
72
+
73
+ ## Rationale
74
+
75
+ ${result.rationale.map((item) => `- ${item}`).join("\n")}
76
+
77
+ ## Required Artifacts
78
+
79
+ ${result.requiredArtifacts.map((artifact) => `- ${artifact}`).join("\n")}
80
+
81
+ ## Repair Packet
82
+
83
+ - available: ${String(result.repairPacket.available)}
84
+ - json: ${result.repairPacket.path}
85
+ - markdown: ${result.repairPacket.markdownPath}
86
+
87
+ ## Repair Decision
88
+
89
+ - available: ${String(result.repairDecision.available)}
90
+ - json: ${result.repairDecision.path}
91
+ - sourceArtifactPath: ${result.repairDecision.sourceArtifactPath ?? "none"}
92
+ - repairPacketArtifactPath: ${result.repairDecision.repairPacketArtifactPath ?? "none"}
93
+ - repairPacketSha256: ${result.repairDecision.repairPacketSha256 ?? "none"}
94
+ - verificationArtifactPath: ${result.repairDecision.verificationArtifactPath ?? "none"}
95
+ - verificationSha256: ${result.repairDecision.verificationSha256 ?? "none"}
96
+
97
+ ## Recommended Commands
98
+
99
+ ${result.recommendedCommands.length > 0 ? result.recommendedCommands.map((command) => `- ${command}`).join("\n") : "- none"}
100
+
101
+ ## Stop Condition
102
+
103
+ ${result.stopCondition}
104
+ `;
105
+ }
106
+ //# sourceMappingURL=state-explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-explain.js","sourceRoot":"","sources":["../../src/runtime/state-explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { HarnessState, TaskUnderstanding, ComponentItem, ExecutionUnit, VerificationStatus, StateNextResult } from "../schemas/types.js";
2
+ export declare function createDefaultState(): HarnessState;
3
+ export declare function statePath(projectRoot: string): string;
4
+ export declare function loadState(projectRoot: string): HarnessState;
5
+ export declare function saveState(projectRoot: string, state: HarnessState): HarnessState;
6
+ export declare function updatePlannedState(projectRoot: string, task: TaskUnderstanding, components: ComponentItem[], units: ExecutionUnit[]): HarnessState;
7
+ export declare function updateVerificationState(projectRoot: string, status: VerificationStatus, incrementRetry?: boolean): HarnessState;
8
+ export declare function recordChangedFiles(projectRoot: string, files: string[]): HarnessState;
9
+ export declare function getNextAction(projectRoot: string): StateNextResult;
10
+ export declare function changedFilesFromGit(projectRoot: string): string[];
@@ -0,0 +1,237 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { harnessPath, relativeHarnessPath } from "../storage/paths.js";
5
+ import { readJson, writeJson } from "../storage/json.js";
6
+ import { isHarnessState } from "../schemas/validation.js";
7
+ import { normalizeProjectRelativePath } from "./project-paths.js";
8
+ export function createDefaultState() {
9
+ return {
10
+ version: 1,
11
+ status: "idle",
12
+ task: null,
13
+ components: [],
14
+ units: [],
15
+ changedFiles: [],
16
+ verification: {
17
+ status: "not_run",
18
+ latestResultPath: null
19
+ },
20
+ errors: [],
21
+ retryCount: 0,
22
+ blockers: [],
23
+ updatedAt: new Date().toISOString()
24
+ };
25
+ }
26
+ export function statePath(projectRoot) {
27
+ return harnessPath(projectRoot, "state.json");
28
+ }
29
+ export function loadState(projectRoot) {
30
+ const path = statePath(projectRoot);
31
+ if (!fs.existsSync(path)) {
32
+ return createDefaultState();
33
+ }
34
+ try {
35
+ const parsed = readJson(path);
36
+ if (isHarnessState(parsed)) {
37
+ return parsed;
38
+ }
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ return createBlockedState(`Harness state is malformed JSON: ${message}`);
43
+ }
44
+ return createBlockedState("Harness state does not match the expected contract; rerun planning or repair .frontend-harness/state.json.");
45
+ }
46
+ export function saveState(projectRoot, state) {
47
+ const next = { ...state, updatedAt: new Date().toISOString() };
48
+ if (!isHarnessState(next)) {
49
+ throw new Error("Refusing to save invalid harness state.");
50
+ }
51
+ writeJson(statePath(projectRoot), next);
52
+ return next;
53
+ }
54
+ function createBlockedState(blocker) {
55
+ return {
56
+ ...createDefaultState(),
57
+ status: "blocked",
58
+ blockers: [blocker]
59
+ };
60
+ }
61
+ export function updatePlannedState(projectRoot, task, components, units) {
62
+ const current = loadState(projectRoot);
63
+ return saveState(projectRoot, {
64
+ ...current,
65
+ status: "awaiting_agent_edit",
66
+ task,
67
+ components,
68
+ units,
69
+ changedFiles: [],
70
+ verification: {
71
+ status: "not_run",
72
+ latestResultPath: null
73
+ },
74
+ errors: [],
75
+ retryCount: 0,
76
+ blockers: []
77
+ });
78
+ }
79
+ export function updateVerificationState(projectRoot, status, incrementRetry = false) {
80
+ const current = loadState(projectRoot);
81
+ const retryCount = incrementRetry ? current.retryCount + 1 : current.retryCount;
82
+ return saveState(projectRoot, {
83
+ ...current,
84
+ status: status === "passed" ? "passed" : status === "failed" ? "failed" : current.status,
85
+ verification: {
86
+ status,
87
+ latestResultPath: relativeHarnessPath("verification", "latest.json")
88
+ },
89
+ retryCount
90
+ });
91
+ }
92
+ export function recordChangedFiles(projectRoot, files) {
93
+ const current = loadState(projectRoot);
94
+ const merged = new Set(current.changedFiles);
95
+ for (const file of files) {
96
+ if (file.trim()) {
97
+ merged.add(normalizeProjectRelativePath(file.trim(), "changed file"));
98
+ }
99
+ }
100
+ const verificationInvalidated = current.status === "passed" || current.verification.status === "passed";
101
+ return saveState(projectRoot, {
102
+ ...current,
103
+ status: verificationInvalidated ? "awaiting_agent_edit" : current.status,
104
+ verification: verificationInvalidated
105
+ ? {
106
+ status: "not_run",
107
+ latestResultPath: null
108
+ }
109
+ : current.verification,
110
+ changedFiles: [...merged].sort()
111
+ });
112
+ }
113
+ export function getNextAction(projectRoot) {
114
+ const state = loadState(projectRoot);
115
+ const base = {
116
+ stateStatus: state.status,
117
+ verificationStatus: state.verification.status,
118
+ changedFiles: [...state.changedFiles].sort(),
119
+ artifacts: [
120
+ relativeHarnessPath("state.json"),
121
+ relativeHarnessPath("plans", "latest.json"),
122
+ relativeHarnessPath("execution-units", "latest.json"),
123
+ relativeHarnessPath("component-graph", "latest.json"),
124
+ relativeHarnessPath("verification", "latest.json"),
125
+ relativeHarnessPath("repair", "latest.json")
126
+ ]
127
+ };
128
+ if (state.blockers.length > 0 || state.status === "blocked") {
129
+ return {
130
+ ...base,
131
+ action: "blocked",
132
+ reason: "state has blockers that require resolution before continuing",
133
+ command: null,
134
+ guidance: state.blockers.length > 0
135
+ ? state.blockers
136
+ : ["Inspect frontend-harness state --json and clear the blocker in project work before retrying."],
137
+ checks: ["Resolve blockers before planning, editing, or verification."],
138
+ stopCondition: "blockers cleared and frontend-harness state next --json returns a non-blocked action"
139
+ };
140
+ }
141
+ if (!state.task || state.units.length === 0) {
142
+ return {
143
+ ...base,
144
+ action: "plan",
145
+ reason: "no task plan or execution units are recorded",
146
+ command: "frontend-harness plan --json \"<task>\"",
147
+ guidance: ["Create a plan before editing so execution units, component graph metadata, and guidance exist."],
148
+ checks: ["Confirm .frontend-harness/plans/latest.json and .frontend-harness/execution-units/latest.json exist after planning."],
149
+ stopCondition: "frontend-harness state next --json returns edit, verify, fix, configure_verification, done, or blocked"
150
+ };
151
+ }
152
+ if (state.verification.status === "not_configured") {
153
+ return {
154
+ ...base,
155
+ action: "configure_verification",
156
+ reason: "verification ran but no commands were configured",
157
+ command: null,
158
+ guidance: [
159
+ "Add verification commands to .frontend-harness/config.json or package.json scripts.",
160
+ "Then rerun frontend-harness verify --json."
161
+ ],
162
+ checks: ["Run frontend-harness context --json to inspect verification command sources after configuration."],
163
+ stopCondition: "frontend-harness verify --json runs at least one configured command"
164
+ };
165
+ }
166
+ if (state.status === "failed" || state.verification.status === "failed" || state.verification.status === "error") {
167
+ return {
168
+ ...base,
169
+ action: "fix",
170
+ reason: "latest verification failed",
171
+ command: "frontend-harness verify --json",
172
+ guidance: [
173
+ "Read .frontend-harness/verification/latest.json and the failed command logs.",
174
+ "Patch the relevant project files without changing generated harness artifacts.",
175
+ "Record newly changed files with frontend-harness state record-change <file> before rerunning verification."
176
+ ],
177
+ checks: ["Inspect failed command logs before editing.", "Keep generated .frontend-harness artifacts unchanged unless the harness command updates them."],
178
+ stopCondition: "frontend-harness verify --json passes and frontend-harness state next --json returns done"
179
+ };
180
+ }
181
+ if (state.status === "passed" || state.verification.status === "passed") {
182
+ return {
183
+ ...base,
184
+ action: "done",
185
+ reason: "latest verification passed",
186
+ command: null,
187
+ guidance: ["No next harness action is required unless the task scope changes."],
188
+ checks: ["Confirm the task scope has not changed since the latest successful verification."],
189
+ stopCondition: "task scope remains unchanged"
190
+ };
191
+ }
192
+ if (state.changedFiles.length > 0) {
193
+ return {
194
+ ...base,
195
+ action: "verify",
196
+ reason: "planned task has recorded changed files and needs verification",
197
+ command: "frontend-harness verify --json",
198
+ guidance: ["Run verification before deciding whether to fix or finish."],
199
+ checks: ["Verify recorded changed files match the actual project files edited for the task."],
200
+ stopCondition: "frontend-harness verify --json returns passed, failed, error, or not_configured"
201
+ };
202
+ }
203
+ return {
204
+ ...base,
205
+ action: "edit",
206
+ reason: "planned task is awaiting agent edits",
207
+ command: null,
208
+ guidance: [
209
+ "Read .frontend-harness/plans/latest.json and .frontend-harness/execution-units/latest.json.",
210
+ "Edit the planned project files, then record each changed file with frontend-harness state record-change <file>."
211
+ ],
212
+ checks: ["Edit only files required by the planned execution units.", "Record every changed project file before verification."],
213
+ stopCondition: "changed files are recorded and frontend-harness state next --json returns verify"
214
+ };
215
+ }
216
+ export function changedFilesFromGit(projectRoot) {
217
+ if (!fs.existsSync(path.join(projectRoot, ".git"))) {
218
+ return [];
219
+ }
220
+ const output = execFileSync("git", ["status", "--short"], {
221
+ cwd: projectRoot,
222
+ encoding: "utf8"
223
+ });
224
+ return output
225
+ .split("\n")
226
+ .filter((line) => line.trim())
227
+ .map((line) => {
228
+ const status = line.slice(0, 2);
229
+ const file = line.slice(3).trim();
230
+ if (status.includes("R") && file.includes(" -> ")) {
231
+ return file.split(" -> ").at(-1) ?? file;
232
+ }
233
+ return file;
234
+ })
235
+ .filter((file) => file && !file.startsWith(".frontend-harness/") && !file.startsWith(".omx/"));
236
+ }
237
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/runtime/state.ts"],"names":[],"mappings":"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"}