frontend-harness 0.1.0 → 0.2.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 (68) hide show
  1. package/AGENTS.md +9 -5
  2. package/CLAUDE.md +9 -5
  3. package/README.md +56 -11
  4. package/dist/cli/index.js +33 -7
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/runtime/clean.js +6 -1
  7. package/dist/runtime/clean.js.map +1 -1
  8. package/dist/runtime/command-taxonomy.js +4 -1
  9. package/dist/runtime/command-taxonomy.js.map +1 -1
  10. package/dist/runtime/common/naming.d.ts +2 -0
  11. package/dist/runtime/common/naming.js +13 -0
  12. package/dist/runtime/common/naming.js.map +1 -0
  13. package/dist/runtime/common/parsing.d.ts +11 -0
  14. package/dist/runtime/common/parsing.js +30 -0
  15. package/dist/runtime/common/parsing.js.map +1 -0
  16. package/dist/runtime/context.js +3 -2
  17. package/dist/runtime/context.js.map +1 -1
  18. package/dist/runtime/knowledge.js +16 -12
  19. package/dist/runtime/knowledge.js.map +1 -1
  20. package/dist/runtime/plan/component-resolver.d.ts +8 -0
  21. package/dist/runtime/plan/component-resolver.js +344 -0
  22. package/dist/runtime/plan/component-resolver.js.map +1 -0
  23. package/dist/runtime/plan/guidance.d.ts +3 -0
  24. package/dist/runtime/plan/guidance.js +119 -0
  25. package/dist/runtime/plan/guidance.js.map +1 -0
  26. package/dist/runtime/plan/proposal.d.ts +2 -0
  27. package/dist/runtime/plan/proposal.js +251 -0
  28. package/dist/runtime/plan/proposal.js.map +1 -0
  29. package/dist/runtime/plan/workflow.d.ts +8 -0
  30. package/dist/runtime/plan/workflow.js +228 -0
  31. package/dist/runtime/plan/workflow.js.map +1 -0
  32. package/dist/runtime/plan.d.ts +4 -3
  33. package/dist/runtime/plan.js +123 -448
  34. package/dist/runtime/plan.js.map +1 -1
  35. package/dist/runtime/policy-provenance.js +30 -17
  36. package/dist/runtime/policy-provenance.js.map +1 -1
  37. package/dist/runtime/project-discovery.js +12 -3
  38. package/dist/runtime/project-discovery.js.map +1 -1
  39. package/dist/runtime/project-paths.js +3 -0
  40. package/dist/runtime/project-paths.js.map +1 -1
  41. package/dist/runtime/protocol-init.js +7 -4
  42. package/dist/runtime/protocol-init.js.map +1 -1
  43. package/dist/runtime/repair-decision.js +14 -27
  44. package/dist/runtime/repair-decision.js.map +1 -1
  45. package/dist/runtime/repair-packet.js +8 -1
  46. package/dist/runtime/repair-packet.js.map +1 -1
  47. package/dist/runtime/scaffold/vue-template.d.ts +7 -0
  48. package/dist/runtime/scaffold/vue-template.js +167 -0
  49. package/dist/runtime/scaffold/vue-template.js.map +1 -0
  50. package/dist/runtime/scaffold.d.ts +21 -0
  51. package/dist/runtime/scaffold.js +80 -0
  52. package/dist/runtime/scaffold.js.map +1 -0
  53. package/dist/runtime/skills.js +3 -3
  54. package/dist/runtime/skills.js.map +1 -1
  55. package/dist/runtime/state.js +32 -16
  56. package/dist/runtime/state.js.map +1 -1
  57. package/dist/runtime/units.js +36 -1
  58. package/dist/runtime/units.js.map +1 -1
  59. package/dist/runtime/verification-commands.js +8 -4
  60. package/dist/runtime/verification-commands.js.map +1 -1
  61. package/dist/runtime/verify.js +76 -17
  62. package/dist/runtime/verify.js.map +1 -1
  63. package/dist/schemas/types.d.ts +64 -6
  64. package/dist/schemas/validation.js +4 -0
  65. package/dist/schemas/validation.js.map +1 -1
  66. package/dist/storage/json.js +6 -1
  67. package/dist/storage/json.js.map +1 -1
  68. package/package.json +3 -4
@@ -0,0 +1,251 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { isRecord, parseBoundedString, parseStringArray as parseBoundedStringArray } from "../common/parsing.js";
4
+ const AGENT_PROPOSAL_PARSE_OPTIONS = {
5
+ prefix: "agent proposal",
6
+ maxLength: 500
7
+ };
8
+ export function readAgentPlanningProposal(projectRoot, file) {
9
+ const fullPath = path.resolve(projectRoot, file);
10
+ let parsed;
11
+ try {
12
+ parsed = JSON.parse(fs.readFileSync(fullPath, "utf8"));
13
+ }
14
+ catch (error) {
15
+ const detail = error instanceof Error ? error.message : String(error);
16
+ throw new Error(`agent proposal file must contain valid JSON: ${file}: ${detail}`);
17
+ }
18
+ return parseAgentPlanningProposal(parsed, file);
19
+ }
20
+ function parseAgentPlanningProposal(value, file) {
21
+ if (!isRecord(value) || Array.isArray(value)) {
22
+ throw new Error(`agent proposal file must contain a JSON object: ${file}`);
23
+ }
24
+ return parseAgentPlanningProposalEnvelope(value, file);
25
+ }
26
+ function parseAgentPlanningProposalEnvelope(value, file) {
27
+ const allowedKeys = new Set(["contractVersion", "proposal"]);
28
+ for (const key of Object.keys(value)) {
29
+ if (!allowedKeys.has(key)) {
30
+ throw new Error(`agent proposal file contains unsupported field: ${key}`);
31
+ }
32
+ }
33
+ if (value["contractVersion"] !== 1) {
34
+ throw new Error("agent proposal contractVersion must be 1");
35
+ }
36
+ if (!isRecord(value["proposal"]) || Array.isArray(value["proposal"])) {
37
+ throw new Error(`agent proposal file proposal must be a JSON object: ${file}`);
38
+ }
39
+ const proposal = parseAgentPlanningProposalObject(value["proposal"], new Set([
40
+ "intentSuggestion",
41
+ "constraintHints",
42
+ "componentHints",
43
+ "planningEvidence"
44
+ ]), "agent proposal file proposal");
45
+ return {
46
+ contractVersion: 1,
47
+ ...proposal
48
+ };
49
+ }
50
+ function parseAgentPlanningProposalObject(value, allowedKeys, label) {
51
+ for (const key of Object.keys(value)) {
52
+ if (!allowedKeys.has(key)) {
53
+ throw new Error(`${label} contains unsupported field: ${key}`);
54
+ }
55
+ }
56
+ const proposal = {};
57
+ if (value["intentSuggestion"] !== undefined) {
58
+ proposal.intentSuggestion = parseAgentProposalString(value["intentSuggestion"], "intentSuggestion");
59
+ }
60
+ if (value["constraintHints"] !== undefined) {
61
+ proposal.constraintHints = parseStringArray(value["constraintHints"], "constraintHints");
62
+ }
63
+ if (value["componentHints"] !== undefined) {
64
+ proposal.componentHints = parseComponentHints(value["componentHints"]);
65
+ }
66
+ if (value["planningEvidence"] !== undefined) {
67
+ proposal.planningEvidence = parsePlanningEvidence(value["planningEvidence"]);
68
+ }
69
+ return proposal;
70
+ }
71
+ function parseWorkflowSuggestion(value) {
72
+ const workflow = parseAgentProposalString(value, "workflow candidate kind");
73
+ const allowed = [
74
+ "ui_implementation",
75
+ "prd_knowledge",
76
+ "api_integration",
77
+ "frontend_test",
78
+ "bug_fix",
79
+ "frontend_review",
80
+ "requirement_change",
81
+ "documentation",
82
+ "maintenance"
83
+ ];
84
+ if (!allowed.includes(workflow)) {
85
+ throw new Error(`agent proposal workflow candidate kind must be one of: ${allowed.join(", ")}`);
86
+ }
87
+ return workflow;
88
+ }
89
+ function parseStringArray(value, label) {
90
+ return parseBoundedStringArray(value, label, {
91
+ ...AGENT_PROPOSAL_PARSE_OPTIONS,
92
+ maxItems: 10
93
+ });
94
+ }
95
+ function parseComponentHints(value) {
96
+ if (!Array.isArray(value)) {
97
+ throw new Error("agent proposal componentHints must be an array");
98
+ }
99
+ if (value.length > 10) {
100
+ throw new Error("agent proposal componentHints cannot contain more than 10 items");
101
+ }
102
+ return value.map((item, index) => {
103
+ if (!isRecord(item) || Array.isArray(item)) {
104
+ throw new Error(`agent proposal componentHints[${index}] must be an object`);
105
+ }
106
+ const allowedKeys = new Set(["name", "responsibility"]);
107
+ for (const key of Object.keys(item)) {
108
+ if (!allowedKeys.has(key)) {
109
+ throw new Error(`agent proposal componentHints[${index}] contains unsupported field: ${key}`);
110
+ }
111
+ }
112
+ return {
113
+ ...(item["name"] !== undefined ? { name: parseAgentProposalString(item["name"], `componentHints[${index}].name`) } : {}),
114
+ ...(item["responsibility"] !== undefined
115
+ ? { responsibility: parseAgentProposalString(item["responsibility"], `componentHints[${index}].responsibility`) }
116
+ : {})
117
+ };
118
+ });
119
+ }
120
+ function parsePlanningEvidence(value) {
121
+ if (!isRecord(value) || Array.isArray(value)) {
122
+ throw new Error("agent proposal planningEvidence must be an object");
123
+ }
124
+ const allowedKeys = new Set(["workflowCandidates", "targetCandidates", "verificationCandidates", "ambiguities"]);
125
+ for (const key of Object.keys(value)) {
126
+ if (!allowedKeys.has(key)) {
127
+ throw new Error(`agent proposal planningEvidence contains unsupported field: ${key}`);
128
+ }
129
+ }
130
+ const evidence = {};
131
+ if (value["workflowCandidates"] !== undefined) {
132
+ evidence.workflowCandidates = parseWorkflowCandidates(value["workflowCandidates"]);
133
+ }
134
+ if (value["targetCandidates"] !== undefined) {
135
+ evidence.targetCandidates = parseTargetCandidates(value["targetCandidates"]);
136
+ }
137
+ if (value["verificationCandidates"] !== undefined) {
138
+ evidence.verificationCandidates = parseVerificationCandidates(value["verificationCandidates"]);
139
+ }
140
+ if (value["ambiguities"] !== undefined) {
141
+ evidence.ambiguities = parseAmbiguities(value["ambiguities"]);
142
+ }
143
+ return evidence;
144
+ }
145
+ function parseWorkflowCandidates(value) {
146
+ if (!Array.isArray(value)) {
147
+ throw new Error("agent proposal planningEvidence.workflowCandidates must be an array");
148
+ }
149
+ if (value.length > 10) {
150
+ throw new Error("agent proposal planningEvidence.workflowCandidates cannot contain more than 10 items");
151
+ }
152
+ return value.map((item, index) => {
153
+ if (!isRecord(item) || Array.isArray(item)) {
154
+ throw new Error(`agent proposal planningEvidence.workflowCandidates[${index}] must be an object`);
155
+ }
156
+ const allowedKeys = new Set(["kind", "confidence", "reasons"]);
157
+ for (const key of Object.keys(item)) {
158
+ if (!allowedKeys.has(key)) {
159
+ throw new Error(`agent proposal planningEvidence.workflowCandidates[${index}] contains unsupported field: ${key}`);
160
+ }
161
+ }
162
+ const kind = parseWorkflowSuggestion(item["kind"]);
163
+ const confidence = parseProbability(item["confidence"], `planningEvidence.workflowCandidates[${index}].confidence`);
164
+ const reasons = parseStringArray(item["reasons"], `planningEvidence.workflowCandidates[${index}].reasons`);
165
+ return { kind, confidence, reasons };
166
+ });
167
+ }
168
+ function parseTargetCandidates(value) {
169
+ if (!Array.isArray(value)) {
170
+ throw new Error("agent proposal planningEvidence.targetCandidates must be an array");
171
+ }
172
+ if (value.length > 20) {
173
+ throw new Error("agent proposal planningEvidence.targetCandidates cannot contain more than 20 items");
174
+ }
175
+ return value.map((item, index) => {
176
+ if (!isRecord(item) || Array.isArray(item)) {
177
+ throw new Error(`agent proposal planningEvidence.targetCandidates[${index}] must be an object`);
178
+ }
179
+ const allowedKeys = new Set(["path", "role", "confidence"]);
180
+ for (const key of Object.keys(item)) {
181
+ if (!allowedKeys.has(key)) {
182
+ throw new Error(`agent proposal planningEvidence.targetCandidates[${index}] contains unsupported field: ${key}`);
183
+ }
184
+ }
185
+ return {
186
+ path: parseAgentProposalString(item["path"], `planningEvidence.targetCandidates[${index}].path`),
187
+ role: parseAgentProposalString(item["role"], `planningEvidence.targetCandidates[${index}].role`),
188
+ confidence: parseProbability(item["confidence"], `planningEvidence.targetCandidates[${index}].confidence`)
189
+ };
190
+ });
191
+ }
192
+ function parseVerificationCandidates(value) {
193
+ if (!Array.isArray(value)) {
194
+ throw new Error("agent proposal planningEvidence.verificationCandidates must be an array");
195
+ }
196
+ if (value.length > 20) {
197
+ throw new Error("agent proposal planningEvidence.verificationCandidates cannot contain more than 20 items");
198
+ }
199
+ return value.map((item, index) => {
200
+ if (!isRecord(item) || Array.isArray(item)) {
201
+ throw new Error(`agent proposal planningEvidence.verificationCandidates[${index}] must be an object`);
202
+ }
203
+ const allowedKeys = new Set(["kind", "reason"]);
204
+ for (const key of Object.keys(item)) {
205
+ if (!allowedKeys.has(key)) {
206
+ throw new Error(`agent proposal planningEvidence.verificationCandidates[${index}] contains unsupported field: ${key}`);
207
+ }
208
+ }
209
+ return {
210
+ kind: parseAgentProposalString(item["kind"], `planningEvidence.verificationCandidates[${index}].kind`),
211
+ reason: parseAgentProposalString(item["reason"], `planningEvidence.verificationCandidates[${index}].reason`)
212
+ };
213
+ });
214
+ }
215
+ function parseAmbiguities(value) {
216
+ if (!Array.isArray(value)) {
217
+ throw new Error("agent proposal planningEvidence.ambiguities must be an array");
218
+ }
219
+ if (value.length > 20) {
220
+ throw new Error("agent proposal planningEvidence.ambiguities cannot contain more than 20 items");
221
+ }
222
+ return value.map((item, index) => {
223
+ if (!isRecord(item) || Array.isArray(item)) {
224
+ throw new Error(`agent proposal planningEvidence.ambiguities[${index}] must be an object`);
225
+ }
226
+ const allowedKeys = new Set(["question", "severity"]);
227
+ for (const key of Object.keys(item)) {
228
+ if (!allowedKeys.has(key)) {
229
+ throw new Error(`agent proposal planningEvidence.ambiguities[${index}] contains unsupported field: ${key}`);
230
+ }
231
+ }
232
+ const severity = parseAgentProposalString(item["severity"], `planningEvidence.ambiguities[${index}].severity`);
233
+ if (!["low", "medium", "high"].includes(severity)) {
234
+ throw new Error("agent proposal planningEvidence ambiguity severity must be one of: low, medium, high");
235
+ }
236
+ return {
237
+ question: parseAgentProposalString(item["question"], `planningEvidence.ambiguities[${index}].question`),
238
+ severity: severity
239
+ };
240
+ });
241
+ }
242
+ function parseProbability(value, label) {
243
+ if (typeof value !== "number" || Number.isNaN(value) || value < 0 || value > 1) {
244
+ throw new Error(`agent proposal ${label} must be a number between 0 and 1`);
245
+ }
246
+ return value;
247
+ }
248
+ function parseAgentProposalString(value, label) {
249
+ return parseBoundedString(value, label, AGENT_PROPOSAL_PARSE_OPTIONS);
250
+ }
251
+ //# sourceMappingURL=proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../../src/runtime/plan/proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AgentPlanningDecision, FrontendWorkflowKind, FrontendWorkflowPolicy } from "../../schemas/types.js";
2
+ export interface WorkflowInputSignals {
3
+ prd?: string;
4
+ ui?: string;
5
+ }
6
+ export declare function inferTaskIntent(scope: string, workflowKind: FrontendWorkflowKind): string;
7
+ export declare function inferFrontendWorkflow(scope: string, input: WorkflowInputSignals, proposal: AgentPlanningDecision | null): FrontendWorkflowPolicy;
8
+ export declare function verificationForWorkflow(kind: FrontendWorkflowKind | undefined): string[];
@@ -0,0 +1,228 @@
1
+ export function inferTaskIntent(scope, workflowKind) {
2
+ const normalized = scope.toLowerCase();
3
+ if (workflowKind === "frontend_review") {
4
+ return "frontend_review";
5
+ }
6
+ if (workflowKind === "documentation") {
7
+ return "update_documentation";
8
+ }
9
+ if (workflowKind === "maintenance") {
10
+ return "maintain_project";
11
+ }
12
+ if (workflowKind === "bug_fix" || /\b(fix|bug)\b|\u4fee\u590d|\u9519\u8bef|\u62a5\u9519|\u7f3a\u9677/.test(normalized)) {
13
+ return "fix_bug";
14
+ }
15
+ if (workflowKind === "frontend_test" || /\b(test|e2e|playwright|vitest)\b|\u6d4b\u8bd5|\u7aef\u5230\u7aef|\u96c6\u6210\u6d4b\u8bd5/.test(normalized)) {
16
+ return "add_test";
17
+ }
18
+ if (/\brefactor\b|\u91cd\u6784/.test(normalized)) {
19
+ return "refactor";
20
+ }
21
+ return "implement_page";
22
+ }
23
+ export function inferFrontendWorkflow(scope, input, proposal) {
24
+ const normalized = scope.toLowerCase();
25
+ const hasAttachedUiSource = Boolean(input.ui);
26
+ const hasUiImplementationSignal = /\b(stitch|figma|html|design|page|screen|component|view|dashboard)\b|\u9875\u9762|\u754c\u9762|\u7ec4\u4ef6|\u89c6\u56fe|\u770b\u677f|\u8bbe\u8ba1/.test(normalized);
27
+ const hasUiSource = hasAttachedUiSource || /\b(ui|stitch|figma|html|design|page|screen|component|view|dashboard)\b|\u9875\u9762|\u754c\u9762|\u7ec4\u4ef6|\u89c6\u56fe|\u770b\u677f|\u8bbe\u8ba1/.test(normalized);
28
+ const hasPrdSource = Boolean(input.prd) || /\b(prd|product|requirement|requirements|knowledge|document)\b|\u4ea7\u54c1|\u9700\u6c42|\u77e5\u8bc6\u5e93|\u6587\u6863/.test(normalized);
29
+ const hasReviewSignal = /\b(review|code review|audit|handoff)\b|\u8bc4\u5ba1|\u4ee3\u7801\u5ba1\u67e5|\u5ba1\u67e5|\u5ba1\u6838|\u590d\u6838|\u4ea4\u4ed8/.test(normalized);
30
+ const hasBugSignal = /\b(bug|fix|regression|error)\b|\u4fee\u590d|\u9519\u8bef|\u62a5\u9519|\u7f3a\u9677/.test(normalized);
31
+ const hasTestSignal = /\b(e2e|integration test|test|playwright|vitest)\b|\u6d4b\u8bd5|\u7aef\u5230\u7aef|\u96c6\u6210\u6d4b\u8bd5/.test(normalized);
32
+ const hasApiSignal = /\b(api|swagger|endpoint|interface|request|dto)\b|\u63a5\u53e3|\u8bf7\u6c42|\u5bf9\u63a5|\u8054\u8c03/.test(normalized);
33
+ const hasRequirementChange = /\b(requirement changes?|changed [a-z0-9 -]*requirements?|update [a-z0-9 -]*requirements?|sync [a-z0-9 -]*requirements?)\b|\u9700\u6c42\u53d8\u66f4|\u53d8\u66f4\u9700\u6c42|\u540c\u6b65\u9700\u6c42/.test(normalized);
34
+ const hasDocumentationSignal = /\b(readme|docs?|documentation|guide|manual|agents\.md|claude\.md)\b|\u6587\u6863|\u8bf4\u660e|\u6307\u5357/.test(normalized);
35
+ const hasExplicitDocumentationTarget = /\b(readme|docs?|guide|manual|agents\.md|claude\.md)\b|\u6587\u6863|\u8bf4\u660e|\u6307\u5357/.test(normalized);
36
+ const hasMaintenanceSignal = /\b(cli|runtime|config|package|script|scaffold|harness|protocol|workflow|planning|planner|resolver|policy|maintenance|refactor)\b|\u811a\u624b\u67b6|\u534f\u8bae|\u89c4\u5212|\u5206\u6d3e|\u7ef4\u62a4|\u91cd\u6784|\u51c6\u786e\u6027/.test(normalized);
37
+ const hasPlannerMaintenanceSignal = /\b(plan|planning|planner|resolver|policy|runtime|harness|workflow)\b|\u89c4\u5212|\u5206\u6d3e/.test(normalized);
38
+ const systemKind = hasReviewSignal
39
+ ? "frontend_review"
40
+ : hasBugSignal
41
+ ? "bug_fix"
42
+ : hasRequirementChange
43
+ ? "requirement_change"
44
+ : hasTestSignal
45
+ ? "frontend_test"
46
+ : hasApiSignal
47
+ ? "api_integration"
48
+ : hasMaintenanceSignal && hasPlannerMaintenanceSignal && !hasAttachedUiSource && !hasExplicitDocumentationTarget
49
+ ? "maintenance"
50
+ : hasMaintenanceSignal && !hasAttachedUiSource && !hasUiImplementationSignal && !hasExplicitDocumentationTarget
51
+ ? "maintenance"
52
+ : hasDocumentationSignal && !hasAttachedUiSource && !hasUiImplementationSignal
53
+ ? "documentation"
54
+ : hasMaintenanceSignal && !hasAttachedUiSource && !hasUiImplementationSignal
55
+ ? "maintenance"
56
+ : hasPrdSource && !hasUiSource
57
+ ? "prd_knowledge"
58
+ : "ui_implementation";
59
+ const evidenceKind = selectEvidenceWorkflowKind(systemKind, proposal?.planningEvidence);
60
+ const kind = evidenceKind ?? systemKind;
61
+ return workflowPolicy(kind, { hasPrdSource, hasUiSource });
62
+ }
63
+ export function verificationForWorkflow(kind) {
64
+ if (kind === "frontend_test") {
65
+ return ["targeted test", "typecheck"];
66
+ }
67
+ if (kind === "bug_fix") {
68
+ return ["regression test", "typecheck"];
69
+ }
70
+ if (kind === "frontend_review") {
71
+ return ["typecheck", "test", "build"];
72
+ }
73
+ if (kind === "api_integration") {
74
+ return ["typecheck", "integration test or API mock"];
75
+ }
76
+ if (kind === "requirement_change") {
77
+ return ["typecheck", "affected regression test"];
78
+ }
79
+ if (kind === "prd_knowledge") {
80
+ return ["knowledge review"];
81
+ }
82
+ if (kind === "documentation") {
83
+ return ["documentation review"];
84
+ }
85
+ if (kind === "maintenance") {
86
+ return ["regression test", "typecheck", "build"];
87
+ }
88
+ return ["typecheck"];
89
+ }
90
+ function selectEvidenceWorkflowKind(systemKind, evidence) {
91
+ const candidates = [...(evidence?.workflowCandidates ?? [])].sort((left, right) => right.confidence - left.confidence);
92
+ const primary = candidates[0];
93
+ const runnerUp = candidates[1];
94
+ const margin = primary && runnerUp ? primary.confidence - runnerUp.confidence : primary?.confidence ?? 0;
95
+ if (!primary || primary.confidence < 0.75 || margin < 0.2) {
96
+ return null;
97
+ }
98
+ if (primary.kind === systemKind) {
99
+ return primary.kind;
100
+ }
101
+ if (systemKind === "ui_implementation") {
102
+ return primary.kind;
103
+ }
104
+ if (primary.confidence >= 0.9 && systemKind !== "bug_fix" && systemKind !== "requirement_change") {
105
+ return primary.kind;
106
+ }
107
+ return null;
108
+ }
109
+ function workflowPolicy(kind, inputSignals) {
110
+ const policies = {
111
+ ui_implementation: {
112
+ kind,
113
+ summary: "Implement or adapt frontend UI while preserving project semantics, component boundaries, and validation evidence.",
114
+ requiredKnowledgeActions: inputSignals.hasUiSource
115
+ ? ["Capture reusable UI semantics, component responsibilities, and design assumptions in project knowledge when they affect future work."]
116
+ : ["Reuse existing project knowledge before inventing new UI semantics."],
117
+ implementationConstraints: [
118
+ "Treat imported MCP/Stitch/Figma/HTML output as source material, not project-ready code.",
119
+ "Normalize generated UI into project components, naming, state, routing, and styling conventions."
120
+ ],
121
+ verificationFocus: ["typecheck", "component behavior", "responsive rendering", "visual regressions when UI source is provided"]
122
+ },
123
+ prd_knowledge: {
124
+ kind,
125
+ summary: "Convert PRD or requirement material into durable project knowledge before implementation.",
126
+ requiredKnowledgeActions: [
127
+ "Promote stable product concepts, terminology, permissions, workflows, and acceptance rules into .frontend-harness/knowledge/.",
128
+ "Keep raw PRD text separate from distilled project knowledge."
129
+ ],
130
+ implementationConstraints: [
131
+ "Do not implement product behavior until PRD-derived assumptions are explicit.",
132
+ "Mark unknown product decisions as blockers or assumptions instead of guessing."
133
+ ],
134
+ verificationFocus: ["knowledge coverage", "acceptance criteria traceability", "terminology consistency"]
135
+ },
136
+ api_integration: {
137
+ kind,
138
+ summary: "Integrate frontend behavior with API contracts using project knowledge plus Swagger/API evidence.",
139
+ requiredKnowledgeActions: [
140
+ "Reference relevant domain knowledge before mapping request parameters, DTOs, and response states.",
141
+ "Promote durable API assumptions when Swagger or backend behavior clarifies product rules."
142
+ ],
143
+ implementationConstraints: [
144
+ "Do not invent API fields, enum values, pagination contracts, or error shapes.",
145
+ "Keep request mapping, loading, empty, and error states inside the project API/state conventions."
146
+ ],
147
+ verificationFocus: ["typecheck", "API mapping", "loading/empty/error states", "integration tests or mocks"]
148
+ },
149
+ frontend_test: {
150
+ kind,
151
+ summary: "Add or update frontend E2E/integration coverage for user-visible behavior.",
152
+ requiredKnowledgeActions: [
153
+ "Use project knowledge to choose behavior-level assertions instead of implementation-detail assertions.",
154
+ "Promote durable testing conventions only when they apply beyond the current task."
155
+ ],
156
+ implementationConstraints: [
157
+ "Prefer behavior-focused integration or E2E tests over brittle snapshot-only checks.",
158
+ "Keep fixtures and mocks aligned with known API/product contracts."
159
+ ],
160
+ verificationFocus: ["targeted test", "typecheck", "critical user path", "failure diagnostics"]
161
+ },
162
+ bug_fix: {
163
+ kind,
164
+ summary: "Fix a frontend bug with evidence, minimal scope, and regression coverage proportional to risk.",
165
+ requiredKnowledgeActions: [
166
+ "Check project knowledge for intended behavior before changing code.",
167
+ "Promote the resolved product or technical rule if the bug revealed durable knowledge."
168
+ ],
169
+ implementationConstraints: [
170
+ "Reproduce or explain the bug before patching when evidence is available.",
171
+ "Keep the fix scoped to the failing behavior and avoid unrelated refactors."
172
+ ],
173
+ verificationFocus: ["regression test", "typecheck", "affected workflow", "repair evidence"]
174
+ },
175
+ frontend_review: {
176
+ kind,
177
+ summary: "Review frontend project changes or project health before handoff, with findings grounded in code and validation evidence.",
178
+ requiredKnowledgeActions: [
179
+ "Check project-local skills and knowledge before judging conventions.",
180
+ "Promote durable review findings only when they represent reusable project guidance."
181
+ ],
182
+ implementationConstraints: [
183
+ "Treat review plans as an inspection boundary, not as instructions to create new UI components.",
184
+ "Fix only evidence-backed, safe, scoped issues discovered during review."
185
+ ],
186
+ verificationFocus: ["typecheck", "test", "build", "review findings"]
187
+ },
188
+ requirement_change: {
189
+ kind,
190
+ summary: "Apply requirement changes and keep implementation, tests, and knowledge synchronized.",
191
+ requiredKnowledgeActions: [
192
+ "Update project knowledge for changed product rules before or alongside code changes.",
193
+ "Record obsolete assumptions so future agents do not reuse stale behavior."
194
+ ],
195
+ implementationConstraints: [
196
+ "Identify impacted UI, API mapping, tests, and knowledge before editing.",
197
+ "Do not leave previous requirement behavior undocumented when it changes."
198
+ ],
199
+ verificationFocus: ["changed acceptance criteria", "knowledge sync", "affected regression tests", "typecheck"]
200
+ },
201
+ documentation: {
202
+ kind,
203
+ summary: "Update project documentation or agent protocol text without inventing implementation files.",
204
+ requiredKnowledgeActions: [
205
+ "Keep documentation aligned with current product behavior and protocol boundaries."
206
+ ],
207
+ implementationConstraints: [
208
+ "Edit documentation targets directly; do not create frontend component files for documentation-only work.",
209
+ "Preserve generated protocol blocks unless running protocol initialization."
210
+ ],
211
+ verificationFocus: ["documentation accuracy", "typecheck when package contracts change"]
212
+ },
213
+ maintenance: {
214
+ kind,
215
+ summary: "Maintain project tooling, runtime, CLI, configuration, or planning behavior.",
216
+ requiredKnowledgeActions: [
217
+ "Record durable product or protocol behavior changes when they affect future agent work."
218
+ ],
219
+ implementationConstraints: [
220
+ "Keep maintenance changes scoped to runtime/tooling behavior and matching tests.",
221
+ "Do not infer UI component work from project maintenance wording alone."
222
+ ],
223
+ verificationFocus: ["regression test", "typecheck", "build"]
224
+ }
225
+ };
226
+ return policies[kind];
227
+ }
228
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../../src/runtime/plan/workflow.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import type { AgentDecisionCheckResult, ComponentItem, ExecutionGuidanceStep, ExecutionUnit, TaskUnderstanding } from "../schemas/types.js";
1
+ import type { AgentProposalCheckResult, ComponentItem, ExecutionGuidanceStep, ExecutionUnit, PlanMeta, TaskUnderstanding } from "../schemas/types.js";
2
2
  export interface PlanInput {
3
3
  taskText: string;
4
4
  prd?: string;
5
5
  ui?: string;
6
- agentDecision?: string;
6
+ agentProposal?: string;
7
7
  }
8
8
  export interface PlanOutput {
9
9
  task: TaskUnderstanding;
@@ -13,6 +13,7 @@ export interface PlanOutput {
13
13
  componentGraphPath: string;
14
14
  guidancePath: string;
15
15
  statePath: string;
16
+ meta: PlanMeta;
16
17
  }
17
18
  export declare function createPlan(projectRoot: string, input: PlanInput): PlanOutput;
18
- export declare function checkAgentPlanningDecision(projectRoot: string, file: string | undefined): AgentDecisionCheckResult;
19
+ export declare function checkAgentPlanningProposal(projectRoot: string, file: string | undefined): AgentProposalCheckResult;