humanish 0.0.1 → 0.15.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/AGENTS.md +77 -0
- package/CONTRIBUTING.md +39 -0
- package/LICENSE +21 -0
- package/README.md +437 -8
- package/SECURITY.md +34 -0
- package/dist/actor-contract.d.ts +107 -0
- package/dist/actor-contract.js +286 -0
- package/dist/actor-contract.js.map +1 -0
- package/dist/actor-registry.d.ts +73 -0
- package/dist/actor-registry.js +93 -0
- package/dist/actor-registry.js.map +1 -0
- package/dist/adapter-extension.d.ts +54 -0
- package/dist/adapter-extension.js +214 -0
- package/dist/adapter-extension.js.map +1 -0
- package/dist/argv.d.ts +1 -0
- package/dist/argv.js +8 -0
- package/dist/argv.js.map +1 -0
- package/dist/artifact-reference.d.ts +22 -0
- package/dist/artifact-reference.js +47 -0
- package/dist/artifact-reference.js.map +1 -0
- package/dist/browser-evidence-hygiene.d.ts +7 -0
- package/dist/browser-evidence-hygiene.js +40 -0
- package/dist/browser-evidence-hygiene.js.map +1 -0
- package/dist/claude-agent-sdk.d.ts +94 -0
- package/dist/claude-agent-sdk.js +363 -0
- package/dist/claude-agent-sdk.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-app-server-ui.d.ts +39 -0
- package/dist/codex-app-server-ui.js +357 -0
- package/dist/codex-app-server-ui.js.map +1 -0
- package/dist/codex-app-server.d.ts +144 -0
- package/dist/codex-app-server.js +754 -0
- package/dist/codex-app-server.js.map +1 -0
- package/dist/command-failure.d.ts +29 -0
- package/dist/command-failure.js +54 -0
- package/dist/command-failure.js.map +1 -0
- package/dist/computer-use-actor.d.ts +52 -0
- package/dist/computer-use-actor.js +48 -0
- package/dist/computer-use-actor.js.map +1 -0
- package/dist/computer-use.d.ts +232 -0
- package/dist/computer-use.js +615 -0
- package/dist/computer-use.js.map +1 -0
- package/dist/concurrency.d.ts +1 -0
- package/dist/concurrency.js +27 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/concurrent-shared-world-lab.d.ts +115 -0
- package/dist/concurrent-shared-world-lab.js +1094 -0
- package/dist/concurrent-shared-world-lab.js.map +1 -0
- package/dist/core/git-state.d.ts +33 -0
- package/dist/core/git-state.js +277 -0
- package/dist/core/git-state.js.map +1 -0
- package/dist/core/git-workspace.d.ts +31 -0
- package/dist/core/git-workspace.js +447 -0
- package/dist/core/git-workspace.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/run-primitives.d.ts +66 -0
- package/dist/core/run-primitives.js +120 -0
- package/dist/core/run-primitives.js.map +1 -0
- package/dist/cua-actor-lab.d.ts +621 -0
- package/dist/cua-actor-lab.js +2845 -0
- package/dist/cua-actor-lab.js.map +1 -0
- package/dist/device-presets.d.ts +67 -0
- package/dist/device-presets.js +50 -0
- package/dist/device-presets.js.map +1 -0
- package/dist/e2b-desktop-executor.d.ts +101 -0
- package/dist/e2b-desktop-executor.js +309 -0
- package/dist/e2b-desktop-executor.js.map +1 -0
- package/dist/e2b-desktop-launch.d.ts +144 -0
- package/dist/e2b-desktop-launch.js +59 -0
- package/dist/e2b-desktop-launch.js.map +1 -0
- package/dist/e2b-detached.d.ts +53 -0
- package/dist/e2b-detached.js +130 -0
- package/dist/e2b-detached.js.map +1 -0
- package/dist/e2b-terminal-lab.d.ts +345 -0
- package/dist/e2b-terminal-lab.js +1532 -0
- package/dist/e2b-terminal-lab.js.map +1 -0
- package/dist/env-file.d.ts +14 -0
- package/dist/env-file.js +108 -0
- package/dist/env-file.js.map +1 -0
- package/dist/feedback.d.ts +51 -0
- package/dist/feedback.js +351 -0
- package/dist/feedback.js.map +1 -0
- package/dist/image-evidence.d.ts +2 -0
- package/dist/image-evidence.js +33 -0
- package/dist/image-evidence.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/init-templates.d.ts +12 -0
- package/dist/init-templates.js +369 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.d.ts +26 -0
- package/dist/init.js +429 -0
- package/dist/init.js.map +1 -0
- package/dist/lab-app-runner.d.ts +78 -0
- package/dist/lab-app-runner.js +403 -0
- package/dist/lab-app-runner.js.map +1 -0
- package/dist/lab-config.d.ts +583 -0
- package/dist/lab-config.js +1789 -0
- package/dist/lab-config.js.map +1 -0
- package/dist/lab-engine.d.ts +77 -0
- package/dist/lab-engine.js +216 -0
- package/dist/lab-engine.js.map +1 -0
- package/dist/lab-preflight.d.ts +67 -0
- package/dist/lab-preflight.js +385 -0
- package/dist/lab-preflight.js.map +1 -0
- package/dist/labs.d.ts +53 -0
- package/dist/labs.js +382 -0
- package/dist/labs.js.map +1 -0
- package/dist/observer-assets.d.ts +2 -0
- package/dist/observer-assets.js +2630 -0
- package/dist/observer-assets.js.map +1 -0
- package/dist/observer-data.d.ts +63 -0
- package/dist/observer-data.js +145 -0
- package/dist/observer-data.js.map +1 -0
- package/dist/observer-static.d.ts +39 -0
- package/dist/observer-static.js +306 -0
- package/dist/observer-static.js.map +1 -0
- package/dist/observer.d.ts +46 -0
- package/dist/observer.js +550 -0
- package/dist/observer.js.map +1 -0
- package/dist/openai-responses-cu.d.ts +113 -0
- package/dist/openai-responses-cu.js +545 -0
- package/dist/openai-responses-cu.js.map +1 -0
- package/dist/oss-lab.d.ts +52 -0
- package/dist/oss-lab.js +344 -0
- package/dist/oss-lab.js.map +1 -0
- package/dist/oss-meta-lab-scoring.d.ts +15 -0
- package/dist/oss-meta-lab-scoring.js +145 -0
- package/dist/oss-meta-lab-scoring.js.map +1 -0
- package/dist/oss-meta-lab.d.ts +277 -0
- package/dist/oss-meta-lab.js +4529 -0
- package/dist/oss-meta-lab.js.map +1 -0
- package/dist/oss-remote-telemetry.d.ts +77 -0
- package/dist/oss-remote-telemetry.js +403 -0
- package/dist/oss-remote-telemetry.js.map +1 -0
- package/dist/persona.d.ts +35 -0
- package/dist/persona.js +133 -0
- package/dist/persona.js.map +1 -0
- package/dist/pi-agent-core.d.ts +77 -0
- package/dist/pi-agent-core.js +203 -0
- package/dist/pi-agent-core.js.map +1 -0
- package/dist/program.d.ts +54 -0
- package/dist/program.js +2349 -0
- package/dist/program.js.map +1 -0
- package/dist/redaction.d.ts +90 -0
- package/dist/redaction.js +292 -0
- package/dist/redaction.js.map +1 -0
- package/dist/run-paths.d.ts +56 -0
- package/dist/run-paths.js +340 -0
- package/dist/run-paths.js.map +1 -0
- package/dist/run.d.ts +794 -0
- package/dist/run.js +4844 -0
- package/dist/run.js.map +1 -0
- package/dist/scripted-browser-actor.d.ts +297 -0
- package/dist/scripted-browser-actor.js +1399 -0
- package/dist/scripted-browser-actor.js.map +1 -0
- package/dist/scripted-browser-lab.d.ts +107 -0
- package/dist/scripted-browser-lab.js +788 -0
- package/dist/scripted-browser-lab.js.map +1 -0
- package/dist/selected-output-paths.d.ts +49 -0
- package/dist/selected-output-paths.js +354 -0
- package/dist/selected-output-paths.js.map +1 -0
- package/dist/shared-world-lab.d.ts +208 -0
- package/dist/shared-world-lab.js +1049 -0
- package/dist/shared-world-lab.js.map +1 -0
- package/dist/source-archive.d.ts +82 -0
- package/dist/source-archive.js +408 -0
- package/dist/source-archive.js.map +1 -0
- package/dist/stop-conditions.d.ts +26 -0
- package/dist/stop-conditions.js +66 -0
- package/dist/stop-conditions.js.map +1 -0
- package/dist/terminal-agent-actor.d.ts +36 -0
- package/dist/terminal-agent-actor.js +23 -0
- package/dist/terminal-agent-actor.js.map +1 -0
- package/docs/architecture/actor-contract.md +431 -0
- package/docs/architecture/github-feedback-loop.md +189 -0
- package/docs/architecture/local-codex-tui-actor.md +213 -0
- package/docs/architecture/observer.md +118 -0
- package/docs/architecture/oss-lab-poc.md +250 -0
- package/docs/architecture/project-layout.md +166 -0
- package/docs/architecture/state-driven-executor.md +203 -0
- package/docs/architecture/terminal-product-lane.md +148 -0
- package/docs/contracts/adapter-fixtures.md +80 -0
- package/docs/contracts/core.md +71 -0
- package/docs/contracts/feedback.md +145 -0
- package/docs/contracts/policy.md +311 -0
- package/docs/contracts/run-bundle.md +358 -0
- package/docs/contracts/schemas.md +984 -0
- package/docs/goals/current.md +428 -0
- package/docs/principles/invariants-and-defaults.md +135 -0
- package/docs/principles/self-driving-harness.md +129 -0
- package/docs/product/open-source-install-experience.md +237 -0
- package/docs/ramp/README.md +207 -0
- package/docs/release/open-source-readiness.md +208 -0
- package/docs/release/public-readiness-standard.md +205 -0
- package/docs/roadmap/world-class-open-source-v0.md +311 -0
- package/package.json +102 -8
- package/skills/humanish/SKILL.md +244 -0
- package/skills/humanish/agents/openai.yaml +7 -0
- package/index.js +0 -1
package/dist/init.js
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { lstat, realpath, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { humanishScripts, runtimeDirectories, starterFiles } from "./init-templates.js";
|
|
4
|
+
import { assertPreparedSelectedOutputDirectory, prepareContainedOutputDirectory, prepareSelectedOutputDirectory, readContainedRegularFile, writeContainedOutputFile } from "./selected-output-paths.js";
|
|
5
|
+
export const INIT_RESPONSE_SCHEMA = "humanish.init-result.v1";
|
|
6
|
+
export async function runInit(options) {
|
|
7
|
+
const requestedCwd = path.resolve(options.cwd);
|
|
8
|
+
const mode = getMode(options);
|
|
9
|
+
const warnings = [];
|
|
10
|
+
const changes = [];
|
|
11
|
+
const writes = [];
|
|
12
|
+
const dirs = [];
|
|
13
|
+
const cwdCheck = await validateCwd(requestedCwd);
|
|
14
|
+
if (cwdCheck) {
|
|
15
|
+
return {
|
|
16
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
17
|
+
ok: false,
|
|
18
|
+
mode,
|
|
19
|
+
cwd: requestedCwd,
|
|
20
|
+
changes,
|
|
21
|
+
warnings,
|
|
22
|
+
error: cwdCheck
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const cwd = await realpath(requestedCwd);
|
|
26
|
+
const preparedProjectRoot = await prepareSelectedOutputDirectory(path.dirname(cwd), cwd);
|
|
27
|
+
const initialPathCheck = await validateInitProjectPaths(cwd);
|
|
28
|
+
if (initialPathCheck) {
|
|
29
|
+
return {
|
|
30
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
31
|
+
ok: false,
|
|
32
|
+
mode,
|
|
33
|
+
cwd: requestedCwd,
|
|
34
|
+
changes,
|
|
35
|
+
warnings,
|
|
36
|
+
error: initialPathCheck
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
for (const file of starterFiles) {
|
|
40
|
+
const absolutePath = path.join(cwd, file.path);
|
|
41
|
+
const existing = await readTextIfExists(preparedProjectRoot, file.path);
|
|
42
|
+
if (existing === null) {
|
|
43
|
+
changes.push({
|
|
44
|
+
path: file.path,
|
|
45
|
+
action: "create",
|
|
46
|
+
target: file.plane,
|
|
47
|
+
reason: "public-safe starter file"
|
|
48
|
+
});
|
|
49
|
+
writes.push({
|
|
50
|
+
absolutePath,
|
|
51
|
+
relativePath: file.path,
|
|
52
|
+
contents: file.contents,
|
|
53
|
+
target: file.plane
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else if (existing === file.contents) {
|
|
57
|
+
changes.push({
|
|
58
|
+
path: file.path,
|
|
59
|
+
action: "skip",
|
|
60
|
+
target: file.plane,
|
|
61
|
+
reason: "already matches starter"
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
changes.push({
|
|
66
|
+
path: file.path,
|
|
67
|
+
action: "skip",
|
|
68
|
+
target: file.plane,
|
|
69
|
+
reason: "existing file would not be overwritten"
|
|
70
|
+
});
|
|
71
|
+
warnings.push(`Skipped existing ${file.path}; Humanish never overwrites user files during init.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const directory of runtimeDirectories) {
|
|
75
|
+
const absolutePath = path.join(cwd, directory.path);
|
|
76
|
+
const exists = await pathExists(preparedProjectRoot, directory.path);
|
|
77
|
+
changes.push({
|
|
78
|
+
path: directory.path,
|
|
79
|
+
action: exists ? "skip" : "mkdir",
|
|
80
|
+
target: directory.plane,
|
|
81
|
+
reason: exists ? "already exists" : "ignored runtime directory"
|
|
82
|
+
});
|
|
83
|
+
if (!exists) {
|
|
84
|
+
dirs.push({ absolutePath, relativePath: directory.path });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const gitignorePlan = await planGitignore(preparedProjectRoot, cwd);
|
|
88
|
+
changes.push(gitignorePlan.change);
|
|
89
|
+
if (gitignorePlan.write) {
|
|
90
|
+
writes.push(gitignorePlan.write);
|
|
91
|
+
}
|
|
92
|
+
const packagePlan = await planPackageJson(preparedProjectRoot, cwd);
|
|
93
|
+
changes.push(packagePlan.change);
|
|
94
|
+
warnings.push(...packagePlan.warnings);
|
|
95
|
+
if (packagePlan.error) {
|
|
96
|
+
return {
|
|
97
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
98
|
+
ok: false,
|
|
99
|
+
mode,
|
|
100
|
+
cwd: requestedCwd,
|
|
101
|
+
changes,
|
|
102
|
+
warnings,
|
|
103
|
+
error: packagePlan.error
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (packagePlan.write) {
|
|
107
|
+
writes.push(packagePlan.write);
|
|
108
|
+
}
|
|
109
|
+
if (mode === "needs-confirmation") {
|
|
110
|
+
return {
|
|
111
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
112
|
+
ok: false,
|
|
113
|
+
mode,
|
|
114
|
+
cwd: requestedCwd,
|
|
115
|
+
changes,
|
|
116
|
+
warnings,
|
|
117
|
+
error: {
|
|
118
|
+
code: "HUMANISH_CONFIRMATION_REQUIRED",
|
|
119
|
+
message: "Re-run with --dry-run to inspect or --yes to apply safe generated changes."
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (mode === "applied") {
|
|
124
|
+
await assertPreparedSelectedOutputDirectory(preparedProjectRoot);
|
|
125
|
+
const applyPathCheck = await validateInitProjectPaths(cwd);
|
|
126
|
+
if (applyPathCheck) {
|
|
127
|
+
return {
|
|
128
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
129
|
+
ok: false,
|
|
130
|
+
mode,
|
|
131
|
+
cwd: requestedCwd,
|
|
132
|
+
changes,
|
|
133
|
+
warnings,
|
|
134
|
+
error: applyPathCheck
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
for (const directory of dirs) {
|
|
138
|
+
await prepareContainedOutputDirectory(preparedProjectRoot, directory.relativePath);
|
|
139
|
+
}
|
|
140
|
+
for (const write of writes) {
|
|
141
|
+
await writeContainedOutputFile(preparedProjectRoot, write.relativePath, write.contents, "utf8");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
schema: INIT_RESPONSE_SCHEMA,
|
|
146
|
+
ok: true,
|
|
147
|
+
mode,
|
|
148
|
+
cwd: requestedCwd,
|
|
149
|
+
changes,
|
|
150
|
+
warnings
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async function validateInitProjectPaths(cwd) {
|
|
154
|
+
const targets = [
|
|
155
|
+
...starterFiles.map((file) => ({ path: file.path, kind: "file" })),
|
|
156
|
+
...runtimeDirectories.map((directory) => ({ path: directory.path, kind: "directory" })),
|
|
157
|
+
{ path: ".gitignore", kind: "file" },
|
|
158
|
+
{ path: "package.json", kind: "file" }
|
|
159
|
+
];
|
|
160
|
+
for (const targetSpec of targets) {
|
|
161
|
+
const relativePath = targetSpec.path;
|
|
162
|
+
const target = path.resolve(cwd, relativePath);
|
|
163
|
+
if (!isPathInside(cwd, target)) {
|
|
164
|
+
return unsafeProjectPath(relativePath);
|
|
165
|
+
}
|
|
166
|
+
const parts = path.relative(cwd, target).split(path.sep).filter(Boolean);
|
|
167
|
+
let current = cwd;
|
|
168
|
+
for (const [index, part] of parts.entries()) {
|
|
169
|
+
current = path.join(current, part);
|
|
170
|
+
try {
|
|
171
|
+
const stats = await lstat(current);
|
|
172
|
+
const isLeaf = index === parts.length - 1;
|
|
173
|
+
if (stats.isSymbolicLink()
|
|
174
|
+
|| (!isLeaf && !stats.isDirectory())
|
|
175
|
+
|| (isLeaf && targetSpec.kind === "file" && (!stats.isFile() || stats.nlink > 1))
|
|
176
|
+
|| (isLeaf && targetSpec.kind === "directory" && !stats.isDirectory())) {
|
|
177
|
+
return unsafeProjectPath(relativePath);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
return unsafeProjectPath(relativePath);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
function unsafeProjectPath(relativePath) {
|
|
191
|
+
return {
|
|
192
|
+
code: "HUMANISH_UNSAFE_PROJECT_PATH",
|
|
193
|
+
message: `Init target must stay inside the project, use the expected regular-file or directory kind, and not traverse symbolic links or hardlinked files: ${relativePath}`
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function getMode(options) {
|
|
197
|
+
if (options.dryRun) {
|
|
198
|
+
return "dry-run";
|
|
199
|
+
}
|
|
200
|
+
if (options.yes) {
|
|
201
|
+
return "applied";
|
|
202
|
+
}
|
|
203
|
+
return "needs-confirmation";
|
|
204
|
+
}
|
|
205
|
+
async function planGitignore(projectRoot, cwd) {
|
|
206
|
+
const relativePath = ".gitignore";
|
|
207
|
+
const absolutePath = path.join(cwd, relativePath);
|
|
208
|
+
const existing = await readTextIfExists(projectRoot, relativePath);
|
|
209
|
+
const currentLines = existing?.split(/\r?\n/) ?? [];
|
|
210
|
+
const envIndex = currentLines.lastIndexOf(".env*");
|
|
211
|
+
const envExampleIndex = currentLines.lastIndexOf("!.env.example");
|
|
212
|
+
const needsEnv = envIndex === -1;
|
|
213
|
+
const needsEnvExample = envExampleIndex === -1
|
|
214
|
+
|| (envIndex !== -1 && envExampleIndex < envIndex)
|
|
215
|
+
|| needsEnv;
|
|
216
|
+
const missingLines = [
|
|
217
|
+
...(currentLines.includes(".humanish/") ? [] : [".humanish/"]),
|
|
218
|
+
...(needsEnv ? [".env*"] : []),
|
|
219
|
+
...(needsEnvExample ? ["!.env.example"] : [])
|
|
220
|
+
];
|
|
221
|
+
if (missingLines.length === 0) {
|
|
222
|
+
return {
|
|
223
|
+
change: {
|
|
224
|
+
path: relativePath,
|
|
225
|
+
action: "skip",
|
|
226
|
+
target: "gitignore",
|
|
227
|
+
reason: "already ignores Humanish runtime and env files"
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const prefix = existing && existing.trim().length > 0
|
|
232
|
+
? trimTrailingNewlines(existing) + "\n\n"
|
|
233
|
+
: "";
|
|
234
|
+
const contents = `${prefix}# Humanish runtime and local secrets\n${missingLines.join("\n")}\n`;
|
|
235
|
+
return {
|
|
236
|
+
write: {
|
|
237
|
+
absolutePath,
|
|
238
|
+
relativePath,
|
|
239
|
+
contents,
|
|
240
|
+
target: "gitignore"
|
|
241
|
+
},
|
|
242
|
+
change: {
|
|
243
|
+
path: relativePath,
|
|
244
|
+
action: existing === null ? "create" : "update",
|
|
245
|
+
target: "gitignore",
|
|
246
|
+
reason: `add ${missingLines.join(", ")}`
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
async function planPackageJson(projectRoot, cwd) {
|
|
251
|
+
const relativePath = "package.json";
|
|
252
|
+
const absolutePath = path.join(cwd, relativePath);
|
|
253
|
+
const existing = await readTextIfExists(projectRoot, relativePath);
|
|
254
|
+
if (existing === null) {
|
|
255
|
+
return {
|
|
256
|
+
change: {
|
|
257
|
+
path: relativePath,
|
|
258
|
+
action: "skip",
|
|
259
|
+
target: "package-json",
|
|
260
|
+
reason: "package.json not found"
|
|
261
|
+
},
|
|
262
|
+
warnings: ["Skipped package.json scripts because package.json was not found."]
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
let parsed;
|
|
266
|
+
try {
|
|
267
|
+
parsed = JSON.parse(existing);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return {
|
|
271
|
+
change: {
|
|
272
|
+
path: relativePath,
|
|
273
|
+
action: "skip",
|
|
274
|
+
target: "package-json",
|
|
275
|
+
reason: "package.json is not valid JSON"
|
|
276
|
+
},
|
|
277
|
+
warnings: ["package.json is not valid JSON; init did not apply partial changes."],
|
|
278
|
+
error: {
|
|
279
|
+
code: "HUMANISH_INVALID_PACKAGE_JSON",
|
|
280
|
+
message: "package.json is not valid JSON. Fix it before running humanish init."
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
if (!isRecord(parsed)) {
|
|
285
|
+
return {
|
|
286
|
+
change: {
|
|
287
|
+
path: relativePath,
|
|
288
|
+
action: "skip",
|
|
289
|
+
target: "package-json",
|
|
290
|
+
reason: "package.json root is not an object"
|
|
291
|
+
},
|
|
292
|
+
warnings: ["package.json root is not an object; init did not apply partial changes."],
|
|
293
|
+
error: {
|
|
294
|
+
code: "HUMANISH_INVALID_PACKAGE_JSON",
|
|
295
|
+
message: "package.json root must be an object. Fix it before running humanish init."
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const scripts = isRecord(parsed.scripts) ? { ...parsed.scripts } : {};
|
|
300
|
+
const missingScripts = {};
|
|
301
|
+
const conflictingScripts = [];
|
|
302
|
+
for (const [name, command] of Object.entries(humanishScripts)) {
|
|
303
|
+
const existingScript = scripts[name];
|
|
304
|
+
if (existingScript === undefined) {
|
|
305
|
+
missingScripts[name] = command;
|
|
306
|
+
}
|
|
307
|
+
else if (existingScript !== command) {
|
|
308
|
+
conflictingScripts.push(name);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (conflictingScripts.length > 0 && Object.keys(missingScripts).length === 0) {
|
|
312
|
+
return {
|
|
313
|
+
change: {
|
|
314
|
+
path: relativePath,
|
|
315
|
+
action: "skip",
|
|
316
|
+
target: "package-json",
|
|
317
|
+
reason: `existing script conflicts: ${conflictingScripts.join(", ")}`
|
|
318
|
+
},
|
|
319
|
+
warnings: [
|
|
320
|
+
`Skipped package.json script patch because these scripts already exist with different values: ${conflictingScripts.join(", ")}.`
|
|
321
|
+
]
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
if (Object.keys(missingScripts).length === 0) {
|
|
325
|
+
return {
|
|
326
|
+
change: {
|
|
327
|
+
path: relativePath,
|
|
328
|
+
action: "skip",
|
|
329
|
+
target: "package-json",
|
|
330
|
+
reason: "Humanish scripts already present"
|
|
331
|
+
},
|
|
332
|
+
warnings: []
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
parsed.scripts = {
|
|
336
|
+
...scripts,
|
|
337
|
+
...missingScripts
|
|
338
|
+
};
|
|
339
|
+
const warnings = conflictingScripts.length === 0
|
|
340
|
+
? []
|
|
341
|
+
: [
|
|
342
|
+
`Preserved existing script values for conflicting scripts: ${conflictingScripts.join(", ")}.`
|
|
343
|
+
];
|
|
344
|
+
return {
|
|
345
|
+
write: {
|
|
346
|
+
absolutePath,
|
|
347
|
+
relativePath,
|
|
348
|
+
contents: `${JSON.stringify(parsed, null, 2)}\n`,
|
|
349
|
+
target: "package-json"
|
|
350
|
+
},
|
|
351
|
+
change: {
|
|
352
|
+
path: relativePath,
|
|
353
|
+
action: "update",
|
|
354
|
+
target: "package-json",
|
|
355
|
+
reason: `add scripts: ${Object.keys(missingScripts).join(", ")}`
|
|
356
|
+
},
|
|
357
|
+
warnings
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
async function readTextIfExists(projectRoot, relativePath) {
|
|
361
|
+
const bytes = await readContainedRegularFile(projectRoot, relativePath);
|
|
362
|
+
if (bytes !== null) {
|
|
363
|
+
return bytes.toString("utf8");
|
|
364
|
+
}
|
|
365
|
+
const target = path.join(projectRoot.physicalPath, relativePath);
|
|
366
|
+
try {
|
|
367
|
+
await lstat(target);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
throw new Error(unsafeProjectPath(relativePath).message);
|
|
376
|
+
}
|
|
377
|
+
async function pathExists(projectRoot, relativePath) {
|
|
378
|
+
await assertPreparedSelectedOutputDirectory(projectRoot);
|
|
379
|
+
const filePath = path.join(projectRoot.physicalPath, relativePath);
|
|
380
|
+
try {
|
|
381
|
+
const stats = await lstat(filePath);
|
|
382
|
+
if (stats.isSymbolicLink() || !stats.isDirectory()) {
|
|
383
|
+
throw new Error(unsafeProjectPath(relativePath).message);
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
async function validateCwd(cwd) {
|
|
395
|
+
try {
|
|
396
|
+
const stats = await stat(cwd);
|
|
397
|
+
if (!stats.isDirectory()) {
|
|
398
|
+
return {
|
|
399
|
+
code: "HUMANISH_INVALID_CWD",
|
|
400
|
+
message: `Target cwd is not a directory: ${cwd}`
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
407
|
+
return {
|
|
408
|
+
code: "HUMANISH_INVALID_CWD",
|
|
409
|
+
message: `Target cwd does not exist: ${cwd}`
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
throw error;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function trimTrailingNewlines(text) {
|
|
416
|
+
return text.replace(/\n+$/, "");
|
|
417
|
+
}
|
|
418
|
+
function isRecord(value) {
|
|
419
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
420
|
+
}
|
|
421
|
+
function isPathInside(root, candidate) {
|
|
422
|
+
const relative = path.relative(root, candidate);
|
|
423
|
+
return relative === ""
|
|
424
|
+
|| (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
425
|
+
}
|
|
426
|
+
function isNodeError(error) {
|
|
427
|
+
return error instanceof Error && "code" in error;
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export declare const LAB_APP_RUNNER_PLAN_SCHEMA = "humanish.lab-app-runner-plan.v1";
|
|
2
|
+
export type LabAppFramework = "next" | "vite" | "generic" | "none";
|
|
3
|
+
export type LabPackageManager = "npm" | "pnpm" | "yarn" | "bun";
|
|
4
|
+
export type LabInstallMode = "run" | "skip" | "when-missing";
|
|
5
|
+
export type LabSurfaceKind = "desktop" | "mobile";
|
|
6
|
+
export interface LabPackageJsonMetadata {
|
|
7
|
+
dependencies?: Record<string, string>;
|
|
8
|
+
devDependencies?: Record<string, string>;
|
|
9
|
+
packageManager?: string;
|
|
10
|
+
scripts?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
export interface LabAppRunnerMetadata {
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
devDependencies?: Record<string, string>;
|
|
15
|
+
hasNodeModules?: boolean;
|
|
16
|
+
lockfiles?: string[];
|
|
17
|
+
packageJson?: LabPackageJsonMetadata;
|
|
18
|
+
packageManager?: string;
|
|
19
|
+
preferredPort?: number;
|
|
20
|
+
readinessIntervalMs?: number;
|
|
21
|
+
readinessTimeoutMs?: number;
|
|
22
|
+
scripts?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface LabAppRunnerInstallPlan {
|
|
25
|
+
command: string;
|
|
26
|
+
mode: LabInstallMode;
|
|
27
|
+
reason: string;
|
|
28
|
+
}
|
|
29
|
+
export interface LabAppRunnerDevServerPlan {
|
|
30
|
+
command: string;
|
|
31
|
+
framework: Exclude<LabAppFramework, "none">;
|
|
32
|
+
port: number;
|
|
33
|
+
reason: string;
|
|
34
|
+
scriptName: string;
|
|
35
|
+
url: string;
|
|
36
|
+
}
|
|
37
|
+
export interface LabAppRunnerReadinessPlan {
|
|
38
|
+
command: string;
|
|
39
|
+
intervalMs: number;
|
|
40
|
+
timeoutMs: number;
|
|
41
|
+
url: string;
|
|
42
|
+
}
|
|
43
|
+
export interface LabAppSurface {
|
|
44
|
+
command: string;
|
|
45
|
+
id: LabSurfaceKind;
|
|
46
|
+
label: string;
|
|
47
|
+
url: string;
|
|
48
|
+
viewport: {
|
|
49
|
+
deviceScaleFactor: number;
|
|
50
|
+
height: number;
|
|
51
|
+
isMobile: boolean;
|
|
52
|
+
width: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface LabAppRunnerShellPlan {
|
|
56
|
+
commands: string[];
|
|
57
|
+
script: string;
|
|
58
|
+
}
|
|
59
|
+
export interface LabAppRunnerPlan {
|
|
60
|
+
devServer?: LabAppRunnerDevServerPlan;
|
|
61
|
+
framework: LabAppFramework;
|
|
62
|
+
install: LabAppRunnerInstallPlan;
|
|
63
|
+
ok: boolean;
|
|
64
|
+
packageManager: LabPackageManager;
|
|
65
|
+
readiness?: LabAppRunnerReadinessPlan;
|
|
66
|
+
schema: typeof LAB_APP_RUNNER_PLAN_SCHEMA;
|
|
67
|
+
shell: LabAppRunnerShellPlan;
|
|
68
|
+
surfaces: LabAppSurface[];
|
|
69
|
+
warnings: string[];
|
|
70
|
+
}
|
|
71
|
+
export declare function buildLabAppRunnerPlan(metadata: LabAppRunnerMetadata): LabAppRunnerPlan;
|
|
72
|
+
export declare function renderLabAppRunnerShell(args: {
|
|
73
|
+
devServer?: LabAppRunnerDevServerPlan;
|
|
74
|
+
install: LabAppRunnerInstallPlan;
|
|
75
|
+
packageManager: LabPackageManager;
|
|
76
|
+
readiness?: LabAppRunnerReadinessPlan;
|
|
77
|
+
surfaces?: LabAppSurface[];
|
|
78
|
+
}): LabAppRunnerShellPlan;
|