@captain_z/zsk 1.6.1 → 1.8.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/README.md +24 -32
- package/dist/bin.js +22 -15
- package/dist/bin.js.map +1 -1
- package/dist/commands/check.d.ts +1 -0
- package/dist/commands/check.js +209 -12
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/demo.d.ts +1 -0
- package/dist/commands/demo.js +341 -36
- package/dist/commands/demo.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.js +102 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/issue.d.ts +2 -1
- package/dist/commands/issue.js +75 -30
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/module.js +42 -27
- package/dist/commands/module.js.map +1 -1
- package/dist/commands/prep.js +100 -6
- package/dist/commands/prep.js.map +1 -1
- package/dist/commands/project-init.js +63 -11
- package/dist/commands/project-init.js.map +1 -1
- package/dist/core/config.d.ts +14 -2
- package/dist/core/config.js +91 -12
- package/dist/core/config.js.map +1 -1
- package/dist/core/raw-manifest.d.ts +10 -0
- package/dist/core/raw-manifest.js +48 -1
- package/dist/core/raw-manifest.js.map +1 -1
- package/dist/core/scaffolder.js +5 -2
- package/dist/core/scaffolder.js.map +1 -1
- package/dist/core/workspace-layout.d.ts +53 -0
- package/dist/core/workspace-layout.js +108 -0
- package/dist/core/workspace-layout.js.map +1 -0
- package/package.json +2 -2
- package/schemas/zsk-config.schema.json +141 -11
- package/templates/issue/default/issue.md +9 -5
- package/templates/module/frontend-module/design.md +22 -0
- package/templates/module/frontend-module/module.yaml +4 -3
- package/templates/module/frontend-module/proposal.md +26 -1
- package/templates/module/frontend-module/spec.md +13 -0
- package/templates/module/frontend-module/tasks.md +15 -2
- package/templates/project-init/.zsk/config.yaml +41 -29
- package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +62 -0
- package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +59 -0
- package/templates/project-init/.zsk/modules/index.md +7 -0
- package/templates/project-init/.zsk/raws/backend/index.md +3 -0
- package/templates/project-init/.zsk/raws/index.md +7 -0
- package/templates/project-init/.zsk/raws/jira/index.md +3 -0
- package/templates/project-init/.zsk/raws/manual/index.md +3 -0
- package/templates/project-init/.zsk/raws/product/index.md +3 -0
- package/templates/project-init/.zsk/raws/qa/index.md +3 -0
- package/templates/project-init/.zsk/raws/ue/index.md +3 -0
- package/templates/module/frontend-module/acceptance.md +0 -18
- package/templates/module/frontend-module/archive.md +0 -17
- package/templates/module/frontend-module/commit.md +0 -15
- package/templates/module/frontend-module/demo-outline.md +0 -59
- package/templates/module/frontend-module/demo-report.md +0 -23
- package/templates/module/frontend-module/deploy.md +0 -18
- package/templates/module/frontend-module/ready.md +0 -12
- package/templates/module/frontend-module/review.md +0 -12
- package/templates/module/frontend-module/scenarios/index.md +0 -21
- package/templates/module/frontend-module/scenarios/p0-happy-path.spec.ts +0 -13
- package/templates/module/frontend-module/smoke.md +0 -21
- package/templates/module/frontend-module/verification.md +0 -6
- package/templates/module/frontend-module/verify.md +0 -12
- package/templates/project-init/.issues/README.md +0 -57
- package/templates/project-init/.issues/_taxonomy.md +0 -35
- package/templates/project-init/.issues/index.md +0 -7
- package/templates/project-init/.raws/README.md +0 -27
- package/templates/project-init/.raws/api-contracts/index.md +0 -22
- package/templates/project-init/.raws/backend-repositories/index.md +0 -12
- package/templates/project-init/.raws/design-assets/index.md +0 -25
- package/templates/project-init/.raws/design-sources/index.md +0 -24
- package/templates/project-init/.raws/index.md +0 -56
- package/templates/project-init/.raws/issues/index.md +0 -4
- package/templates/project-init/.raws/requirements/index.md +0 -23
- package/templates/project-init/.raws/testing/index.md +0 -22
- package/templates/project-init/.zsk/checkpoints/index.md +0 -4
- package/templates/project-init/.zsk/learning/index.md +0 -14
- package/templates/project-init/.zsk/learning/proposals/.gitkeep +0 -1
- package/templates/project-init/.zsk/resource-manifest.json +0 -55
- package/templates/project-init/.zsk/workflow-state.json +0 -6
- package/templates/project-init/docs/SYSTEM-SPEC.md +0 -53
- package/templates/project-init/docs/_module-index.md +0 -15
- package/templates/project-init/project-config.md +0 -154
- /package/templates/project-init/{.raws → .zsk/raws}/manifest.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { readFile, writeFile, mkdir, stat } from "node:fs/promises";
|
|
3
|
-
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
4
4
|
export async function updateRawManifest(file, records) {
|
|
5
5
|
await mkdir(dirname(file), { recursive: true });
|
|
6
6
|
const manifest = {
|
|
@@ -9,6 +9,24 @@ export async function updateRawManifest(file, records) {
|
|
|
9
9
|
};
|
|
10
10
|
await writeFile(file, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
11
11
|
}
|
|
12
|
+
export async function updateRawIndex(file, records) {
|
|
13
|
+
await mkdir(dirname(file), { recursive: true });
|
|
14
|
+
const rows = records.map((record) => {
|
|
15
|
+
const target = record.snapshot ?? record.output ?? record.sourcePath ?? describeOrigin(record.origin) ?? "";
|
|
16
|
+
return `| ${record.provider} | ${record.type} | ${record.status ?? record.method} | ${target} |`;
|
|
17
|
+
});
|
|
18
|
+
const content = [
|
|
19
|
+
"# Raw Source Index",
|
|
20
|
+
"",
|
|
21
|
+
"Immutable fact sources for this project. Generated by `zsk prep`.",
|
|
22
|
+
"",
|
|
23
|
+
"| Provider | Type | Status | Snapshot / Origin |",
|
|
24
|
+
"| --- | --- | --- | --- |",
|
|
25
|
+
rows.length > 0 ? rows.join("\n") : "| | | | |",
|
|
26
|
+
"",
|
|
27
|
+
].join("\n");
|
|
28
|
+
await writeFile(file, content, "utf8");
|
|
29
|
+
}
|
|
12
30
|
export async function describeResource(root, provider, source) {
|
|
13
31
|
const ref = source.snapshot ?? source.path ?? source.output ?? source.origin?.path;
|
|
14
32
|
const fullPath = ref ? resolvePath(root, ref) : null;
|
|
@@ -20,6 +38,7 @@ export async function describeResource(root, provider, source) {
|
|
|
20
38
|
origin: source.origin,
|
|
21
39
|
snapshot: source.snapshot,
|
|
22
40
|
output: source.output,
|
|
41
|
+
status: "configured",
|
|
23
42
|
exists: Boolean(info),
|
|
24
43
|
size: info?.size ?? null,
|
|
25
44
|
hash: info && info.isFile ? await sha256(fullPath) : null,
|
|
@@ -27,6 +46,28 @@ export async function describeResource(root, provider, source) {
|
|
|
27
46
|
method: toMethod(source),
|
|
28
47
|
};
|
|
29
48
|
}
|
|
49
|
+
export async function describeDiscoveredResource(root, provider, type, path, status, note) {
|
|
50
|
+
const fullPath = resolvePath(root, path);
|
|
51
|
+
const info = await safeStat(fullPath);
|
|
52
|
+
return {
|
|
53
|
+
provider,
|
|
54
|
+
type,
|
|
55
|
+
originKind: "local",
|
|
56
|
+
origin: { kind: "local", path },
|
|
57
|
+
sourcePath: path,
|
|
58
|
+
status,
|
|
59
|
+
exists: Boolean(info),
|
|
60
|
+
size: info?.size ?? null,
|
|
61
|
+
hash: info && info.isFile ? await sha256(fullPath) : null,
|
|
62
|
+
syncedAt: new Date().toISOString(),
|
|
63
|
+
method: "local",
|
|
64
|
+
note,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function projectRelative(root, path) {
|
|
68
|
+
const rel = relative(root, path);
|
|
69
|
+
return rel === "" || rel.startsWith("..") ? path : rel;
|
|
70
|
+
}
|
|
30
71
|
function toMethod(source) {
|
|
31
72
|
if (source.kind === "script")
|
|
32
73
|
return "script";
|
|
@@ -58,4 +99,10 @@ async function sha256(path) {
|
|
|
58
99
|
function resolvePath(root, value) {
|
|
59
100
|
return isAbsolute(value) ? value : resolve(root, value);
|
|
60
101
|
}
|
|
102
|
+
function describeOrigin(origin) {
|
|
103
|
+
if (!origin || typeof origin !== "object")
|
|
104
|
+
return null;
|
|
105
|
+
const value = origin;
|
|
106
|
+
return value.path ?? value.url ?? value.repository ?? value.note ?? null;
|
|
107
|
+
}
|
|
61
108
|
//# sourceMappingURL=raw-manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-manifest.js","sourceRoot":"","sources":["../../src/core/raw-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"raw-manifest.js","sourceRoot":"","sources":["../../src/core/raw-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/core/scaffolder.js
CHANGED
|
@@ -40,14 +40,16 @@ export async function scaffoldTemplate(templateSubpath, target, opts = {}) {
|
|
|
40
40
|
}
|
|
41
41
|
async function copyRecursive(src, dst, overwrite, result, variables) {
|
|
42
42
|
const entries = await readdir(src, { withFileTypes: true });
|
|
43
|
-
|
|
43
|
+
let hasTemplateFile = false;
|
|
44
44
|
for (const e of entries) {
|
|
45
45
|
const srcPath = join(src, e.name);
|
|
46
46
|
const dstPath = join(dst, applyTemplateVariables(e.name, variables));
|
|
47
47
|
if (e.isDirectory()) {
|
|
48
|
-
await copyRecursive(srcPath, dstPath, overwrite, result, variables);
|
|
48
|
+
hasTemplateFile = (await copyRecursive(srcPath, dstPath, overwrite, result, variables)) || hasTemplateFile;
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
|
+
hasTemplateFile = true;
|
|
52
|
+
await mkdir(dst, { recursive: true });
|
|
51
53
|
if (!overwrite && (await fileExists(dstPath))) {
|
|
52
54
|
result.skipped.push(dstPath);
|
|
53
55
|
continue;
|
|
@@ -57,6 +59,7 @@ async function copyRecursive(src, dst, overwrite, result, variables) {
|
|
|
57
59
|
result.written.push(dstPath);
|
|
58
60
|
}
|
|
59
61
|
}
|
|
62
|
+
return hasTemplateFile;
|
|
60
63
|
}
|
|
61
64
|
function applyTemplateVariables(value, variables) {
|
|
62
65
|
let next = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,2DAA2D;AAE3D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAO7C,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAElD,gFAAgF;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,kBAAkB,GAAG,OAAO,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,iDAAiD;IACjD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IACzD,kBAAkB,GAAG,SAAS,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,eAAuB,EACvB,MAAc,EACd,OAAoE,EAAE;IAEtE,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACxC,MAAM,MAAM,GAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC5D,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACxF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,GAAW,EACX,SAAkB,EAClB,MAAsB,EACtB,SAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare const WORKSPACE_LAYOUT_VERSION = 2;
|
|
2
|
+
export declare const DEFAULT_WORKSPACE_PATHS: {
|
|
3
|
+
readonly docs: ".zsk/docs";
|
|
4
|
+
readonly modules: ".zsk/modules";
|
|
5
|
+
readonly raws: ".zsk/raws";
|
|
6
|
+
readonly resources: ".zsk/resources";
|
|
7
|
+
readonly issues: ".zsk/issues";
|
|
8
|
+
readonly evidence: ".zsk/evidence";
|
|
9
|
+
readonly playwright: ".zsk/playwright";
|
|
10
|
+
};
|
|
11
|
+
export type WorkspaceLayoutConfig = {
|
|
12
|
+
paths?: {
|
|
13
|
+
docs?: string;
|
|
14
|
+
modules?: string;
|
|
15
|
+
resources?: string;
|
|
16
|
+
issues?: string;
|
|
17
|
+
evidence?: string;
|
|
18
|
+
playwright?: string;
|
|
19
|
+
plans?: string;
|
|
20
|
+
raws?: string;
|
|
21
|
+
};
|
|
22
|
+
modules?: {
|
|
23
|
+
index?: string;
|
|
24
|
+
root?: string;
|
|
25
|
+
};
|
|
26
|
+
automation?: {
|
|
27
|
+
demo?: {
|
|
28
|
+
evidenceDir?: string;
|
|
29
|
+
scenarioDir?: string;
|
|
30
|
+
bridge?: {
|
|
31
|
+
planFile?: string;
|
|
32
|
+
executionFile?: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type WorkspaceLayout = {
|
|
38
|
+
version: number;
|
|
39
|
+
docsRoot: string;
|
|
40
|
+
modulesRoot: string;
|
|
41
|
+
resourcesRoot: string;
|
|
42
|
+
issuesRoot: string;
|
|
43
|
+
evidenceRoot: string;
|
|
44
|
+
playwrightRoot: string;
|
|
45
|
+
};
|
|
46
|
+
export type WorkspacePathKind = "config" | "workflowState" | "mcpPlaywrightConfig" | "docsRoot" | "projectConfig" | "systemSpec" | "modulesRoot" | "moduleIndex" | "moduleRoot" | "moduleConfig" | "moduleRuns" | "resourcesRoot" | "resourcesTesting" | "resourcesManifest" | "rawsRoot" | "rawsTesting" | "rawsManifest" | "issuesRoot" | "moduleIssues" | "evidenceRoot" | "moduleEvidence" | "demoEvidence" | "playwrightRoot" | "modulePlaywright" | "playwrightSpecs" | "playwrightTestPlans" | "playwrightAuth" | "playwrightAuthState" | "playwrightResults" | "playwrightReport" | "playwrightExecution" | "demoSessionCurrent" | "bridgeOperationPlan" | "bridgeExecution";
|
|
47
|
+
export type WorkspacePathOptions = {
|
|
48
|
+
module?: string;
|
|
49
|
+
};
|
|
50
|
+
export declare function resolveWorkspaceLayout(config?: WorkspaceLayoutConfig): WorkspaceLayout;
|
|
51
|
+
export declare function getWorkspacePath(config: WorkspaceLayoutConfig, kind: WorkspacePathKind, options?: WorkspacePathOptions): string;
|
|
52
|
+
export declare function resolveWorkspacePath(root: string, config: WorkspaceLayoutConfig, kind: WorkspacePathKind, options?: WorkspacePathOptions): string;
|
|
53
|
+
export declare function interpolateModulePath(value: string, moduleId: string): string;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
2
|
+
export const WORKSPACE_LAYOUT_VERSION = 2;
|
|
3
|
+
export const DEFAULT_WORKSPACE_PATHS = {
|
|
4
|
+
docs: ".zsk/docs",
|
|
5
|
+
modules: ".zsk/modules",
|
|
6
|
+
raws: ".zsk/raws",
|
|
7
|
+
resources: ".zsk/resources",
|
|
8
|
+
issues: ".zsk/issues",
|
|
9
|
+
evidence: ".zsk/evidence",
|
|
10
|
+
playwright: ".zsk/playwright",
|
|
11
|
+
};
|
|
12
|
+
export function resolveWorkspaceLayout(config = {}) {
|
|
13
|
+
const paths = config.paths ?? {};
|
|
14
|
+
const rawsRoot = paths.raws ?? paths.resources ?? DEFAULT_WORKSPACE_PATHS.raws;
|
|
15
|
+
return {
|
|
16
|
+
version: WORKSPACE_LAYOUT_VERSION,
|
|
17
|
+
docsRoot: paths.docs ?? DEFAULT_WORKSPACE_PATHS.docs,
|
|
18
|
+
modulesRoot: paths.modules ?? config.modules?.root ?? DEFAULT_WORKSPACE_PATHS.modules,
|
|
19
|
+
resourcesRoot: rawsRoot,
|
|
20
|
+
issuesRoot: paths.issues ?? DEFAULT_WORKSPACE_PATHS.issues,
|
|
21
|
+
evidenceRoot: paths.evidence ?? DEFAULT_WORKSPACE_PATHS.evidence,
|
|
22
|
+
playwrightRoot: paths.playwright ?? DEFAULT_WORKSPACE_PATHS.playwright,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function getWorkspacePath(config, kind, options = {}) {
|
|
26
|
+
const layout = resolveWorkspaceLayout(config);
|
|
27
|
+
const moduleId = options.module;
|
|
28
|
+
switch (kind) {
|
|
29
|
+
case "config":
|
|
30
|
+
return join(".zsk", "config.yaml");
|
|
31
|
+
case "workflowState":
|
|
32
|
+
return join(".zsk", "workflow-state.json");
|
|
33
|
+
case "mcpPlaywrightConfig":
|
|
34
|
+
return join(".zsk", "mcp", "playwright.json");
|
|
35
|
+
case "docsRoot":
|
|
36
|
+
return layout.docsRoot;
|
|
37
|
+
case "projectConfig":
|
|
38
|
+
return join(layout.docsRoot, "PROJECT-CONFIG.md");
|
|
39
|
+
case "systemSpec":
|
|
40
|
+
return join(layout.docsRoot, "SYSTEM-SPEC.md");
|
|
41
|
+
case "modulesRoot":
|
|
42
|
+
return layout.modulesRoot;
|
|
43
|
+
case "moduleIndex":
|
|
44
|
+
return config.modules?.index ?? join(layout.modulesRoot, "_module-index.md");
|
|
45
|
+
case "moduleRoot":
|
|
46
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId));
|
|
47
|
+
case "moduleConfig":
|
|
48
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "module.yaml");
|
|
49
|
+
case "moduleRuns":
|
|
50
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "runs");
|
|
51
|
+
case "rawsRoot":
|
|
52
|
+
case "resourcesRoot":
|
|
53
|
+
return layout.resourcesRoot;
|
|
54
|
+
case "rawsTesting":
|
|
55
|
+
case "resourcesTesting":
|
|
56
|
+
return join(layout.resourcesRoot, "qa", "testing");
|
|
57
|
+
case "rawsManifest":
|
|
58
|
+
case "resourcesManifest":
|
|
59
|
+
return join(layout.resourcesRoot, "manifest.json");
|
|
60
|
+
case "issuesRoot":
|
|
61
|
+
return layout.issuesRoot;
|
|
62
|
+
case "moduleIssues":
|
|
63
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_issues");
|
|
64
|
+
case "evidenceRoot":
|
|
65
|
+
return layout.evidenceRoot;
|
|
66
|
+
case "moduleEvidence":
|
|
67
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_evidence");
|
|
68
|
+
case "demoEvidence":
|
|
69
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_evidence", "demo");
|
|
70
|
+
case "playwrightRoot":
|
|
71
|
+
return layout.playwrightRoot;
|
|
72
|
+
case "modulePlaywright":
|
|
73
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright");
|
|
74
|
+
case "playwrightSpecs":
|
|
75
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "specs");
|
|
76
|
+
case "playwrightTestPlans":
|
|
77
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "test-plans");
|
|
78
|
+
case "playwrightAuth":
|
|
79
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", ".auth");
|
|
80
|
+
case "playwrightAuthState":
|
|
81
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", ".auth", "user.json");
|
|
82
|
+
case "playwrightResults":
|
|
83
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "results");
|
|
84
|
+
case "playwrightReport":
|
|
85
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "report");
|
|
86
|
+
case "playwrightExecution":
|
|
87
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution");
|
|
88
|
+
case "demoSessionCurrent":
|
|
89
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "current.json");
|
|
90
|
+
case "bridgeOperationPlan":
|
|
91
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "operation-plan.json");
|
|
92
|
+
case "bridgeExecution":
|
|
93
|
+
return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "playwright-execution.json");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function resolveWorkspacePath(root, config, kind, options = {}) {
|
|
97
|
+
const workspacePath = getWorkspacePath(config, kind, options);
|
|
98
|
+
return isAbsolute(workspacePath) ? workspacePath : resolve(root, workspacePath);
|
|
99
|
+
}
|
|
100
|
+
export function interpolateModulePath(value, moduleId) {
|
|
101
|
+
return value.split("{module}").join(moduleId);
|
|
102
|
+
}
|
|
103
|
+
function requireModuleId(kind, moduleId) {
|
|
104
|
+
if (moduleId)
|
|
105
|
+
return moduleId;
|
|
106
|
+
throw new Error(`${kind} requires a module id`);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=workspace-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-layout.js","sourceRoot":"","sources":["../../src/core/workspace-layout.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@captain_z/zsk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "ZNorth Standard Kit — CLI installer for zsk skill bundles (npx @captain_z/zsk add)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"commander": "^12.1.0",
|
|
21
21
|
"picocolors": "^1.1.1",
|
|
22
22
|
"yaml": "^2.7.0",
|
|
23
|
-
"@captain_z/zsk-skills": "1.
|
|
23
|
+
"@captain_z/zsk-skills": "1.8.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^22.10.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://unpkg.com/@captain_z/zsk/schemas/zsk-config.schema.json",
|
|
4
4
|
"title": "ZSK Project Config",
|
|
5
|
-
|
|
5
|
+
"description": "Project-level configuration for ZSK raw source origins, workspace paths, tools, and module index locations.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["project", "paths", "sources", "tools", "modules"],
|
|
@@ -28,28 +28,55 @@
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
|
+
"layoutVersion": {
|
|
32
|
+
"description": "Workspace layout version. Version 2 keeps all zsk-managed outputs under .zsk/ by default and prefers paths.raws for fact sources.",
|
|
33
|
+
"type": "integer",
|
|
34
|
+
"minimum": 2
|
|
35
|
+
},
|
|
31
36
|
"paths": {
|
|
32
37
|
"description": "Top-level project knowledge workspace paths.",
|
|
33
38
|
"type": "object",
|
|
34
39
|
"additionalProperties": false,
|
|
35
|
-
"required": ["
|
|
40
|
+
"required": ["docs", "modules", "issues", "evidence", "playwright"],
|
|
41
|
+
"anyOf": [
|
|
42
|
+
{
|
|
43
|
+
"required": ["raws"]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"required": ["resources"]
|
|
47
|
+
}
|
|
48
|
+
],
|
|
36
49
|
"properties": {
|
|
37
|
-
"
|
|
50
|
+
"docs": {
|
|
38
51
|
"$ref": "#/$defs/pathRef"
|
|
39
52
|
},
|
|
40
|
-
"
|
|
53
|
+
"modules": {
|
|
54
|
+
"$ref": "#/$defs/pathRef"
|
|
55
|
+
},
|
|
56
|
+
"resources": {
|
|
57
|
+
"description": "Deprecated compatibility alias for paths.raws.",
|
|
58
|
+
"$ref": "#/$defs/pathRef"
|
|
59
|
+
},
|
|
60
|
+
"raws": {
|
|
61
|
+
"description": "Preferred immutable raw fact-source root.",
|
|
41
62
|
"$ref": "#/$defs/pathRef"
|
|
42
63
|
},
|
|
43
64
|
"issues": {
|
|
44
65
|
"$ref": "#/$defs/pathRef"
|
|
45
66
|
},
|
|
67
|
+
"evidence": {
|
|
68
|
+
"$ref": "#/$defs/pathRef"
|
|
69
|
+
},
|
|
70
|
+
"playwright": {
|
|
71
|
+
"$ref": "#/$defs/pathRef"
|
|
72
|
+
},
|
|
46
73
|
"metadata": {
|
|
47
74
|
"$ref": "#/$defs/metadata"
|
|
48
75
|
}
|
|
49
76
|
}
|
|
50
77
|
},
|
|
51
78
|
"sources": {
|
|
52
|
-
"description": "Project-level
|
|
79
|
+
"description": "Project-level raw source origins. May be empty after init and filled by AI or zsk config setup.",
|
|
53
80
|
"type": "object",
|
|
54
81
|
"additionalProperties": {
|
|
55
82
|
"$ref": "#/$defs/sourceRef"
|
|
@@ -75,7 +102,7 @@
|
|
|
75
102
|
"uniqueItems": true
|
|
76
103
|
},
|
|
77
104
|
"design": {
|
|
78
|
-
"description": "Preferred tools for design and
|
|
105
|
+
"description": "Preferred tools for design source and asset capture.",
|
|
79
106
|
"type": "array",
|
|
80
107
|
"items": {
|
|
81
108
|
"$ref": "#/$defs/toolName"
|
|
@@ -121,7 +148,7 @@
|
|
|
121
148
|
"properties": {
|
|
122
149
|
"defaultMode": {
|
|
123
150
|
"type": "string",
|
|
124
|
-
"enum": ["manual", "script", "playwright", "computer-use", "hybrid"]
|
|
151
|
+
"enum": ["manual", "script", "optimized", "playwright", "computer-use", "hybrid"]
|
|
125
152
|
},
|
|
126
153
|
"baseUrl": {
|
|
127
154
|
"type": "string",
|
|
@@ -204,7 +231,7 @@
|
|
|
204
231
|
}
|
|
205
232
|
},
|
|
206
233
|
"sync": {
|
|
207
|
-
"description": "Optional deterministic or AI-assisted raw
|
|
234
|
+
"description": "Optional deterministic or AI-assisted raw source sync configuration.",
|
|
208
235
|
"type": "object",
|
|
209
236
|
"additionalProperties": {
|
|
210
237
|
"$ref": "#/$defs/syncRef"
|
|
@@ -247,12 +274,12 @@
|
|
|
247
274
|
}
|
|
248
275
|
},
|
|
249
276
|
"sourceType": {
|
|
250
|
-
"description": "
|
|
277
|
+
"description": "Raw source role.",
|
|
251
278
|
"type": "string",
|
|
252
279
|
"enum": ["srs", "prd", "design", "api_contract", "backend_repo", "test_case", "design_asset", "vendor_doc", "manual"]
|
|
253
280
|
},
|
|
254
281
|
"sourceRef": {
|
|
255
|
-
"description": "
|
|
282
|
+
"description": "Raw source reference.",
|
|
256
283
|
"type": "object",
|
|
257
284
|
"additionalProperties": false,
|
|
258
285
|
"required": ["type", "origin"],
|
|
@@ -289,9 +316,18 @@
|
|
|
289
316
|
{
|
|
290
317
|
"$ref": "#/$defs/modaoOrigin"
|
|
291
318
|
},
|
|
319
|
+
{
|
|
320
|
+
"$ref": "#/$defs/designOrigin"
|
|
321
|
+
},
|
|
292
322
|
{
|
|
293
323
|
"$ref": "#/$defs/openapiOrigin"
|
|
294
324
|
},
|
|
325
|
+
{
|
|
326
|
+
"$ref": "#/$defs/jiraOrigin"
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"$ref": "#/$defs/srsOrigin"
|
|
330
|
+
},
|
|
295
331
|
{
|
|
296
332
|
"$ref": "#/$defs/manualOrigin"
|
|
297
333
|
}
|
|
@@ -339,7 +375,7 @@
|
|
|
339
375
|
"properties": {
|
|
340
376
|
"kind": {
|
|
341
377
|
"type": "string",
|
|
342
|
-
"
|
|
378
|
+
"enum": ["git", "git-submodule"]
|
|
343
379
|
},
|
|
344
380
|
"repository": {
|
|
345
381
|
"type": "string",
|
|
@@ -401,6 +437,35 @@
|
|
|
401
437
|
}
|
|
402
438
|
}
|
|
403
439
|
},
|
|
440
|
+
"designOrigin": {
|
|
441
|
+
"type": "object",
|
|
442
|
+
"additionalProperties": false,
|
|
443
|
+
"required": ["kind", "provider"],
|
|
444
|
+
"properties": {
|
|
445
|
+
"kind": {
|
|
446
|
+
"type": "string",
|
|
447
|
+
"const": "design"
|
|
448
|
+
},
|
|
449
|
+
"provider": {
|
|
450
|
+
"type": "string",
|
|
451
|
+
"minLength": 1
|
|
452
|
+
},
|
|
453
|
+
"url": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"minLength": 1
|
|
456
|
+
},
|
|
457
|
+
"path": {
|
|
458
|
+
"$ref": "#/$defs/pathRef"
|
|
459
|
+
},
|
|
460
|
+
"id": {
|
|
461
|
+
"type": "string",
|
|
462
|
+
"minLength": 1
|
|
463
|
+
},
|
|
464
|
+
"metadata": {
|
|
465
|
+
"$ref": "#/$defs/metadata"
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
},
|
|
404
469
|
"openapiOrigin": {
|
|
405
470
|
"type": "object",
|
|
406
471
|
"additionalProperties": false,
|
|
@@ -430,6 +495,71 @@
|
|
|
430
495
|
}
|
|
431
496
|
]
|
|
432
497
|
},
|
|
498
|
+
"jiraOrigin": {
|
|
499
|
+
"type": "object",
|
|
500
|
+
"additionalProperties": false,
|
|
501
|
+
"required": ["kind"],
|
|
502
|
+
"properties": {
|
|
503
|
+
"kind": {
|
|
504
|
+
"type": "string",
|
|
505
|
+
"const": "jira"
|
|
506
|
+
},
|
|
507
|
+
"url": {
|
|
508
|
+
"type": "string",
|
|
509
|
+
"minLength": 1
|
|
510
|
+
},
|
|
511
|
+
"path": {
|
|
512
|
+
"$ref": "#/$defs/pathRef"
|
|
513
|
+
},
|
|
514
|
+
"jql": {
|
|
515
|
+
"type": "string",
|
|
516
|
+
"minLength": 1
|
|
517
|
+
},
|
|
518
|
+
"metadata": {
|
|
519
|
+
"$ref": "#/$defs/metadata"
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
"anyOf": [
|
|
523
|
+
{
|
|
524
|
+
"required": ["url"]
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"required": ["path"]
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
"required": ["jql"]
|
|
531
|
+
}
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
"srsOrigin": {
|
|
535
|
+
"type": "object",
|
|
536
|
+
"additionalProperties": false,
|
|
537
|
+
"required": ["kind"],
|
|
538
|
+
"properties": {
|
|
539
|
+
"kind": {
|
|
540
|
+
"type": "string",
|
|
541
|
+
"const": "srs"
|
|
542
|
+
},
|
|
543
|
+
"url": {
|
|
544
|
+
"type": "string",
|
|
545
|
+
"minLength": 1
|
|
546
|
+
},
|
|
547
|
+
"path": {
|
|
548
|
+
"$ref": "#/$defs/pathRef"
|
|
549
|
+
},
|
|
550
|
+
"metadata": {
|
|
551
|
+
"$ref": "#/$defs/metadata"
|
|
552
|
+
}
|
|
553
|
+
},
|
|
554
|
+
"anyOf": [
|
|
555
|
+
{
|
|
556
|
+
"required": ["url"]
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"required": ["path"]
|
|
560
|
+
}
|
|
561
|
+
]
|
|
562
|
+
},
|
|
433
563
|
"manualOrigin": {
|
|
434
564
|
"type": "object",
|
|
435
565
|
"additionalProperties": false,
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
__ISSUE_TYPE__
|
|
6
6
|
|
|
7
|
+
## 作用域
|
|
8
|
+
|
|
9
|
+
__ISSUE_SCOPE__
|
|
10
|
+
|
|
7
11
|
## 问题级别
|
|
8
12
|
|
|
9
13
|
__SEVERITY__
|
|
@@ -62,11 +66,11 @@ __SEVERITY__
|
|
|
62
66
|
## Documentation Feedback
|
|
63
67
|
|
|
64
68
|
- 需要反哺的文档:
|
|
65
|
-
- [ ]
|
|
66
|
-
- [ ]
|
|
67
|
-
- [ ]
|
|
68
|
-
- [ ]
|
|
69
|
-
- [ ] `.zsk/
|
|
69
|
+
- [ ] `.zsk/modules/{module}/spec.md`
|
|
70
|
+
- [ ] `.zsk/modules/{module}/design.md`
|
|
71
|
+
- [ ] `.zsk/modules/{module}/tasks.md`
|
|
72
|
+
- [ ] `.zsk/docs/SYSTEM-SPEC.md`
|
|
73
|
+
- [ ] `.zsk/raws`
|
|
70
74
|
- 更新内容或 no-update rationale:
|
|
71
75
|
- 反哺时机:修复通过 verify 且经用户/产品确认后执行
|
|
72
76
|
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# __MODULE_NAME__ Design
|
|
2
2
|
|
|
3
|
+
## Implementation Map
|
|
4
|
+
|
|
5
|
+
| Requirement / AC | Surface | Files / Modules | Interface / State / Data Flow | Risk |
|
|
6
|
+
| --- | --- | --- | --- | --- |
|
|
7
|
+
| FR-001 / AC-001 | | | | |
|
|
8
|
+
|
|
9
|
+
## Decisions
|
|
10
|
+
|
|
11
|
+
| Decision | Alternatives Rejected | Rationale / Evidence | Rollback / Migration Note |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| | | | |
|
|
14
|
+
|
|
15
|
+
## States And Failure Modes
|
|
16
|
+
|
|
17
|
+
| State | User/System Observable Behavior | Test / Demo Evidence |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| loading | | |
|
|
20
|
+
| empty | | |
|
|
21
|
+
| error | | |
|
|
22
|
+
| permission | | |
|
|
23
|
+
|
|
3
24
|
## Playwright Locator And State Strategy
|
|
4
25
|
|
|
5
26
|
| Scenario | Page / Route | Preferred Locator Strategy | State Coverage | API / Mock | Auth / Storage | Evidence |
|
|
@@ -11,6 +32,7 @@ Guidelines:
|
|
|
11
32
|
- Prefer user-facing locators: `getByRole`, `getByLabel`, `getByPlaceholder`, `getByTestId`.
|
|
12
33
|
- Add implementation tasks for missing accessible names, labels, or stable test ids.
|
|
13
34
|
- Define auth/storage reuse before demo so Playwright can run repeatably.
|
|
35
|
+
- Route unclear behavior back to spec instead of redesigning requirements here.
|
|
14
36
|
|
|
15
37
|
## Documentation Feedback
|
|
16
38
|
|
|
@@ -9,19 +9,20 @@ sources: {}
|
|
|
9
9
|
runtime:
|
|
10
10
|
url: http://localhost:3000
|
|
11
11
|
tools:
|
|
12
|
-
-
|
|
12
|
+
- playwright_cli
|
|
13
13
|
- playwright
|
|
14
14
|
- computer_use
|
|
15
15
|
- browser_use
|
|
16
16
|
|
|
17
17
|
tests:
|
|
18
18
|
raw_cases: []
|
|
19
|
-
derived_cases:
|
|
19
|
+
derived_cases:
|
|
20
|
+
- __PLAYWRIGHT_TEST_PLANS__/test-plan.json
|
|
20
21
|
automated:
|
|
21
22
|
unit: []
|
|
22
23
|
integration: []
|
|
23
24
|
e2e:
|
|
24
|
-
-
|
|
25
|
+
- __PLAYWRIGHT_SPECS__
|
|
25
26
|
tdd_required: true
|
|
26
27
|
|
|
27
28
|
outputs:
|