mimetic-cli 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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/argv.d.ts +1 -0
  4. package/dist/argv.js +8 -0
  5. package/dist/argv.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +5 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/feedback.d.ts +48 -0
  10. package/dist/feedback.js +243 -0
  11. package/dist/feedback.js.map +1 -0
  12. package/dist/index.d.ts +15 -0
  13. package/dist/index.js +9 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/init-templates.d.ts +12 -0
  16. package/dist/init-templates.js +251 -0
  17. package/dist/init-templates.js.map +1 -0
  18. package/dist/init.d.ts +26 -0
  19. package/dist/init.js +343 -0
  20. package/dist/init.js.map +1 -0
  21. package/dist/observer-assets.d.ts +2 -0
  22. package/dist/observer-assets.js +2322 -0
  23. package/dist/observer-assets.js.map +1 -0
  24. package/dist/observer-data.d.ts +53 -0
  25. package/dist/observer-data.js +123 -0
  26. package/dist/observer-data.js.map +1 -0
  27. package/dist/observer.d.ts +36 -0
  28. package/dist/observer.js +360 -0
  29. package/dist/observer.js.map +1 -0
  30. package/dist/oss-lab.d.ts +50 -0
  31. package/dist/oss-lab.js +298 -0
  32. package/dist/oss-lab.js.map +1 -0
  33. package/dist/oss-meta-lab.d.ts +43 -0
  34. package/dist/oss-meta-lab.js +901 -0
  35. package/dist/oss-meta-lab.js.map +1 -0
  36. package/dist/program.d.ts +36 -0
  37. package/dist/program.js +825 -0
  38. package/dist/program.js.map +1 -0
  39. package/dist/run.d.ts +206 -0
  40. package/dist/run.js +688 -0
  41. package/dist/run.js.map +1 -0
  42. package/package.json +78 -0
  43. package/skills/mimetic-cli/SKILL.md +92 -0
  44. package/skills/mimetic-cli/agents/openai.yaml +7 -0
@@ -0,0 +1,251 @@
1
+ export const starterFiles = [
2
+ {
3
+ path: "mimetic/README.md",
4
+ plane: "source",
5
+ contents: `# Mimetic
6
+
7
+ This directory is the committed source of persona simulation intent for this app.
8
+
9
+ Keep this directory public-safe:
10
+
11
+ - synthetic personas only;
12
+ - synthetic fixtures only;
13
+ - env var names only, never values;
14
+ - no PII, PHI, secrets, raw private transcripts, private screenshots, customer data, or patient data.
15
+
16
+ Generated run bundles, screenshots, traces, logs, and local overrides belong in ignored \`.mimetic/\`.
17
+ `
18
+ },
19
+ {
20
+ path: "mimetic/config.ts",
21
+ plane: "source",
22
+ contents: `export default {
23
+ schema: "mimetic.config.v1",
24
+ app: {
25
+ name: "synthetic-app",
26
+ baseUrl: "http://localhost:3000",
27
+ startCommand: "npm run dev"
28
+ },
29
+ personasDir: "mimetic/personas",
30
+ scenariosDir: "mimetic/scenarios",
31
+ policiesDir: "mimetic/policies",
32
+ artifactsDir: ".mimetic/runs"
33
+ };
34
+ `
35
+ },
36
+ {
37
+ path: "mimetic/personas/synthetic-new-user.yaml",
38
+ plane: "source",
39
+ contents: `schema: mimetic.persona.v1
40
+ id: synthetic-new-user
41
+ name: Synthetic New User
42
+ summary: A privacy-safe first-time user evaluating the app with realistic but synthetic needs.
43
+ traits:
44
+ patience: medium
45
+ technical_confidence: medium
46
+ accessibility_needs: none_declared
47
+ constraints:
48
+ - Do not use real personal data.
49
+ - Do not use production accounts.
50
+ - Treat all credentials as env var names only.
51
+ `
52
+ },
53
+ {
54
+ path: "mimetic/personas/skeptical-power-user.yaml",
55
+ plane: "source",
56
+ contents: `schema: mimetic.persona.v1
57
+ id: skeptical-power-user
58
+ name: Skeptical Power User
59
+ summary: A privacy-safe experienced user looking for speed, reversibility, and clear proof.
60
+ traits:
61
+ patience: low
62
+ technical_confidence: high
63
+ accessibility_needs: keyboard_first
64
+ constraints:
65
+ - Do not use real personal data.
66
+ - Prefer synthetic fixture inputs.
67
+ - Flag unclear recovery paths.
68
+ `
69
+ },
70
+ {
71
+ path: "mimetic/scenarios/first-run-smoke.yaml",
72
+ plane: "source",
73
+ contents: `schema: mimetic.scenario.v1
74
+ id: first-run-smoke
75
+ title: First-run smoke
76
+ persona: synthetic-new-user
77
+ goal: Reach the first meaningful product state without using private data.
78
+ mode: dry-run
79
+ steps:
80
+ - name: Open the app
81
+ expectation: The app shell is reachable.
82
+ - name: Complete the first synthetic action
83
+ expectation: The user sees a clear next state.
84
+ - name: Capture review notes
85
+ expectation: Notes are public-safe and evidence-backed.
86
+ `
87
+ },
88
+ {
89
+ path: "mimetic/scenarios/onboarding-regression.yaml",
90
+ plane: "source",
91
+ contents: `schema: mimetic.scenario.v1
92
+ id: onboarding-regression
93
+ title: Onboarding regression
94
+ persona: skeptical-power-user
95
+ goal: Exercise onboarding friction using synthetic inputs and explicit recovery checks.
96
+ mode: dry-run
97
+ steps:
98
+ - name: Start onboarding
99
+ expectation: Required information is clear.
100
+ - name: Use synthetic fixture data
101
+ expectation: No real user data is entered.
102
+ - name: Check recovery path
103
+ expectation: The user can back out or retry safely.
104
+ `
105
+ },
106
+ {
107
+ path: "mimetic/policies/redaction.yaml",
108
+ plane: "source",
109
+ contents: `schema: mimetic.redaction-policy.v1
110
+ deny:
111
+ - pii
112
+ - phi
113
+ - secrets
114
+ - tokens
115
+ - raw_private_transcripts
116
+ - private_screenshots
117
+ - customer_data
118
+ - patient_data
119
+ allow:
120
+ - synthetic_personas
121
+ - synthetic_fixtures
122
+ - env_var_names
123
+ `
124
+ },
125
+ {
126
+ path: "mimetic/policies/network.yaml",
127
+ plane: "source",
128
+ contents: `schema: mimetic.network-policy.v1
129
+ default: local_only
130
+ allowed_hosts:
131
+ - localhost
132
+ - 127.0.0.1
133
+ notes:
134
+ - Add external hosts only after confirming they are safe for public proof artifacts.
135
+ `
136
+ },
137
+ {
138
+ path: "mimetic/policies/credentials.example.yaml",
139
+ plane: "source",
140
+ contents: `schema: mimetic.credentials-policy.v1
141
+ env_names:
142
+ openai: OPENAI_API_KEY
143
+ e2b: E2B_API_KEY
144
+ rules:
145
+ - Store values outside the repository.
146
+ - Commit env var names only.
147
+ - Do not paste keys into personas, scenarios, issue drafts, or run bundles.
148
+ `
149
+ },
150
+ {
151
+ path: "mimetic/adapters/app.ts",
152
+ plane: "source",
153
+ contents: `export const appAdapter = {
154
+ schema: "mimetic.adapter.v1",
155
+ id: "synthetic-app",
156
+ name: "Synthetic App",
157
+ routes: [
158
+ {
159
+ id: "home",
160
+ path: "/",
161
+ description: "Synthetic app entry point"
162
+ }
163
+ ]
164
+ };
165
+ `
166
+ },
167
+ {
168
+ path: "mimetic/review/vocabulary.yaml",
169
+ plane: "source",
170
+ contents: `schema: mimetic.review-vocabulary.v1
171
+ verdicts:
172
+ - pass
173
+ - fail
174
+ - blocked
175
+ - needs_evidence
176
+ labels:
177
+ friction: User-visible friction.
178
+ gap: Missing evidence or missing coverage.
179
+ public_safety: Potential privacy, secret, or public-boundary issue.
180
+ `
181
+ },
182
+ {
183
+ path: "mimetic/review/milestones.yaml",
184
+ plane: "source",
185
+ contents: `schema: mimetic.milestones.v1
186
+ milestones:
187
+ - id: first-visible-state
188
+ description: The first meaningful app state is visible.
189
+ - id: synthetic-action-complete
190
+ description: A synthetic user action reaches an expected state.
191
+ - id: review-ready
192
+ description: Public-safe evidence is ready for review.
193
+ `
194
+ },
195
+ {
196
+ path: "mimetic/coverage-map.md",
197
+ plane: "source",
198
+ contents: `# Coverage Map
199
+
200
+ This file should enumerate screens, roles, states, and paths before scenarios are treated as complete.
201
+
202
+ Current starter coverage is intentionally minimal and synthetic.
203
+ `
204
+ },
205
+ {
206
+ path: "mimetic/coverage-matrix.md",
207
+ plane: "source",
208
+ contents: `# Coverage Matrix
209
+
210
+ | Area | Persona | Happy Path | Sad Path | Status |
211
+ | --- | --- | --- | --- | --- |
212
+ | First run | synthetic-new-user | planned | planned | starter |
213
+ | Onboarding | skeptical-power-user | planned | planned | starter |
214
+ `
215
+ },
216
+ {
217
+ path: "mimetic/fixtures/synthetic-login-state.json",
218
+ plane: "source",
219
+ contents: `{
220
+ "schema": "mimetic.synthetic-fixture.v1",
221
+ "kind": "login-state",
222
+ "user": {
223
+ "id": "synthetic-user-001",
224
+ "email": "synthetic.user@example.test"
225
+ },
226
+ "notes": [
227
+ "Synthetic fixture only.",
228
+ "Do not replace with real user data."
229
+ ]
230
+ }
231
+ `
232
+ }
233
+ ];
234
+ export const runtimeDirectories = [
235
+ { path: ".mimetic/runs", plane: "runtime" },
236
+ { path: ".mimetic/cache", plane: "runtime" },
237
+ { path: ".mimetic/tmp", plane: "runtime" },
238
+ { path: ".mimetic/logs", plane: "runtime" },
239
+ { path: ".mimetic/local/personas", plane: "runtime" },
240
+ { path: ".mimetic/local/policies", plane: "runtime" },
241
+ { path: ".mimetic/secrets", plane: "runtime" }
242
+ ];
243
+ export const mimeticScripts = {
244
+ mimetic: "mimetic",
245
+ "mimetic:doctor": "mimetic doctor",
246
+ "mimetic:run": "mimetic run --dry-run",
247
+ "mimetic:watch": "mimetic watch",
248
+ "mimetic:watch:ci": "mimetic watch --json --no-open",
249
+ "mimetic:verify": "mimetic verify"
250
+ };
251
+ //# sourceMappingURL=init-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-templates.js","sourceRoot":"","sources":["../src/init-templates.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;IACD;QACE,IAAI,EAAE,0CAA0C;QAChD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;IACD;QACE,IAAI,EAAE,4CAA4C;QAClD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;IACD;QACE,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;;CAab;KACE;IACD;QACE,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;;CAab;KACE;IACD;QACE,IAAI,EAAE,iCAAiC;QACvC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;;;CAcb;KACE;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;CAOb;KACE;IACD;QACE,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;CAQb;KACE;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;CAUb;KACE;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;CAQb;KACE;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;CAKb;KACE;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;CAMb;KACE;IACD;QACE,IAAI,EAAE,6CAA6C;QACnD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;;;;;;;;;;;;CAYb;KACE;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAuB;IACpD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3C,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3C,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,SAAS,EAAE;IACrD,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,SAAS,EAAE;IACrD,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE;CAC/C,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,gBAAgB;IAClC,aAAa,EAAE,uBAAuB;IACtC,eAAe,EAAE,eAAe;IAChC,kBAAkB,EAAE,gCAAgC;IACpD,gBAAgB,EAAE,gBAAgB;CACnC,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ export declare const INIT_RESPONSE_SCHEMA = "mimetic.init-result.v1";
2
+ export interface InitOptions {
3
+ cwd: string;
4
+ dryRun?: boolean;
5
+ yes?: boolean;
6
+ }
7
+ export type InitMode = "dry-run" | "applied" | "needs-confirmation";
8
+ export interface InitChange {
9
+ path: string;
10
+ action: "create" | "mkdir" | "update" | "skip";
11
+ target: "source" | "runtime" | "gitignore" | "package-json";
12
+ reason: string;
13
+ }
14
+ export interface InitResult {
15
+ schema: typeof INIT_RESPONSE_SCHEMA;
16
+ ok: boolean;
17
+ mode: InitMode;
18
+ cwd: string;
19
+ changes: InitChange[];
20
+ warnings: string[];
21
+ error?: {
22
+ code: "MIMETIC_CONFIRMATION_REQUIRED" | "MIMETIC_INVALID_CWD" | "MIMETIC_INVALID_PACKAGE_JSON";
23
+ message: string;
24
+ };
25
+ }
26
+ export declare function runInit(options: InitOptions): Promise<InitResult>;
package/dist/init.js ADDED
@@ -0,0 +1,343 @@
1
+ import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { mimeticScripts, runtimeDirectories, starterFiles } from "./init-templates.js";
4
+ export const INIT_RESPONSE_SCHEMA = "mimetic.init-result.v1";
5
+ export async function runInit(options) {
6
+ const cwd = path.resolve(options.cwd);
7
+ const mode = getMode(options);
8
+ const warnings = [];
9
+ const changes = [];
10
+ const writes = [];
11
+ const dirs = [];
12
+ const cwdCheck = await validateCwd(cwd);
13
+ if (cwdCheck) {
14
+ return {
15
+ schema: INIT_RESPONSE_SCHEMA,
16
+ ok: false,
17
+ mode,
18
+ cwd,
19
+ changes,
20
+ warnings,
21
+ error: cwdCheck
22
+ };
23
+ }
24
+ for (const file of starterFiles) {
25
+ const absolutePath = path.join(cwd, file.path);
26
+ const existing = await readTextIfExists(absolutePath);
27
+ if (existing === null) {
28
+ changes.push({
29
+ path: file.path,
30
+ action: "create",
31
+ target: file.plane,
32
+ reason: "public-safe starter file"
33
+ });
34
+ writes.push({
35
+ absolutePath,
36
+ relativePath: file.path,
37
+ contents: file.contents,
38
+ target: file.plane
39
+ });
40
+ }
41
+ else if (existing === file.contents) {
42
+ changes.push({
43
+ path: file.path,
44
+ action: "skip",
45
+ target: file.plane,
46
+ reason: "already matches starter"
47
+ });
48
+ }
49
+ else {
50
+ changes.push({
51
+ path: file.path,
52
+ action: "skip",
53
+ target: file.plane,
54
+ reason: "existing file would not be overwritten"
55
+ });
56
+ warnings.push(`Skipped existing ${file.path}; Mimetic never overwrites user files during init.`);
57
+ }
58
+ }
59
+ for (const directory of runtimeDirectories) {
60
+ const absolutePath = path.join(cwd, directory.path);
61
+ const exists = await pathExists(absolutePath);
62
+ changes.push({
63
+ path: directory.path,
64
+ action: exists ? "skip" : "mkdir",
65
+ target: directory.plane,
66
+ reason: exists ? "already exists" : "ignored runtime directory"
67
+ });
68
+ if (!exists) {
69
+ dirs.push({ absolutePath, relativePath: directory.path });
70
+ }
71
+ }
72
+ const gitignorePlan = await planGitignore(cwd);
73
+ changes.push(gitignorePlan.change);
74
+ if (gitignorePlan.write) {
75
+ writes.push(gitignorePlan.write);
76
+ }
77
+ const packagePlan = await planPackageJson(cwd);
78
+ changes.push(packagePlan.change);
79
+ warnings.push(...packagePlan.warnings);
80
+ if (packagePlan.error) {
81
+ return {
82
+ schema: INIT_RESPONSE_SCHEMA,
83
+ ok: false,
84
+ mode,
85
+ cwd,
86
+ changes,
87
+ warnings,
88
+ error: packagePlan.error
89
+ };
90
+ }
91
+ if (packagePlan.write) {
92
+ writes.push(packagePlan.write);
93
+ }
94
+ if (mode === "needs-confirmation") {
95
+ return {
96
+ schema: INIT_RESPONSE_SCHEMA,
97
+ ok: false,
98
+ mode,
99
+ cwd,
100
+ changes,
101
+ warnings,
102
+ error: {
103
+ code: "MIMETIC_CONFIRMATION_REQUIRED",
104
+ message: "Re-run with --dry-run to inspect or --yes to apply safe generated changes."
105
+ }
106
+ };
107
+ }
108
+ if (mode === "applied") {
109
+ for (const directory of dirs) {
110
+ await mkdir(directory.absolutePath, { recursive: true });
111
+ }
112
+ for (const write of writes) {
113
+ await mkdir(path.dirname(write.absolutePath), { recursive: true });
114
+ await writeFile(write.absolutePath, write.contents, "utf8");
115
+ }
116
+ }
117
+ return {
118
+ schema: INIT_RESPONSE_SCHEMA,
119
+ ok: true,
120
+ mode,
121
+ cwd,
122
+ changes,
123
+ warnings
124
+ };
125
+ }
126
+ function getMode(options) {
127
+ if (options.dryRun) {
128
+ return "dry-run";
129
+ }
130
+ if (options.yes) {
131
+ return "applied";
132
+ }
133
+ return "needs-confirmation";
134
+ }
135
+ async function planGitignore(cwd) {
136
+ const relativePath = ".gitignore";
137
+ const absolutePath = path.join(cwd, relativePath);
138
+ const existing = await readTextIfExists(absolutePath);
139
+ const currentLines = existing?.split(/\r?\n/) ?? [];
140
+ const envIndex = currentLines.lastIndexOf(".env*");
141
+ const envExampleIndex = currentLines.lastIndexOf("!.env.example");
142
+ const needsEnv = envIndex === -1;
143
+ const needsEnvExample = envExampleIndex === -1
144
+ || (envIndex !== -1 && envExampleIndex < envIndex)
145
+ || needsEnv;
146
+ const missingLines = [
147
+ ...(currentLines.includes(".mimetic/") ? [] : [".mimetic/"]),
148
+ ...(needsEnv ? [".env*"] : []),
149
+ ...(needsEnvExample ? ["!.env.example"] : [])
150
+ ];
151
+ if (missingLines.length === 0) {
152
+ return {
153
+ change: {
154
+ path: relativePath,
155
+ action: "skip",
156
+ target: "gitignore",
157
+ reason: "already ignores Mimetic runtime and env files"
158
+ }
159
+ };
160
+ }
161
+ const prefix = existing && existing.trim().length > 0
162
+ ? trimTrailingNewlines(existing) + "\n\n"
163
+ : "";
164
+ const contents = `${prefix}# Mimetic runtime and local secrets\n${missingLines.join("\n")}\n`;
165
+ return {
166
+ write: {
167
+ absolutePath,
168
+ relativePath,
169
+ contents,
170
+ target: "gitignore"
171
+ },
172
+ change: {
173
+ path: relativePath,
174
+ action: existing === null ? "create" : "update",
175
+ target: "gitignore",
176
+ reason: `add ${missingLines.join(", ")}`
177
+ }
178
+ };
179
+ }
180
+ async function planPackageJson(cwd) {
181
+ const relativePath = "package.json";
182
+ const absolutePath = path.join(cwd, relativePath);
183
+ const existing = await readTextIfExists(absolutePath);
184
+ if (existing === null) {
185
+ return {
186
+ change: {
187
+ path: relativePath,
188
+ action: "skip",
189
+ target: "package-json",
190
+ reason: "package.json not found"
191
+ },
192
+ warnings: ["Skipped package.json scripts because package.json was not found."]
193
+ };
194
+ }
195
+ let parsed;
196
+ try {
197
+ parsed = JSON.parse(existing);
198
+ }
199
+ catch {
200
+ return {
201
+ change: {
202
+ path: relativePath,
203
+ action: "skip",
204
+ target: "package-json",
205
+ reason: "package.json is not valid JSON"
206
+ },
207
+ warnings: ["package.json is not valid JSON; init did not apply partial changes."],
208
+ error: {
209
+ code: "MIMETIC_INVALID_PACKAGE_JSON",
210
+ message: "package.json is not valid JSON. Fix it before running mimetic init."
211
+ }
212
+ };
213
+ }
214
+ if (!isRecord(parsed)) {
215
+ return {
216
+ change: {
217
+ path: relativePath,
218
+ action: "skip",
219
+ target: "package-json",
220
+ reason: "package.json root is not an object"
221
+ },
222
+ warnings: ["package.json root is not an object; init did not apply partial changes."],
223
+ error: {
224
+ code: "MIMETIC_INVALID_PACKAGE_JSON",
225
+ message: "package.json root must be an object. Fix it before running mimetic init."
226
+ }
227
+ };
228
+ }
229
+ const scripts = isRecord(parsed.scripts) ? { ...parsed.scripts } : {};
230
+ const missingScripts = {};
231
+ const conflictingScripts = [];
232
+ for (const [name, command] of Object.entries(mimeticScripts)) {
233
+ const existingScript = scripts[name];
234
+ if (existingScript === undefined) {
235
+ missingScripts[name] = command;
236
+ }
237
+ else if (existingScript !== command) {
238
+ conflictingScripts.push(name);
239
+ }
240
+ }
241
+ if (conflictingScripts.length > 0 && Object.keys(missingScripts).length === 0) {
242
+ return {
243
+ change: {
244
+ path: relativePath,
245
+ action: "skip",
246
+ target: "package-json",
247
+ reason: `existing script conflicts: ${conflictingScripts.join(", ")}`
248
+ },
249
+ warnings: [
250
+ `Skipped package.json script patch because these scripts already exist with different values: ${conflictingScripts.join(", ")}.`
251
+ ]
252
+ };
253
+ }
254
+ if (Object.keys(missingScripts).length === 0) {
255
+ return {
256
+ change: {
257
+ path: relativePath,
258
+ action: "skip",
259
+ target: "package-json",
260
+ reason: "Mimetic scripts already present"
261
+ },
262
+ warnings: []
263
+ };
264
+ }
265
+ parsed.scripts = {
266
+ ...scripts,
267
+ ...missingScripts
268
+ };
269
+ const warnings = conflictingScripts.length === 0
270
+ ? []
271
+ : [
272
+ `Preserved existing script values for conflicting scripts: ${conflictingScripts.join(", ")}.`
273
+ ];
274
+ return {
275
+ write: {
276
+ absolutePath,
277
+ relativePath,
278
+ contents: `${JSON.stringify(parsed, null, 2)}\n`,
279
+ target: "package-json"
280
+ },
281
+ change: {
282
+ path: relativePath,
283
+ action: "update",
284
+ target: "package-json",
285
+ reason: `add scripts: ${Object.keys(missingScripts).join(", ")}`
286
+ },
287
+ warnings
288
+ };
289
+ }
290
+ async function readTextIfExists(filePath) {
291
+ try {
292
+ return await readFile(filePath, "utf8");
293
+ }
294
+ catch (error) {
295
+ if (isNodeError(error) && error.code === "ENOENT") {
296
+ return null;
297
+ }
298
+ throw error;
299
+ }
300
+ }
301
+ async function pathExists(filePath) {
302
+ try {
303
+ await stat(filePath);
304
+ return true;
305
+ }
306
+ catch (error) {
307
+ if (isNodeError(error) && error.code === "ENOENT") {
308
+ return false;
309
+ }
310
+ throw error;
311
+ }
312
+ }
313
+ async function validateCwd(cwd) {
314
+ try {
315
+ const stats = await stat(cwd);
316
+ if (!stats.isDirectory()) {
317
+ return {
318
+ code: "MIMETIC_INVALID_CWD",
319
+ message: `Target cwd is not a directory: ${cwd}`
320
+ };
321
+ }
322
+ return null;
323
+ }
324
+ catch (error) {
325
+ if (isNodeError(error) && error.code === "ENOENT") {
326
+ return {
327
+ code: "MIMETIC_INVALID_CWD",
328
+ message: `Target cwd does not exist: ${cwd}`
329
+ };
330
+ }
331
+ throw error;
332
+ }
333
+ }
334
+ function trimTrailingNewlines(text) {
335
+ return text.replace(/\n+$/, "");
336
+ }
337
+ function isRecord(value) {
338
+ return typeof value === "object" && value !== null && !Array.isArray(value);
339
+ }
340
+ function isNodeError(error) {
341
+ return error instanceof Error && "code" in error;
342
+ }
343
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function observerCss(): string;
2
+ export declare function observerClientJs(): string;