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.
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/argv.d.ts +1 -0
- package/dist/argv.js +8 -0
- package/dist/argv.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/feedback.d.ts +48 -0
- package/dist/feedback.js +243 -0
- package/dist/feedback.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/init-templates.d.ts +12 -0
- package/dist/init-templates.js +251 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.d.ts +26 -0
- package/dist/init.js +343 -0
- package/dist/init.js.map +1 -0
- package/dist/observer-assets.d.ts +2 -0
- package/dist/observer-assets.js +2322 -0
- package/dist/observer-assets.js.map +1 -0
- package/dist/observer-data.d.ts +53 -0
- package/dist/observer-data.js +123 -0
- package/dist/observer-data.js.map +1 -0
- package/dist/observer.d.ts +36 -0
- package/dist/observer.js +360 -0
- package/dist/observer.js.map +1 -0
- package/dist/oss-lab.d.ts +50 -0
- package/dist/oss-lab.js +298 -0
- package/dist/oss-lab.js.map +1 -0
- package/dist/oss-meta-lab.d.ts +43 -0
- package/dist/oss-meta-lab.js +901 -0
- package/dist/oss-meta-lab.js.map +1 -0
- package/dist/program.d.ts +36 -0
- package/dist/program.js +825 -0
- package/dist/program.js.map +1 -0
- package/dist/run.d.ts +206 -0
- package/dist/run.js +688 -0
- package/dist/run.js.map +1 -0
- package/package.json +78 -0
- package/skills/mimetic-cli/SKILL.md +92 -0
- 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
|
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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"}
|