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,571 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { harnessPath, relativeHarnessPath } from "../storage/paths.js";
4
+ import { writeJson, writeText } from "../storage/json.js";
5
+ import { updatePlannedState } from "./state.js";
6
+ import { resolveComponentPlacement } from "./project-discovery.js";
7
+ import { buildComponentGraph } from "./graph.js";
8
+ import { resolveProjectRelativePath } from "./project-paths.js";
9
+ import { buildPolicyProvenance } from "./policy-provenance.js";
10
+ export function createPlan(projectRoot, input) {
11
+ if (!input.taskText.trim()) {
12
+ throw new Error("plan requires a task");
13
+ }
14
+ const normalizedInput = normalizePlanInput(projectRoot, input);
15
+ const task = understandTask(projectRoot, normalizedInput);
16
+ const components = inferComponents(projectRoot, task);
17
+ const units = buildExecutionUnits(components, task);
18
+ const componentGraph = buildComponentGraph(components, units);
19
+ const executionGuidance = buildExecutionGuidance();
20
+ const guidance = renderGuidance(task, components, units, executionGuidance);
21
+ const output = {
22
+ task,
23
+ components,
24
+ units,
25
+ executionGuidance,
26
+ componentGraphPath: relativeHarnessPath("component-graph", "latest.json"),
27
+ guidancePath: relativeHarnessPath("guidance", "latest.md"),
28
+ statePath: relativeHarnessPath("state.json")
29
+ };
30
+ writeJson(harnessPath(projectRoot, "plans", "latest.json"), output);
31
+ writeJson(harnessPath(projectRoot, "execution-units", "latest.json"), {
32
+ units
33
+ });
34
+ writeJson(harnessPath(projectRoot, "component-graph", "latest.json"), componentGraph);
35
+ writeText(harnessPath(projectRoot, "guidance", "latest.md"), guidance);
36
+ updatePlannedState(projectRoot, task, components, units);
37
+ return output;
38
+ }
39
+ export function checkAgentPlanningDecision(projectRoot, file) {
40
+ if (!file) {
41
+ throw new Error("decision check requires --file <agent-decision.json>");
42
+ }
43
+ const artifactPath = file;
44
+ try {
45
+ const relativePath = validateRequiredReferencedFile(projectRoot, file, "agent decision");
46
+ const decision = readAgentPlanningDecision(projectRoot, relativePath);
47
+ return {
48
+ status: "passed",
49
+ artifactPath: relativePath,
50
+ contractVersion: decision.contractVersion ?? null,
51
+ decision,
52
+ errors: []
53
+ };
54
+ }
55
+ catch (error) {
56
+ return {
57
+ status: "failed",
58
+ artifactPath,
59
+ contractVersion: null,
60
+ decision: null,
61
+ errors: [error instanceof Error ? error.message : String(error)]
62
+ };
63
+ }
64
+ }
65
+ function normalizePlanInput(projectRoot, input) {
66
+ return {
67
+ taskText: input.taskText,
68
+ ...optionalString("prd", validateReferencedFile(projectRoot, input.prd, "PRD")),
69
+ ...optionalString("ui", validateReferencedFile(projectRoot, input.ui, "UI")),
70
+ ...optionalString("agentDecision", validateReferencedFile(projectRoot, input.agentDecision, "agent decision"))
71
+ };
72
+ }
73
+ function validateRequiredReferencedFile(projectRoot, file, label) {
74
+ return validateReferencedFile(projectRoot, file, label);
75
+ }
76
+ function validateReferencedFile(projectRoot, file, label) {
77
+ if (!file) {
78
+ return undefined;
79
+ }
80
+ const { relativePath, fullPath } = resolveProjectRelativePath(projectRoot, file, `${label} file`);
81
+ if (!fs.existsSync(fullPath)) {
82
+ throw new Error(`${label} file cannot be read: ${file}`);
83
+ }
84
+ return relativePath;
85
+ }
86
+ function understandTask(projectRoot, input) {
87
+ const text = input.taskText.trim();
88
+ const decision = input.agentDecision
89
+ ? readAgentPlanningDecision(projectRoot, input.agentDecision)
90
+ : null;
91
+ const scope = text;
92
+ const decisionConstraints = decision?.constraintHints ?? [];
93
+ const frontendWorkflow = inferFrontendWorkflow(scope, input);
94
+ const intent = inferTaskIntent(scope, frontendWorkflow.kind);
95
+ return {
96
+ intent,
97
+ scope,
98
+ constraints: [
99
+ "Use the agent-invoked harness loop.",
100
+ "CLI owns project facts and verification.",
101
+ "System owns deterministic planning; agent planning input is limited to bounded hints.",
102
+ ...frontendWorkflow.implementationConstraints,
103
+ ...decisionConstraints
104
+ ],
105
+ frontendWorkflow,
106
+ policyProvenance: buildPolicyProvenance(projectRoot, scope, frontendWorkflow.kind),
107
+ inputs: {
108
+ ...(input.prd ? { prd: input.prd } : {}),
109
+ ...(input.ui ? { ui: input.ui } : {}),
110
+ ...(input.agentDecision ? { agentDecision: input.agentDecision } : {})
111
+ },
112
+ ...buildAgentPlanningMetadata(input.agentDecision, decision)
113
+ };
114
+ }
115
+ function inferTaskIntent(scope, workflowKind) {
116
+ const normalized = scope.toLowerCase();
117
+ if (workflowKind === "bug_fix" || /\b(fix|bug)\b|缺陷|修复|错误|报错/.test(normalized)) {
118
+ return "fix_bug";
119
+ }
120
+ if (/\brefactor\b|重构/.test(normalized)) {
121
+ return "refactor";
122
+ }
123
+ if (workflowKind === "frontend_test" || /\b(test|e2e|playwright|vitest)\b|测试|端到端|集成测试/.test(normalized)) {
124
+ return "add_test";
125
+ }
126
+ return "implement_page";
127
+ }
128
+ function buildAgentPlanningMetadata(decisionPath, decision) {
129
+ if (!decisionPath) {
130
+ return {
131
+ reasoningMode: "deterministic"
132
+ };
133
+ }
134
+ return {
135
+ reasoningMode: "agent_assisted",
136
+ agentDecision: {
137
+ summary: buildAgentDecisionSummary(decisionPath),
138
+ artifactPath: decisionPath ?? null,
139
+ contractVersion: decision?.contractVersion ?? null,
140
+ intentSuggestion: decision?.intentSuggestion ?? null,
141
+ ...(decision?.constraintHints ? { constraintHints: decision.constraintHints } : {}),
142
+ ...(decision?.componentHints ? { componentHints: decision.componentHints } : {})
143
+ }
144
+ };
145
+ }
146
+ function buildAgentDecisionSummary(decisionPath) {
147
+ return decisionPath
148
+ ? `Planning uses structured decision input from ${decisionPath}.`
149
+ : "Planning uses structured decision input.";
150
+ }
151
+ function inferComponents(projectRoot, task) {
152
+ const baseName = toPascalCase(task.scope) || "PlannedComponent";
153
+ const placement = resolveComponentPlacement(projectRoot, task.scope);
154
+ const componentKinds = inferComponentKinds(task.scope);
155
+ return componentKinds.map((kind) => {
156
+ const name = componentName(baseName, kind.suffix);
157
+ return {
158
+ name,
159
+ file: `${placement.sourceRoot}/${name}${placement.extension}`,
160
+ responsibility: task.intent === "fix_bug" ? "bug fix target" : kind.responsibility,
161
+ status: "unknown"
162
+ };
163
+ });
164
+ }
165
+ function inferComponentKinds(scope) {
166
+ const normalized = scope.toLowerCase();
167
+ const asksForTable = /\b(table|grid|list)\b/.test(normalized);
168
+ const asksForForm = /\b(form|create|edit|filter|search)\b/.test(normalized);
169
+ const asksForPage = /\b(page|screen|dashboard|view)\b/.test(normalized);
170
+ if (asksForPage && asksForTable && asksForForm) {
171
+ return [
172
+ {
173
+ suffix: "Page",
174
+ responsibility: "page composition and data-flow boundary"
175
+ },
176
+ {
177
+ suffix: "Table",
178
+ responsibility: "tabular list rendering"
179
+ },
180
+ {
181
+ suffix: "Form",
182
+ responsibility: "form or filter interaction"
183
+ }
184
+ ];
185
+ }
186
+ return [
187
+ {
188
+ suffix: "",
189
+ responsibility: "planned UI/component implementation"
190
+ }
191
+ ];
192
+ }
193
+ function inferFrontendWorkflow(scope, input) {
194
+ const normalized = scope.toLowerCase();
195
+ const hasUiSource = Boolean(input.ui) || /\b(ui|stitch|figma|html|design|page|screen|component|view|dashboard)\b|页面|界面|组件|视图|看板|设计稿/.test(normalized);
196
+ const hasPrdSource = Boolean(input.prd) || /\b(prd|product|requirement|requirements|knowledge|document)\b|产品|需求|知识库|文档/.test(normalized);
197
+ const hasBugSignal = /\b(bug|fix|regression|error)\b|缺陷|修复|错误|报错/.test(normalized);
198
+ const hasTestSignal = /\b(e2e|integration test|test|playwright|vitest)\b|测试|端到端|集成测试/.test(normalized);
199
+ const hasApiSignal = /\b(api|swagger|endpoint|interface|request|dto)\b|接口|请求|对接|联调/.test(normalized);
200
+ const hasRequirementChange = /\b(requirement changes?|changed [a-z0-9 -]*requirements?|update [a-z0-9 -]*requirements?|sync [a-z0-9 -]*requirements?)\b|需求变更|变更需求|需求[^,。,.]*同步|同步[^,。,.]*需求/.test(normalized);
201
+ const kind = hasBugSignal
202
+ ? "bug_fix"
203
+ : hasRequirementChange
204
+ ? "requirement_change"
205
+ : hasTestSignal
206
+ ? "frontend_test"
207
+ : hasApiSignal
208
+ ? "api_integration"
209
+ : hasPrdSource && !hasUiSource
210
+ ? "prd_knowledge"
211
+ : "ui_implementation";
212
+ return workflowPolicy(kind, { hasPrdSource, hasUiSource });
213
+ }
214
+ function workflowPolicy(kind, inputSignals) {
215
+ const policies = {
216
+ ui_implementation: {
217
+ kind,
218
+ summary: "Implement or adapt frontend UI while preserving project semantics, component boundaries, and validation evidence.",
219
+ requiredKnowledgeActions: inputSignals.hasUiSource
220
+ ? ["Capture reusable UI semantics, component responsibilities, and design assumptions in project knowledge when they affect future work."]
221
+ : ["Reuse existing project knowledge before inventing new UI semantics."],
222
+ implementationConstraints: [
223
+ "Treat imported MCP/Stitch/Figma/HTML output as source material, not project-ready code.",
224
+ "Normalize generated UI into project components, naming, state, routing, and styling conventions."
225
+ ],
226
+ verificationFocus: ["typecheck", "component behavior", "responsive rendering", "visual regressions when UI source is provided"]
227
+ },
228
+ prd_knowledge: {
229
+ kind,
230
+ summary: "Convert PRD or requirement material into durable project knowledge before implementation.",
231
+ requiredKnowledgeActions: [
232
+ "Promote stable product concepts, terminology, permissions, workflows, and acceptance rules into .frontend-harness/knowledge/.",
233
+ "Keep raw PRD text separate from distilled project knowledge."
234
+ ],
235
+ implementationConstraints: [
236
+ "Do not implement product behavior until PRD-derived assumptions are explicit.",
237
+ "Mark unknown product decisions as blockers or assumptions instead of guessing."
238
+ ],
239
+ verificationFocus: ["knowledge coverage", "acceptance criteria traceability", "terminology consistency"]
240
+ },
241
+ api_integration: {
242
+ kind,
243
+ summary: "Integrate frontend behavior with API contracts using project knowledge plus Swagger/API evidence.",
244
+ requiredKnowledgeActions: [
245
+ "Reference relevant domain knowledge before mapping request parameters, DTOs, and response states.",
246
+ "Promote durable API assumptions when Swagger or backend behavior clarifies product rules."
247
+ ],
248
+ implementationConstraints: [
249
+ "Do not invent API fields, enum values, pagination contracts, or error shapes.",
250
+ "Keep request mapping, loading, empty, and error states inside the project API/state conventions."
251
+ ],
252
+ verificationFocus: ["typecheck", "API mapping", "loading/empty/error states", "integration tests or mocks"]
253
+ },
254
+ frontend_test: {
255
+ kind,
256
+ summary: "Add or update frontend E2E/integration coverage for user-visible behavior.",
257
+ requiredKnowledgeActions: [
258
+ "Use project knowledge to choose behavior-level assertions instead of implementation-detail assertions.",
259
+ "Promote durable testing conventions only when they apply beyond the current task."
260
+ ],
261
+ implementationConstraints: [
262
+ "Prefer behavior-focused integration or E2E tests over brittle snapshot-only checks.",
263
+ "Keep fixtures and mocks aligned with known API/product contracts."
264
+ ],
265
+ verificationFocus: ["targeted test", "typecheck", "critical user path", "failure diagnostics"]
266
+ },
267
+ bug_fix: {
268
+ kind,
269
+ summary: "Fix a frontend bug with evidence, minimal scope, and regression coverage proportional to risk.",
270
+ requiredKnowledgeActions: [
271
+ "Check project knowledge for intended behavior before changing code.",
272
+ "Promote the resolved product or technical rule if the bug revealed durable knowledge."
273
+ ],
274
+ implementationConstraints: [
275
+ "Reproduce or explain the bug before patching when evidence is available.",
276
+ "Keep the fix scoped to the failing behavior and avoid unrelated refactors."
277
+ ],
278
+ verificationFocus: ["regression test", "typecheck", "affected workflow", "repair evidence"]
279
+ },
280
+ requirement_change: {
281
+ kind,
282
+ summary: "Apply requirement changes and keep implementation, tests, and knowledge synchronized.",
283
+ requiredKnowledgeActions: [
284
+ "Update project knowledge for changed product rules before or alongside code changes.",
285
+ "Record obsolete assumptions so future agents do not reuse stale behavior."
286
+ ],
287
+ implementationConstraints: [
288
+ "Identify impacted UI, API mapping, tests, and knowledge before editing.",
289
+ "Do not leave previous requirement behavior undocumented when it changes."
290
+ ],
291
+ verificationFocus: ["changed acceptance criteria", "knowledge sync", "affected regression tests", "typecheck"]
292
+ }
293
+ };
294
+ return policies[kind];
295
+ }
296
+ function componentName(baseName, suffix) {
297
+ return suffix && !baseName.endsWith(suffix) ? `${baseName}${suffix}` : baseName;
298
+ }
299
+ function buildExecutionUnits(components, task) {
300
+ const units = components.map((component) => toUnit(component, task));
301
+ const pageUnit = units.find((unit) => unit.id.endsWith("-page"));
302
+ if (pageUnit && units.length > 1) {
303
+ pageUnit.dependsOn = units
304
+ .filter((unit) => unit.id !== pageUnit.id)
305
+ .map((unit) => unit.id);
306
+ }
307
+ return units;
308
+ }
309
+ function toUnit(component, task) {
310
+ return {
311
+ id: unitIdFromName(component.name),
312
+ file: component.file,
313
+ task: `${task.intent}: ${task.scope}`,
314
+ verification: verificationForWorkflow(task.frontendWorkflow?.kind),
315
+ dependsOn: [],
316
+ parallelGroup: null
317
+ };
318
+ }
319
+ function verificationForWorkflow(kind) {
320
+ if (kind === "frontend_test") {
321
+ return ["targeted test", "typecheck"];
322
+ }
323
+ if (kind === "bug_fix") {
324
+ return ["regression test", "typecheck"];
325
+ }
326
+ if (kind === "api_integration") {
327
+ return ["typecheck", "integration test or API mock"];
328
+ }
329
+ if (kind === "requirement_change") {
330
+ return ["typecheck", "affected regression test"];
331
+ }
332
+ if (kind === "prd_knowledge") {
333
+ return ["knowledge review"];
334
+ }
335
+ return ["typecheck"];
336
+ }
337
+ function readAgentPlanningDecision(projectRoot, file) {
338
+ const fullPath = path.resolve(projectRoot, file);
339
+ let parsed;
340
+ try {
341
+ parsed = JSON.parse(fs.readFileSync(fullPath, "utf8"));
342
+ }
343
+ catch (error) {
344
+ const detail = error instanceof Error ? error.message : String(error);
345
+ throw new Error(`agent decision file must contain valid JSON: ${file}: ${detail}`);
346
+ }
347
+ return parseAgentPlanningDecision(parsed, file);
348
+ }
349
+ function parseAgentPlanningDecision(value, file) {
350
+ if (!isRecord(value) || Array.isArray(value)) {
351
+ throw new Error(`agent decision file must contain a JSON object: ${file}`);
352
+ }
353
+ if ("decision" in value || "contractVersion" in value) {
354
+ return parseAgentPlanningDecisionEnvelope(value, file);
355
+ }
356
+ const allowedKeys = new Set(["intentSuggestion", "constraintHints", "componentHints"]);
357
+ return parseAgentPlanningDecisionObject(value, allowedKeys, "agent decision file");
358
+ }
359
+ function parseAgentPlanningDecisionEnvelope(value, file) {
360
+ const allowedKeys = new Set(["contractVersion", "decision"]);
361
+ for (const key of Object.keys(value)) {
362
+ if (!allowedKeys.has(key)) {
363
+ throw new Error(`agent decision file contains unsupported field: ${key}`);
364
+ }
365
+ }
366
+ if (value["contractVersion"] !== 1) {
367
+ throw new Error("agent decision contractVersion must be 1");
368
+ }
369
+ if (!isRecord(value["decision"]) || Array.isArray(value["decision"])) {
370
+ throw new Error(`agent decision file decision must be a JSON object: ${file}`);
371
+ }
372
+ const decision = parseAgentPlanningDecisionObject(value["decision"], new Set(["intentSuggestion", "constraintHints", "componentHints"]), "agent decision file decision");
373
+ return {
374
+ contractVersion: 1,
375
+ ...decision
376
+ };
377
+ }
378
+ function parseAgentPlanningDecisionObject(value, allowedKeys, label) {
379
+ for (const key of Object.keys(value)) {
380
+ if (!allowedKeys.has(key)) {
381
+ throw new Error(`${label} contains unsupported field: ${key}`);
382
+ }
383
+ }
384
+ const decision = {};
385
+ if (value["intentSuggestion"] !== undefined) {
386
+ decision.intentSuggestion = parseBoundedString(value["intentSuggestion"], "intentSuggestion");
387
+ }
388
+ if (value["constraintHints"] !== undefined) {
389
+ decision.constraintHints = parseStringArray(value["constraintHints"], "constraintHints");
390
+ }
391
+ if (value["componentHints"] !== undefined) {
392
+ decision.componentHints = parseComponentHints(value["componentHints"]);
393
+ }
394
+ return decision;
395
+ }
396
+ function parseStringArray(value, label) {
397
+ if (!Array.isArray(value)) {
398
+ throw new Error(`agent decision ${label} must be an array of strings`);
399
+ }
400
+ if (value.length > 10) {
401
+ throw new Error(`agent decision ${label} cannot contain more than 10 items`);
402
+ }
403
+ return value.map((item, index) => parseBoundedString(item, `${label}[${index}]`));
404
+ }
405
+ function parseComponentHints(value) {
406
+ if (!Array.isArray(value)) {
407
+ throw new Error("agent decision componentHints must be an array");
408
+ }
409
+ if (value.length > 10) {
410
+ throw new Error("agent decision componentHints cannot contain more than 10 items");
411
+ }
412
+ return value.map((item, index) => {
413
+ if (!isRecord(item) || Array.isArray(item)) {
414
+ throw new Error(`agent decision componentHints[${index}] must be an object`);
415
+ }
416
+ const allowedKeys = new Set(["name", "responsibility"]);
417
+ for (const key of Object.keys(item)) {
418
+ if (!allowedKeys.has(key)) {
419
+ throw new Error(`agent decision componentHints[${index}] contains unsupported field: ${key}`);
420
+ }
421
+ }
422
+ return {
423
+ ...(item["name"] !== undefined ? { name: parseBoundedString(item["name"], `componentHints[${index}].name`) } : {}),
424
+ ...(item["responsibility"] !== undefined
425
+ ? { responsibility: parseBoundedString(item["responsibility"], `componentHints[${index}].responsibility`) }
426
+ : {})
427
+ };
428
+ });
429
+ }
430
+ function optionalString(key, value) {
431
+ return value === undefined ? {} : { [key]: value };
432
+ }
433
+ function parseBoundedString(value, label) {
434
+ if (typeof value !== "string") {
435
+ throw new Error(`agent decision ${label} must be a string`);
436
+ }
437
+ const trimmed = value.trim();
438
+ if (!trimmed) {
439
+ throw new Error(`agent decision ${label} cannot be empty`);
440
+ }
441
+ if (trimmed.length > 500) {
442
+ throw new Error(`agent decision ${label} cannot exceed 500 characters`);
443
+ }
444
+ return trimmed;
445
+ }
446
+ function isRecord(value) {
447
+ return typeof value === "object" && value !== null;
448
+ }
449
+ function unitIdFromName(name) {
450
+ return `unit-${name.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`;
451
+ }
452
+ function buildExecutionGuidance() {
453
+ return [
454
+ {
455
+ order: 1,
456
+ action: "inspect_plan",
457
+ description: `Read ${relativeHarnessPath("plans", "latest.json")} and ${relativeHarnessPath("execution-units", "latest.json")} before editing.`,
458
+ command: null,
459
+ condition: null
460
+ },
461
+ {
462
+ order: 2,
463
+ action: "edit_files",
464
+ description: "Edit only the project files required by the planned execution units.",
465
+ command: null,
466
+ condition: null
467
+ },
468
+ {
469
+ order: 3,
470
+ action: "record_changes",
471
+ description: "Record each changed project file so the harness state reflects the execution boundary.",
472
+ command: "frontend-harness state record-change <file>",
473
+ condition: "after editing"
474
+ },
475
+ {
476
+ order: 4,
477
+ action: "verify",
478
+ description: "Run the configured verification commands and inspect the JSON result.",
479
+ command: "frontend-harness verify --json",
480
+ condition: "after recording changes"
481
+ },
482
+ {
483
+ order: 5,
484
+ action: "fix_failed_verification",
485
+ description: `If verification fails, generate and inspect ${relativeHarnessPath("repair", "latest.json")} before patching the relevant project files, recording new changes, and rerunning verification.`,
486
+ command: "frontend-harness repair packet --json",
487
+ condition: "when verification status is failed or error"
488
+ }
489
+ ];
490
+ }
491
+ function renderGuidance(task, components, units, executionGuidance) {
492
+ return `# Agent Execution Guidance
493
+
494
+ ## Task
495
+
496
+ - Intent: ${task.intent}
497
+ - Scope: ${task.scope}
498
+
499
+ ## Frontend Workflow Policy
500
+
501
+ - Kind: ${task.frontendWorkflow?.kind ?? "unknown"}
502
+ - Summary: ${task.frontendWorkflow?.summary ?? "No workflow policy inferred."}
503
+ - Knowledge: ${(task.frontendWorkflow?.requiredKnowledgeActions ?? []).join(" ")}
504
+ - Verification focus: ${(task.frontendWorkflow?.verificationFocus ?? []).join(", ")}
505
+
506
+ ## Project References
507
+
508
+ ${renderProjectReferences(task)}
509
+
510
+ ## Loop
511
+
512
+ ${executionGuidance.map(renderExecutionGuidanceStep).join("\n")}
513
+
514
+ ## Components
515
+
516
+ ${components.map((component) => `- ${component.name}: ${component.file} (${component.responsibility})`).join("\n")}
517
+
518
+ ## Units
519
+
520
+ ${units.map(renderUnitGuidance).join("\n")}
521
+ `;
522
+ }
523
+ function renderProjectReferences(task) {
524
+ const provenance = task.policyProvenance;
525
+ if (!provenance) {
526
+ return "- No project-local skills or knowledge selected.";
527
+ }
528
+ const lines = [];
529
+ if (provenance.skillRoutes.length) {
530
+ lines.push("Selected skills:");
531
+ for (const route of provenance.skillRoutes) {
532
+ lines.push(`- ${route.name}: ${route.path}; source: ${route.source}; score: ${route.score}; reasons: ${route.reasons.join(", ")}`);
533
+ }
534
+ }
535
+ else {
536
+ lines.push("Selected skills: none.");
537
+ }
538
+ if (provenance.knowledgeReferences.length) {
539
+ lines.push("Selected knowledge:");
540
+ for (const knowledgePath of provenance.knowledgeReferences) {
541
+ const sha256 = provenance.knowledgeSha256[knowledgePath];
542
+ lines.push(`- ${knowledgePath}${sha256 ? `; sha256: ${sha256}` : ""}`);
543
+ }
544
+ }
545
+ else {
546
+ lines.push("Selected knowledge: none.");
547
+ }
548
+ lines.push(`Selection reason: ${provenance.selectionReason}`);
549
+ return lines.join("\n");
550
+ }
551
+ function renderExecutionGuidanceStep(step) {
552
+ const command = step.command ? ` Command: \`${step.command}\`.` : "";
553
+ const condition = step.condition ? ` Condition: ${step.condition}.` : "";
554
+ return `${step.order}. ${step.description}${command}${condition}`;
555
+ }
556
+ function renderUnitGuidance(unit) {
557
+ const dependencies = JSON.stringify(unit.dependsOn);
558
+ const parallelGroup = JSON.stringify(unit.parallelGroup);
559
+ const independent = unit.dependsOn.length === 0;
560
+ return `- ${unit.id}: ${unit.task}; file ${unit.file}; independent: ${independent}; dependsOn: ${dependencies}; parallelGroup: ${parallelGroup}; verification focus: ${unit.verification.join(", ")}`;
561
+ }
562
+ function toPascalCase(value) {
563
+ return value
564
+ .replace(/[^a-zA-Z0-9]+/g, " ")
565
+ .trim()
566
+ .split(/\s+/)
567
+ .slice(0, 4)
568
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
569
+ .join("");
570
+ }
571
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/runtime/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FrontendWorkflowKind } from "../schemas/types.js";
2
+ export interface PolicyProvenance {
3
+ selectedSkills: string[];
4
+ skillPaths: string[];
5
+ skillRoutes: SkillRouteCandidate[];
6
+ knowledgeReferences: string[];
7
+ knowledgeSha256: Record<string, string>;
8
+ selectionReason: string;
9
+ }
10
+ export interface SkillRouteCandidate {
11
+ name: string;
12
+ path: string;
13
+ score: number;
14
+ source: "metadata" | "workflow" | "keyword";
15
+ reasons: string[];
16
+ }
17
+ export declare function buildPolicyProvenance(projectRoot: string, taskText: string, workflowKind?: FrontendWorkflowKind): PolicyProvenance;