ai-spector 0.4.9 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/prototype.d.ts.map +1 -1
- package/dist/commands/prototype.js +15 -2
- package/dist/commands/prototype.js.map +1 -1
- package/dist/prototype/build-base-path.d.ts +11 -0
- package/dist/prototype/build-base-path.d.ts.map +1 -0
- package/dist/prototype/build-base-path.js +84 -0
- package/dist/prototype/build-base-path.js.map +1 -0
- package/dist/prototype/build-manifest.d.ts.map +1 -1
- package/dist/prototype/build-manifest.js +29 -8
- package/dist/prototype/build-manifest.js.map +1 -1
- package/dist/prototype/preview-uri.d.ts +8 -0
- package/dist/prototype/preview-uri.d.ts.map +1 -0
- package/dist/prototype/preview-uri.js +35 -0
- package/dist/prototype/preview-uri.js.map +1 -0
- package/dist/prototype/relative-assets.d.ts +9 -0
- package/dist/prototype/relative-assets.d.ts.map +1 -0
- package/dist/prototype/relative-assets.js +23 -0
- package/dist/prototype/relative-assets.js.map +1 -0
- package/dist/prototype/rewrite-build-assets.d.ts +8 -0
- package/dist/prototype/rewrite-build-assets.d.ts.map +1 -0
- package/dist/prototype/rewrite-build-assets.js +40 -0
- package/dist/prototype/rewrite-build-assets.js.map +1 -0
- package/dist/prototype/route-defaults.d.ts +43 -0
- package/dist/prototype/route-defaults.d.ts.map +1 -0
- package/dist/prototype/route-defaults.js +50 -0
- package/dist/prototype/route-defaults.js.map +1 -0
- package/dist/prototype/types.d.ts +28 -2
- package/dist/prototype/types.d.ts.map +1 -1
- package/dist/prototype/validate.d.ts.map +1 -1
- package/dist/prototype/validate.js +37 -0
- package/dist/prototype/validate.js.map +1 -1
- package/package.json +1 -2
- package/scaffold/cursor/skills/ai-spector-generate-prototype/SKILL.md +1 -0
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/runbook.md +30 -1
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/spa-prototype.md +82 -0
- package/scaffold/cursor/skills/ai-spector-generate-prototype/references/stack-picker.md +17 -0
- package/scaffold/prototype/CLAUDE.md +3 -2
- package/scaffold/prototype/README.md +9 -0
- package/scaffold/prototype/route-defaults.example.json +15 -0
- package/scaffold/prototype/spa/vue/README.md +44 -0
- package/scaffold/prototype/spa/vue/src/prototype-guard.ts +31 -0
|
@@ -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":"AAqCA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzF;AAYD,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlF;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,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CA0Df;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,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFrF;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"}
|
|
@@ -8,6 +8,7 @@ import { buildPrototypeManifest, writePrototypeManifestFiles, } from "../prototy
|
|
|
8
8
|
import { assertThemeExists, installThemeDesign, listBundledThemes, readThemeSummary, } from "../prototype/themes.js";
|
|
9
9
|
import { installThemePreviews, resolveThemePreviewPath, themeHasPreview, } from "../prototype/theme-preview.js";
|
|
10
10
|
import { openInBrowser } from "../util/open-browser.js";
|
|
11
|
+
import { rewriteBuildAssetRefs } from "../prototype/rewrite-build-assets.js";
|
|
11
12
|
import { formatPrototypeIssues, validatePrototype, } from "../prototype/validate.js";
|
|
12
13
|
export async function runPrototypeThemes(opts = {}) {
|
|
13
14
|
const themes = await listBundledThemes();
|
|
@@ -81,7 +82,7 @@ export async function runPrototypeSetup(opts = {}) {
|
|
|
81
82
|
await mkdir(srcDir, { recursive: true });
|
|
82
83
|
const scaffoldProto = join(scaffoldBundleRoot(), "prototype");
|
|
83
84
|
if (await pathExists(scaffoldProto)) {
|
|
84
|
-
for (const name of ["README.md", "CLAUDE.md"]) {
|
|
85
|
+
for (const name of ["README.md", "CLAUDE.md", "route-defaults.example.json"]) {
|
|
85
86
|
const dest = join(prototypeRoot, name);
|
|
86
87
|
const src = join(scaffoldProto, name);
|
|
87
88
|
if (await pathExists(src) && !(await pathExists(dest))) {
|
|
@@ -248,8 +249,12 @@ export async function runPrototypeSync(opts = {}) {
|
|
|
248
249
|
}
|
|
249
250
|
await mkdir(destAbs, { recursive: true });
|
|
250
251
|
await copyTree(srcAbs, destAbs);
|
|
252
|
+
const rewriteResult = await rewriteBuildAssetRefs(destAbs);
|
|
251
253
|
if (!opts.json) {
|
|
252
254
|
console.log(`Copied ${buildSrc} → ${buildDest}`);
|
|
255
|
+
if (rewriteResult.filesRewritten > 0) {
|
|
256
|
+
console.log(`Rewrote root-absolute asset paths in ${rewriteResult.filesRewritten} HTML file(s) (./ relative)`);
|
|
257
|
+
}
|
|
253
258
|
}
|
|
254
259
|
}
|
|
255
260
|
// Regenerate manifest + screen-map with updated htmlExists / URIs
|
|
@@ -263,10 +268,12 @@ export async function runPrototypeSync(opts = {}) {
|
|
|
263
268
|
skipCopy: opts.skipCopy ?? false,
|
|
264
269
|
screenMapPath: paths.screenMapPath,
|
|
265
270
|
screenCount: built.screenCount,
|
|
271
|
+
prototypeBypassAuth: built.screenMap.prototypeBypassAuth,
|
|
266
272
|
screens: built.screenMap.screens.map((s) => ({
|
|
267
273
|
screenId: s.screenId,
|
|
268
274
|
screenDoc: s.screenDoc,
|
|
269
275
|
uri: s.uri,
|
|
276
|
+
previewUri: s.previewUri ?? s.uri,
|
|
270
277
|
buildDest,
|
|
271
278
|
})),
|
|
272
279
|
}, null, 2));
|
|
@@ -278,7 +285,13 @@ export async function runPrototypeSync(opts = {}) {
|
|
|
278
285
|
console.log("");
|
|
279
286
|
console.log("Screen URI mapping:");
|
|
280
287
|
for (const s of built.screenMap.screens) {
|
|
281
|
-
|
|
288
|
+
const open = s.previewUri ?? s.uri;
|
|
289
|
+
const suffix = open !== s.uri ? ` (pattern: ${s.uri})` : "";
|
|
290
|
+
console.log(` ${s.screenDoc.padEnd(40)} → ${open}${suffix}`);
|
|
291
|
+
}
|
|
292
|
+
if (built.screenMap.prototypeBypassAuth) {
|
|
293
|
+
console.log("");
|
|
294
|
+
console.log(" prototypeBypassAuth: true — SPA should allow direct previewUri access without login");
|
|
282
295
|
}
|
|
283
296
|
}
|
|
284
297
|
export async function runPrototypeInstallPreviews(opts = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prototype.js","sourceRoot":"","sources":["../../src/commands/prototype.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PrototypeTechStack } from "./types.js";
|
|
2
|
+
export interface ViteBasePathCheck {
|
|
3
|
+
configPath: string | null;
|
|
4
|
+
relativeBase: boolean;
|
|
5
|
+
/** True when a vite config exists but base is root-absolute or missing (Vite default `/`). */
|
|
6
|
+
needsRelativeBase: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function viteConfigNeedsRelativeBase(content: string): boolean;
|
|
9
|
+
export declare function checkViteRelativeBase(projectRoot: string, techStack?: PrototypeTechStack): Promise<ViteBasePathCheck | null>;
|
|
10
|
+
export declare function formatViteBasePathHint(check: ViteBasePathCheck): string;
|
|
11
|
+
//# sourceMappingURL=build-base-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-base-path.d.ts","sourceRoot":"","sources":["../../src/prototype/build-base-path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBrD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,8FAA8F;IAC9F,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAmCD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASpE;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmBnC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAKvE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathExists } from "../util/fs.js";
|
|
4
|
+
const VITE_STACKS = new Set(["vue", "react", "svelte"]);
|
|
5
|
+
const VITE_CONFIG_NAMES = [
|
|
6
|
+
"vite.config.ts",
|
|
7
|
+
"vite.config.js",
|
|
8
|
+
"vite.config.mts",
|
|
9
|
+
"vite.config.mjs",
|
|
10
|
+
];
|
|
11
|
+
/** Vite `base` set to a root-absolute path (default when omitted). */
|
|
12
|
+
const VITE_ABSOLUTE_BASE_RE = /\bbase\s*:\s*(['"])\/(?!\.)\1/;
|
|
13
|
+
/** Vite `base` explicitly set to relative (./ or empty-relative). */
|
|
14
|
+
const VITE_RELATIVE_BASE_RE = /\bbase\s*:\s*(['"])\.\/?\1/;
|
|
15
|
+
async function findViteConfig(projectRoot) {
|
|
16
|
+
const searchRoots = [projectRoot, join(projectRoot, "frontend"), join(projectRoot, "prototype")];
|
|
17
|
+
for (const root of searchRoots) {
|
|
18
|
+
if (!(await pathExists(root))) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
for (const name of VITE_CONFIG_NAMES) {
|
|
22
|
+
const candidate = join(root, name);
|
|
23
|
+
if (await pathExists(candidate)) {
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// One level of subdirs (e.g. frontend/app/vite.config.ts)
|
|
28
|
+
try {
|
|
29
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
if (!entry.isDirectory()) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
for (const name of VITE_CONFIG_NAMES) {
|
|
35
|
+
const candidate = join(root, entry.name, name);
|
|
36
|
+
if (await pathExists(candidate)) {
|
|
37
|
+
return candidate;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// ignore unreadable dirs
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
export function viteConfigNeedsRelativeBase(content) {
|
|
49
|
+
if (VITE_RELATIVE_BASE_RE.test(content)) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
// Explicit absolute base, or no base key (Vite default is `/`)
|
|
53
|
+
if (VITE_ABSOLUTE_BASE_RE.test(content)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return !/\bbase\s*:/.test(content);
|
|
57
|
+
}
|
|
58
|
+
export async function checkViteRelativeBase(projectRoot, techStack) {
|
|
59
|
+
if (!techStack || !VITE_STACKS.has(techStack)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const configPath = await findViteConfig(projectRoot);
|
|
63
|
+
if (!configPath) {
|
|
64
|
+
return {
|
|
65
|
+
configPath: null,
|
|
66
|
+
relativeBase: false,
|
|
67
|
+
needsRelativeBase: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const content = await readFile(configPath, "utf8");
|
|
71
|
+
const needsRelativeBase = viteConfigNeedsRelativeBase(content);
|
|
72
|
+
return {
|
|
73
|
+
configPath,
|
|
74
|
+
relativeBase: !needsRelativeBase,
|
|
75
|
+
needsRelativeBase,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function formatViteBasePathHint(check) {
|
|
79
|
+
if (check.configPath) {
|
|
80
|
+
return `Set base: './' in ${check.configPath} before npm run build`;
|
|
81
|
+
}
|
|
82
|
+
return "Add vite.config.ts with base: './' before npm run build";
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=build-base-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-base-path.js","sourceRoot":"","sources":["../../src/prototype/build-base-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/prototype/build-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/prototype/build-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAkBpB,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,4BAA4B,CAAC,CAyHvC;AAED,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAM1D"}
|
|
@@ -3,6 +3,7 @@ import { readFile } from "node:fs/promises";
|
|
|
3
3
|
import { access } from "node:fs/promises";
|
|
4
4
|
import { parseScreenIndexFromList } from "./parse-screen-index.js";
|
|
5
5
|
import { assertDefaultScreenInPool, resolveDefaultScreenId, } from "./resolve-default-screen.js";
|
|
6
|
+
import { applyRouteDefaults, loadRouteDefaults } from "./route-defaults.js";
|
|
6
7
|
import { pathExists, readJson, writeJson } from "../util/fs.js";
|
|
7
8
|
async function htmlExists(projectRoot, relativePath) {
|
|
8
9
|
try {
|
|
@@ -38,20 +39,42 @@ export async function buildPrototypeManifest(opts) {
|
|
|
38
39
|
...(r.userRole ? { userRole: r.userRole } : {}),
|
|
39
40
|
}));
|
|
40
41
|
const buildMode = opts.config.buildMode ?? "static";
|
|
42
|
+
const routeDefaults = await loadRouteDefaults(opts.projectRoot, opts.config.prototypeDir);
|
|
43
|
+
const screenMapPath = join(opts.projectRoot, opts.config.prototypeDir, "screen-map.json");
|
|
44
|
+
let previousDefault;
|
|
45
|
+
let previousBypassAuth;
|
|
46
|
+
const previousScreensById = new Map();
|
|
47
|
+
if (await pathExists(screenMapPath)) {
|
|
48
|
+
const prior = await readJson(screenMapPath);
|
|
49
|
+
previousDefault = prior.defaultScreenId;
|
|
50
|
+
previousBypassAuth = prior.prototypeBypassAuth;
|
|
51
|
+
for (const s of prior.screens ?? []) {
|
|
52
|
+
previousScreensById.set(s.screenId, s);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
41
55
|
const mapScreens = await Promise.all(rows.map(async (r) => {
|
|
42
56
|
const exists = await htmlExists(opts.projectRoot, r.prototypePath);
|
|
43
57
|
if (exists) {
|
|
44
58
|
htmlCount++;
|
|
45
59
|
}
|
|
46
|
-
const
|
|
60
|
+
const baseUri = buildMode === "spa" ? `/${r.slug}` : `/src/${r.prototypeStem}.html`;
|
|
61
|
+
const prior = previousScreensById.get(r.screenId);
|
|
62
|
+
const routeApplied = applyRouteDefaults({
|
|
63
|
+
screenId: r.screenId,
|
|
64
|
+
slug: r.slug,
|
|
65
|
+
buildMode,
|
|
66
|
+
baseUri,
|
|
67
|
+
fromFile: routeDefaults?.screens[r.screenId],
|
|
68
|
+
fromPriorEntry: prior,
|
|
69
|
+
});
|
|
47
70
|
return {
|
|
48
71
|
screenId: r.screenId,
|
|
49
72
|
displayName: r.displayName,
|
|
50
73
|
screenDoc: r.screenDoc,
|
|
51
74
|
prototypeStem: r.prototypeStem,
|
|
52
75
|
prototypePath: r.prototypePath,
|
|
53
|
-
uri,
|
|
54
76
|
htmlExists: exists,
|
|
77
|
+
...routeApplied,
|
|
55
78
|
};
|
|
56
79
|
}));
|
|
57
80
|
const manifest = {
|
|
@@ -60,12 +83,6 @@ export async function buildPrototypeManifest(opts) {
|
|
|
60
83
|
generatedAt,
|
|
61
84
|
screens: manifestScreens,
|
|
62
85
|
};
|
|
63
|
-
let previousDefault;
|
|
64
|
-
const screenMapPath = join(opts.projectRoot, opts.config.prototypeDir, "screen-map.json");
|
|
65
|
-
if (await pathExists(screenMapPath)) {
|
|
66
|
-
const prior = await readJson(screenMapPath);
|
|
67
|
-
previousDefault = prior.defaultScreenId;
|
|
68
|
-
}
|
|
69
86
|
if (opts.defaultScreenId?.trim()) {
|
|
70
87
|
assertDefaultScreenInPool(opts.defaultScreenId, mapScreens);
|
|
71
88
|
}
|
|
@@ -74,12 +91,16 @@ export async function buildPrototypeManifest(opts) {
|
|
|
74
91
|
previous: previousDefault,
|
|
75
92
|
configDefault: opts.config.defaultScreenId,
|
|
76
93
|
});
|
|
94
|
+
const prototypeBypassAuth = routeDefaults?.prototypeBypassAuth ??
|
|
95
|
+
previousBypassAuth ??
|
|
96
|
+
(buildMode === "spa" ? opts.config.prototypeBypassAuth ?? true : undefined);
|
|
77
97
|
const screenMap = {
|
|
78
98
|
schemaVersion: 1,
|
|
79
99
|
themeName: opts.themeName,
|
|
80
100
|
buildMode,
|
|
81
101
|
generatedAt,
|
|
82
102
|
...(defaultScreenId ? { defaultScreenId } : {}),
|
|
103
|
+
...(prototypeBypassAuth !== undefined ? { prototypeBypassAuth } : {}),
|
|
83
104
|
screens: mapScreens,
|
|
84
105
|
};
|
|
85
106
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/prototype/build-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/prototype/build-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a concrete preview URL from a route pattern and default param values.
|
|
3
|
+
* Used in screen-map.json so reviewers can open detail screens without manual URL editing.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildPreviewUri(routePattern: string, routeParams?: Record<string, string>, queryParams?: Record<string, string>): string;
|
|
6
|
+
/** True when the pattern still has unresolved dynamic segments (e.g. :id). */
|
|
7
|
+
export declare function routePatternHasUnresolvedParams(routePattern: string, routeParams?: Record<string, string>): boolean;
|
|
8
|
+
//# sourceMappingURL=preview-uri.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-uri.d.ts","sourceRoot":"","sources":["../../src/prototype/preview-uri.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAqBR;AAED,8EAA8E;AAC9E,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAST"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a concrete preview URL from a route pattern and default param values.
|
|
3
|
+
* Used in screen-map.json so reviewers can open detail screens without manual URL editing.
|
|
4
|
+
*/
|
|
5
|
+
export function buildPreviewUri(routePattern, routeParams, queryParams) {
|
|
6
|
+
let path = routePattern.trim() || "/";
|
|
7
|
+
if (!path.startsWith("/")) {
|
|
8
|
+
path = `/${path}`;
|
|
9
|
+
}
|
|
10
|
+
if (routeParams) {
|
|
11
|
+
for (const [key, value] of Object.entries(routeParams)) {
|
|
12
|
+
const encoded = encodeURIComponent(value);
|
|
13
|
+
path = path.replace(`:${key}`, encoded).replace(`[${key}]`, encoded);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
17
|
+
const qs = new URLSearchParams(queryParams).toString();
|
|
18
|
+
if (qs) {
|
|
19
|
+
path += path.includes("?") ? `&${qs}` : `?${qs}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return path;
|
|
23
|
+
}
|
|
24
|
+
/** True when the pattern still has unresolved dynamic segments (e.g. :id). */
|
|
25
|
+
export function routePatternHasUnresolvedParams(routePattern, routeParams) {
|
|
26
|
+
const paramNames = [...routePattern.matchAll(/:([A-Za-z0-9_]+)/g)].map((m) => m[1]);
|
|
27
|
+
if (paramNames.length === 0) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (!routeParams) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return paramNames.some((name) => !routeParams[name]?.trim());
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=preview-uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-uri.js","sourceRoot":"","sources":["../../src/prototype/preview-uri.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,WAAoC,EACpC,WAAoC;IAEpC,IAAI,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvD,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,+BAA+B,CAC7C,YAAoB,EACpB,WAAoC;IAEpC,MAAM,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect and rewrite root-absolute local asset refs in HTML.
|
|
3
|
+
* Paths like `/assets/app.js` break when the prototype is served from a subdirectory;
|
|
4
|
+
* use `./assets/app.js` (relative to the current HTML file) instead.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findAbsoluteLocalRefs(html: string): string[];
|
|
7
|
+
export declare function rewriteAbsoluteLocalRefs(html: string): string;
|
|
8
|
+
export declare function htmlHasAbsoluteLocalRefs(html: string): boolean;
|
|
9
|
+
//# sourceMappingURL=relative-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-assets.d.ts","sourceRoot":"","sources":["../../src/prototype/relative-assets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect and rewrite root-absolute local asset refs in HTML.
|
|
3
|
+
* Paths like `/assets/app.js` break when the prototype is served from a subdirectory;
|
|
4
|
+
* use `./assets/app.js` (relative to the current HTML file) instead.
|
|
5
|
+
*/
|
|
6
|
+
/** Matches src/href="/local/path" but not protocol-relative (//) or same-page anchors (#). */
|
|
7
|
+
const ABSOLUTE_LOCAL_REF_RE = /\b(src|href)\s*=\s*(["'])\/(?!\/|#)([^"']+)\2/gi;
|
|
8
|
+
export function findAbsoluteLocalRefs(html) {
|
|
9
|
+
const refs = [];
|
|
10
|
+
const re = new RegExp(ABSOLUTE_LOCAL_REF_RE.source, "gi");
|
|
11
|
+
let match;
|
|
12
|
+
while ((match = re.exec(html)) !== null) {
|
|
13
|
+
refs.push(`/${match[3]}`);
|
|
14
|
+
}
|
|
15
|
+
return refs;
|
|
16
|
+
}
|
|
17
|
+
export function rewriteAbsoluteLocalRefs(html) {
|
|
18
|
+
return html.replace(ABSOLUTE_LOCAL_REF_RE, (_full, attr, quote, path) => `${attr}=${quote}./${path}${quote}`);
|
|
19
|
+
}
|
|
20
|
+
export function htmlHasAbsoluteLocalRefs(html) {
|
|
21
|
+
return findAbsoluteLocalRefs(html).length > 0;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=relative-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-assets.js","sourceRoot":"","sources":["../../src/prototype/relative-assets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8FAA8F;AAC9F,MAAM,qBAAqB,GACzB,iDAAiD,CAAC;AAEpD,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,IAAI,CAAC,OAAO,CACjB,qBAAqB,EACrB,CAAC,KAAK,EAAE,IAAY,EAAE,KAAa,EAAE,IAAY,EAAE,EAAE,CACnD,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RewriteBuildAssetsResult {
|
|
2
|
+
filesScanned: number;
|
|
3
|
+
filesRewritten: number;
|
|
4
|
+
rewrittenPaths: string[];
|
|
5
|
+
}
|
|
6
|
+
/** Rewrite root-absolute asset refs in HTML under a build output directory. */
|
|
7
|
+
export declare function rewriteBuildAssetRefs(buildDestAbs: string): Promise<RewriteBuildAssetsResult>;
|
|
8
|
+
//# sourceMappingURL=rewrite-build-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite-build-assets.d.ts","sourceRoot":"","sources":["../../src/prototype/rewrite-build-assets.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAgBD,+EAA+E;AAC/E,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAsBnC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { rewriteAbsoluteLocalRefs, htmlHasAbsoluteLocalRefs } from "./relative-assets.js";
|
|
4
|
+
async function walkHtmlFiles(dir) {
|
|
5
|
+
const out = [];
|
|
6
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
7
|
+
for (const entry of entries) {
|
|
8
|
+
const full = join(dir, entry.name);
|
|
9
|
+
if (entry.isDirectory()) {
|
|
10
|
+
out.push(...(await walkHtmlFiles(full)));
|
|
11
|
+
}
|
|
12
|
+
else if (entry.isFile() && entry.name.endsWith(".html")) {
|
|
13
|
+
out.push(full);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
/** Rewrite root-absolute asset refs in HTML under a build output directory. */
|
|
19
|
+
export async function rewriteBuildAssetRefs(buildDestAbs) {
|
|
20
|
+
const htmlFiles = await walkHtmlFiles(buildDestAbs);
|
|
21
|
+
const result = {
|
|
22
|
+
filesScanned: htmlFiles.length,
|
|
23
|
+
filesRewritten: 0,
|
|
24
|
+
rewrittenPaths: [],
|
|
25
|
+
};
|
|
26
|
+
for (const filePath of htmlFiles) {
|
|
27
|
+
const original = await readFile(filePath, "utf8");
|
|
28
|
+
if (!htmlHasAbsoluteLocalRefs(original)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const rewritten = rewriteAbsoluteLocalRefs(original);
|
|
32
|
+
if (rewritten !== original) {
|
|
33
|
+
await writeFile(filePath, rewritten, "utf8");
|
|
34
|
+
result.filesRewritten += 1;
|
|
35
|
+
result.rewrittenPaths.push(filePath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=rewrite-build-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite-build-assets.js","sourceRoot":"","sources":["../../src/prototype/rewrite-build-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAQ1F,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAoB;IAEpB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,MAAM,GAA6B;QACvC,YAAY,EAAE,SAAS,CAAC,MAAM;QAC9B,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,EAAE;KACnB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { PrototypeScreenMapEntry } from "./types.js";
|
|
2
|
+
export interface PrototypeRouteDefaultsScreen {
|
|
3
|
+
/** Router path pattern; defaults to screen slug route `/<slug>`. */
|
|
4
|
+
routePattern?: string;
|
|
5
|
+
/** Default path-param values for preview / deep links (e.g. `{ "id": "demo-001" }`). */
|
|
6
|
+
routeParams?: Record<string, string>;
|
|
7
|
+
/** Default query-string values for preview (e.g. `{ "tab": "overview" }`). */
|
|
8
|
+
queryParams?: Record<string, string>;
|
|
9
|
+
/** When true, production would guard this route; prototype SPA should still allow direct access. */
|
|
10
|
+
requiresAuth?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface PrototypeRouteDefaultsFile {
|
|
13
|
+
schemaVersion: 1;
|
|
14
|
+
/**
|
|
15
|
+
* When true (default for prototypes), SPA router guards must not redirect unauthenticated
|
|
16
|
+
* users away from deep-linked routes — reviewers open any screen-map previewUri directly.
|
|
17
|
+
*/
|
|
18
|
+
prototypeBypassAuth?: boolean;
|
|
19
|
+
screens: Record<string, PrototypeRouteDefaultsScreen>;
|
|
20
|
+
}
|
|
21
|
+
export declare function routeDefaultsPath(prototypeDir: string): string;
|
|
22
|
+
export declare function loadRouteDefaults(projectRoot: string, prototypeDir: string): Promise<PrototypeRouteDefaultsFile | undefined>;
|
|
23
|
+
export interface ApplyRouteDefaultsInput {
|
|
24
|
+
screenId: string;
|
|
25
|
+
slug: string;
|
|
26
|
+
buildMode: "static" | "spa";
|
|
27
|
+
baseUri: string;
|
|
28
|
+
fromFile?: PrototypeRouteDefaultsScreen;
|
|
29
|
+
fromPriorEntry?: Pick<PrototypeScreenMapEntry, "routePattern" | "routeParams" | "queryParams" | "requiresAuth" | "uri">;
|
|
30
|
+
}
|
|
31
|
+
export interface ApplyRouteDefaultsResult {
|
|
32
|
+
uri: string;
|
|
33
|
+
routePattern?: string;
|
|
34
|
+
routeParams?: Record<string, string>;
|
|
35
|
+
queryParams?: Record<string, string>;
|
|
36
|
+
previewUri?: string;
|
|
37
|
+
requiresAuth?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Merge route defaults (file → prior screen-map) and compute previewUri for SPA screens.
|
|
41
|
+
*/
|
|
42
|
+
export declare function applyRouteDefaults(input: ApplyRouteDefaultsInput): ApplyRouteDefaultsResult;
|
|
43
|
+
//# sourceMappingURL=route-defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-defaults.d.ts","sourceRoot":"","sources":["../../src/prototype/route-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,4BAA4B;IAC3C,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oGAAoG;IACpG,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACvD;AAID,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAUjD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,4BAA4B,CAAC;IACxC,cAAc,CAAC,EAAE,IAAI,CACnB,uBAAuB,EACvB,cAAc,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,CACxE,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CA+B3F"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { buildPreviewUri, routePatternHasUnresolvedParams } from "./preview-uri.js";
|
|
3
|
+
import { pathExists, readJson } from "../util/fs.js";
|
|
4
|
+
const ROUTE_DEFAULTS_FILE = "route-defaults.json";
|
|
5
|
+
export function routeDefaultsPath(prototypeDir) {
|
|
6
|
+
return join(prototypeDir, ROUTE_DEFAULTS_FILE);
|
|
7
|
+
}
|
|
8
|
+
export async function loadRouteDefaults(projectRoot, prototypeDir) {
|
|
9
|
+
const path = join(projectRoot, prototypeDir, ROUTE_DEFAULTS_FILE);
|
|
10
|
+
if (!(await pathExists(path))) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const raw = await readJson(path);
|
|
14
|
+
if (raw.schemaVersion !== 1 || !raw.screens) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Merge route defaults (file → prior screen-map) and compute previewUri for SPA screens.
|
|
21
|
+
*/
|
|
22
|
+
export function applyRouteDefaults(input) {
|
|
23
|
+
const merged = {
|
|
24
|
+
routePattern: input.fromPriorEntry?.routePattern ?? input.fromPriorEntry?.uri,
|
|
25
|
+
routeParams: input.fromPriorEntry?.routeParams,
|
|
26
|
+
queryParams: input.fromPriorEntry?.queryParams,
|
|
27
|
+
requiresAuth: input.fromPriorEntry?.requiresAuth,
|
|
28
|
+
...input.fromFile,
|
|
29
|
+
};
|
|
30
|
+
if (input.buildMode !== "spa") {
|
|
31
|
+
return { uri: input.baseUri };
|
|
32
|
+
}
|
|
33
|
+
const routePattern = merged.routePattern?.trim() || input.fromPriorEntry?.uri || input.baseUri;
|
|
34
|
+
const routeParams = merged.routeParams;
|
|
35
|
+
const queryParams = merged.queryParams;
|
|
36
|
+
const requiresAuth = merged.requiresAuth;
|
|
37
|
+
const hasUnresolved = routePatternHasUnresolvedParams(routePattern, routeParams);
|
|
38
|
+
const previewUri = hasUnresolved
|
|
39
|
+
? undefined
|
|
40
|
+
: buildPreviewUri(routePattern, routeParams, queryParams);
|
|
41
|
+
return {
|
|
42
|
+
uri: routePattern,
|
|
43
|
+
...(routePattern !== input.baseUri ? { routePattern } : {}),
|
|
44
|
+
...(routeParams && Object.keys(routeParams).length > 0 ? { routeParams } : {}),
|
|
45
|
+
...(queryParams && Object.keys(queryParams).length > 0 ? { queryParams } : {}),
|
|
46
|
+
...(previewUri ? { previewUri } : {}),
|
|
47
|
+
...(requiresAuth !== undefined ? { requiresAuth } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=route-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-defaults.js","sourceRoot":"","sources":["../../src/prototype/route-defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,11 @@ export interface PrototypeConfig {
|
|
|
53
53
|
/** Repo-relative path to Apache htpasswd file (nginx basic auth). */
|
|
54
54
|
htpasswdFile: string;
|
|
55
55
|
basicAuth?: PrototypeBasicAuth;
|
|
56
|
+
/**
|
|
57
|
+
* When true (default for SPA prototypes), router auth guards must allow direct navigation
|
|
58
|
+
* to any screen without forcing login first. Set false to test real auth flows.
|
|
59
|
+
*/
|
|
60
|
+
prototypeBypassAuth?: boolean;
|
|
56
61
|
}
|
|
57
62
|
export interface ScreenIndexRow {
|
|
58
63
|
screenId: string;
|
|
@@ -85,12 +90,28 @@ export interface PrototypeScreenMapEntry {
|
|
|
85
90
|
prototypeStem: string;
|
|
86
91
|
prototypePath: string;
|
|
87
92
|
/**
|
|
88
|
-
*
|
|
93
|
+
* Route path for this screen.
|
|
89
94
|
* - static mode: "/src/<stem>.html"
|
|
90
|
-
* - spa mode: "/<slug>"
|
|
95
|
+
* - spa mode: "/<slug>" or a pattern with params (e.g. "/orders/:id")
|
|
91
96
|
*/
|
|
92
97
|
uri: string;
|
|
93
98
|
htmlExists: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* SPA only: explicit router pattern when it differs from the slug-only path.
|
|
101
|
+
* Usually the same as `uri`; set when the app uses param segments.
|
|
102
|
+
*/
|
|
103
|
+
routePattern?: string;
|
|
104
|
+
/** SPA only: default path-param values for prototype deep links (e.g. `{ "id": "demo-001" }`). */
|
|
105
|
+
routeParams?: Record<string, string>;
|
|
106
|
+
/** SPA only: default query params appended to `previewUri`. */
|
|
107
|
+
queryParams?: Record<string, string>;
|
|
108
|
+
/**
|
|
109
|
+
* SPA only: concrete URL to open this screen in a browser (params substituted, query appended).
|
|
110
|
+
* Hosting and reviewers use this instead of typing IDs manually.
|
|
111
|
+
*/
|
|
112
|
+
previewUri?: string;
|
|
113
|
+
/** SPA only: production would require login; prototype still allows direct `previewUri` access. */
|
|
114
|
+
requiresAuth?: boolean;
|
|
94
115
|
}
|
|
95
116
|
export interface PrototypeScreenMap {
|
|
96
117
|
schemaVersion: 1;
|
|
@@ -99,6 +120,11 @@ export interface PrototypeScreenMap {
|
|
|
99
120
|
generatedAt: string;
|
|
100
121
|
/** Entry screen at generation time (from screens with HTML when any exist). */
|
|
101
122
|
defaultScreenId?: string;
|
|
123
|
+
/**
|
|
124
|
+
* SPA only: when true, generated router must not redirect unauthenticated users to login
|
|
125
|
+
* when opening a deep-linked route (prototype review mode).
|
|
126
|
+
*/
|
|
127
|
+
prototypeBypassAuth?: boolean;
|
|
102
128
|
screens: PrototypeScreenMapEntry[];
|
|
103
129
|
}
|
|
104
130
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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,wFAAwF;AACxF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;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;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prototype/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AASrE,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,CAmIrC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAOhF"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { isPrototypeBasicAuthConfigured } from "./config.js";
|
|
4
|
+
import { findAbsoluteLocalRefs } from "./relative-assets.js";
|
|
5
|
+
import { checkViteRelativeBase, formatViteBasePathHint } from "./build-base-path.js";
|
|
4
6
|
import { pathExists, readJson } from "../util/fs.js";
|
|
5
7
|
const EXTERNAL_ASSET_RE = /(?:https?:)?\/\/(?:fonts\.googleapis|fonts\.gstatic|cdn\.|unpkg\.|jsdelivr\.)/i;
|
|
6
8
|
export async function validatePrototype(opts) {
|
|
@@ -77,6 +79,15 @@ export async function validatePrototype(opts) {
|
|
|
77
79
|
path: htmlPath,
|
|
78
80
|
});
|
|
79
81
|
}
|
|
82
|
+
const absoluteRefs = findAbsoluteLocalRefs(html);
|
|
83
|
+
if (absoluteRefs.length > 0) {
|
|
84
|
+
issues.push({
|
|
85
|
+
severity: opts.strict ? "error" : "warn",
|
|
86
|
+
code: "ABSOLUTE_ASSET_PATH",
|
|
87
|
+
message: `Root-absolute asset refs in ${screen.prototypeStem}.html (${absoluteRefs.slice(0, 3).join(", ")}${absoluteRefs.length > 3 ? ", …" : ""}) — use relative paths from the current file (e.g. ./assets/app.js)`,
|
|
88
|
+
path: htmlPath,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
80
91
|
}
|
|
81
92
|
const docPath = join(opts.projectRoot, screen.screenDoc);
|
|
82
93
|
if (!(await pathExists(docPath))) {
|
|
@@ -88,6 +99,32 @@ export async function validatePrototype(opts) {
|
|
|
88
99
|
});
|
|
89
100
|
}
|
|
90
101
|
}
|
|
102
|
+
const buildMode = opts.config.buildMode ?? "static";
|
|
103
|
+
if (buildMode === "spa") {
|
|
104
|
+
const viteCheck = await checkViteRelativeBase(opts.projectRoot, opts.config.techStack);
|
|
105
|
+
if (viteCheck?.needsRelativeBase) {
|
|
106
|
+
issues.push({
|
|
107
|
+
severity: opts.strict ? "error" : "warn",
|
|
108
|
+
code: "VITE_BASE_PATH",
|
|
109
|
+
message: `Vite build will emit root-absolute asset URLs — ${formatViteBasePathHint(viteCheck)}`,
|
|
110
|
+
path: viteCheck.configPath ?? undefined,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const buildDest = opts.config.buildDest?.trim() || `${opts.config.prototypeDir}/dist`;
|
|
114
|
+
const indexPath = join(opts.projectRoot, buildDest, "index.html");
|
|
115
|
+
if (await pathExists(indexPath)) {
|
|
116
|
+
const html = await readFile(indexPath, "utf8");
|
|
117
|
+
const absoluteRefs = findAbsoluteLocalRefs(html);
|
|
118
|
+
if (absoluteRefs.length > 0) {
|
|
119
|
+
issues.push({
|
|
120
|
+
severity: opts.strict ? "error" : "warn",
|
|
121
|
+
code: "ABSOLUTE_ASSET_PATH",
|
|
122
|
+
message: `Root-absolute asset refs in ${buildDest}/index.html (${absoluteRefs.slice(0, 3).join(", ")}${absoluteRefs.length > 3 ? ", …" : ""}) — set Vite base: './' and rebuild, or run prototype sync to rewrite paths`,
|
|
123
|
+
path: indexPath,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
91
128
|
return issues;
|
|
92
129
|
}
|
|
93
130
|
export function formatPrototypeIssues(issues) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/prototype/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-spector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
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",
|
|
@@ -59,7 +59,6 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@types/mdast": "^4.0.4",
|
|
62
|
-
"ai-spector": "^0.4.8",
|
|
63
62
|
"ajv": "^8.17.1",
|
|
64
63
|
"ajv-formats": "^3.0.1",
|
|
65
64
|
"commander": "^12.1.0",
|
|
@@ -24,6 +24,7 @@ paths:
|
|
|
24
24
|
| No theme stored — **must confirm before setup** | [references/theme-picker.md](references/theme-picker.md) |
|
|
25
25
|
| No basic auth stored | [references/auth-picker.md](references/auth-picker.md) |
|
|
26
26
|
| Before writing each screen HTML | [references/prototype-graph-context.md](references/prototype-graph-context.md) |
|
|
27
|
+
| SPA buildMode (vue, react, nuxt, …) | [references/spa-prototype.md](references/spa-prototype.md) |
|
|
27
28
|
| Run of 5+ screens | [../ai-spector/references/context-management.md](../ai-spector/references/context-management.md) |
|
|
28
29
|
| CLI fails | [../ai-spector/references/cli-failures.md](../ai-spector/references/cli-failures.md) |
|
|
29
30
|
|
|
@@ -50,6 +50,7 @@ In SPA mode:
|
|
|
50
50
|
- Navigation links between screens must use `<slug>`-based routes (e.g. `<router-link to="/login">`)
|
|
51
51
|
- The `screen-map.json` `uri` values are route paths — the hosting layer (dev server or `serve -s dist`) handles routing
|
|
52
52
|
- The agent must **not** generate a separate `.html` per screen; there is one `index.html` entrypoint
|
|
53
|
+
- **Prototype routing:** follow [spa-prototype.md](spa-prototype.md) — bypass login redirects for direct review, and set default path/query params in `prototype/route-defaults.json` so `previewUri` deep links work for detail screens
|
|
53
54
|
|
|
54
55
|
## Usage — three ways to choose targets
|
|
55
56
|
|
|
@@ -169,6 +170,7 @@ Read `techStack` (and `buildMode`) from `prototype.config.json`. File type and s
|
|
|
169
170
|
|
|
170
171
|
- Write `prototype/src/<prototypeStem>.html` (self-contained or with sibling `.css`/`.js`)
|
|
171
172
|
- Navigation links use `href` values from `uri` in `screen-map.json`
|
|
173
|
+
- **Script, stylesheet, and image refs to local files must use relative paths** from the current HTML file — e.g. `<script src="./assets/app.js">`, `<link href="./styles.css">`. Do **not** use root-absolute paths like `/assets/app.js`; they resolve from the server root and break when deployed under a subdirectory.
|
|
172
174
|
|
|
173
175
|
**Framework stacks (spa mode):**
|
|
174
176
|
|
|
@@ -176,6 +178,8 @@ Read `techStack` (and `buildMode`) from `prototype.config.json`. File type and s
|
|
|
176
178
|
- There is **one** `index.html` entrypoint — do **not** create per-screen HTML files
|
|
177
179
|
- Generate a route config file (`router.ts`, `app.routes.ts`, or equivalent) mapping each screen slug to its component
|
|
178
180
|
- Navigation between screens uses the framework's router component with `uri` from `screen-map.json` as the path
|
|
181
|
+
- **Direct access (no login redirect):** router guards must honor `prototypeBypassAuth` on `screen-map.json` — see [spa-prototype.md](spa-prototype.md)
|
|
182
|
+
- **Param routes:** copy `route-defaults.example.json` → `route-defaults.json`, set `routeParams` / `queryParams` per screen id, run `prototype manifest`, give users the generated `previewUri` links
|
|
179
183
|
|
|
180
184
|
**All stacks:**
|
|
181
185
|
|
|
@@ -232,7 +236,8 @@ npx ai-spector prototype sync
|
|
|
232
236
|
|
|
233
237
|
This will:
|
|
234
238
|
1. Copy everything from `buildSrc` → `buildDest`
|
|
235
|
-
2.
|
|
239
|
+
2. Rewrite root-absolute asset paths in HTML to `./`-relative paths (e.g. `/assets/app.js` → `./assets/app.js`)
|
|
240
|
+
3. Regenerate `prototype/manifest.json` and `prototype/screen-map.json` with correct `uri` values
|
|
236
241
|
|
|
237
242
|
**Override source/dest without editing config:**
|
|
238
243
|
|
|
@@ -260,6 +265,27 @@ npx ai-spector prototype sync --json
|
|
|
260
265
|
|
|
261
266
|
Output includes each screen's `screenDoc → uri` mapping.
|
|
262
267
|
|
|
268
|
+
### Relative asset paths — required for all web builds
|
|
269
|
+
|
|
270
|
+
When HTML references another local file (script, stylesheet, image, favicon), the URL must be **relative to the current HTML file**, starting with `./`:
|
|
271
|
+
|
|
272
|
+
```html
|
|
273
|
+
<script type="module" crossorigin src="./assets/index-uOr-eA2t.js"></script>
|
|
274
|
+
<link rel="stylesheet" href="./assets/index.css">
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Root-absolute paths like `/assets/app.js` resolve from the server root. When `dist/` is deployed to a subdirectory (e.g. `/project-id/1.4/dist/`), those requests hit the wrong URL and return 403/404.
|
|
278
|
+
|
|
279
|
+
> **`prototype sync` rewrites paths in copied HTML only.** Bundled JS chunks still use whatever paths Vite emitted at build time. Always set `base: './'` (or the equivalent below) **before** `npm run build`.
|
|
280
|
+
|
|
281
|
+
| Stack | How to get relative paths at build time |
|
|
282
|
+
|-------|----------------------------------------|
|
|
283
|
+
| Plain HTML | Write `./`-prefixed paths directly in each `.html` file |
|
|
284
|
+
| **Vite** (vue / react / svelte) | **`base: './'` in `vite.config.ts`** — required before `npm run build` |
|
|
285
|
+
| Nuxt 3 | `app: { baseURL: './' }` in `nuxt.config.ts` |
|
|
286
|
+
| Next.js | `basePath` + `assetPrefix: './'` in `next.config.js` (when deploying under a subpath) |
|
|
287
|
+
| After any framework build | `prototype sync` rewrites absolute refs in copied **HTML only** — still configure the build tool above |
|
|
288
|
+
|
|
263
289
|
### Vite base path — required before first build
|
|
264
290
|
|
|
265
291
|
Vite defaults to `base: '/'`, generating absolute asset URLs (`/assets/app.js`). When `dist/` is deployed to a subdirectory, all asset requests resolve from the server root and return 403/404.
|
|
@@ -314,12 +340,15 @@ If the agent is asked to "sync prototype", "copy build output", or "update scree
|
|
|
314
340
|
- [ ] Role-based sections rendered when multiple actors satisfy the screen
|
|
315
341
|
- [ ] Every generated file name matches `prototypeStem` in manifest
|
|
316
342
|
- [ ] Wireframe/layout from screen detail doc reflected in HTML
|
|
343
|
+
- [ ] Local asset refs use `./`-relative paths (not `/assets/...`) — static HTML in source; SPA via `base: './'` or `prototype sync`
|
|
317
344
|
- [ ] Tokens from `prototype/DESIGN.md` only (no random CDN)
|
|
318
345
|
- [ ] `prototype validate --strict` passes
|
|
319
346
|
- [ ] `screen-map.json` entries have correct `uri` values:
|
|
320
347
|
- static mode → `/src/<stem>.html`
|
|
321
348
|
- spa mode → `/<slug>`
|
|
322
349
|
- [ ] SPA mode only: single `index.html` entrypoint exists; route config generated; navigation uses route paths (not file paths)
|
|
350
|
+
- [ ] SPA mode only: `prototypeBypassAuth` honored in router — reviewers can open any `previewUri` without login
|
|
351
|
+
- [ ] SPA mode only: param/detail screens have `route-defaults.json` entries and non-empty `previewUri` in `screen-map.json`
|
|
323
352
|
- [ ] External build workflow: `prototype sync` run after framework build; `buildDest` contains the copied files
|
|
324
353
|
|
|
325
354
|
## On failure
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# SPA prototype — direct routes and param defaults
|
|
2
|
+
|
|
3
|
+
Load this reference when `buildMode` is `spa` (vue, react, nuxt, next, svelte, angular).
|
|
4
|
+
|
|
5
|
+
## Why prototype mode differs from production
|
|
6
|
+
|
|
7
|
+
In production, unauthenticated users are redirected to login before seeing app screens. **Prototypes are for visual review** — stakeholders must open any screen directly (including post-login dashboards and detail pages) without walking through auth every time.
|
|
8
|
+
|
|
9
|
+
The agent **must** implement prototype-friendly routing and document deep links in `screen-map.json`.
|
|
10
|
+
|
|
11
|
+
## 1. Bypass auth redirects (required for SPA)
|
|
12
|
+
|
|
13
|
+
Set `prototypeBypassAuth: true` on `prototype/screen-map.json` (default when running `npx ai-spector prototype manifest` in SPA mode).
|
|
14
|
+
|
|
15
|
+
In the SPA router:
|
|
16
|
+
|
|
17
|
+
- When `prototypeBypassAuth` is true (or unset — treat as true for prototypes), **do not** redirect to login in `beforeEach` / middleware.
|
|
18
|
+
- Still define `meta.requiresAuth` on routes that would be protected in production (matches `requiresAuth` on screen-map entries).
|
|
19
|
+
- Optional: read bypass from `import.meta.env.VITE_PROTOTYPE_BYPASS_AUTH === 'true'` if the app is built outside `prototype/` — keep in sync with screen-map.
|
|
20
|
+
|
|
21
|
+
Starter pattern: [scaffold/prototype/spa/vue/src/prototype-guard.ts](../../../../prototype/spa/vue/src/prototype-guard.ts).
|
|
22
|
+
|
|
23
|
+
Tell the user: *"Open any screen via the previewUri column in screen-map.json — login redirect is disabled in prototype mode."*
|
|
24
|
+
|
|
25
|
+
## 2. Default URL params in the mapping file (required for param routes)
|
|
26
|
+
|
|
27
|
+
Detail screens use path or query params (`:id`, `?tab=`). Reviewers need a **ready-made URL** without guessing IDs.
|
|
28
|
+
|
|
29
|
+
### `prototype/route-defaults.json`
|
|
30
|
+
|
|
31
|
+
Copy from `prototype/route-defaults.example.json` and edit per screen id (Screen Index id, e.g. `order-detail`):
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"schemaVersion": 1,
|
|
36
|
+
"prototypeBypassAuth": true,
|
|
37
|
+
"screens": {
|
|
38
|
+
"order-detail": {
|
|
39
|
+
"routePattern": "/orders/:id",
|
|
40
|
+
"routeParams": { "id": "demo-001" },
|
|
41
|
+
"queryParams": { "tab": "summary" },
|
|
42
|
+
"requiresAuth": true
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then regenerate the map:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx ai-spector prototype manifest
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Fields on each `screen-map.json` entry (SPA)
|
|
55
|
+
|
|
56
|
+
| Field | Purpose |
|
|
57
|
+
|-------|---------|
|
|
58
|
+
| `uri` | Router path pattern (e.g. `/orders/:id`) |
|
|
59
|
+
| `routeParams` | Default path param values for preview |
|
|
60
|
+
| `queryParams` | Default query string for preview |
|
|
61
|
+
| `previewUri` | **Open this URL** — concrete path with params filled in |
|
|
62
|
+
| `requiresAuth` | Production would guard; prototype still allows direct access when bypass is on |
|
|
63
|
+
|
|
64
|
+
Simple screens without params only need `uri: "/<slug>"` (auto-generated).
|
|
65
|
+
|
|
66
|
+
### Router implementation
|
|
67
|
+
|
|
68
|
+
- Register routes using `uri` / `routePattern` from screen-map (e.g. `/orders/:id`).
|
|
69
|
+
- Seed component state from `route.params` / `useRoute()`; when params are missing in dev, fall back to defaults from `route-defaults.json` or hard-coded prototype fixtures matching `routeParams`.
|
|
70
|
+
- Link between screens with the framework router; use `previewUri` in docs/comments for QA bookmarks.
|
|
71
|
+
|
|
72
|
+
## 3. Agent checklist (SPA)
|
|
73
|
+
|
|
74
|
+
- [ ] `prototype/route-defaults.json` created for any screen with `:param` or required query args
|
|
75
|
+
- [ ] Router guard skips login redirect when `prototypeBypassAuth` is true
|
|
76
|
+
- [ ] Routes registered from screen-map `uri` values
|
|
77
|
+
- [ ] `npx ai-spector prototype manifest` run — every param route has a `previewUri`
|
|
78
|
+
- [ ] User told they can open `previewUri` paths directly (list them in the completion message)
|
|
79
|
+
|
|
80
|
+
## 4. Static HTML note
|
|
81
|
+
|
|
82
|
+
Static prototypes (`techStack: html`) already use one file per screen — no router bypass. Param-heavy flows may use query strings in the filename link (e.g. `order-detail.html?id=demo-001`) or a dedicated static page per variant; prefer SPA when many param routes exist.
|
|
@@ -21,6 +21,16 @@ Skip when:
|
|
|
21
21
|
| SvelteKit | `svelte` | `spa` | `routes/<slug>/+page.svelte` per screen |
|
|
22
22
|
| Angular | `angular` | `spa` | component per screen |
|
|
23
23
|
|
|
24
|
+
## Required: relative asset paths for all web builds
|
|
25
|
+
|
|
26
|
+
> When HTML references a local file (script, stylesheet, image), use a path **relative to the current HTML file** (`./assets/app.js`), not a root-absolute path (`/assets/app.js`). Root-absolute URLs break when the prototype is served from a subdirectory on deploy.
|
|
27
|
+
|
|
28
|
+
Example (correct):
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<script type="module" crossorigin src="./assets/index-uOr-eA2t.js"></script>
|
|
32
|
+
```
|
|
33
|
+
|
|
24
34
|
## Required: relative base path for Vite-based stacks (vue, react, svelte)
|
|
25
35
|
|
|
26
36
|
> Vite defaults to `base: '/'` which generates **absolute** asset URLs (`/assets/app.js`). When the built `dist/` is served from a subdirectory (e.g. `/project-id/1.4/dist/`), all asset requests hit the server root and return 403/404.
|
|
@@ -43,6 +53,13 @@ npx ai-spector prototype sync --clean
|
|
|
43
53
|
|
|
44
54
|
When the agent sets up a Vite-based stack (vue / react / svelte), it **must** write or verify `base: './'` in `vite.config.ts` before generating any other files. Flag it explicitly to the user if the config is missing or set to `'/'`.
|
|
45
55
|
|
|
56
|
+
## SPA-only: direct routes and param defaults
|
|
57
|
+
|
|
58
|
+
Framework stacks use `buildMode: spa`. After stack selection, follow [spa-prototype.md](spa-prototype.md):
|
|
59
|
+
|
|
60
|
+
- Router must allow **direct navigation** to any screen without login redirect (`prototypeBypassAuth`).
|
|
61
|
+
- Detail screens with URL params need defaults in `prototype/route-defaults.json` → `previewUri` in `screen-map.json`.
|
|
62
|
+
|
|
46
63
|
## Step 1 — Check stored stack
|
|
47
64
|
|
|
48
65
|
Read `.ai-spector/.docflow/config/prototype.config.json`. If `techStack` is set, skip this entire flow.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Prototype agent constraints
|
|
2
2
|
|
|
3
|
-
-
|
|
4
|
-
-
|
|
3
|
+
- **Static HTML** (`techStack: html`): output only HTML/CSS/JS under `prototype/src/` — one `.html` per screen; filename must match `prototypeStem` from `prototype/manifest.json`.
|
|
4
|
+
- **SPA** (`buildMode: spa`): one entrypoint, framework components per screen; honor `prototypeBypassAuth` and `previewUri` in `screen-map.json` (see `route-defaults.example.json` and `spa/vue/`).
|
|
5
|
+
- **Local asset refs must be relative** — use paths from the current HTML file (`./styles.css`, `./assets/app.js`), not root-absolute paths (`/assets/app.js`). Root-absolute URLs break when the prototype is served from a subdirectory on deploy.
|
|
5
6
|
- Use design tokens from `prototype/DESIGN.md` only — do not import external fonts/icons unless specified there.
|
|
6
7
|
- Do not edit `docs/**` while generating prototype files.
|
|
7
8
|
- Do not create files outside `prototype/`.
|
|
@@ -53,3 +53,12 @@ git add prototype/
|
|
|
53
53
|
## Screen → file mapping
|
|
54
54
|
|
|
55
55
|
See `prototype/manifest.json` and `prototype/screen-map.json` (rebuilt by `npx ai-spector prototype manifest`).
|
|
56
|
+
|
|
57
|
+
## SPA prototypes (Vue, React, …)
|
|
58
|
+
|
|
59
|
+
When `buildMode` is `spa`:
|
|
60
|
+
|
|
61
|
+
1. **Direct routes** — `screen-map.json` sets `prototypeBypassAuth: true` so the app router must not force login before showing a deep-linked screen.
|
|
62
|
+
2. **Detail / param URLs** — copy `route-defaults.example.json` to `route-defaults.json`, set default `routeParams` (e.g. `id: "demo-001"`), then run `npx ai-spector prototype manifest`. Open each screen via its `previewUri` in `screen-map.json`.
|
|
63
|
+
|
|
64
|
+
Starter patterns: `prototype/spa/vue/` (router guard helper).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"prototypeBypassAuth": true,
|
|
4
|
+
"screens": {
|
|
5
|
+
"order-detail": {
|
|
6
|
+
"routePattern": "/orders/:id",
|
|
7
|
+
"routeParams": { "id": "demo-001" },
|
|
8
|
+
"queryParams": { "tab": "summary" },
|
|
9
|
+
"requiresAuth": true
|
|
10
|
+
},
|
|
11
|
+
"login": {
|
|
12
|
+
"requiresAuth": false
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Vue SPA prototype starter
|
|
2
|
+
|
|
3
|
+
Copy these patterns when generating a Vue 3 + Vite + Vue Router prototype. The agent should adapt routes to your `prototype/screen-map.json`.
|
|
4
|
+
|
|
5
|
+
## Prototype mode (direct routes, no login redirect)
|
|
6
|
+
|
|
7
|
+
Reviewers open any screen via `previewUri` in `screen-map.json` without signing in first.
|
|
8
|
+
|
|
9
|
+
1. Set `prototypeBypassAuth: true` in `prototype/route-defaults.json` (or rely on the default from `npx ai-spector prototype manifest`).
|
|
10
|
+
2. In the router guard, skip auth when bypass is enabled:
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import screenMap from "../../screen-map.json";
|
|
14
|
+
|
|
15
|
+
const bypassAuth = screenMap.prototypeBypassAuth !== false;
|
|
16
|
+
|
|
17
|
+
router.beforeEach((to) => {
|
|
18
|
+
if (bypassAuth) return true;
|
|
19
|
+
if (to.meta.requiresAuth && !isLoggedIn()) {
|
|
20
|
+
return { name: "login", query: { redirect: to.fullPath } };
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
3. Mark protected routes with `meta: { requiresAuth: true }` to match `requiresAuth` on screen-map entries.
|
|
27
|
+
|
|
28
|
+
## Route params and preview URIs
|
|
29
|
+
|
|
30
|
+
For detail screens, copy `prototype/route-defaults.example.json` to `prototype/route-defaults.json` and set default param values. Then run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx ai-spector prototype manifest
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Use the generated `previewUri` per screen (e.g. `/orders/demo-001?tab=summary`) for bookmarks and QA links.
|
|
37
|
+
|
|
38
|
+
## Build
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# vite.config.ts must use base: './'
|
|
42
|
+
npm run build
|
|
43
|
+
npx ai-spector prototype sync
|
|
44
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prototype router guard — allows direct deep links without login when bypass is on.
|
|
3
|
+
* Import screen-map.json from the prototype workspace (path varies per project layout).
|
|
4
|
+
*/
|
|
5
|
+
export interface PrototypeScreenMapGuardSource {
|
|
6
|
+
prototypeBypassAuth?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function shouldBypassPrototypeAuth(
|
|
10
|
+
screenMap: PrototypeScreenMapGuardSource | undefined,
|
|
11
|
+
): boolean {
|
|
12
|
+
return screenMap?.prototypeBypassAuth !== false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function createPrototypeAuthGuard(
|
|
16
|
+
screenMap: PrototypeScreenMapGuardSource | undefined,
|
|
17
|
+
isLoggedIn: () => boolean,
|
|
18
|
+
): (to: { meta: { requiresAuth?: boolean }; fullPath: string; name?: string | symbol }) =>
|
|
19
|
+
| boolean
|
|
20
|
+
| { name: string; query: { redirect: string } } {
|
|
21
|
+
const bypass = shouldBypassPrototypeAuth(screenMap);
|
|
22
|
+
return (to) => {
|
|
23
|
+
if (bypass) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (to.meta.requiresAuth && !isLoggedIn()) {
|
|
27
|
+
return { name: "login", query: { redirect: to.fullPath } };
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
}
|