frontend-harness 0.7.9 → 0.8.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/CHANGELOG.md +29 -0
- package/README.md +20 -10
- package/dist/cli/index.js +388 -66
- package/dist/cli/index.js.map +1 -1
- package/dist/runtime/builtin-skills.js +1 -1
- package/dist/runtime/clean.js +25 -3
- package/dist/runtime/clean.js.map +1 -1
- package/dist/runtime/command-taxonomy.js +6 -1
- package/dist/runtime/command-taxonomy.js.map +1 -1
- package/dist/runtime/context.d.ts +33 -2
- package/dist/runtime/context.js +112 -13
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/evidence.d.ts +27 -0
- package/dist/runtime/evidence.js +302 -19
- package/dist/runtime/evidence.js.map +1 -1
- package/dist/runtime/graph.js +11 -4
- package/dist/runtime/graph.js.map +1 -1
- package/dist/runtime/ingest.d.ts +38 -0
- package/dist/runtime/ingest.js +157 -0
- package/dist/runtime/ingest.js.map +1 -0
- package/dist/runtime/knowledge/constants.d.ts +9 -0
- package/dist/runtime/knowledge/constants.js +25 -0
- package/dist/runtime/knowledge/constants.js.map +1 -0
- package/dist/runtime/knowledge/core.d.ts +25 -0
- package/dist/runtime/knowledge/core.js +1569 -0
- package/dist/runtime/knowledge/core.js.map +1 -0
- package/dist/runtime/knowledge/types.d.ts +241 -0
- package/dist/runtime/knowledge/types.js +2 -0
- package/dist/runtime/knowledge/types.js.map +1 -0
- package/dist/runtime/knowledge.d.ts +2 -188
- package/dist/runtime/knowledge.js +1 -1126
- package/dist/runtime/knowledge.js.map +1 -1
- package/dist/runtime/plan/component-resolver.js +17 -6
- package/dist/runtime/plan/component-resolver.js.map +1 -1
- package/dist/runtime/plan/guidance.d.ts +1 -1
- package/dist/runtime/plan/guidance.js +88 -25
- package/dist/runtime/plan/guidance.js.map +1 -1
- package/dist/runtime/plan/proposal.js +9 -0
- package/dist/runtime/plan/proposal.js.map +1 -1
- package/dist/runtime/plan/workflow.d.ts +1 -0
- package/dist/runtime/plan/workflow.js +32 -1
- package/dist/runtime/plan/workflow.js.map +1 -1
- package/dist/runtime/plan.d.ts +13 -0
- package/dist/runtime/plan.js +137 -82
- package/dist/runtime/plan.js.map +1 -1
- package/dist/runtime/policy-provenance.d.ts +17 -1
- package/dist/runtime/policy-provenance.js +84 -16
- package/dist/runtime/policy-provenance.js.map +1 -1
- package/dist/runtime/project-discovery.js +32 -17
- package/dist/runtime/project-discovery.js.map +1 -1
- package/dist/runtime/project-paths.js +7 -1
- package/dist/runtime/project-paths.js.map +1 -1
- package/dist/runtime/protocol-init.js +117 -26
- package/dist/runtime/protocol-init.js.map +1 -1
- package/dist/runtime/repair-decision.js +76 -16
- package/dist/runtime/repair-decision.js.map +1 -1
- package/dist/runtime/repair-packet.js +141 -20
- package/dist/runtime/repair-packet.js.map +1 -1
- package/dist/runtime/scaffold/vue-template.js +1 -1
- package/dist/runtime/scaffold/vue-template.js.map +1 -1
- package/dist/runtime/scaffold.js +44 -8
- package/dist/runtime/scaffold.js.map +1 -1
- package/dist/runtime/skills.d.ts +9 -0
- package/dist/runtime/skills.js +133 -18
- package/dist/runtime/skills.js.map +1 -1
- package/dist/runtime/state-explain.js +39 -7
- package/dist/runtime/state-explain.js.map +1 -1
- package/dist/runtime/state.js +85 -10
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/task-context.d.ts +122 -0
- package/dist/runtime/task-context.js +1322 -0
- package/dist/runtime/task-context.js.map +1 -0
- package/dist/runtime/task-signals.d.ts +1 -0
- package/dist/runtime/task-signals.js +1 -1
- package/dist/runtime/task-signals.js.map +1 -1
- package/dist/runtime/ui-restoration.d.ts +3 -3
- package/dist/runtime/ui-restoration.js +3 -3
- package/dist/runtime/ui-restoration.js.map +1 -1
- package/dist/runtime/ui-source.d.ts +6 -0
- package/dist/runtime/ui-source.js +66 -0
- package/dist/runtime/ui-source.js.map +1 -0
- package/dist/runtime/units.js +11 -4
- package/dist/runtime/units.js.map +1 -1
- package/dist/runtime/verification-commands.js +95 -21
- package/dist/runtime/verification-commands.js.map +1 -1
- package/dist/runtime/verify.js +129 -43
- package/dist/runtime/verify.js.map +1 -1
- package/dist/runtime/visual-compare.js +104 -12
- package/dist/runtime/visual-compare.js.map +1 -1
- package/dist/schemas/types.d.ts +75 -2
- package/dist/schemas/validation.js +257 -6
- package/dist/schemas/validation.js.map +1 -1
- package/dist/storage/json.d.ts +9 -1
- package/dist/storage/json.js +106 -8
- package/dist/storage/json.js.map +1 -1
- package/docs/DIRECTION.md +13 -11
- package/docs/RELEASE.md +5 -1
- package/package.json +1 -1
|
@@ -30,6 +30,46 @@ const executionUnitKeys = new Set(["id", "file", "task", "verification", "verifi
|
|
|
30
30
|
const changeBaselineKeys = new Set(["source", "entries", "capturedAt"]);
|
|
31
31
|
const changeBaselineEntryKeys = new Set(["path", "status", "signature"]);
|
|
32
32
|
const verificationStateKeys = new Set(["status", "latestResultPath"]);
|
|
33
|
+
const frontendWorkflowKinds = new Set([
|
|
34
|
+
"ui_implementation",
|
|
35
|
+
"prd_knowledge",
|
|
36
|
+
"api_integration",
|
|
37
|
+
"frontend_test",
|
|
38
|
+
"bug_fix",
|
|
39
|
+
"frontend_review",
|
|
40
|
+
"requirement_change",
|
|
41
|
+
"documentation",
|
|
42
|
+
"maintenance"
|
|
43
|
+
]);
|
|
44
|
+
const workflowStageKinds = new Set([...frontendWorkflowKinds, "design_restoration"]);
|
|
45
|
+
const frontendWorkflowKeys = new Set(["kind", "loopMode", "summary", "requiredKnowledgeActions", "implementationConstraints", "verificationFocus"]);
|
|
46
|
+
const workflowPlanKeys = new Set(["primary", "stages"]);
|
|
47
|
+
const workflowStageKeys = new Set(["id", "kind", "title", "dependsOn", "requiredEvidence", "guidance"]);
|
|
48
|
+
const taskInputsKeys = new Set(["prd", "apiSource", "uiSource", "agentProposal"]);
|
|
49
|
+
const uiSourceKeys = new Set(["kind", "value", "provider"]);
|
|
50
|
+
const uiSourceKinds = new Set(["design_url", "visual_artifact", "generated_markup", "design_artifact"]);
|
|
51
|
+
const uiSourceProviders = new Set(["pixso", "figma", "mastergo", "lanhu", "stitch", "local"]);
|
|
52
|
+
const policyProvenanceKeys = new Set(["selectedSkills", "skillPaths", "skillRoutes", "knowledgeReferences", "knowledgeSha256", "selectionReason", "limits"]);
|
|
53
|
+
const policyProvenanceLimitsKeys = new Set(["skillRoutes", "knowledgeReferences"]);
|
|
54
|
+
const skillRouteKeys = new Set(["name", "path", "score", "source", "reasons"]);
|
|
55
|
+
const agentProposalKeys = new Set([
|
|
56
|
+
"summary",
|
|
57
|
+
"artifactPath",
|
|
58
|
+
"contractVersion",
|
|
59
|
+
"intentSuggestion",
|
|
60
|
+
"constraintHints",
|
|
61
|
+
"componentHints",
|
|
62
|
+
"planningEvidence",
|
|
63
|
+
"limits"
|
|
64
|
+
]);
|
|
65
|
+
const agentProposalLimitsKeys = new Set(["constraintHints", "componentHints", "workflowCandidates", "targetCandidates", "verificationCandidates", "ambiguities"]);
|
|
66
|
+
const proposalFieldLimitKeys = new Set(["selected", "total", "omitted", "max"]);
|
|
67
|
+
const agentComponentHintKeys = new Set(["name", "responsibility"]);
|
|
68
|
+
const planningEvidenceKeys = new Set(["workflowCandidates", "targetCandidates", "verificationCandidates", "ambiguities"]);
|
|
69
|
+
const workflowCandidateKeys = new Set(["kind", "confidence", "reasons"]);
|
|
70
|
+
const targetCandidateKeys = new Set(["path", "role", "confidence"]);
|
|
71
|
+
const verificationCandidateKeys = new Set(["kind", "reason"]);
|
|
72
|
+
const ambiguityKeys = new Set(["question", "severity"]);
|
|
33
73
|
export function isHarnessState(value) {
|
|
34
74
|
if (!isRecord(value)) {
|
|
35
75
|
return false;
|
|
@@ -45,13 +85,13 @@ export function isHarnessState(value) {
|
|
|
45
85
|
&& Array.isArray(value["units"])
|
|
46
86
|
&& value["units"].every(isValidExecutionUnit)
|
|
47
87
|
&& Array.isArray(value["changedFiles"])
|
|
48
|
-
&& value["changedFiles"].every(
|
|
88
|
+
&& value["changedFiles"].every(isValidStateProjectPath)
|
|
49
89
|
&& isValidChangeBaseline(value["changeBaseline"])
|
|
50
90
|
&& isRecord(verification)
|
|
51
91
|
&& hasOnlyKeys(verification, verificationStateKeys)
|
|
52
92
|
&& typeof verification["status"] === "string"
|
|
53
93
|
&& verificationStatuses.has(verification["status"])
|
|
54
|
-
&& (verification["latestResultPath"] === null ||
|
|
94
|
+
&& (verification["latestResultPath"] === null || isValidHarnessArtifactPath(verification["latestResultPath"]))
|
|
55
95
|
&& Array.isArray(value["errors"])
|
|
56
96
|
&& value["errors"].every(isNonEmptyString)
|
|
57
97
|
&& typeof value["retryCount"] === "number"
|
|
@@ -67,13 +107,19 @@ function isValidTaskUnderstanding(value) {
|
|
|
67
107
|
&& isNonEmptyString(value["intent"])
|
|
68
108
|
&& isNonEmptyString(value["scope"])
|
|
69
109
|
&& Array.isArray(value["constraints"])
|
|
70
|
-
&& value["constraints"].every(isNonEmptyString)
|
|
110
|
+
&& value["constraints"].every(isNonEmptyString)
|
|
111
|
+
&& (value["frontendWorkflow"] === undefined || isValidFrontendWorkflow(value["frontendWorkflow"]))
|
|
112
|
+
&& (value["workflowPlan"] === undefined || isValidWorkflowPlan(value["workflowPlan"]))
|
|
113
|
+
&& (value["inputs"] === undefined || isValidTaskInputs(value["inputs"]))
|
|
114
|
+
&& (value["reasoningMode"] === undefined || value["reasoningMode"] === "deterministic" || value["reasoningMode"] === "agent_assisted")
|
|
115
|
+
&& (value["policyProvenance"] === undefined || isValidPolicyProvenance(value["policyProvenance"]))
|
|
116
|
+
&& (value["agentProposal"] === undefined || isValidAgentProposalSummary(value["agentProposal"]));
|
|
71
117
|
}
|
|
72
118
|
function isValidComponentItem(value) {
|
|
73
119
|
return isRecord(value)
|
|
74
120
|
&& hasOnlyKeys(value, componentItemKeys)
|
|
75
121
|
&& isNonEmptyString(value["name"])
|
|
76
|
-
&&
|
|
122
|
+
&& isValidStateProjectPath(value["file"])
|
|
77
123
|
&& isNonEmptyString(value["responsibility"])
|
|
78
124
|
&& typeof value["status"] === "string"
|
|
79
125
|
&& ["new", "existing", "unknown"].includes(value["status"]);
|
|
@@ -82,7 +128,7 @@ function isValidExecutionUnit(value) {
|
|
|
82
128
|
return isRecord(value)
|
|
83
129
|
&& hasOnlyKeys(value, executionUnitKeys)
|
|
84
130
|
&& isNonEmptyString(value["id"])
|
|
85
|
-
&&
|
|
131
|
+
&& isValidStateProjectPath(value["file"])
|
|
86
132
|
&& isNonEmptyString(value["task"])
|
|
87
133
|
&& Array.isArray(value["verification"])
|
|
88
134
|
&& value["verification"].every(isNonEmptyString)
|
|
@@ -105,13 +151,218 @@ function isValidChangeBaseline(value) {
|
|
|
105
151
|
function isValidChangeBaselineEntry(value) {
|
|
106
152
|
return isRecord(value)
|
|
107
153
|
&& hasOnlyKeys(value, changeBaselineEntryKeys)
|
|
108
|
-
&&
|
|
154
|
+
&& isValidStateProjectPath(value["path"])
|
|
109
155
|
&& isNonEmptyString(value["status"])
|
|
110
156
|
&& isNonEmptyString(value["signature"]);
|
|
111
157
|
}
|
|
158
|
+
function isValidFrontendWorkflow(value) {
|
|
159
|
+
return isRecord(value)
|
|
160
|
+
&& hasOnlyKeys(value, frontendWorkflowKeys)
|
|
161
|
+
&& typeof value["kind"] === "string"
|
|
162
|
+
&& frontendWorkflowKinds.has(value["kind"])
|
|
163
|
+
&& (value["loopMode"] === "full" || value["loopMode"] === "lightweight")
|
|
164
|
+
&& isNonEmptyString(value["summary"])
|
|
165
|
+
&& isStringArray(value["requiredKnowledgeActions"])
|
|
166
|
+
&& isStringArray(value["implementationConstraints"])
|
|
167
|
+
&& isStringArray(value["verificationFocus"]);
|
|
168
|
+
}
|
|
169
|
+
function isValidWorkflowPlan(value) {
|
|
170
|
+
return isRecord(value)
|
|
171
|
+
&& hasOnlyKeys(value, workflowPlanKeys)
|
|
172
|
+
&& typeof value["primary"] === "string"
|
|
173
|
+
&& frontendWorkflowKinds.has(value["primary"])
|
|
174
|
+
&& Array.isArray(value["stages"])
|
|
175
|
+
&& value["stages"].every(isValidWorkflowStage);
|
|
176
|
+
}
|
|
177
|
+
function isValidWorkflowStage(value) {
|
|
178
|
+
return isRecord(value)
|
|
179
|
+
&& hasOnlyKeys(value, workflowStageKeys)
|
|
180
|
+
&& isNonEmptyString(value["id"])
|
|
181
|
+
&& typeof value["kind"] === "string"
|
|
182
|
+
&& workflowStageKinds.has(value["kind"])
|
|
183
|
+
&& isNonEmptyString(value["title"])
|
|
184
|
+
&& isStringArray(value["dependsOn"])
|
|
185
|
+
&& isStringArray(value["requiredEvidence"])
|
|
186
|
+
&& isStringArray(value["guidance"]);
|
|
187
|
+
}
|
|
188
|
+
function isValidTaskInputs(value) {
|
|
189
|
+
return isRecord(value)
|
|
190
|
+
&& hasOnlyKeys(value, taskInputsKeys)
|
|
191
|
+
&& (value["prd"] === undefined || isNonEmptyString(value["prd"]))
|
|
192
|
+
&& (value["apiSource"] === undefined || isNonEmptyString(value["apiSource"]))
|
|
193
|
+
&& (value["agentProposal"] === undefined || isNonEmptyString(value["agentProposal"]))
|
|
194
|
+
&& (value["uiSource"] === undefined || isValidUiSource(value["uiSource"]));
|
|
195
|
+
}
|
|
196
|
+
function isValidUiSource(value) {
|
|
197
|
+
return isRecord(value)
|
|
198
|
+
&& hasOnlyKeys(value, uiSourceKeys)
|
|
199
|
+
&& typeof value["kind"] === "string"
|
|
200
|
+
&& uiSourceKinds.has(value["kind"])
|
|
201
|
+
&& isNonEmptyString(value["value"])
|
|
202
|
+
&& (value["provider"] === undefined || (typeof value["provider"] === "string" && uiSourceProviders.has(value["provider"])));
|
|
203
|
+
}
|
|
204
|
+
function isValidPolicyProvenance(value) {
|
|
205
|
+
return isRecord(value)
|
|
206
|
+
&& hasOnlyKeys(value, policyProvenanceKeys)
|
|
207
|
+
&& isStringArray(value["selectedSkills"])
|
|
208
|
+
&& isStringArray(value["skillPaths"])
|
|
209
|
+
&& Array.isArray(value["skillRoutes"])
|
|
210
|
+
&& value["skillRoutes"].every(isValidSkillRoute)
|
|
211
|
+
&& isStringArray(value["knowledgeReferences"])
|
|
212
|
+
&& isStringRecord(value["knowledgeSha256"])
|
|
213
|
+
&& isNonEmptyString(value["selectionReason"])
|
|
214
|
+
&& (value["limits"] === undefined || isValidPolicyProvenanceLimits(value["limits"]));
|
|
215
|
+
}
|
|
216
|
+
function isValidPolicyProvenanceLimits(value) {
|
|
217
|
+
return isRecord(value)
|
|
218
|
+
&& hasOnlyKeys(value, policyProvenanceLimitsKeys)
|
|
219
|
+
&& isValidProposalFieldLimit(value["skillRoutes"])
|
|
220
|
+
&& isValidProposalFieldLimit(value["knowledgeReferences"]);
|
|
221
|
+
}
|
|
222
|
+
function isValidSkillRoute(value) {
|
|
223
|
+
return isRecord(value)
|
|
224
|
+
&& hasOnlyKeys(value, skillRouteKeys)
|
|
225
|
+
&& isNonEmptyString(value["name"])
|
|
226
|
+
&& isNonEmptyString(value["path"])
|
|
227
|
+
&& typeof value["score"] === "number"
|
|
228
|
+
&& Number.isFinite(value["score"])
|
|
229
|
+
&& value["score"] >= 0
|
|
230
|
+
&& value["score"] <= 1
|
|
231
|
+
&& (value["source"] === "metadata" || value["source"] === "workflow")
|
|
232
|
+
&& isStringArray(value["reasons"]);
|
|
233
|
+
}
|
|
234
|
+
function isValidAgentProposalSummary(value) {
|
|
235
|
+
return isRecord(value)
|
|
236
|
+
&& hasOnlyKeys(value, agentProposalKeys)
|
|
237
|
+
&& (value["summary"] === undefined || value["summary"] === null || isNonEmptyString(value["summary"]))
|
|
238
|
+
&& (value["artifactPath"] === undefined || value["artifactPath"] === null || isNonEmptyString(value["artifactPath"]))
|
|
239
|
+
&& (value["contractVersion"] === undefined || value["contractVersion"] === null || value["contractVersion"] === 1)
|
|
240
|
+
&& (value["intentSuggestion"] === undefined || value["intentSuggestion"] === null || isNonEmptyString(value["intentSuggestion"]))
|
|
241
|
+
&& (value["constraintHints"] === undefined || isStringArray(value["constraintHints"]))
|
|
242
|
+
&& (value["componentHints"] === undefined || (Array.isArray(value["componentHints"]) && value["componentHints"].every(isValidAgentComponentHint)))
|
|
243
|
+
&& (value["planningEvidence"] === undefined || isValidPlanningEvidence(value["planningEvidence"]))
|
|
244
|
+
&& (value["limits"] === undefined || isValidAgentProposalLimits(value["limits"]));
|
|
245
|
+
}
|
|
246
|
+
function isValidAgentProposalLimits(value) {
|
|
247
|
+
return isRecord(value)
|
|
248
|
+
&& hasOnlyKeys(value, agentProposalLimitsKeys)
|
|
249
|
+
&& isValidProposalFieldLimit(value["constraintHints"])
|
|
250
|
+
&& isValidProposalFieldLimit(value["componentHints"])
|
|
251
|
+
&& isValidProposalFieldLimit(value["workflowCandidates"])
|
|
252
|
+
&& isValidProposalFieldLimit(value["targetCandidates"])
|
|
253
|
+
&& isValidProposalFieldLimit(value["verificationCandidates"])
|
|
254
|
+
&& isValidProposalFieldLimit(value["ambiguities"]);
|
|
255
|
+
}
|
|
256
|
+
function isValidProposalFieldLimit(value) {
|
|
257
|
+
return isRecord(value)
|
|
258
|
+
&& hasOnlyKeys(value, proposalFieldLimitKeys)
|
|
259
|
+
&& isNonNegativeInteger(value["selected"])
|
|
260
|
+
&& isNonNegativeInteger(value["total"])
|
|
261
|
+
&& isNonNegativeInteger(value["omitted"])
|
|
262
|
+
&& isNonNegativeInteger(value["max"]);
|
|
263
|
+
}
|
|
264
|
+
function isValidAgentComponentHint(value) {
|
|
265
|
+
return isRecord(value)
|
|
266
|
+
&& hasOnlyKeys(value, agentComponentHintKeys)
|
|
267
|
+
&& (value["name"] === undefined || isNonEmptyString(value["name"]))
|
|
268
|
+
&& (value["responsibility"] === undefined || isNonEmptyString(value["responsibility"]));
|
|
269
|
+
}
|
|
270
|
+
function isValidPlanningEvidence(value) {
|
|
271
|
+
return isRecord(value)
|
|
272
|
+
&& hasOnlyKeys(value, planningEvidenceKeys)
|
|
273
|
+
&& (value["workflowCandidates"] === undefined || (Array.isArray(value["workflowCandidates"]) && value["workflowCandidates"].every(isValidWorkflowCandidate)))
|
|
274
|
+
&& (value["targetCandidates"] === undefined || (Array.isArray(value["targetCandidates"]) && value["targetCandidates"].every(isValidTargetCandidate)))
|
|
275
|
+
&& (value["verificationCandidates"] === undefined || (Array.isArray(value["verificationCandidates"]) && value["verificationCandidates"].every(isValidVerificationCandidate)))
|
|
276
|
+
&& (value["ambiguities"] === undefined || (Array.isArray(value["ambiguities"]) && value["ambiguities"].every(isValidAmbiguity)));
|
|
277
|
+
}
|
|
278
|
+
function isValidWorkflowCandidate(value) {
|
|
279
|
+
return isRecord(value)
|
|
280
|
+
&& hasOnlyKeys(value, workflowCandidateKeys)
|
|
281
|
+
&& typeof value["kind"] === "string"
|
|
282
|
+
&& frontendWorkflowKinds.has(value["kind"])
|
|
283
|
+
&& isProbability(value["confidence"])
|
|
284
|
+
&& isStringArray(value["reasons"]);
|
|
285
|
+
}
|
|
286
|
+
function isValidTargetCandidate(value) {
|
|
287
|
+
return isRecord(value)
|
|
288
|
+
&& hasOnlyKeys(value, targetCandidateKeys)
|
|
289
|
+
&& isNonEmptyString(value["path"])
|
|
290
|
+
&& isNonEmptyString(value["role"])
|
|
291
|
+
&& isProbability(value["confidence"]);
|
|
292
|
+
}
|
|
293
|
+
function isValidVerificationCandidate(value) {
|
|
294
|
+
return isRecord(value)
|
|
295
|
+
&& hasOnlyKeys(value, verificationCandidateKeys)
|
|
296
|
+
&& isNonEmptyString(value["kind"])
|
|
297
|
+
&& isNonEmptyString(value["reason"]);
|
|
298
|
+
}
|
|
299
|
+
function isValidAmbiguity(value) {
|
|
300
|
+
return isRecord(value)
|
|
301
|
+
&& hasOnlyKeys(value, ambiguityKeys)
|
|
302
|
+
&& isNonEmptyString(value["question"])
|
|
303
|
+
&& (value["severity"] === "low" || value["severity"] === "medium" || value["severity"] === "high");
|
|
304
|
+
}
|
|
305
|
+
function isProbability(value) {
|
|
306
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
|
|
307
|
+
}
|
|
308
|
+
function isStringArray(value) {
|
|
309
|
+
return Array.isArray(value) && value.every(isNonEmptyString);
|
|
310
|
+
}
|
|
311
|
+
function isStringRecord(value) {
|
|
312
|
+
return isRecord(value) && Object.values(value).every(isNonEmptyString);
|
|
313
|
+
}
|
|
314
|
+
function isValidStateProjectPath(value) {
|
|
315
|
+
if (!isNonEmptyString(value)) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
if (value.includes("\0") || value.includes("\\") || /^[A-Za-z]:/.test(value) || value.startsWith("/")) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
const normalized = normalizePosixPath(value);
|
|
322
|
+
if (normalized === "." || normalized === ".." || normalized.startsWith("../") || normalized.endsWith("/")) {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
return !normalized.startsWith(".frontend-harness/")
|
|
326
|
+
|| normalized === ".frontend-harness/knowledge"
|
|
327
|
+
|| normalized.startsWith(".frontend-harness/knowledge/");
|
|
328
|
+
}
|
|
329
|
+
function isValidHarnessArtifactPath(value) {
|
|
330
|
+
if (!isNonEmptyString(value)) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
if (value.includes("\0") || value.includes("\\") || /^[A-Za-z]:/.test(value) || value.startsWith("/")) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
const normalized = normalizePosixPath(value);
|
|
337
|
+
return normalized !== "."
|
|
338
|
+
&& normalized !== ".."
|
|
339
|
+
&& !normalized.startsWith("../")
|
|
340
|
+
&& !normalized.endsWith("/")
|
|
341
|
+
&& normalized.startsWith(".frontend-harness/");
|
|
342
|
+
}
|
|
343
|
+
function normalizePosixPath(value) {
|
|
344
|
+
const parts = [];
|
|
345
|
+
for (const part of value.split("/")) {
|
|
346
|
+
if (!part || part === ".") {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
if (part === "..") {
|
|
350
|
+
if (parts.length === 0) {
|
|
351
|
+
return `../${parts.join("/")}`;
|
|
352
|
+
}
|
|
353
|
+
parts.pop();
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
parts.push(part);
|
|
357
|
+
}
|
|
358
|
+
return parts.join("/") || ".";
|
|
359
|
+
}
|
|
112
360
|
function isNonEmptyString(value) {
|
|
113
361
|
return typeof value === "string" && Boolean(value.trim());
|
|
114
362
|
}
|
|
363
|
+
function isNonNegativeInteger(value) {
|
|
364
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
365
|
+
}
|
|
115
366
|
function isRecord(value) {
|
|
116
367
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
117
368
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/schemas/validation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/schemas/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/json.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export declare function ensureDir(dir: string): void;
|
|
2
2
|
export declare function writeJson(filePath: string, value: unknown): void;
|
|
3
3
|
export declare function writeJsonExclusive(filePath: string, value: unknown): void;
|
|
4
|
-
export declare function readJson<T>(filePath: string
|
|
4
|
+
export declare function readJson<T>(filePath: string, options?: {
|
|
5
|
+
maxBytes?: number;
|
|
6
|
+
label?: string;
|
|
7
|
+
}): T | null;
|
|
5
8
|
export declare function writeText(filePath: string, value: string): void;
|
|
9
|
+
export declare function writeBuffer(filePath: string, value: Uint8Array): void;
|
|
10
|
+
export declare function chmodFileWithoutSymlink(filePath: string, mode: number): void;
|
|
11
|
+
export declare function assertSafeWriteTarget(filePath: string): void;
|
|
12
|
+
export declare function isRegularFileWithoutSymlink(filePath: string): boolean;
|
|
13
|
+
export declare function isDirectoryWithoutSymlink(dirPath: string): boolean;
|
package/dist/storage/json.js
CHANGED
|
@@ -1,24 +1,122 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
export function ensureDir(dir) {
|
|
4
|
-
|
|
4
|
+
ensureDirectoryWithoutSymlinks(dir);
|
|
5
5
|
}
|
|
6
6
|
export function writeJson(filePath, value) {
|
|
7
|
-
|
|
8
|
-
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
7
|
+
writeTextAtomic(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
9
8
|
}
|
|
10
9
|
export function writeJsonExclusive(filePath, value) {
|
|
11
|
-
|
|
10
|
+
assertSafeWriteTarget(filePath);
|
|
12
11
|
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
|
|
13
12
|
}
|
|
14
|
-
export function readJson(filePath) {
|
|
15
|
-
if (!
|
|
13
|
+
export function readJson(filePath, options = {}) {
|
|
14
|
+
if (!isRegularFileWithoutSymlink(filePath)) {
|
|
16
15
|
return null;
|
|
17
16
|
}
|
|
17
|
+
if (options.maxBytes !== undefined) {
|
|
18
|
+
const stat = fs.statSync(filePath);
|
|
19
|
+
if (stat.size > options.maxBytes) {
|
|
20
|
+
throw new Error(`${options.label ?? path.basename(filePath)} exceeds ${options.maxBytes} bytes.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
18
23
|
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
19
24
|
}
|
|
20
25
|
export function writeText(filePath, value) {
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
writeTextAtomic(filePath, value);
|
|
27
|
+
}
|
|
28
|
+
export function writeBuffer(filePath, value) {
|
|
29
|
+
writeFileAtomic(filePath, value);
|
|
30
|
+
}
|
|
31
|
+
export function chmodFileWithoutSymlink(filePath, mode) {
|
|
32
|
+
const noFollow = fs.constants.O_NOFOLLOW ?? 0;
|
|
33
|
+
const fd = fs.openSync(filePath, fs.constants.O_RDONLY | noFollow);
|
|
34
|
+
try {
|
|
35
|
+
const stat = fs.fstatSync(fd);
|
|
36
|
+
if (!stat.isFile()) {
|
|
37
|
+
throw new Error(`Mode target must be a file: ${filePath}`);
|
|
38
|
+
}
|
|
39
|
+
fs.fchmodSync(fd, mode);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
fs.closeSync(fd);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function writeTextAtomic(filePath, value) {
|
|
46
|
+
writeFileAtomic(filePath, value);
|
|
47
|
+
}
|
|
48
|
+
function writeFileAtomic(filePath, value) {
|
|
49
|
+
assertSafeWriteTarget(filePath);
|
|
50
|
+
const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
51
|
+
try {
|
|
52
|
+
fs.writeFileSync(tempPath, value, typeof value === "string" ? { encoding: "utf8", flag: "wx" } : { flag: "wx" });
|
|
53
|
+
fs.renameSync(tempPath, filePath);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
fs.rmSync(tempPath, { force: true });
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function assertSafeWriteTarget(filePath) {
|
|
61
|
+
ensureDirectoryWithoutSymlinks(path.dirname(filePath));
|
|
62
|
+
const existing = fs.lstatSync(filePath, { throwIfNoEntry: false });
|
|
63
|
+
if (existing?.isSymbolicLink()) {
|
|
64
|
+
throw new Error(`Refusing to write through symlink: ${filePath}`);
|
|
65
|
+
}
|
|
66
|
+
if (existing && !existing.isFile()) {
|
|
67
|
+
throw new Error(`Write target must be a file: ${filePath}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function ensureDirectoryWithoutSymlinks(dir) {
|
|
71
|
+
const resolved = path.resolve(dir);
|
|
72
|
+
const parsed = path.parse(resolved);
|
|
73
|
+
const parts = path.relative(parsed.root, resolved).split(path.sep).filter(Boolean);
|
|
74
|
+
let current = parsed.root;
|
|
75
|
+
for (const part of parts) {
|
|
76
|
+
current = path.join(current, part);
|
|
77
|
+
const stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
78
|
+
if (!stat) {
|
|
79
|
+
fs.mkdirSync(current);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (stat.isSymbolicLink()) {
|
|
83
|
+
throw new Error(`Refusing to use symlinked directory: ${current}`);
|
|
84
|
+
}
|
|
85
|
+
if (!stat.isDirectory()) {
|
|
86
|
+
throw new Error(`Path component must be a directory: ${current}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function isRegularFileWithoutSymlink(filePath) {
|
|
91
|
+
return pathHasTypeWithoutSymlink(filePath, (stat) => stat.isFile());
|
|
92
|
+
}
|
|
93
|
+
export function isDirectoryWithoutSymlink(dirPath) {
|
|
94
|
+
return pathHasTypeWithoutSymlink(dirPath, (stat) => stat.isDirectory());
|
|
95
|
+
}
|
|
96
|
+
function pathHasTypeWithoutSymlink(filePath, acceptsFinalStat) {
|
|
97
|
+
const resolved = path.resolve(filePath);
|
|
98
|
+
const parsed = path.parse(resolved);
|
|
99
|
+
const parts = path.relative(parsed.root, resolved).split(path.sep).filter(Boolean);
|
|
100
|
+
let current = parsed.root;
|
|
101
|
+
for (const [index, part] of parts.entries()) {
|
|
102
|
+
current = path.join(current, part);
|
|
103
|
+
let stat;
|
|
104
|
+
try {
|
|
105
|
+
stat = fs.lstatSync(current, { throwIfNoEntry: false });
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
if (index === parts.length - 1 && (!stat || !acceptsFinalStat(stat))) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
if (!stat || stat.isSymbolicLink()) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (index < parts.length - 1 && !stat.isDirectory()) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return parts.length > 0;
|
|
23
121
|
}
|
|
24
122
|
//# sourceMappingURL=json.js.map
|
package/dist/storage/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/storage/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/storage/json.ts"],"names":[],"mappings":"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"}
|
package/docs/DIRECTION.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frontend-harness Direction
|
|
2
2
|
|
|
3
|
-
`frontend-harness` is a project-level
|
|
3
|
+
`frontend-harness` is a project-level context and evidence policy layer for frontend AI-assisted development.
|
|
4
4
|
|
|
5
|
-
The package should make Codex and Claude Code more predictable inside a frontend repository without replacing their runtime capabilities.
|
|
5
|
+
The package should make Codex and Claude Code more predictable inside a frontend repository without replacing their runtime capabilities or wrapping simple tasks in unnecessary process.
|
|
6
6
|
|
|
7
7
|
## Product Surface
|
|
8
8
|
|
|
@@ -13,29 +13,29 @@ npm install frontend-harness --save-dev
|
|
|
13
13
|
npm run harness:init
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
After that, team members work normally in Codex or Claude Code. The injected `AGENTS.md` and `CLAUDE.md` protocol tells the agent
|
|
16
|
+
After that, team members work normally in Codex or Claude Code. The injected `AGENTS.md` and `CLAUDE.md` protocol tells the agent when the harness loop is worth using and when project-local skill guidance plus normal verification is enough.
|
|
17
17
|
|
|
18
18
|
## Policy Loop
|
|
19
19
|
|
|
20
|
-
The stable loop is:
|
|
20
|
+
The stable full loop is:
|
|
21
21
|
|
|
22
22
|
```text
|
|
23
23
|
context -> plan -> implement -> record-change -> verify -> repair -> done
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
The CLI should keep these steps deterministic and evidence-backed.
|
|
26
|
+
The CLI should keep these steps deterministic and evidence-backed for tasks that need source material, traceability, visual restoration, PRD knowledge, or audit evidence. Simple bug fixes, tests, docs, maintenance, and small requirement edits should stay lightweight unless they include explicit PRD/API/UI inputs or ask for durable evidence.
|
|
27
27
|
|
|
28
28
|
`plan --json` should classify the frontend workflow before implementation. The first stable workflow policy classes are:
|
|
29
29
|
|
|
30
30
|
- `ui_implementation`: hand-written UI or generated UI adaptation from MCP/Stitch/Figma/HTML.
|
|
31
31
|
- `prd_knowledge`: PRD digestion into durable project knowledge, including source-linked atomic cards, update/merge behavior, and a generated PRD source index for large-project traceability.
|
|
32
|
-
- `api_integration`: Swagger/API-backed frontend data integration.
|
|
33
|
-
- `frontend_test`: E2E or integration testing.
|
|
34
|
-
- `bug_fix`: scoped bug repair with regression evidence.
|
|
32
|
+
- `api_integration`: Swagger/API-backed frontend data integration when API source material or reusable contract evidence is present.
|
|
33
|
+
- `frontend_test`: lightweight E2E or integration testing guidance.
|
|
34
|
+
- `bug_fix`: lightweight scoped bug repair guidance, with regression evidence when the task warrants it.
|
|
35
35
|
- `frontend_review`: evidence-grounded review without inventing implementation work.
|
|
36
|
-
- `requirement_change`: implementation plus knowledge/test synchronization
|
|
36
|
+
- `requirement_change`: lightweight implementation guidance plus knowledge/test synchronization when changed requirements affect durable project understanding.
|
|
37
37
|
|
|
38
|
-
These classes are policy metadata,
|
|
38
|
+
These classes are policy metadata. UI restoration, PRD knowledge, and explicit source-backed work can drive the full loop; ordinary workflow classes should usually route skills, boundaries, and verification focus without forcing stateful ceremony.
|
|
39
39
|
|
|
40
40
|
## Boundaries
|
|
41
41
|
|
|
@@ -47,6 +47,7 @@ These classes are policy metadata, not skill routing and not runtime scheduling.
|
|
|
47
47
|
- state continuity
|
|
48
48
|
- repair evidence
|
|
49
49
|
- project-local knowledge and skills
|
|
50
|
+
- lightweight project guidance for ordinary tasks
|
|
50
51
|
|
|
51
52
|
Codex and Claude Code own:
|
|
52
53
|
|
|
@@ -61,7 +62,8 @@ Codex and Claude Code own:
|
|
|
61
62
|
## Directional Decisions
|
|
62
63
|
|
|
63
64
|
- Human-facing commands stay minimal: `init` and `protocol check`.
|
|
64
|
-
- Agent-facing commands stay stable: `context`, `plan`, `state record-change`, `verify`, `repair packet`, and `state next
|
|
65
|
+
- Agent-facing commands stay stable: `context`, `plan`, `state record-change`, `verify`, `repair packet`, and `state next`, but the protocol should reserve the full sequence for tasks where it adds evidence or traceability.
|
|
66
|
+
- Ordinary workflow classes should not pretend to outperform direct agent conversation. They should provide skill routing, boundaries, and verification hints unless richer source material makes the full loop useful.
|
|
65
67
|
- Low-level launcher lifecycle commands are removed from the product direction.
|
|
66
68
|
- Phase planning documents are no longer the product documentation model.
|
|
67
69
|
- README is the product entry point.
|
package/docs/RELEASE.md
CHANGED
|
@@ -28,6 +28,7 @@ The temporary npm cache avoids local global-cache permission issues on machines
|
|
|
28
28
|
Confirm the dry-run output includes only intended public artifacts, normally:
|
|
29
29
|
|
|
30
30
|
- `dist/**`
|
|
31
|
+
- `templates/scaffold/**`
|
|
31
32
|
- `README.md`
|
|
32
33
|
- `CHANGELOG.md`
|
|
33
34
|
- `docs/DIRECTION.md`
|
|
@@ -75,11 +76,14 @@ npm publish --access public
|
|
|
75
76
|
Then create a git commit and tag if they were not already created:
|
|
76
77
|
|
|
77
78
|
```bash
|
|
78
|
-
git
|
|
79
|
+
git status --short
|
|
80
|
+
git add package.json package-lock.json CHANGELOG.md README.md docs/RELEASE.md docs/DIRECTION.md src tests templates
|
|
79
81
|
git commit -m "Release v<version>"
|
|
80
82
|
git tag v<version>
|
|
81
83
|
```
|
|
82
84
|
|
|
85
|
+
Adjust the `git add` paths to the actual release diff; do not include unrelated local review notes or generated runtime artifacts.
|
|
86
|
+
|
|
83
87
|
Push the commit and tag:
|
|
84
88
|
|
|
85
89
|
```bash
|