ai-spector 0.4.0 → 0.4.2
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 +10 -2
- package/assets/themes/airbnb/preview.html +281 -0
- package/assets/themes/airtable/preview.html +209 -0
- package/assets/themes/apple/preview.html +461 -0
- package/assets/themes/binance/preview.html +1013 -0
- package/assets/themes/bmw/preview.html +255 -0
- package/assets/themes/bugatti/preview.html +879 -0
- package/assets/themes/cal/preview.html +620 -0
- package/assets/themes/claude/preview.html +873 -0
- package/assets/themes/clay/preview.html +360 -0
- package/assets/themes/clickhouse/preview.html +833 -0
- package/assets/themes/cohere/preview.html +854 -0
- package/assets/themes/coinbase/preview.html +208 -0
- package/assets/themes/composio/preview.html +980 -0
- package/assets/themes/cursor/preview.html +428 -0
- package/assets/themes/elevenlabs/preview.html +296 -0
- package/assets/themes/expo/preview.html +580 -0
- package/assets/themes/ferrari/preview.html +1168 -0
- package/assets/themes/framer/preview.html +930 -0
- package/assets/themes/hashicorp/preview.html +1238 -0
- package/assets/themes/ibm/preview.html +473 -0
- package/assets/themes/intercom/preview.html +229 -0
- package/assets/themes/kraken/preview.html +213 -0
- package/assets/themes/lamborghini/preview.html +428 -0
- package/assets/themes/linear.app/preview.html +418 -0
- package/assets/themes/lovable/preview.html +393 -0
- package/assets/themes/meta/preview.html +656 -0
- package/assets/themes/minimax/preview.html +1293 -0
- package/assets/themes/mintlify/preview.html +443 -0
- package/assets/themes/miro/preview.html +218 -0
- package/assets/themes/mistral.ai/preview.html +850 -0
- package/assets/themes/mongodb/preview.html +304 -0
- package/assets/themes/nike/preview.html +1182 -0
- package/assets/themes/notion/preview.html +409 -0
- package/assets/themes/nvidia/preview.html +411 -0
- package/assets/themes/ollama/preview.html +725 -0
- package/assets/themes/opencode.ai/preview.html +402 -0
- package/assets/themes/pinterest/preview.html +277 -0
- package/assets/themes/playstation/preview.html +1125 -0
- package/assets/themes/posthog/preview.html +794 -0
- package/assets/themes/raycast/preview.html +735 -0
- package/assets/themes/renault/preview.html +652 -0
- package/assets/themes/replicate/preview.html +878 -0
- package/assets/themes/resend/preview.html +399 -0
- package/assets/themes/revolut/preview.html +278 -0
- package/assets/themes/runwayml/preview.html +712 -0
- package/assets/themes/sanity/preview.html +1180 -0
- package/assets/themes/sentry/preview.html +996 -0
- package/assets/themes/shopify/preview.html +611 -0
- package/assets/themes/spacex/preview.html +265 -0
- package/assets/themes/spotify/preview.html +275 -0
- package/assets/themes/stripe/preview.html +464 -0
- package/assets/themes/supabase/preview.html +1002 -0
- package/assets/themes/superhuman/preview.html +996 -0
- package/assets/themes/tesla/preview.html +971 -0
- package/assets/themes/theverge/preview.html +1143 -0
- package/assets/themes/together.ai/preview.html +944 -0
- package/assets/themes/uber/preview.html +1164 -0
- package/assets/themes/vercel/preview.html +412 -0
- package/assets/themes/voltagent/preview.html +813 -0
- package/assets/themes/warp/preview.html +580 -0
- package/assets/themes/webflow/preview.html +191 -0
- package/assets/themes/wired/preview.html +1049 -0
- package/assets/themes/wise/preview.html +274 -0
- package/assets/themes/x.ai/preview.html +452 -0
- package/assets/themes/zapier/preview.html +417 -0
- package/dist/cli.js +37 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/graph-visualize.d.ts.map +1 -1
- package/dist/commands/graph-visualize.js +1 -22
- package/dist/commands/graph-visualize.js.map +1 -1
- package/dist/commands/prototype.d.ts +19 -0
- package/dist/commands/prototype.d.ts.map +1 -1
- package/dist/commands/prototype.js +78 -3
- package/dist/commands/prototype.js.map +1 -1
- package/dist/prototype/config.d.ts +9 -1
- package/dist/prototype/config.d.ts.map +1 -1
- package/dist/prototype/config.js +29 -0
- package/dist/prototype/config.js.map +1 -1
- package/dist/prototype/htpasswd.d.ts +5 -0
- package/dist/prototype/htpasswd.d.ts.map +1 -0
- package/dist/prototype/htpasswd.js +33 -0
- package/dist/prototype/htpasswd.js.map +1 -0
- package/dist/prototype/theme-preview.d.ts +17 -0
- package/dist/prototype/theme-preview.d.ts.map +1 -0
- package/dist/prototype/theme-preview.js +73 -0
- package/dist/prototype/theme-preview.js.map +1 -0
- package/dist/prototype/types.d.ts +8 -0
- package/dist/prototype/types.d.ts.map +1 -1
- package/dist/prototype/validate.d.ts.map +1 -1
- package/dist/prototype/validate.js +19 -0
- package/dist/prototype/validate.js.map +1 -1
- package/dist/util/open-browser.d.ts +3 -0
- package/dist/util/open-browser.d.ts.map +1 -0
- package/dist/util/open-browser.js +24 -0
- package/dist/util/open-browser.js.map +1 -0
- package/package.json +4 -2
- package/scaffold/.ai-spector/.docflow/config/language.json +4 -0
- package/scaffold/cursor/WORKFLOW.md +2 -1
- package/scaffold/cursor/skills/_skill-router.md +1 -1
- package/scaffold/cursor/skills/ai-spector/references/generate-workflow.md +8 -0
- package/scaffold/cursor/skills/ai-spector/references/language-picker.md +70 -0
- package/scaffold/cursor/skills/ai-spector/references/project-conventions.md +13 -4
- package/scaffold/cursor/skills/ai-spector-generate-basic-design/SKILL.md +1 -0
- package/scaffold/cursor/skills/ai-spector-generate-detail-design/SKILL.md +1 -0
- package/scaffold/cursor/skills/ai-spector-generate-prototype/SKILL.md +13 -5
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/auth-picker.md +61 -0
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/runbook.md +32 -10
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/theme-picker.md +118 -0
- package/scaffold/cursor/skills/ai-spector-generate-srs/SKILL.md +1 -0
- package/scaffold/prototype/README.md +24 -3
|
@@ -2,6 +2,13 @@ export interface PrototypeThemesOptions {
|
|
|
2
2
|
json?: boolean;
|
|
3
3
|
}
|
|
4
4
|
export declare function runPrototypeThemes(opts?: PrototypeThemesOptions): Promise<void>;
|
|
5
|
+
export interface PrototypeAuthOptions {
|
|
6
|
+
root?: string;
|
|
7
|
+
username?: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
fromConfig?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function runPrototypeAuth(opts?: PrototypeAuthOptions): Promise<void>;
|
|
5
12
|
export interface PrototypeSetupOptions {
|
|
6
13
|
root?: string;
|
|
7
14
|
theme?: string;
|
|
@@ -23,4 +30,16 @@ export interface PrototypeValidateOptions {
|
|
|
23
30
|
skipExternalCheck?: boolean;
|
|
24
31
|
}
|
|
25
32
|
export declare function runPrototypeValidate(opts?: PrototypeValidateOptions): Promise<void>;
|
|
33
|
+
export interface PrototypePreviewOptions {
|
|
34
|
+
theme: string;
|
|
35
|
+
open?: boolean;
|
|
36
|
+
json?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function runPrototypePreview(opts: PrototypePreviewOptions): Promise<string>;
|
|
39
|
+
export interface PrototypeInstallPreviewsOptions {
|
|
40
|
+
from?: string;
|
|
41
|
+
dryRun?: boolean;
|
|
42
|
+
json?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare function runPrototypeInstallPreviews(opts?: PrototypeInstallPreviewsOptions): Promise<void>;
|
|
26
45
|
//# sourceMappingURL=prototype.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prototype.d.ts","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prototype.d.ts","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzF;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrF;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFvF;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxF;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,GAAE,+BAAoC,GACzC,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -2,24 +2,55 @@ import { mkdir, writeFile } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { copyTree, pathExists, writeJson } from "../util/fs.js";
|
|
4
4
|
import { scaffoldBundleRoot } from "../config/load.js";
|
|
5
|
-
import { loadPrototypeConfig, persistPrototypeDefaultTheme, readPrototypeThemeName, } from "../prototype/config.js";
|
|
5
|
+
import { isPrototypeBasicAuthConfigured, loadPrototypeConfig, persistPrototypeBasicAuth, persistPrototypeDefaultTheme, readPrototypeThemeName, } from "../prototype/config.js";
|
|
6
|
+
import { writeHtpasswdFile } from "../prototype/htpasswd.js";
|
|
6
7
|
import { buildPrototypeManifest, writePrototypeManifestFiles, } from "../prototype/build-manifest.js";
|
|
7
8
|
import { assertThemeExists, installThemeDesign, listBundledThemes, readThemeSummary, } from "../prototype/themes.js";
|
|
9
|
+
import { installThemePreviews, resolveThemePreviewPath, themeHasPreview, } from "../prototype/theme-preview.js";
|
|
10
|
+
import { openInBrowser } from "../util/open-browser.js";
|
|
8
11
|
import { formatPrototypeIssues, validatePrototype, } from "../prototype/validate.js";
|
|
9
12
|
export async function runPrototypeThemes(opts = {}) {
|
|
10
13
|
const themes = await listBundledThemes();
|
|
11
14
|
if (opts.json) {
|
|
12
|
-
|
|
15
|
+
const withPreview = await Promise.all(themes.map(async (name) => ({
|
|
16
|
+
name,
|
|
17
|
+
summary: await readThemeSummary(name),
|
|
18
|
+
preview: await themeHasPreview(name),
|
|
19
|
+
})));
|
|
20
|
+
console.log(JSON.stringify({ themes: withPreview }, null, 2));
|
|
13
21
|
return;
|
|
14
22
|
}
|
|
15
23
|
console.log(`Bundled prototype themes (${themes.length}):`);
|
|
16
24
|
for (const name of themes) {
|
|
17
25
|
const summary = await readThemeSummary(name);
|
|
18
|
-
|
|
26
|
+
const preview = (await themeHasPreview(name)) ? " [preview]" : "";
|
|
27
|
+
console.log(summary ? ` ${name} — ${summary}${preview}` : ` ${name}${preview}`);
|
|
19
28
|
}
|
|
20
29
|
console.log("");
|
|
30
|
+
console.log("Preview a theme: ai-spector prototype preview <name> [--open]");
|
|
21
31
|
console.log("Use: ai-spector prototype setup --theme <name>");
|
|
22
32
|
}
|
|
33
|
+
export async function runPrototypeAuth(opts = {}) {
|
|
34
|
+
const { projectRoot, config } = await loadPrototypeConfig(opts.root);
|
|
35
|
+
let username = opts.username?.trim();
|
|
36
|
+
let password = opts.password;
|
|
37
|
+
if (opts.fromConfig) {
|
|
38
|
+
if (!isPrototypeBasicAuthConfigured(config)) {
|
|
39
|
+
throw new Error("No basicAuth in prototype.config.json — run: ai-spector prototype auth --username <u> --password <p>");
|
|
40
|
+
}
|
|
41
|
+
username = config.basicAuth.username;
|
|
42
|
+
password = config.basicAuth.password;
|
|
43
|
+
}
|
|
44
|
+
if (!username || !password) {
|
|
45
|
+
throw new Error("username and password required: ai-spector prototype auth --username <u> --password <p>");
|
|
46
|
+
}
|
|
47
|
+
const next = await persistPrototypeBasicAuth(projectRoot, { username, password });
|
|
48
|
+
const htpasswdPath = join(projectRoot, next.htpasswdFile);
|
|
49
|
+
await writeHtpasswdFile(htpasswdPath, username, password);
|
|
50
|
+
console.log(`Prototype basic auth configured for user "${username}"`);
|
|
51
|
+
console.log(` credentials: .ai-spector/.docflow/config/prototype.config.json (basicAuth)`);
|
|
52
|
+
console.log(` htpasswd: ${next.htpasswdFile}`);
|
|
53
|
+
}
|
|
23
54
|
export async function runPrototypeSetup(opts = {}) {
|
|
24
55
|
const { projectRoot, config } = await loadPrototypeConfig(opts.root);
|
|
25
56
|
const theme = opts.theme?.trim() ||
|
|
@@ -147,4 +178,48 @@ export async function runPrototypeValidate(opts = {}) {
|
|
|
147
178
|
throw new Error(`Prototype validation failed (${errors.length} error(s))`);
|
|
148
179
|
}
|
|
149
180
|
}
|
|
181
|
+
export async function runPrototypePreview(opts) {
|
|
182
|
+
const theme = opts.theme.trim();
|
|
183
|
+
await assertThemeExists(theme);
|
|
184
|
+
const previewPath = resolveThemePreviewPath(theme);
|
|
185
|
+
if (!(await pathExists(previewPath))) {
|
|
186
|
+
throw new Error(`No preview for theme "${theme}". Expected ${previewPath}`);
|
|
187
|
+
}
|
|
188
|
+
const fileUrl = `file://${previewPath}`;
|
|
189
|
+
if (opts.json) {
|
|
190
|
+
console.log(JSON.stringify({ theme, previewPath, fileUrl }, null, 2));
|
|
191
|
+
return previewPath;
|
|
192
|
+
}
|
|
193
|
+
console.log(`Theme preview: ${theme}`);
|
|
194
|
+
console.log(` ${previewPath}`);
|
|
195
|
+
console.log("");
|
|
196
|
+
console.log("Open in browser:");
|
|
197
|
+
console.log(` ${fileUrl}`);
|
|
198
|
+
if (opts.open) {
|
|
199
|
+
await openInBrowser(previewPath);
|
|
200
|
+
}
|
|
201
|
+
return previewPath;
|
|
202
|
+
}
|
|
203
|
+
export async function runPrototypeInstallPreviews(opts = {}) {
|
|
204
|
+
const result = await installThemePreviews({
|
|
205
|
+
from: opts.from,
|
|
206
|
+
dryRun: opts.dryRun,
|
|
207
|
+
});
|
|
208
|
+
if (opts.json) {
|
|
209
|
+
console.log(JSON.stringify(result, null, 2));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const label = opts.dryRun ? "Would install" : "Installed";
|
|
213
|
+
console.log(`${label} theme previews from ${result.stagingRoot}`);
|
|
214
|
+
console.log(` moved: ${result.moved.length}`);
|
|
215
|
+
if (result.moved.length > 0) {
|
|
216
|
+
console.log(` ${result.moved.join(", ")}`);
|
|
217
|
+
}
|
|
218
|
+
if (result.skipped.length > 0) {
|
|
219
|
+
console.log(` skipped (preview.html exists): ${result.skipped.join(", ")}`);
|
|
220
|
+
}
|
|
221
|
+
if (result.missingTheme.length > 0) {
|
|
222
|
+
console.log(` no theme folder: ${result.missingTheme.join(", ")}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
150
225
|
//# sourceMappingURL=prototype.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAMlC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA+B,EAAE;IACxE,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { PrototypeConfig } from "./types.js";
|
|
1
|
+
import type { PrototypeBasicAuth, PrototypeConfig } from "./types.js";
|
|
2
|
+
export declare function isPrototypeBasicAuthConfigured(config: PrototypeConfig): config is PrototypeConfig & {
|
|
3
|
+
basicAuth: PrototypeBasicAuth;
|
|
4
|
+
};
|
|
2
5
|
export declare function loadPrototypeConfig(root?: string): Promise<{
|
|
3
6
|
projectRoot: string;
|
|
4
7
|
config: PrototypeConfig;
|
|
@@ -6,4 +9,9 @@ export declare function loadPrototypeConfig(root?: string): Promise<{
|
|
|
6
9
|
export declare function readPrototypeThemeName(projectRoot: string, config: PrototypeConfig): Promise<string | undefined>;
|
|
7
10
|
/** Persist explicit theme choice for future prototype runs (no re-prompt). */
|
|
8
11
|
export declare function persistPrototypeDefaultTheme(projectRoot: string, theme: string): Promise<void>;
|
|
12
|
+
/** Persist HTTP basic auth credentials for prototype hosting. */
|
|
13
|
+
export declare function persistPrototypeBasicAuth(projectRoot: string, creds: {
|
|
14
|
+
username: string;
|
|
15
|
+
password: string;
|
|
16
|
+
}): Promise<PrototypeConfig>;
|
|
9
17
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/prototype/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/prototype/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AActE,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,GACtB,MAAM,IAAI,eAAe,GAAG;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,CAG/D;AAED,wBAAsB,mBAAmB,CACvC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC,CAc3D;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED,8EAA8E;AAC9E,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,iEAAiE;AACjE,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,eAAe,CAAC,CAwB1B"}
|
package/dist/prototype/config.js
CHANGED
|
@@ -10,7 +10,12 @@ const DEFAULT_CONFIG = {
|
|
|
10
10
|
srcDir: "prototype/src",
|
|
11
11
|
slugFrom: "screenName",
|
|
12
12
|
defaultTheme: "vercel",
|
|
13
|
+
htpasswdFile: "prototype/htpasswd",
|
|
13
14
|
};
|
|
15
|
+
export function isPrototypeBasicAuthConfigured(config) {
|
|
16
|
+
const auth = config.basicAuth;
|
|
17
|
+
return Boolean(auth?.username?.trim() && auth.password);
|
|
18
|
+
}
|
|
14
19
|
export async function loadPrototypeConfig(root) {
|
|
15
20
|
const projectRoot = root ?? findProjectRoot();
|
|
16
21
|
const projectConfig = join(projectRoot, ".ai-spector/.docflow/config/prototype.config.json");
|
|
@@ -61,4 +66,28 @@ export async function persistPrototypeDefaultTheme(projectRoot, theme) {
|
|
|
61
66
|
const next = { ...DEFAULT_CONFIG, ...raw, defaultTheme: name };
|
|
62
67
|
await writeJson(projectConfig, next);
|
|
63
68
|
}
|
|
69
|
+
/** Persist HTTP basic auth credentials for prototype hosting. */
|
|
70
|
+
export async function persistPrototypeBasicAuth(projectRoot, creds) {
|
|
71
|
+
const username = creds.username.trim();
|
|
72
|
+
const password = creds.password;
|
|
73
|
+
if (!username || !password) {
|
|
74
|
+
throw new Error("username and password are required");
|
|
75
|
+
}
|
|
76
|
+
const projectConfig = join(projectRoot, ".ai-spector/.docflow/config/prototype.config.json");
|
|
77
|
+
let raw = {};
|
|
78
|
+
if (await pathExists(projectConfig)) {
|
|
79
|
+
raw = await readJson(projectConfig);
|
|
80
|
+
}
|
|
81
|
+
else if (await pathExists(bundledPrototypeConfigPath())) {
|
|
82
|
+
raw = await readJson(bundledPrototypeConfigPath());
|
|
83
|
+
}
|
|
84
|
+
const basicAuth = {
|
|
85
|
+
username,
|
|
86
|
+
password,
|
|
87
|
+
setAt: new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
const next = { ...DEFAULT_CONFIG, ...raw, basicAuth };
|
|
90
|
+
await writeJson(projectConfig, next);
|
|
91
|
+
return next;
|
|
92
|
+
}
|
|
64
93
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/prototype/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGhE,MAAM,cAAc,GAAoB;IACtC,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,mCAAmC;IAClD,kBAAkB,EAAE,oBAAoB;IACxC,eAAe,EAAE,4BAA4B;IAC7C,YAAY,EAAE,WAAW;IACzB,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/prototype/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGhE,MAAM,cAAc,GAAoB;IACtC,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,mCAAmC;IAClD,kBAAkB,EAAE,oBAAoB;IACxC,eAAe,EAAE,4BAA4B;IAC7C,YAAY,EAAE,WAAW;IACzB,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,oBAAoB;CACnC,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC5C,MAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAC9B,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa;IAEb,MAAM,WAAW,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,CACxB,WAAW,EACX,mDAAmD,CACpD,CAAC;IACF,IAAI,GAAG,GAA6B,EAAE,CAAC;IACvC,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,GAAG,GAAG,MAAM,QAAQ,CAA2B,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,MAAM,UAAU,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;QAC1D,GAAG,GAAG,MAAM,QAAQ,CAA2B,0BAA0B,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,CAAC;IAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,MAAuB;IAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAyB,aAAa,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAClD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAyB,YAAY,CAAC,CAAC;QACtE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,WAAmB,EACnB,KAAa;IAEb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CACxB,WAAW,EACX,mDAAmD,CACpD,CAAC;IACF,IAAI,GAAG,GAA6B,EAAE,CAAC;IACvC,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,GAAG,GAAG,MAAM,QAAQ,CAA2B,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,MAAM,UAAU,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;QAC1D,GAAG,GAAG,MAAM,QAAQ,CAA2B,0BAA0B,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,IAAI,GAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAChF,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB,EACnB,KAA6C;IAE7C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CACxB,WAAW,EACX,mDAAmD,CACpD,CAAC;IACF,IAAI,GAAG,GAA6B,EAAE,CAAC;IACvC,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,GAAG,GAAG,MAAM,QAAQ,CAA2B,aAAa,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,MAAM,UAAU,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;QAC1D,GAAG,GAAG,MAAM,QAAQ,CAA2B,0BAA0B,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,SAAS,GAAuB;QACpC,QAAQ;QACR,QAAQ;QACR,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAChC,CAAC;IACF,MAAM,IAAI,GAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC;IACvE,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Apache apr1 MD5 via `openssl passwd -apr1` (nginx/Apache compatible). */
|
|
2
|
+
export declare function apr1Hash(password: string, salt?: string): string;
|
|
3
|
+
export declare function formatHtpasswdLine(username: string, password: string): string;
|
|
4
|
+
export declare function writeHtpasswdFile(filePath: string, username: string, password: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=htpasswd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htpasswd.d.ts","sourceRoot":"","sources":["../../src/prototype/htpasswd.ts"],"names":[],"mappings":"AAIA,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAchE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU7E;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
/** Apache apr1 MD5 via `openssl passwd -apr1` (nginx/Apache compatible). */
|
|
5
|
+
export function apr1Hash(password, salt) {
|
|
6
|
+
const args = ["passwd", "-apr1"];
|
|
7
|
+
if (salt) {
|
|
8
|
+
args.push("-salt", salt);
|
|
9
|
+
}
|
|
10
|
+
args.push(password);
|
|
11
|
+
try {
|
|
12
|
+
return execFileSync("openssl", args, { encoding: "utf8" }).trim();
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw new Error("Could not run `openssl passwd -apr1`. Install OpenSSL and ensure it is on PATH.", { cause: err });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function formatHtpasswdLine(username, password) {
|
|
19
|
+
const user = username.trim();
|
|
20
|
+
if (!user) {
|
|
21
|
+
throw new Error("username is required");
|
|
22
|
+
}
|
|
23
|
+
if (!password) {
|
|
24
|
+
throw new Error("password is required");
|
|
25
|
+
}
|
|
26
|
+
const hash = apr1Hash(password);
|
|
27
|
+
return `${user}:${hash}`;
|
|
28
|
+
}
|
|
29
|
+
export async function writeHtpasswdFile(filePath, username, password) {
|
|
30
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
31
|
+
await writeFile(filePath, `${formatHtpasswdLine(username, password)}\n`, "utf8");
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=htpasswd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htpasswd.js","sourceRoot":"","sources":["../../src/prototype/htpasswd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,IAAa;IACtD,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,iFAAiF,EACjF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,QAAgB;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function resolveThemePreviewPath(themeName: string): string;
|
|
2
|
+
export declare function themeHasPreview(themeName: string): Promise<boolean>;
|
|
3
|
+
/** Legacy staging dirs (`assets/preview/themes` or accidental `assets/preview /themes`). */
|
|
4
|
+
export declare function resolveThemePreviewsStagingRoot(explicitFrom?: string): Promise<string | undefined>;
|
|
5
|
+
export interface InstallThemePreviewsResult {
|
|
6
|
+
stagingRoot: string;
|
|
7
|
+
moved: string[];
|
|
8
|
+
skipped: string[];
|
|
9
|
+
missingTheme: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface InstallThemePreviewsOptions {
|
|
12
|
+
from?: string;
|
|
13
|
+
themesRoot?: string;
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function installThemePreviews(opts?: InstallThemePreviewsOptions): Promise<InstallThemePreviewsResult>;
|
|
17
|
+
//# sourceMappingURL=theme-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-preview.d.ts","sourceRoot":"","sources":["../../src/prototype/theme-preview.ts"],"names":[],"mappings":"AAeA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,4FAA4F;AAC5F,wBAAsB,+BAA+B,CACnD,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,2BAAgC,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAyCrC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readdir, rename } from "node:fs/promises";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { packageBundleRoot, themesBundleRoot } from "../config/load.js";
|
|
4
|
+
import { pathExists } from "../util/fs.js";
|
|
5
|
+
const PREVIEW_FILENAME = "preview.html";
|
|
6
|
+
function sanitizeThemeName(themeName) {
|
|
7
|
+
const safe = themeName.replace(/[^a-zA-Z0-9._-]/g, "");
|
|
8
|
+
if (!safe || safe !== themeName) {
|
|
9
|
+
throw new Error(`Invalid theme name: ${themeName}`);
|
|
10
|
+
}
|
|
11
|
+
return safe;
|
|
12
|
+
}
|
|
13
|
+
export function resolveThemePreviewPath(themeName) {
|
|
14
|
+
return join(themesBundleRoot(), sanitizeThemeName(themeName), PREVIEW_FILENAME);
|
|
15
|
+
}
|
|
16
|
+
export async function themeHasPreview(themeName) {
|
|
17
|
+
return pathExists(resolveThemePreviewPath(themeName));
|
|
18
|
+
}
|
|
19
|
+
/** Legacy staging dirs (`assets/preview/themes` or accidental `assets/preview /themes`). */
|
|
20
|
+
export async function resolveThemePreviewsStagingRoot(explicitFrom) {
|
|
21
|
+
if (explicitFrom?.trim()) {
|
|
22
|
+
const from = explicitFrom.trim();
|
|
23
|
+
return (await pathExists(from)) ? from : undefined;
|
|
24
|
+
}
|
|
25
|
+
const root = packageBundleRoot();
|
|
26
|
+
const candidates = [
|
|
27
|
+
join(root, "assets", "preview", "themes"),
|
|
28
|
+
join(root, "assets", "preview ", "themes"),
|
|
29
|
+
];
|
|
30
|
+
for (const candidate of candidates) {
|
|
31
|
+
if (await pathExists(candidate)) {
|
|
32
|
+
return candidate;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
export async function installThemePreviews(opts = {}) {
|
|
38
|
+
const stagingRoot = await resolveThemePreviewsStagingRoot(opts.from);
|
|
39
|
+
if (!stagingRoot) {
|
|
40
|
+
const hint = opts.from?.trim()
|
|
41
|
+
? `Path not found: ${opts.from.trim()}`
|
|
42
|
+
: "No staging folder (expected assets/preview/themes/)";
|
|
43
|
+
throw new Error(hint);
|
|
44
|
+
}
|
|
45
|
+
const themesRoot = opts.themesRoot ?? themesBundleRoot();
|
|
46
|
+
const entries = await readdir(stagingRoot, { withFileTypes: true });
|
|
47
|
+
const moved = [];
|
|
48
|
+
const skipped = [];
|
|
49
|
+
const missingTheme = [];
|
|
50
|
+
for (const ent of entries) {
|
|
51
|
+
if (!ent.isFile() || !ent.name.endsWith(".html")) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const themeName = basename(ent.name, ".html");
|
|
55
|
+
const themeDir = join(themesRoot, themeName);
|
|
56
|
+
const dest = join(themeDir, PREVIEW_FILENAME);
|
|
57
|
+
const src = join(stagingRoot, ent.name);
|
|
58
|
+
if (!(await pathExists(themeDir))) {
|
|
59
|
+
missingTheme.push(themeName);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (await pathExists(dest)) {
|
|
63
|
+
skipped.push(themeName);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (!opts.dryRun) {
|
|
67
|
+
await rename(src, dest);
|
|
68
|
+
}
|
|
69
|
+
moved.push(themeName);
|
|
70
|
+
}
|
|
71
|
+
return { stagingRoot, moved, skipped, missingTheme };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=theme-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-preview.js","sourceRoot":"","sources":["../../src/prototype/theme-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAExC,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,OAAO,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,YAAqB;IAErB,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;KAC3C,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoC,EAAE;IAEtC,MAAM,WAAW,GAAG,MAAM,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAC5B,CAAC,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YACvC,CAAC,CAAC,qDAAqD,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export interface PrototypeBasicAuth {
|
|
2
|
+
username: string;
|
|
3
|
+
password: string;
|
|
4
|
+
setAt: string;
|
|
5
|
+
}
|
|
1
6
|
export interface PrototypeConfig {
|
|
2
7
|
version: number;
|
|
3
8
|
listScreenDoc: string;
|
|
@@ -7,6 +12,9 @@ export interface PrototypeConfig {
|
|
|
7
12
|
srcDir: string;
|
|
8
13
|
slugFrom: "screenName";
|
|
9
14
|
defaultTheme: string;
|
|
15
|
+
/** Repo-relative path to Apache htpasswd file (nginx basic auth). */
|
|
16
|
+
htpasswdFile: string;
|
|
17
|
+
basicAuth?: PrototypeBasicAuth;
|
|
10
18
|
}
|
|
11
19
|
export interface ScreenIndexRow {
|
|
12
20
|
screenId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prototype/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prototype/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,EAAE,CAAC;CACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAOrE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CA6FrC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAOhF"}
|
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { isPrototypeBasicAuthConfigured } from "./config.js";
|
|
3
4
|
import { pathExists, readJson } from "../util/fs.js";
|
|
4
5
|
const EXTERNAL_ASSET_RE = /(?:https?:)?\/\/(?:fonts\.googleapis|fonts\.gstatic|cdn\.|unpkg\.|jsdelivr\.)/i;
|
|
5
6
|
export async function validatePrototype(opts) {
|
|
6
7
|
const issues = [];
|
|
8
|
+
if (!isPrototypeBasicAuthConfigured(opts.config)) {
|
|
9
|
+
issues.push({
|
|
10
|
+
severity: "error",
|
|
11
|
+
code: "BASIC_AUTH_MISSING",
|
|
12
|
+
message: "Prototype basic auth not configured — ask the user for username/password, then: ai-spector prototype auth --username <u> --password <p>",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
const htpasswdPath = join(opts.projectRoot, opts.config.htpasswdFile);
|
|
17
|
+
if (!(await pathExists(htpasswdPath))) {
|
|
18
|
+
issues.push({
|
|
19
|
+
severity: "error",
|
|
20
|
+
code: "HTPASSWD_MISSING",
|
|
21
|
+
message: `Missing ${opts.config.htpasswdFile} — run: ai-spector prototype auth --from-config`,
|
|
22
|
+
path: htpasswdPath,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
7
26
|
const manifestPath = join(opts.projectRoot, opts.config.prototypeDir, "manifest.json");
|
|
8
27
|
if (!(await pathExists(manifestPath))) {
|
|
9
28
|
issues.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,iBAAiB,GACrB,gFAAgF,CAAC;AAgBnF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA8B;IAE9B,MAAM,MAAM,GAA+B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../../src/util/open-browser.ts"],"names":[],"mappings":"AAKA,8DAA8D;AAC9D,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
/** Open a local file in the default browser (file:// URL). */
|
|
5
|
+
export async function openInBrowser(filePath) {
|
|
6
|
+
const url = `file://${filePath}`;
|
|
7
|
+
const platform = process.platform;
|
|
8
|
+
try {
|
|
9
|
+
if (platform === "darwin") {
|
|
10
|
+
await execAsync(`open "${filePath}"`);
|
|
11
|
+
}
|
|
12
|
+
else if (platform === "win32") {
|
|
13
|
+
await execAsync(`start "" "${filePath}"`, { shell: "cmd.exe" });
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
await execAsync(`xdg-open "${filePath}"`);
|
|
17
|
+
}
|
|
18
|
+
console.log(`Opened ${url}`);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
console.warn(`Could not open browser automatically: ${e instanceof Error ? e.message : e}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=open-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../../src/util/open-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,GAAG,GAAG,UAAU,QAAQ,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,SAAS,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,SAAS,CAAC,aAAa,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,aAAa,QAAQ,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CACV,yCAAyC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-spector",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Cursor-first documentation workflow: traceability graph, SRS/basic/detail design templates, and ai-spector CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,7 +53,9 @@
|
|
|
53
53
|
"graph:validate": "node dist/cli.js -r example graph validate",
|
|
54
54
|
"graph:merge": "node dist/cli.js -r example graph merge --from-knowledge",
|
|
55
55
|
"graph:visualize": "node dist/cli.js -r example graph visualize --open",
|
|
56
|
-
"ai-spector": "node dist/cli.js"
|
|
56
|
+
"ai-spector": "node dist/cli.js",
|
|
57
|
+
"themes:install-previews": "node dist/cli.js prototype install-previews",
|
|
58
|
+
"themes:preview": "node dist/cli.js prototype preview"
|
|
57
59
|
},
|
|
58
60
|
"dependencies": {
|
|
59
61
|
"@types/mdast": "^4.0.4",
|
|
@@ -23,7 +23,8 @@ Add files under `docs/data-source/`, open the project in Cursor, **reload MCP**
|
|
|
23
23
|
| Write SRS | “generate SRS”, “write use cases” | `ai-spector-generate-srs` | DAG waves → docs/srs → merge → index |
|
|
24
24
|
| Basic design | “screen list”, “API design”, “wireframes” | `ai-spector-generate-basic-design` | docs/basic-design → merge → index each wave |
|
|
25
25
|
| Detail design | “detail design for checkout” | `ai-spector-generate-detail-design` | docs/detail-design |
|
|
26
|
-
| HTML prototype | “HTML mockup”, “prototype with stripe theme” | `ai-spector-generate-prototype` |
|
|
26
|
+
| HTML prototype | “HTML mockup”, “prototype with stripe theme” | `ai-spector-generate-prototype` | auth picker (if needed) → theme picker → setup → HTML → validate |
|
|
27
|
+
| Pick / preview UI theme | “help me pick a theme”, “show me themes”, “what fits my app?” | `ai-spector-generate-prototype` | read project context → recommend 3 → `prototype preview` ×3 |
|
|
27
28
|
| What to redo | “what’s impacted”, “what should I regenerate” | `ai-spector-graph` | `graph impact` / git diff |
|
|
28
29
|
| Review comments | “resolve comments”, “fix C-001” | `ai-spector-resolve-comments` | inbox → plan → edit → commit |
|
|
29
30
|
| Explore graph | “show the graph” | `ai-spector-graph` | `graph visualize --open` |
|
|
@@ -23,7 +23,7 @@ Agents use this when intent is ambiguous.
|
|
|
23
23
|
| SRS, use cases, features, requirements | `ai-spector-generate-srs` | `references/runbook.md` |
|
|
24
24
|
| screens, APIs, wireframes, basic design | `ai-spector-generate-basic-design` | `references/runbook.md` |
|
|
25
25
|
| detail design, implementation spec | `ai-spector-generate-detail-design` | `references/runbook.md` |
|
|
26
|
-
| HTML prototype
|
|
26
|
+
| HTML prototype | “HTML prototype”, “mockup screens”, “prototype with stripe theme” | `ai-spector-generate-prototype` | `references/runbook.md`, `references/theme-picker.md` |
|
|
27
27
|
| review comments, C-001, inbox | `ai-spector-resolve-comments` | `references/runbook.md` |
|
|
28
28
|
| “generate docs” (no layer named) | `ai-spector-generate` | route to one skill above |
|
|
29
29
|
|
|
@@ -10,6 +10,14 @@ Used by **SRS**, **basic design**, and **detail design** generation skills.
|
|
|
10
10
|
|
|
11
11
|
**Not used by** HTML prototype generation (`ai-spector-generate-prototype` runbook).
|
|
12
12
|
|
|
13
|
+
## Language — check before any write
|
|
14
|
+
|
|
15
|
+
**Read [language-picker.md](./language-picker.md) before generating any document content.**
|
|
16
|
+
|
|
17
|
+
1. Check `.ai-spector/.docflow/config/language.json` for `documentLanguage`.
|
|
18
|
+
2. If missing, run the language-picker flow (ask → persist → continue). Do not write until confirmed.
|
|
19
|
+
3. Apply the enforcement rules in language-picker.md to every file written: all content in the target language, IDs/paths/code never translated, no mixing.
|
|
20
|
+
|
|
13
21
|
## Philosophy
|
|
14
22
|
|
|
15
23
|
- **Accuracy over speed** — full graph context before every write; ingest before the next wave.
|