frontend-harness 0.2.3 → 0.3.1
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/README.md +27 -25
- package/dist/cli/index.js +8 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/runtime/builtin-skills.js +6 -13
- package/dist/runtime/builtin-skills.js.map +1 -1
- package/dist/runtime/command-taxonomy.d.ts +1 -0
- package/dist/runtime/command-taxonomy.js +6 -2
- package/dist/runtime/command-taxonomy.js.map +1 -1
- package/dist/runtime/common/naming.js +16 -1
- package/dist/runtime/common/naming.js.map +1 -1
- package/dist/runtime/context.js +2 -2
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/graph.js +5 -1
- package/dist/runtime/graph.js.map +1 -1
- package/dist/runtime/knowledge.js +12 -6
- package/dist/runtime/knowledge.js.map +1 -1
- package/dist/runtime/plan/component-resolver.js +88 -31
- package/dist/runtime/plan/component-resolver.js.map +1 -1
- package/dist/runtime/plan/guidance.js +8 -4
- package/dist/runtime/plan/guidance.js.map +1 -1
- package/dist/runtime/plan/proposal.js +4 -0
- package/dist/runtime/plan/proposal.js.map +1 -1
- package/dist/runtime/plan/workflow.js +45 -51
- package/dist/runtime/plan/workflow.js.map +1 -1
- package/dist/runtime/plan.js +101 -9
- package/dist/runtime/plan.js.map +1 -1
- package/dist/runtime/policy-provenance.js +2 -2
- package/dist/runtime/policy-provenance.js.map +1 -1
- package/dist/runtime/protocol-init.js +16 -15
- package/dist/runtime/protocol-init.js.map +1 -1
- package/dist/runtime/repair-packet.js +4 -3
- 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/state-explain.js +2 -1
- package/dist/runtime/state-explain.js.map +1 -1
- package/dist/runtime/state.d.ts +10 -0
- package/dist/runtime/state.js +86 -18
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/ui-restoration.d.ts +3 -2
- package/dist/runtime/ui-restoration.js +100 -26
- package/dist/runtime/ui-restoration.js.map +1 -1
- package/dist/runtime/units.js +25 -3
- package/dist/runtime/units.js.map +1 -1
- package/dist/runtime/verify.js +269 -3
- package/dist/runtime/verify.js.map +1 -1
- package/dist/schemas/types.d.ts +2 -0
- package/docs/DIRECTION.md +1 -1
- package/package.json +3 -5
- package/AGENTS.md +0 -60
- package/CLAUDE.md +0 -60
- package/dist/runtime/common/parsing.d.ts +0 -11
- package/dist/runtime/common/parsing.js +0 -30
- package/dist/runtime/common/parsing.js.map +0 -1
- package/dist/runtime/project-discovery.d.ts +0 -17
- package/dist/runtime/project-discovery.js +0 -174
- package/dist/runtime/project-discovery.js.map +0 -1
- package/dist/runtime/skills.d.ts +0 -19
- package/dist/runtime/skills.js +0 -230
- package/dist/runtime/skills.js.map +0 -1
- package/dist/runtime/verification-commands.d.ts +0 -11
- package/dist/runtime/verification-commands.js +0 -93
- package/dist/runtime/verification-commands.js.map +0 -1
- package/dist/storage/json.d.ts +0 -5
- package/dist/storage/json.js +0 -29
- package/dist/storage/json.js.map +0 -1
- package/dist/storage/paths.d.ts +0 -3
- package/dist/storage/paths.js +0 -9
- package/dist/storage/paths.js.map +0 -1
package/dist/runtime/skills.js
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { harnessPath } from "../storage/paths.js";
|
|
4
|
-
export function discoverSkills(projectRoot) {
|
|
5
|
-
const skillsRoot = harnessPath(projectRoot, "skills");
|
|
6
|
-
if (!isReadableDirectory(skillsRoot)) {
|
|
7
|
-
return [];
|
|
8
|
-
}
|
|
9
|
-
return listMarkdownFiles(skillsRoot)
|
|
10
|
-
.flatMap((fullPath) => {
|
|
11
|
-
const skill = describeSkill(projectRoot, fullPath);
|
|
12
|
-
return skill ? [skill] : [];
|
|
13
|
-
})
|
|
14
|
-
.sort((left, right) => left.name.localeCompare(right.name));
|
|
15
|
-
}
|
|
16
|
-
export function checkSkills(projectRoot) {
|
|
17
|
-
const skillsRoot = harnessPath(projectRoot, "skills");
|
|
18
|
-
const relativeSkillsRoot = path.relative(projectRoot, skillsRoot).split(path.sep).join(path.posix.sep);
|
|
19
|
-
if (!fs.existsSync(skillsRoot)) {
|
|
20
|
-
return {
|
|
21
|
-
status: "not_configured",
|
|
22
|
-
skillsRoot: relativeSkillsRoot,
|
|
23
|
-
skillCount: 0,
|
|
24
|
-
errors: [],
|
|
25
|
-
warnings: ["Create .frontend-harness/skills before checking project-local skills."]
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
const errors = [];
|
|
29
|
-
const warnings = [];
|
|
30
|
-
if (!isReadableDirectory(skillsRoot)) {
|
|
31
|
-
errors.push(".frontend-harness/skills must be a readable directory.");
|
|
32
|
-
}
|
|
33
|
-
const skillFiles = isReadableDirectory(skillsRoot) ? listMarkdownFiles(skillsRoot, errors) : [];
|
|
34
|
-
const names = new Set();
|
|
35
|
-
const duplicateNames = new Set();
|
|
36
|
-
for (const fullPath of skillFiles) {
|
|
37
|
-
const relativePath = path.relative(projectRoot, fullPath).split(path.sep).join(path.posix.sep);
|
|
38
|
-
const skillPath = path.relative(skillsRoot, fullPath);
|
|
39
|
-
const name = slugFromSkillPath(skillPath);
|
|
40
|
-
if (names.has(name)) {
|
|
41
|
-
duplicateNames.add(name);
|
|
42
|
-
}
|
|
43
|
-
names.add(name);
|
|
44
|
-
let content;
|
|
45
|
-
try {
|
|
46
|
-
content = fs.readFileSync(fullPath, "utf8");
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
-
errors.push(`${relativePath} cannot be read: ${message}`);
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
const title = extractTitle(content);
|
|
54
|
-
if (!title) {
|
|
55
|
-
errors.push(`${relativePath} must include a non-empty "# Title" heading.`);
|
|
56
|
-
}
|
|
57
|
-
if (!hasBodyGuidance(content)) {
|
|
58
|
-
errors.push(`${relativePath} must include non-empty body guidance after the title.`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
for (const duplicateName of duplicateNames) {
|
|
62
|
-
errors.push(`Duplicate project skill name: ${duplicateName}.`);
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
status: errors.length > 0 ? "failed" : "passed",
|
|
66
|
-
skillsRoot: relativeSkillsRoot,
|
|
67
|
-
skillCount: skillFiles.length,
|
|
68
|
-
errors,
|
|
69
|
-
warnings
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function describeSkill(projectRoot, fullPath) {
|
|
73
|
-
const relativePath = path.relative(projectRoot, fullPath).split(path.sep).join(path.posix.sep);
|
|
74
|
-
const skillsRoot = harnessPath(projectRoot, "skills");
|
|
75
|
-
const skillPath = path.relative(skillsRoot, fullPath);
|
|
76
|
-
let content;
|
|
77
|
-
try {
|
|
78
|
-
content = fs.readFileSync(fullPath, "utf8");
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const name = slugFromSkillPath(skillPath);
|
|
84
|
-
const title = extractTitle(content) ?? name;
|
|
85
|
-
const metadata = parseFrontmatter(content);
|
|
86
|
-
return {
|
|
87
|
-
name: metadata.name ?? name,
|
|
88
|
-
title: metadata.title ?? title,
|
|
89
|
-
description: metadata.description ?? extractDescription(content),
|
|
90
|
-
path: relativePath,
|
|
91
|
-
...(metadata.triggers.length ? { triggers: metadata.triggers } : {}),
|
|
92
|
-
...(metadata.intents.length ? { intents: metadata.intents } : {}),
|
|
93
|
-
...(metadata.examples.length ? { examples: metadata.examples } : {})
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
function parseFrontmatter(content) {
|
|
97
|
-
const empty = {
|
|
98
|
-
triggers: [],
|
|
99
|
-
intents: [],
|
|
100
|
-
examples: []
|
|
101
|
-
};
|
|
102
|
-
if (!content.startsWith("---\n") && !content.startsWith("---\r\n")) {
|
|
103
|
-
return empty;
|
|
104
|
-
}
|
|
105
|
-
const endIndex = content.search(/\r?\n---(?:\r?\n|$)/);
|
|
106
|
-
if (endIndex < 0) {
|
|
107
|
-
return empty;
|
|
108
|
-
}
|
|
109
|
-
const lines = content.slice(content.startsWith("---\r\n") ? 5 : 4, endIndex).split(/\r?\n/);
|
|
110
|
-
const result = {
|
|
111
|
-
triggers: [],
|
|
112
|
-
intents: [],
|
|
113
|
-
examples: []
|
|
114
|
-
};
|
|
115
|
-
let currentList = null;
|
|
116
|
-
for (const line of lines) {
|
|
117
|
-
const trimmed = line.trim();
|
|
118
|
-
if (!trimmed || trimmed.startsWith("#")) {
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
const listItem = trimmed.match(/^-\s+(.+)$/);
|
|
122
|
-
if (listItem && currentList) {
|
|
123
|
-
const value = listItem[1];
|
|
124
|
-
if (value) {
|
|
125
|
-
result[currentList].push(unquoteScalar(value));
|
|
126
|
-
}
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
const pair = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*):\s*(.*)$/);
|
|
130
|
-
if (!pair) {
|
|
131
|
-
currentList = null;
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
const key = pair[1] ?? "";
|
|
135
|
-
const value = (pair[2] ?? "").trim();
|
|
136
|
-
if (key === "name" || key === "title" || key === "description") {
|
|
137
|
-
result[key] = unquoteScalar(value);
|
|
138
|
-
currentList = null;
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (key === "triggers" || key === "intents" || key === "examples") {
|
|
142
|
-
result[key] = parseListValue(value);
|
|
143
|
-
currentList = value ? null : key;
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
currentList = null;
|
|
147
|
-
}
|
|
148
|
-
return result;
|
|
149
|
-
}
|
|
150
|
-
function parseListValue(value) {
|
|
151
|
-
if (!value) {
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
const inline = value.match(/^\[(.*)\]$/);
|
|
155
|
-
if (!inline) {
|
|
156
|
-
return [unquoteScalar(value)];
|
|
157
|
-
}
|
|
158
|
-
return (inline[1] ?? "")
|
|
159
|
-
.split(",")
|
|
160
|
-
.map((item) => unquoteScalar(item.trim()))
|
|
161
|
-
.filter(Boolean);
|
|
162
|
-
}
|
|
163
|
-
function unquoteScalar(value) {
|
|
164
|
-
return value.replace(/^["']|["']$/g, "").trim();
|
|
165
|
-
}
|
|
166
|
-
function extractTitle(content) {
|
|
167
|
-
const line = content.split("\n").find((item) => item.startsWith("# "));
|
|
168
|
-
return line ? line.replace(/^#\s+/, "").trim() || null : null;
|
|
169
|
-
}
|
|
170
|
-
function extractDescription(content) {
|
|
171
|
-
const lines = content.split("\n");
|
|
172
|
-
const titleIndex = lines.findIndex((line) => line.startsWith("# "));
|
|
173
|
-
const body = lines
|
|
174
|
-
.slice(titleIndex >= 0 ? titleIndex + 1 : 0)
|
|
175
|
-
.map((line) => line.trim())
|
|
176
|
-
.find((line) => line && !line.startsWith("#") && !line.startsWith("- "));
|
|
177
|
-
return body ?? null;
|
|
178
|
-
}
|
|
179
|
-
function hasBodyGuidance(content) {
|
|
180
|
-
const lines = content.split("\n");
|
|
181
|
-
const titleIndex = lines.findIndex((line) => line.startsWith("# "));
|
|
182
|
-
return lines
|
|
183
|
-
.slice(titleIndex >= 0 ? titleIndex + 1 : 0)
|
|
184
|
-
.some((line) => {
|
|
185
|
-
const trimmed = line.trim();
|
|
186
|
-
return trimmed && !trimmed.startsWith("#");
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
function isReadableDirectory(directory) {
|
|
190
|
-
try {
|
|
191
|
-
return fs.statSync(directory).isDirectory();
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
function slugFromSkillPath(skillPath) {
|
|
198
|
-
const parsed = path.parse(skillPath);
|
|
199
|
-
const parts = skillPath.split(path.sep);
|
|
200
|
-
const nameParts = parsed.name.toLowerCase() === "skill"
|
|
201
|
-
? parts.slice(0, -1)
|
|
202
|
-
: [...parts.slice(0, -1), parsed.name];
|
|
203
|
-
return nameParts.join("-")
|
|
204
|
-
.toLowerCase()
|
|
205
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
206
|
-
.replace(/^-+|-+$/g, "") || "skill";
|
|
207
|
-
}
|
|
208
|
-
function listMarkdownFiles(directory, errors) {
|
|
209
|
-
try {
|
|
210
|
-
return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
|
|
211
|
-
const fullPath = path.join(directory, entry.name);
|
|
212
|
-
if (entry.isDirectory()) {
|
|
213
|
-
if (entry.name.startsWith(".")) {
|
|
214
|
-
return [];
|
|
215
|
-
}
|
|
216
|
-
return listMarkdownFiles(fullPath, errors);
|
|
217
|
-
}
|
|
218
|
-
return entry.name.endsWith(".md") ? [fullPath] : [];
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
catch (error) {
|
|
222
|
-
if (errors) {
|
|
223
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
224
|
-
errors.push(`Cannot read .frontend-harness/skills: ${message}`);
|
|
225
|
-
return [];
|
|
226
|
-
}
|
|
227
|
-
return [];
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
//# sourceMappingURL=skills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/runtime/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const defaultVerificationCommandNames: readonly ["typecheck", "test", "build"];
|
|
2
|
-
export type DefaultVerificationCommandName = typeof defaultVerificationCommandNames[number];
|
|
3
|
-
export type VerificationCommandName = DefaultVerificationCommandName | string;
|
|
4
|
-
export type VerificationCommandSource = "flag" | "config" | "package" | "none";
|
|
5
|
-
export type VerificationCommandOverrides = Partial<Record<DefaultVerificationCommandName, string>>;
|
|
6
|
-
export interface VerificationCommandDiscovery {
|
|
7
|
-
name: VerificationCommandName;
|
|
8
|
-
source: VerificationCommandSource;
|
|
9
|
-
command: string | null;
|
|
10
|
-
}
|
|
11
|
-
export declare function discoverVerificationCommands(projectRoot: string, overrides?: VerificationCommandOverrides): VerificationCommandDiscovery[];
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { harnessPath } from "../storage/paths.js";
|
|
4
|
-
import { readJson } from "../storage/json.js";
|
|
5
|
-
import { isRecord } from "./common/parsing.js";
|
|
6
|
-
export const defaultVerificationCommandNames = ["typecheck", "test", "build"];
|
|
7
|
-
export function discoverVerificationCommands(projectRoot, overrides = {}) {
|
|
8
|
-
const config = readJson(harnessPath(projectRoot, "config.json")) ?? {};
|
|
9
|
-
const scripts = readPackageScripts(projectRoot);
|
|
10
|
-
const commands = defaultVerificationCommandNames.map((name) => {
|
|
11
|
-
const overrideCommand = overrides[name];
|
|
12
|
-
if (overrideCommand) {
|
|
13
|
-
return {
|
|
14
|
-
name,
|
|
15
|
-
source: "flag",
|
|
16
|
-
command: overrideCommand
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
const configCommand = config.verification?.[name];
|
|
20
|
-
if (configCommand) {
|
|
21
|
-
return {
|
|
22
|
-
name,
|
|
23
|
-
source: "config",
|
|
24
|
-
command: configCommand
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
if (scripts[name]) {
|
|
28
|
-
return {
|
|
29
|
-
name,
|
|
30
|
-
source: "package",
|
|
31
|
-
command: `npm run ${name}`
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
name,
|
|
36
|
-
source: "none",
|
|
37
|
-
command: null
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
const customCommands = readCustomConfigCommands(config);
|
|
41
|
-
const defaultNames = new Set(defaultVerificationCommandNames);
|
|
42
|
-
const configuredNames = new Set(commands.map((entry) => entry.name));
|
|
43
|
-
for (const customCommand of customCommands) {
|
|
44
|
-
if (defaultNames.has(customCommand.name) || configuredNames.has(customCommand.name)) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
commands.push(customCommand);
|
|
48
|
-
configuredNames.add(customCommand.name);
|
|
49
|
-
}
|
|
50
|
-
return commands;
|
|
51
|
-
}
|
|
52
|
-
function readCustomConfigCommands(config) {
|
|
53
|
-
if (!Array.isArray(config.verification?.commands)) {
|
|
54
|
-
return [];
|
|
55
|
-
}
|
|
56
|
-
const commands = [];
|
|
57
|
-
const names = new Set();
|
|
58
|
-
for (const entry of config.verification.commands) {
|
|
59
|
-
if (!isRecord(entry)) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
const name = typeof entry["name"] === "string" ? entry["name"].trim() : "";
|
|
63
|
-
const command = typeof entry["command"] === "string" ? entry["command"].trim() : "";
|
|
64
|
-
if (!isValidCommandName(name) || !command || names.has(name)) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
commands.push({
|
|
68
|
-
name,
|
|
69
|
-
source: "config",
|
|
70
|
-
command
|
|
71
|
-
});
|
|
72
|
-
names.add(name);
|
|
73
|
-
}
|
|
74
|
-
return commands;
|
|
75
|
-
}
|
|
76
|
-
function readPackageScripts(projectRoot) {
|
|
77
|
-
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
78
|
-
if (!fs.existsSync(packageJsonPath)) {
|
|
79
|
-
return {};
|
|
80
|
-
}
|
|
81
|
-
let packageJson;
|
|
82
|
-
try {
|
|
83
|
-
packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return {};
|
|
87
|
-
}
|
|
88
|
-
return packageJson.scripts ?? {};
|
|
89
|
-
}
|
|
90
|
-
function isValidCommandName(value) {
|
|
91
|
-
return /^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,79}$/.test(value);
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=verification-commands.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verification-commands.js","sourceRoot":"","sources":["../../src/runtime/verification-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/json.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export declare function ensureDir(dir: string): void;
|
|
2
|
-
export declare function writeJson(filePath: string, value: unknown): void;
|
|
3
|
-
export declare function writeJsonExclusive(filePath: string, value: unknown): void;
|
|
4
|
-
export declare function readJson<T>(filePath: string): T | null;
|
|
5
|
-
export declare function writeText(filePath: string, value: string): void;
|
package/dist/storage/json.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export function ensureDir(dir) {
|
|
4
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
5
|
-
}
|
|
6
|
-
export function writeJson(filePath, value) {
|
|
7
|
-
ensureDir(path.dirname(filePath));
|
|
8
|
-
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
9
|
-
}
|
|
10
|
-
export function writeJsonExclusive(filePath, value) {
|
|
11
|
-
ensureDir(path.dirname(filePath));
|
|
12
|
-
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
|
|
13
|
-
}
|
|
14
|
-
export function readJson(filePath) {
|
|
15
|
-
if (!fs.existsSync(filePath)) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export function writeText(filePath, value) {
|
|
26
|
-
ensureDir(path.dirname(filePath));
|
|
27
|
-
fs.writeFileSync(filePath, value, "utf8");
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=json.js.map
|
package/dist/storage/json.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAc;IACxD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IACjE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAa;IACvD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/storage/paths.d.ts
DELETED
package/dist/storage/paths.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
export const HARNESS_DIR = ".frontend-harness";
|
|
3
|
-
export function harnessPath(projectRoot, ...parts) {
|
|
4
|
-
return path.join(projectRoot, HARNESS_DIR, ...parts);
|
|
5
|
-
}
|
|
6
|
-
export function relativeHarnessPath(...parts) {
|
|
7
|
-
return path.posix.join(HARNESS_DIR, ...parts);
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=paths.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,GAAG,KAAe;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAG,KAAe;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC;AAChD,CAAC"}
|