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,153 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { harnessPath, relativeHarnessPath } from "../storage/paths.js";
5
+ import { writeJson } from "../storage/json.js";
6
+ import { discoverVerificationCommands } from "./verification-commands.js";
7
+ import { detectProjectStack, discoverProjectSurface } from "./project-discovery.js";
8
+ import { discoverSkills } from "./skills.js";
9
+ import { discoverKnowledgeCards } from "./knowledge.js";
10
+ import { checkComponentGraph } from "./graph.js";
11
+ import { checkExecutionUnits } from "./units.js";
12
+ import { loadState } from "./state.js";
13
+ import { readAcceptedRepairDecision } from "./repair-decision.js";
14
+ import { checkProtocol } from "./protocol-init.js";
15
+ import { publicRecommendedCommands } from "./command-taxonomy.js";
16
+ import { buildPolicyProvenance } from "./policy-provenance.js";
17
+ export function buildContext(projectRoot) {
18
+ const projectSurface = discoverProjectSurface(projectRoot);
19
+ const knownArtifacts = {
20
+ latestContext: relativeHarnessPath("context", "latest.json"),
21
+ latestPlan: relativeHarnessPath("plans", "latest.json"),
22
+ latestExecutionUnits: relativeHarnessPath("execution-units", "latest.json"),
23
+ latestComponentGraph: relativeHarnessPath("component-graph", "latest.json"),
24
+ latestConfig: relativeHarnessPath("config.json"),
25
+ latestVerification: relativeHarnessPath("verification", "latest.json"),
26
+ latestStateExplain: relativeHarnessPath("state-explain", "latest.json"),
27
+ latestRepairPacket: relativeHarnessPath("repair", "latest.json"),
28
+ latestRepairDecision: relativeHarnessPath("repair-decision", "latest.json"),
29
+ latestProtocol: relativeHarnessPath("protocol", "latest.json")
30
+ };
31
+ const state = loadState(projectRoot);
32
+ const context = {
33
+ projectRoot,
34
+ detectedStack: detectProjectStack(projectRoot),
35
+ constraints: collectConstraints(projectRoot),
36
+ knownArtifacts,
37
+ projectSurface,
38
+ projectStatus: buildProjectStatus(projectRoot, knownArtifacts, projectSurface, state),
39
+ lastPlannedPolicyProvenance: buildPolicyProvenance(projectRoot, state.task?.scope ?? ""),
40
+ recommendedNextCommands: publicRecommendedCommands()
41
+ };
42
+ writeJson(harnessPath(projectRoot, "context", "latest.json"), context);
43
+ return context;
44
+ }
45
+ function collectConstraints(projectRoot) {
46
+ const constraints = [];
47
+ for (const file of ["AGENTS.md", "CLAUDE.md", "docs/DIRECTION.md"]) {
48
+ if (fs.existsSync(path.join(projectRoot, file))) {
49
+ constraints.push(file);
50
+ }
51
+ }
52
+ return constraints;
53
+ }
54
+ function buildProjectStatus(projectRoot, knownArtifacts, surface, state) {
55
+ const verificationCommands = discoverVerificationCommands(projectRoot);
56
+ const knowledge = discoverKnowledge(projectRoot);
57
+ const skills = discoverSkills(projectRoot);
58
+ const executionUnits = checkExecutionUnits(projectRoot);
59
+ const componentGraph = checkComponentGraph(projectRoot);
60
+ const protocol = checkProtocol(projectRoot);
61
+ return {
62
+ artifacts: Object.fromEntries(Object.entries(knownArtifacts).map(([name, relativePath]) => [
63
+ name,
64
+ describeArtifact(projectRoot, relativePath)
65
+ ])),
66
+ surface,
67
+ verificationCommands,
68
+ knowledge,
69
+ skills,
70
+ executionUnits,
71
+ componentGraph,
72
+ protocol,
73
+ stateSummary: summarizeState(state),
74
+ planReadiness: buildPlanReadiness({
75
+ protocol,
76
+ skills,
77
+ knowledge,
78
+ verificationCommands,
79
+ surface
80
+ }),
81
+ planningDecision: summarizePlanningDecision(state.task),
82
+ repairDecision: readAcceptedRepairDecision(projectRoot)
83
+ };
84
+ }
85
+ function summarizeState(state) {
86
+ return {
87
+ status: state.status,
88
+ verificationStatus: state.verification.status,
89
+ hasTask: Boolean(state.task),
90
+ taskScope: state.task?.scope ?? null,
91
+ changedFilesCount: state.changedFiles.length,
92
+ retryCount: state.retryCount,
93
+ blockerCount: state.blockers.length
94
+ };
95
+ }
96
+ function buildPlanReadiness(input) {
97
+ const protocolReady = input.protocol.status === "passed";
98
+ const skillsAvailable = input.skills.length > 0;
99
+ const knowledgeAvailable = input.knowledge.length > 0;
100
+ const verificationConfigured = input.verificationCommands.some((command) => command.command);
101
+ const surfaceDetected = input.surface.sourceRoots.length > 0 || input.surface.entryFiles.length > 0;
102
+ const warnings = [
103
+ ...(!protocolReady ? ["Protocol is not current; run frontend-harness init --json before relying on injected instructions."] : []),
104
+ ...(!skillsAvailable ? ["No project-local skills were discovered under .frontend-harness/skills."] : []),
105
+ ...(!knowledgeAvailable ? ["No project knowledge artifacts were discovered under .frontend-harness/knowledge."] : []),
106
+ ...(!verificationConfigured ? ["No verification commands are configured from flags, harness config, or package scripts."] : []),
107
+ ...(!surfaceDetected ? ["No source roots or entry files were detected from the standard frontend project surface."] : [])
108
+ ];
109
+ return {
110
+ status: protocolReady && verificationConfigured ? warnings.length > 0 ? "warning" : "ready" : "blocked",
111
+ protocolReady,
112
+ skillsAvailable,
113
+ knowledgeAvailable,
114
+ verificationConfigured,
115
+ surfaceDetected,
116
+ warnings
117
+ };
118
+ }
119
+ function summarizePlanningDecision(task) {
120
+ const decision = task?.agentDecision;
121
+ if (!decision?.artifactPath) {
122
+ return null;
123
+ }
124
+ return {
125
+ artifactPath: decision.artifactPath,
126
+ contractVersion: decision.contractVersion ?? null,
127
+ intentSuggestion: decision.intentSuggestion ?? null,
128
+ constraintHints: decision.constraintHints ?? [],
129
+ componentHints: decision.componentHints ?? []
130
+ };
131
+ }
132
+ function describeArtifact(projectRoot, relativePath) {
133
+ const fullPath = path.join(projectRoot, relativePath);
134
+ if (!fs.existsSync(fullPath)) {
135
+ return {
136
+ path: relativePath,
137
+ exists: false,
138
+ updatedAt: null,
139
+ sha256: null
140
+ };
141
+ }
142
+ const stat = fs.statSync(fullPath);
143
+ return {
144
+ path: relativePath,
145
+ exists: true,
146
+ updatedAt: stat.mtime.toISOString(),
147
+ sha256: createHash("sha256").update(fs.readFileSync(fullPath)).digest("hex")
148
+ };
149
+ }
150
+ function discoverKnowledge(projectRoot) {
151
+ return discoverKnowledgeCards(projectRoot).map(({ searchable, ...card }) => card);
152
+ }
153
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/runtime/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ComponentGraphArtifact, ComponentItem, ExecutionUnit } from "../schemas/types.js";
2
+ export type GraphCheckStatus = "passed" | "failed" | "not_configured";
3
+ export interface GraphCheckResult {
4
+ status: GraphCheckStatus;
5
+ artifactPath: string;
6
+ nodeCount: number;
7
+ edgeCount: number;
8
+ errors: string[];
9
+ warnings: string[];
10
+ }
11
+ export declare function buildComponentGraph(components: ComponentItem[], units: ExecutionUnit[]): ComponentGraphArtifact;
12
+ export declare function checkComponentGraph(projectRoot: string): GraphCheckResult;
@@ -0,0 +1,211 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { relativeHarnessPath } from "../storage/paths.js";
4
+ const allowedEdgeTypes = new Set(["depends_on"]);
5
+ const allowedEdgeSources = new Set(["execution_unit_depends_on"]);
6
+ export function buildComponentGraph(components, units) {
7
+ const nodes = components.map((component, index) => {
8
+ const unit = units[index];
9
+ if (!unit) {
10
+ throw new Error(`Cannot build component graph: missing execution unit for component ${component.name}.`);
11
+ }
12
+ return {
13
+ id: graphNodeIdFromComponent(component.name),
14
+ component: component.name,
15
+ file: component.file,
16
+ executionUnitId: unit.id
17
+ };
18
+ });
19
+ const nodeByUnitId = new Map(nodes.map((node) => [node.executionUnitId, node]));
20
+ const edges = [];
21
+ for (const unit of units) {
22
+ const fromNode = nodeByUnitId.get(unit.id);
23
+ if (!fromNode) {
24
+ continue;
25
+ }
26
+ for (const dependency of unit.dependsOn) {
27
+ const toNode = nodeByUnitId.get(dependency);
28
+ if (!toNode) {
29
+ continue;
30
+ }
31
+ edges.push({
32
+ from: fromNode.id,
33
+ to: toNode.id,
34
+ type: "depends_on",
35
+ source: "execution_unit_depends_on"
36
+ });
37
+ }
38
+ }
39
+ return {
40
+ nodes,
41
+ edges
42
+ };
43
+ }
44
+ export function checkComponentGraph(projectRoot) {
45
+ const artifactPath = relativeHarnessPath("component-graph", "latest.json");
46
+ const fullPath = path.join(projectRoot, artifactPath);
47
+ if (!fs.existsSync(fullPath)) {
48
+ return {
49
+ status: "not_configured",
50
+ artifactPath,
51
+ nodeCount: 0,
52
+ edgeCount: 0,
53
+ errors: [],
54
+ warnings: ["Run frontend-harness plan before checking the component graph."]
55
+ };
56
+ }
57
+ const errors = [];
58
+ const warnings = [];
59
+ const artifact = readArtifact(fullPath, errors);
60
+ const nodes = getArray(artifact, "nodes", errors);
61
+ const edges = getArray(artifact, "edges", errors);
62
+ const nodeIds = new Set();
63
+ const duplicateNodeIds = new Set();
64
+ for (const [index, node] of nodes.entries()) {
65
+ if (!isRecord(node)) {
66
+ errors.push(`nodes[${index}] must be an object.`);
67
+ continue;
68
+ }
69
+ const id = validateNodeId(node, index, errors);
70
+ if (id) {
71
+ if (nodeIds.has(id)) {
72
+ duplicateNodeIds.add(id);
73
+ }
74
+ nodeIds.add(id);
75
+ }
76
+ }
77
+ for (const duplicateId of duplicateNodeIds) {
78
+ errors.push(`Duplicate component graph node id: ${duplicateId}.`);
79
+ }
80
+ for (const [index, node] of nodes.entries()) {
81
+ if (isRecord(node)) {
82
+ validateNode(node, index, errors);
83
+ }
84
+ }
85
+ validateEdges(edges, nodeIds, errors);
86
+ return {
87
+ status: errors.length > 0 ? "failed" : "passed",
88
+ artifactPath,
89
+ nodeCount: nodes.length,
90
+ edgeCount: edges.length,
91
+ errors,
92
+ warnings
93
+ };
94
+ }
95
+ function graphNodeIdFromComponent(name) {
96
+ return `component-${name.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`;
97
+ }
98
+ function readArtifact(fullPath, errors) {
99
+ try {
100
+ return JSON.parse(fs.readFileSync(fullPath, "utf8"));
101
+ }
102
+ catch (error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ errors.push(`Component graph artifact is not valid JSON: ${message}`);
105
+ return null;
106
+ }
107
+ }
108
+ function getArray(artifact, key, errors) {
109
+ if (!isRecord(artifact)) {
110
+ errors.push("Component graph artifact root must be an object.");
111
+ return [];
112
+ }
113
+ if (!Array.isArray(artifact[key])) {
114
+ errors.push(`Component graph artifact must contain a ${key} array.`);
115
+ return [];
116
+ }
117
+ return artifact[key];
118
+ }
119
+ function validateNodeId(node, index, errors) {
120
+ if (typeof node.id !== "string" || !node.id.trim()) {
121
+ errors.push(`nodes[${index}].id must be a non-empty string.`);
122
+ return null;
123
+ }
124
+ return node.id;
125
+ }
126
+ function validateNode(node, index, errors) {
127
+ if (typeof node.component !== "string" || !node.component.trim()) {
128
+ errors.push(`nodes[${index}].component must be a non-empty string.`);
129
+ }
130
+ if (typeof node.executionUnitId !== "string" || !node.executionUnitId.trim()) {
131
+ errors.push(`nodes[${index}].executionUnitId must be a non-empty string.`);
132
+ }
133
+ if (typeof node.file !== "string" || !node.file.trim()) {
134
+ errors.push(`nodes[${index}].file must be a non-empty project-relative path.`);
135
+ return;
136
+ }
137
+ if (!isProjectRelativeSourcePath(node.file)) {
138
+ errors.push(`nodes[${index}].file must be project-relative and outside generated harness directories.`);
139
+ }
140
+ }
141
+ function validateEdges(edges, nodeIds, errors) {
142
+ const edgeKeys = new Set();
143
+ const duplicateEdgeKeys = new Set();
144
+ for (const [index, edge] of edges.entries()) {
145
+ if (!isRecord(edge)) {
146
+ errors.push(`edges[${index}] must be an object.`);
147
+ continue;
148
+ }
149
+ validateEdge(edge, index, nodeIds, errors);
150
+ const edgeKey = edgeKeyFromUnknown(edge);
151
+ if (edgeKey) {
152
+ if (edgeKeys.has(edgeKey)) {
153
+ duplicateEdgeKeys.add(edgeKey);
154
+ }
155
+ edgeKeys.add(edgeKey);
156
+ }
157
+ }
158
+ for (const duplicateEdgeKey of duplicateEdgeKeys) {
159
+ errors.push(`Duplicate component graph edge: ${duplicateEdgeKey}.`);
160
+ }
161
+ }
162
+ function validateEdge(edge, index, nodeIds, errors) {
163
+ const from = validateEndpoint(edge.from, `edges[${index}].from`, nodeIds, errors);
164
+ const to = validateEndpoint(edge.to, `edges[${index}].to`, nodeIds, errors);
165
+ if (from && to && from === to) {
166
+ errors.push(`edges[${index}] cannot reference the same node.`);
167
+ }
168
+ if (typeof edge.type !== "string" || !allowedEdgeTypes.has(edge.type)) {
169
+ errors.push(`edges[${index}].type must be one of: ${Array.from(allowedEdgeTypes).join(", ")}.`);
170
+ }
171
+ if (typeof edge.source !== "string" || !allowedEdgeSources.has(edge.source)) {
172
+ errors.push(`edges[${index}].source must be one of: ${Array.from(allowedEdgeSources).join(", ")}.`);
173
+ }
174
+ }
175
+ function validateEndpoint(value, label, nodeIds, errors) {
176
+ if (typeof value !== "string" || !value.trim()) {
177
+ errors.push(`${label} must be a non-empty node id.`);
178
+ return null;
179
+ }
180
+ if (!nodeIds.has(value)) {
181
+ errors.push(`${label} references unknown node id: ${value}.`);
182
+ }
183
+ return value;
184
+ }
185
+ function edgeKeyFromUnknown(edge) {
186
+ if (typeof edge.from !== "string" ||
187
+ typeof edge.to !== "string" ||
188
+ typeof edge.type !== "string" ||
189
+ typeof edge.source !== "string") {
190
+ return null;
191
+ }
192
+ return `${edge.from}->${edge.to}:${edge.type}:${edge.source}`;
193
+ }
194
+ function isProjectRelativeSourcePath(file) {
195
+ if (path.isAbsolute(file) || file.startsWith("/")) {
196
+ return false;
197
+ }
198
+ const normalized = path.posix.normalize(file.replace(/\\/g, "/"));
199
+ if (!normalized || normalized === "." || normalized === ".." || normalized.startsWith("../")) {
200
+ return false;
201
+ }
202
+ if (normalized.startsWith("/") || /^[a-zA-Z]:\//.test(normalized)) {
203
+ return false;
204
+ }
205
+ const firstSegment = normalized.split("/")[0];
206
+ return firstSegment !== ".frontend-harness" && firstSegment !== ".omx";
207
+ }
208
+ function isRecord(value) {
209
+ return typeof value === "object" && value !== null;
210
+ }
211
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/runtime/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type KnowledgeType = "prd_semantics" | "project_convention" | "decision_record" | "pitfall" | "glossary";
2
+ export type KnowledgeStatus = "active" | "deprecated";
3
+ export type KnowledgeStability = "stable" | "evolving";
4
+ export interface PromoteKnowledgeInput {
5
+ title?: string;
6
+ body?: string;
7
+ type?: string;
8
+ scope?: string;
9
+ status?: string;
10
+ stability?: string;
11
+ source?: string;
12
+ }
13
+ export interface KnowledgeCard {
14
+ id: string;
15
+ path: string;
16
+ title: string;
17
+ summary: string;
18
+ type: KnowledgeType;
19
+ status: KnowledgeStatus;
20
+ stability: KnowledgeStability;
21
+ scope: string[];
22
+ tags: string[];
23
+ sourcePaths: string[];
24
+ related: string[];
25
+ updatedAt: string;
26
+ searchable: string;
27
+ }
28
+ export interface PromotedKnowledge {
29
+ path: string;
30
+ id: string;
31
+ title: string;
32
+ type: KnowledgeType;
33
+ status: KnowledgeStatus;
34
+ stability: KnowledgeStability;
35
+ createdAt: string;
36
+ }
37
+ export interface KnowledgeCheckResult {
38
+ status: "passed" | "failed" | "not_configured";
39
+ knowledgeRoot: string;
40
+ cardCount: number;
41
+ activeCardCount: number;
42
+ deprecatedCardCount: number;
43
+ errors: string[];
44
+ warnings: string[];
45
+ }
46
+ export declare function promoteKnowledge(projectRoot: string, input: PromoteKnowledgeInput): PromotedKnowledge;
47
+ export declare function discoverKnowledgeCards(projectRoot: string): KnowledgeCard[];
48
+ export declare function checkKnowledge(projectRoot: string): KnowledgeCheckResult;