takt-marp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +108 -0
- package/README.md +108 -0
- package/bin/takt-marp.mjs +24 -0
- package/fixtures/marp-slide-workflow/_workflow-smoke/README.md +23 -0
- package/fixtures/marp-slide-workflow/_workflow-smoke/brief.md +44 -0
- package/marp.config.mjs +3 -0
- package/package.json +56 -0
- package/scripts/lib/takt-marp-cli.mjs +199 -0
- package/scripts/lib/takt-marp-project-init.mjs +81 -0
- package/scripts/lib/takt-marp-project-templates.mjs +93 -0
- package/scripts/lib/takt-marp-runtime-context.mjs +24 -0
- package/scripts/lib/takt-marp-slide-workflow.mjs +453 -0
- package/scripts/takt-marp-approve-slide-workflow-state.mjs +37 -0
- package/scripts/takt-marp-build-slide-artifact.mjs +151 -0
- package/scripts/takt-marp-check-slide-workflow-state.mjs +41 -0
- package/scripts/takt-marp-render-slide-workflow-evidence.mjs +70 -0
- package/scripts/takt-marp-run-slide-workflow.mjs +435 -0
- package/scripts/takt-marp-sync-project-templates.mjs +125 -0
- package/scripts/takt-marp-validate-global-install.mjs +391 -0
- package/scripts/takt-marp-validate-package-boundary.mjs +276 -0
- package/scripts/takt-marp-validate-slide-workflow-foundation.mjs +571 -0
- package/scripts/takt-marp-validate-slide-workflow-smoke.mjs +1935 -0
- package/scripts/takt-marp-verify-delivery-artifacts.mjs +181 -0
- package/scripts/takt-marp-verify-render-evidence-metadata.mjs +133 -0
- package/templates/project/facets/instructions/takt-marp-ai-antipattern-fix.md +47 -0
- package/templates/project/facets/instructions/takt-marp-ai-antipattern-review.md +37 -0
- package/templates/project/facets/instructions/takt-marp-compose-fix.md +25 -0
- package/templates/project/facets/instructions/takt-marp-compose-review.md +30 -0
- package/templates/project/facets/instructions/takt-marp-compose-slides.md +35 -0
- package/templates/project/facets/instructions/takt-marp-compose-work-summary.md +23 -0
- package/templates/project/facets/instructions/takt-marp-deliver-build.md +30 -0
- package/templates/project/facets/instructions/takt-marp-deliver-fix.md +25 -0
- package/templates/project/facets/instructions/takt-marp-deliver-verify.md +25 -0
- package/templates/project/facets/instructions/takt-marp-design-system.md +37 -0
- package/templates/project/facets/instructions/takt-marp-intake.md +15 -0
- package/templates/project/facets/instructions/takt-marp-normalize-brief.md +24 -0
- package/templates/project/facets/instructions/takt-marp-plan-fix.md +26 -0
- package/templates/project/facets/instructions/takt-marp-plan-review.md +24 -0
- package/templates/project/facets/instructions/takt-marp-plan-work-summary.md +24 -0
- package/templates/project/facets/instructions/takt-marp-plan.md +26 -0
- package/templates/project/facets/instructions/takt-marp-polish-fix.md +25 -0
- package/templates/project/facets/instructions/takt-marp-polish-inspect.md +25 -0
- package/templates/project/facets/instructions/takt-marp-render-evidence.md +35 -0
- package/templates/project/facets/instructions/takt-marp-supervise-command.md +58 -0
- package/templates/project/facets/instructions/takt-marp-visual-generate.md +26 -0
- package/templates/project/facets/knowledge/takt-marp-repo-conventions.md +119 -0
- package/templates/project/facets/output-contracts/takt-marp-ai-antipattern-fix.md +48 -0
- package/templates/project/facets/output-contracts/takt-marp-ai-antipattern-review.md +43 -0
- package/templates/project/facets/output-contracts/takt-marp-command-fix.md +32 -0
- package/templates/project/facets/output-contracts/takt-marp-command-review.md +32 -0
- package/templates/project/facets/output-contracts/takt-marp-command-work.md +42 -0
- package/templates/project/facets/output-contracts/takt-marp-normalized-brief.md +31 -0
- package/templates/project/facets/output-contracts/takt-marp-slide-plan.md +30 -0
- package/templates/project/facets/output-contracts/takt-marp-supervision.md +45 -0
- package/templates/project/facets/personas/takt-marp-slide-planner.md +24 -0
- package/templates/project/facets/personas/takt-marp-slide-qa.md +23 -0
- package/templates/project/facets/personas/takt-marp-slide-reviewer.md +22 -0
- package/templates/project/facets/personas/takt-marp-slide-reviser.md +22 -0
- package/templates/project/facets/personas/takt-marp-slide-supervisor.md +24 -0
- package/templates/project/facets/personas/takt-marp-slide-writer.md +22 -0
- package/templates/project/facets/policies/takt-marp-general-slide-quality.md +91 -0
- package/templates/project/facets/policies/takt-marp-slide-quality.md +73 -0
- package/templates/project/facets/policies/takt-marp-svg-first-visual.md +66 -0
- package/templates/project/facets/policies/takt-marp-worker-boundary.md +32 -0
- package/templates/project/workflows/takt-marp-slide-ai-quality-gate.yaml +125 -0
- package/templates/project/workflows/takt-marp-slide-compose.yaml +209 -0
- package/templates/project/workflows/takt-marp-slide-deliver.yaml +164 -0
- package/templates/project/workflows/takt-marp-slide-plan.yaml +213 -0
- package/templates/project/workflows/takt-marp-slide-polish.yaml +158 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import {
|
|
5
|
+
formatError,
|
|
6
|
+
resolveDeckTarget,
|
|
7
|
+
SlideWorkflowError,
|
|
8
|
+
} from "./lib/takt-marp-slide-workflow.mjs";
|
|
9
|
+
|
|
10
|
+
const EXPECTED_ARTIFACTS = Object.freeze({
|
|
11
|
+
html: "SLIDES.html",
|
|
12
|
+
pdf: "SLIDES.pdf",
|
|
13
|
+
pptx: "SLIDES.pptx",
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
function usage() {
|
|
17
|
+
return [
|
|
18
|
+
"Usage: node scripts/takt-marp-verify-delivery-artifacts.mjs <work|verify> [target]",
|
|
19
|
+
"",
|
|
20
|
+
"When target is omitted, the newest matching deliver report under slides/*/review is used.",
|
|
21
|
+
"",
|
|
22
|
+
"Examples:",
|
|
23
|
+
" node scripts/takt-marp-verify-delivery-artifacts.mjs work",
|
|
24
|
+
" node scripts/takt-marp-verify-delivery-artifacts.mjs verify slides/my-talk",
|
|
25
|
+
].join("\n");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function main() {
|
|
29
|
+
const [mode, target] = process.argv.slice(2);
|
|
30
|
+
if (mode === "--help" || mode === "-h") {
|
|
31
|
+
console.log(usage());
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!["work", "verify"].includes(mode)) {
|
|
35
|
+
throw new SlideWorkflowError(usage(), "INVALID_ARGS");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const currentTarget = target ? null : readCurrentWorkflowTarget();
|
|
39
|
+
const targetInfo = resolveDeckTarget(target ?? currentTarget?.target ?? inferTargetFromNewestReport(mode));
|
|
40
|
+
const requested = readRequestedDeliverables(targetInfo);
|
|
41
|
+
const shouldVerifyArtifacts = mode === "work"
|
|
42
|
+
? verifyWorkReport(targetInfo, requested)
|
|
43
|
+
: verifyReviewReport(targetInfo, requested);
|
|
44
|
+
if (!shouldVerifyArtifacts) {
|
|
45
|
+
console.log(`delivery artifact verification skipped for non-successful ${mode} report: ${targetInfo.target}`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const artifacts = listOfficialArtifacts(targetInfo);
|
|
50
|
+
assertRequestedArtifacts(targetInfo, requested, artifacts);
|
|
51
|
+
assertNoUnrequestedArtifacts(requested, artifacts);
|
|
52
|
+
console.log(`delivery artifacts verified: ${targetInfo.target}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function readCurrentWorkflowTarget() {
|
|
56
|
+
const markerPath = path.join(process.cwd(), ".takt", "workflow-current-target.json");
|
|
57
|
+
if (!existsSync(markerPath)) return null;
|
|
58
|
+
const marker = JSON.parse(readFileSync(markerPath, "utf8"));
|
|
59
|
+
if (marker.command !== "deliver") return null;
|
|
60
|
+
assert(typeof marker.target === "string" && marker.target, "current workflow target missing");
|
|
61
|
+
return marker;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function inferTargetFromNewestReport(mode) {
|
|
65
|
+
const reportName = mode === "work" ? "deliver-work.md" : "deliver-verify.md";
|
|
66
|
+
const slidesRoot = path.join(process.cwd(), "slides");
|
|
67
|
+
const candidates = readdirSync(slidesRoot, { withFileTypes: true })
|
|
68
|
+
.filter((entry) => entry.isDirectory())
|
|
69
|
+
.map((entry) => path.join(slidesRoot, entry.name, "review", reportName))
|
|
70
|
+
.filter((reportPath) => existsSync(reportPath))
|
|
71
|
+
.map((reportPath) => Object.freeze({ reportPath, mtimeMs: statSync(reportPath).mtimeMs }))
|
|
72
|
+
.sort((left, right) => right.mtimeMs - left.mtimeMs);
|
|
73
|
+
|
|
74
|
+
if (candidates.length === 0) {
|
|
75
|
+
throw new SlideWorkflowError(`No ${reportName} found under slides/*/review`, "DELIVERY_REPORT_MISSING");
|
|
76
|
+
}
|
|
77
|
+
const deck = path.basename(path.dirname(path.dirname(candidates[0].reportPath)));
|
|
78
|
+
return `slides/${deck}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function readRequestedDeliverables(targetInfo) {
|
|
82
|
+
const plan = readText(path.join(targetInfo.deckPath, "plan.md"));
|
|
83
|
+
const match = plan.match(/deliverables\s*:\s*\[([^\]]*)\]/i);
|
|
84
|
+
assert(match, "plan.md deliverables field missing");
|
|
85
|
+
const requested = match[1]
|
|
86
|
+
.split(",")
|
|
87
|
+
.map((item) => item.trim().replace(/^['"]|['"]$/g, "").toLowerCase())
|
|
88
|
+
.filter(Boolean);
|
|
89
|
+
for (const item of requested) {
|
|
90
|
+
assert(EXPECTED_ARTIFACTS[item], `unsupported deliverable ${item}`);
|
|
91
|
+
}
|
|
92
|
+
return Object.freeze(requested);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function listOfficialArtifacts(targetInfo) {
|
|
96
|
+
const distPath = path.join(process.cwd(), "dist", targetInfo.deckName);
|
|
97
|
+
assert(existsSync(distPath), "dist/<deck> missing");
|
|
98
|
+
return Object.freeze(
|
|
99
|
+
readdirSync(distPath, { recursive: true })
|
|
100
|
+
.filter((file) => statSync(path.join(distPath, file)).isFile())
|
|
101
|
+
.map((file) => String(file).split(path.sep).join("/"))
|
|
102
|
+
.filter((file) => /\.(html|pdf|pptx)$/.test(file)),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function assertRequestedArtifacts(targetInfo, requested, artifacts) {
|
|
107
|
+
const distPath = path.join(process.cwd(), "dist", targetInfo.deckName);
|
|
108
|
+
for (const item of requested) {
|
|
109
|
+
const file = EXPECTED_ARTIFACTS[item];
|
|
110
|
+
assert(artifacts.includes(file), `requested artifact missing: ${file}`);
|
|
111
|
+
const stat = statSync(path.join(distPath, file));
|
|
112
|
+
assert(stat.size > 0, `empty artifact: ${file}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function assertNoUnrequestedArtifacts(requested, artifacts) {
|
|
117
|
+
for (const file of artifacts) {
|
|
118
|
+
const kind = Object.keys(EXPECTED_ARTIFACTS).find((key) => EXPECTED_ARTIFACTS[key] === file);
|
|
119
|
+
assert(kind && requested.includes(kind), `stale or unrequested official artifact exists: ${file}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function verifyWorkReport(targetInfo, requested) {
|
|
124
|
+
const work = readText(path.join(targetInfo.reviewPath, "deliver-work.md"));
|
|
125
|
+
const result = matchReportResult(work, ["passed", "needs_input", "failed"], "deliver-work.md");
|
|
126
|
+
if (result !== "passed") return false;
|
|
127
|
+
|
|
128
|
+
const cleaned = work.match(/Cleaned directory:\s*(.+)/i);
|
|
129
|
+
assert(
|
|
130
|
+
cleaned && cleaned[1].trim() && !/^\s*(?:no|false|not cleaned\b.*|not_cleaned\b.*|uncleaned\b.*)\s*$/i.test(cleaned[1]),
|
|
131
|
+
"deliver-work.md missing positive cleaned directory evidence",
|
|
132
|
+
);
|
|
133
|
+
assertReportReferences(work, requested, "deliver-work.md");
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function verifyReviewReport(targetInfo, requested) {
|
|
138
|
+
const verify = readText(path.join(targetInfo.reviewPath, "deliver-verify.md"));
|
|
139
|
+
const result = matchReportResult(verify, ["approved", "needs_fix", "blocked"], "deliver-verify.md");
|
|
140
|
+
if (result !== "approved") return false;
|
|
141
|
+
|
|
142
|
+
const work = readText(path.join(targetInfo.reviewPath, "deliver-work.md"));
|
|
143
|
+
assertReportReferences(work, requested, "deliver-work.md");
|
|
144
|
+
assertReportReferences(verify, requested, "deliver-verify.md");
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function assertReportReferences(report, requested, reportName) {
|
|
149
|
+
for (const item of requested) {
|
|
150
|
+
const file = EXPECTED_ARTIFACTS[item];
|
|
151
|
+
assert(report.includes(file), `${reportName} missing artifact reference: ${file}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function matchReportResult(report, values, reportName) {
|
|
156
|
+
const pattern = values.join("|");
|
|
157
|
+
const result = report.match(new RegExp(`^result:\\s*(${pattern})\\s*$`, "m")) ??
|
|
158
|
+
report.match(new RegExp(`^-\\s*Result:\\s*(${pattern})\\s*$`, "im"));
|
|
159
|
+
assert(result, `${reportName} result missing`);
|
|
160
|
+
return result[1];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function readText(filePath) {
|
|
164
|
+
if (!existsSync(filePath)) {
|
|
165
|
+
throw new SlideWorkflowError(`Missing file: ${path.relative(process.cwd(), filePath)}`, "FILE_MISSING");
|
|
166
|
+
}
|
|
167
|
+
return readFileSync(filePath, "utf8");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function assert(condition, message) {
|
|
171
|
+
if (!condition) {
|
|
172
|
+
throw new SlideWorkflowError(message, "DELIVERY_ARTIFACT_INVALID");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
main();
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error(formatError(error));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import {
|
|
5
|
+
formatError,
|
|
6
|
+
parseArgs,
|
|
7
|
+
resolveDeckTarget,
|
|
8
|
+
SlideWorkflowError,
|
|
9
|
+
} from "./lib/takt-marp-slide-workflow.mjs";
|
|
10
|
+
|
|
11
|
+
function usage() {
|
|
12
|
+
return [
|
|
13
|
+
"Usage: node scripts/takt-marp-verify-render-evidence-metadata.mjs [target] [--cycle <n>]",
|
|
14
|
+
"",
|
|
15
|
+
"When target is omitted, .takt/render/latest-render-evidence.json is used.",
|
|
16
|
+
"",
|
|
17
|
+
"Examples:",
|
|
18
|
+
" node scripts/takt-marp-verify-render-evidence-metadata.mjs",
|
|
19
|
+
" node scripts/takt-marp-verify-render-evidence-metadata.mjs slides/my-talk --cycle 1",
|
|
20
|
+
].join("\n");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function main() {
|
|
24
|
+
const { positional, flags } = parseArgs(process.argv.slice(2));
|
|
25
|
+
if (flags.help) {
|
|
26
|
+
console.log(usage());
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const currentTarget = positional[0] ? null : readCurrentWorkflowTarget();
|
|
31
|
+
const marker = positional[0] ? null : readLatestMarker();
|
|
32
|
+
if (currentTarget) {
|
|
33
|
+
assert(marker.target === currentTarget.target, `latest render evidence target mismatch: ${marker.target}`);
|
|
34
|
+
}
|
|
35
|
+
const targetInfo = resolveDeckTarget(positional[0] ?? currentTarget?.target ?? marker.target);
|
|
36
|
+
const cycle = Number(flags.cycle ?? marker?.cycle ?? 1);
|
|
37
|
+
if (!Number.isInteger(cycle) || cycle < 1) {
|
|
38
|
+
throw new SlideWorkflowError(`Invalid cycle '${flags.cycle}'. Expected positive integer.`, "INVALID_ARGS");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const root = path.join(process.cwd(), ".takt", "render", targetInfo.deckName, `cycle-${cycle}`);
|
|
42
|
+
const metadataPath = path.join(root, "metadata.json");
|
|
43
|
+
const data = readJson(metadataPath);
|
|
44
|
+
|
|
45
|
+
assert(data.target === targetInfo.target, `metadata target mismatch: ${data.target}`);
|
|
46
|
+
assert(data.cycle === cycle, `metadata cycle mismatch: ${data.cycle}`);
|
|
47
|
+
assertUsableStatus("html_png", data.html_png);
|
|
48
|
+
assertArrayFiles(root, "html_png", data.html_png.files);
|
|
49
|
+
assertUsableStatus("pdf", data.pdf);
|
|
50
|
+
assertFile(root, "pdf", data.pdf.file);
|
|
51
|
+
|
|
52
|
+
if (assertReasonedNonUsable("pdf_raster", data.pdf_raster)) {
|
|
53
|
+
assertArrayFiles(root, "pdf_raster", data.pdf_raster.files);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
console.log(`render evidence metadata verified: ${path.relative(process.cwd(), metadataPath)}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function readLatestMarker() {
|
|
60
|
+
const markerPath = path.join(process.cwd(), ".takt", "render", "latest-render-evidence.json");
|
|
61
|
+
const marker = readJson(markerPath);
|
|
62
|
+
assert(typeof marker.target === "string" && marker.target, "latest render evidence marker target missing");
|
|
63
|
+
assert(Number.isInteger(marker.cycle), "latest render evidence marker cycle missing");
|
|
64
|
+
return marker;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function readCurrentWorkflowTarget() {
|
|
68
|
+
const markerPath = path.join(process.cwd(), ".takt", "workflow-current-target.json");
|
|
69
|
+
if (!existsSync(markerPath)) return null;
|
|
70
|
+
const marker = readJson(markerPath);
|
|
71
|
+
if (marker.command !== "polish") return null;
|
|
72
|
+
assert(typeof marker.target === "string" && marker.target, "current workflow target missing");
|
|
73
|
+
return marker;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function readJson(filePath) {
|
|
77
|
+
if (!existsSync(filePath)) {
|
|
78
|
+
throw new SlideWorkflowError(`Missing file: ${path.relative(process.cwd(), filePath)}`, "FILE_MISSING");
|
|
79
|
+
}
|
|
80
|
+
return JSON.parse(readFileSync(filePath, "utf8"));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function assertUsableStatus(key, item) {
|
|
84
|
+
assert(item && typeof item.status === "string", `${key} status missing`);
|
|
85
|
+
assert(!["pending", "failed", "degraded", "skipped"].includes(item.status), `${key} status not usable: ${item.status}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function assertReasonedNonUsable(key, item) {
|
|
89
|
+
assert(item && typeof item.status === "string", `${key} status missing`);
|
|
90
|
+
assert(!["pending", "failed"].includes(item.status), `${key} status not usable: ${item.status}`);
|
|
91
|
+
if (["degraded", "skipped"].includes(item.status)) {
|
|
92
|
+
assert(typeof item.reason === "string" && item.reason.trim(), `${key} reason missing for ${item.status}`);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function assertArrayFiles(root, key, files) {
|
|
99
|
+
assert(Array.isArray(files) && files.length > 0, `${key} files missing`);
|
|
100
|
+
files.forEach((file, index) => assertFile(root, `${key}[${index}]`, file));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function assertFile(root, label, value) {
|
|
104
|
+
assert(typeof value === "string" && value.trim(), `${label} path missing`);
|
|
105
|
+
const filePath = resolveEvidenceFile(root, value);
|
|
106
|
+
assert(existsSync(filePath), `${label} file missing: ${value}`);
|
|
107
|
+
const stat = statSync(filePath);
|
|
108
|
+
assert(stat.isFile() && stat.size > 0, `${label} file missing or empty: ${value}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function resolveEvidenceFile(root, value) {
|
|
112
|
+
if (path.isAbsolute(value)) {
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
const rootRelativePath = path.join(root, value);
|
|
116
|
+
if (existsSync(rootRelativePath)) {
|
|
117
|
+
return rootRelativePath;
|
|
118
|
+
}
|
|
119
|
+
return path.join(process.cwd(), value);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function assert(condition, message) {
|
|
123
|
+
if (!condition) {
|
|
124
|
+
throw new SlideWorkflowError(message, "RENDER_EVIDENCE_INVALID");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
main();
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error(formatError(error));
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{extends:fix}
|
|
2
|
+
|
|
3
|
+
AI antipattern review の finding を、current command 境界内で安全に直せる場合だけ修正してください。
|
|
4
|
+
|
|
5
|
+
**やること:**
|
|
6
|
+
1. `.takt/workflow-current-target.json` を読み、`target: slides/<deck>` と `command: plan | compose | polish | deliver` を特定してください。
|
|
7
|
+
2. `review/<command>-ai-antipattern-review.md` を読み、同じ `target`、`command`、`workflow_run_id` の current review report であることを確認してください。deck-local report が存在しない場合は、現在の `Report Directory` にある `ai-antipattern-review.md`、または同じ subworkflow reports directory の review report を読んでください。
|
|
8
|
+
3. AI Findings の全 finding を扱い、各 finding について current command 境界内で安全に修正できるか判断してください。
|
|
9
|
+
4. 修正できる finding だけを command-local source artifact に反映してください。
|
|
10
|
+
- `plan`: `plan.md`、`brief.normalized.md` など plan source artifact の範囲。deck-local が未同期の場合は、現在の `Report Directory` から親 command reports directory を特定し、そこにある `plan.md` / `brief.normalized.md` を正本として修正してください。`Report Directory` が `.../reports/subworkflows/...` の場合、`subworkflows` より前の `.../reports` が親 command reports directory です。
|
|
11
|
+
- `compose`: `SLIDES.md` と compose に必要な deck-local source artifact の範囲
|
|
12
|
+
- `polish`: `design-system.md`、`SLIDES.md`、`images/*.svg` など visual / layout / render / design-token 修正の範囲
|
|
13
|
+
- `deliver`: delivery artifact の存在、path、readability、unrequested artifact、必要な clean / rebuild の範囲
|
|
14
|
+
5. current command 境界内で安全に直せない finding は `NEED_REPLAN` とし、必要な owning command と理由を Remaining Context に記録してください。
|
|
15
|
+
6. 必要情報が足りず判断または修正できない finding は `BLOCKED` とし、不足 context と evidence を Remaining Context に記録してください。
|
|
16
|
+
7. `review/<command>-ai-antipattern-fix.md` に finding ごとの decision、changed files、validation evidence、remaining context を記録してください。
|
|
17
|
+
|
|
18
|
+
**境界:**
|
|
19
|
+
- approval file を生成、上書き、削除しないでください。`review/*-approval.md` は人間操作の記録です。
|
|
20
|
+
- git commit、push、branch 操作、PR 操作、TAKT 再起動、workflow orchestration を行わないでください。
|
|
21
|
+
- AI review report にない通常品質 finding を追加修正しないでください。
|
|
22
|
+
- `polish` を plan redesign、中心メッセージ変更、deliverables 変更へ広げないでください。
|
|
23
|
+
- `deliver` を visual / layout / content / design-token inspection へ広げないでください。該当する問題は `NEED_REPLAN` または `BLOCKED` の context として記録してください。
|
|
24
|
+
- external web access を標準の成功条件にしないでください。明示 source material と repository evidence だけを根拠にしてください。
|
|
25
|
+
|
|
26
|
+
**判定基準:**
|
|
27
|
+
- 全 finding を current command 境界内で修正でき、validation evidence を記録できた場合は `FIXED` としてください。
|
|
28
|
+
- 修正不要と判断する場合は `NO_FIX_NEEDED` とし、すべての finding に finding-level evidence を記録してください。
|
|
29
|
+
- current command 境界外の作業、上流 artifact の再設計、人間判断が必要な場合は `NEED_REPLAN` としてください。
|
|
30
|
+
- report、target、command、workflow_run_id、source artifact、必要 context のいずれかを確認できない場合は `BLOCKED` としてください。
|
|
31
|
+
- plan command では、deck-local `brief.normalized.md` / `plan.md` がまだ存在しないことだけを `NEED_REPLAN` または `BLOCKED` 理由にしないでください。親 command reports directory の source artifact が読め、finding を current command 境界内で修正できる場合はその report artifact を更新してください。
|
|
32
|
+
|
|
33
|
+
**report file format:**
|
|
34
|
+
- `review/<command>-ai-antipattern-fix.md` は `.takt/facets/output-contracts/takt-marp-ai-antipattern-fix.md` に従ってください。
|
|
35
|
+
- YAML front matter は flat scalar のみとし、`command`、`target`、`generated_at`、`workflow_run_id`、`step: ai_antipattern_fix`、`cycle`、`status`、`handled_finding_count`、`changed_file_count`、`remaining_context_count` を含めてください。
|
|
36
|
+
- `status` は `FIXED`、`NO_FIX_NEEDED`、`NEED_REPLAN`、`BLOCKED` のいずれかだけを使ってください。
|
|
37
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
38
|
+
|
|
39
|
+
**必須出力**
|
|
40
|
+
## AI Antipattern Fix
|
|
41
|
+
- Status: FIXED / NO_FIX_NEEDED / NEED_REPLAN / BLOCKED
|
|
42
|
+
- Reviewed target:
|
|
43
|
+
- Reviewed command:
|
|
44
|
+
- Handled findings:
|
|
45
|
+
- Changed files:
|
|
46
|
+
- Validation evidence:
|
|
47
|
+
- Remaining context:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
command work output を通常 review / inspect / verify に渡す前に、AI 固有の antipattern だけをレビューしてください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `.takt/workflow-current-target.json` を読み、`target: slides/<deck>` と `command: plan | compose | polish | deliver` を特定してください。
|
|
5
|
+
2. 対象 deck の `review/<command>-work.md` を読み、front matter と本文から同じ `target`、`command`、`workflow_run_id`、work 成果物の範囲を確認してください。deck-local report が存在しない場合は、現在の `Report Directory` から親 command の reports directory を特定し、そこにある `<command>-work.md` を読んでください。`Report Directory` が `.../reports/subworkflows/...` の場合、`subworkflows` より前の `.../reports` が親 command の reports directory です。
|
|
6
|
+
3. command に応じて reviewed scope を特定してください。`plan` と `compose` は `command-work-report` と source artifacts、`polish` は `render-evidence`、`deliver` は `delivery-artifacts` を主範囲にしてください。`plan` の source artifacts は deck-local が未同期なら親 command reports directory の `brief.normalized.md` と `plan.md` を正本として照合してください。
|
|
7
|
+
4. 以下だけを AI-specific finding として分類してください。
|
|
8
|
+
- hallucinated path/tool/API: 存在しない path、利用できない tool、実在確認できない API を前提にした出力
|
|
9
|
+
- unsupported claim: 入力 source artifact、work report、render/delivery evidence にない主張
|
|
10
|
+
- unrequested compatibility: 指示されていない後方互換、代替形式、余分な fallback behavior
|
|
11
|
+
- overbroad abstraction: command 境界を超える抽象化、汎用化、再設計
|
|
12
|
+
- unused generated artifact: workflow の要求や deliverables に紐づかない生成物
|
|
13
|
+
5. finding がある場合は `review/<command>-ai-antipattern-review.md` に stable `finding_id`、`family_tag`、location、required change、具体的 evidence を記録してください。
|
|
14
|
+
6. ordinary slide content、layout、render、delivery quality finding は、AI-specific fabrication または unsupported assumption に由来する場合だけ AI finding として扱ってください。通常品質だけの観察は `Non-AI Quality Notes` に分離してください。
|
|
15
|
+
|
|
16
|
+
**判定基準:**
|
|
17
|
+
- target、command、reviewed scope が特定でき、AI-specific finding がなければ `approved` としてください。
|
|
18
|
+
- current command 境界内で修正可能な AI-specific finding がある場合は `needs_fix` としてください。
|
|
19
|
+
- `.takt/workflow-current-target.json`、`review/<command>-work.md`、target、command、workflow_run_id、reviewed scope のいずれかを特定または照合できない場合は `blocked` とし、通常 review / inspect / verify に進めない outcome にしてください。
|
|
20
|
+
- plan command では、deck-local `brief.normalized.md` / `plan.md` がまだ存在しないことだけを `blocked` 理由にしないでください。親 command reports directory の `brief.normalized.md` / `plan.md` が読め、work report と照合できる場合は reviewed scope を確認済みとして扱ってください。
|
|
21
|
+
- 通常の content、layout、render、delivery artifact 品質だけを理由に `needs_fix` にしないでください。
|
|
22
|
+
- external web access を標準の成功条件にしないでください。明示 source material と repository evidence だけを根拠にしてください。
|
|
23
|
+
|
|
24
|
+
**report file format:**
|
|
25
|
+
- `review/<command>-ai-antipattern-review.md` は `.takt/facets/output-contracts/takt-marp-ai-antipattern-review.md` に従ってください。
|
|
26
|
+
- YAML front matter は flat scalar のみとし、`command`、`target`、`generated_at`、`workflow_run_id`、`step: ai_antipattern_review`、`cycle`、`reviewed_scope`、`result`、`finding_count`、`blocking_finding_count` を含めてください。
|
|
27
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
28
|
+
|
|
29
|
+
**必須出力**
|
|
30
|
+
## AI Antipattern Review
|
|
31
|
+
- Result: approved / needs_fix / blocked
|
|
32
|
+
- Reviewed target:
|
|
33
|
+
- Reviewed command:
|
|
34
|
+
- Reviewed scope:
|
|
35
|
+
- AI findings:
|
|
36
|
+
- Non-AI quality notes:
|
|
37
|
+
- Blocking issues:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{extends:fix}
|
|
2
|
+
|
|
3
|
+
compose review の finding を精査し、妥当な修正だけを compose source artifacts に反映してください。
|
|
4
|
+
|
|
5
|
+
**やること:**
|
|
6
|
+
1. `review/compose-review.md` の finding を読み、`plan.md` と `design-system.md` に照らして妥当性を判断してください。
|
|
7
|
+
2. 妥当な finding は `design-system.md`、`SLIDES.md`、`images/*.svg` に反映してください。
|
|
8
|
+
3. plan-level content 変更が必要な finding は反映せず、理由を記録してください。
|
|
9
|
+
4. `review/compose-fix.md` に finding ごとの対応結果を書いてください。
|
|
10
|
+
|
|
11
|
+
**判定基準:**
|
|
12
|
+
- 妥当な finding をすべて反映または理由付きで非対応にした場合は `fixed` としてください。
|
|
13
|
+
- 安全に修正できない場合は `blocked` としてください。
|
|
14
|
+
|
|
15
|
+
**report file format:**
|
|
16
|
+
- `review/compose-fix.md` は YAML front matter で開始し、`command: compose`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: fix`、`cycle`、`state: fixed`、`result`、`applied_finding_count`、`rejected_finding_count` を含めてください。
|
|
17
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
18
|
+
|
|
19
|
+
**必須出力**
|
|
20
|
+
## Compose Fix
|
|
21
|
+
- Result: fixed / blocked
|
|
22
|
+
- Applied findings:
|
|
23
|
+
- Rejected findings:
|
|
24
|
+
- Files changed:
|
|
25
|
+
- Blocking issues:
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
compose command の成果物をレビューしてください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `brief.normalized.md`、`plan.md`、`design-system.md`、`SLIDES.md`、`images/*.svg`、`review/compose-work.md` を読んでください。
|
|
5
|
+
2. content、flow、visual source、Marp source artifact 境界の観点で確認してください。
|
|
6
|
+
3. 以下の追加観点で確認してください。
|
|
7
|
+
- (a) **style 定義・文書化の存在照合**: plan の各 Layout(custom 句含む)と `SLIDES.md` の各 `_class:` に対応する style 定義(front matter CSS)が存在するか確認してください。`custom:` 句で新設された class については、加えて deck-local `design-system.md` の文書化(`takt-marp-design-system` の文書化規約: class 名・用途・構造・使用スライド番号)が存在するか確認してください。style 定義の欠落、および新設 class の文書化欠落は **blocker** です(基本語彙の class に 4 項目文書化は要求しません)。
|
|
8
|
+
- (b) **inline SVG の規約適合**: `policy takt-marp-svg-first-visual` の inline SVG 規約(フォントスタック・containment・長文禁止)への適合を確認してください。長文流し込みは **major**、フォントスタック・containment 不適合は **major** です。
|
|
9
|
+
- (c) **尺マーカーの累計整合と捏造検出**: `brief.normalized.md` の `Event Context` の `Duration` が分単位の数値である場合、各スライドの speaker notes に尺マーカー `【N分 / 累計 M:SS】` が存在するか確認し、欠落しているスライドがあれば **major** として報告してください。尺マーカーが存在する場合、最終スライドの累計が `Duration` と整合するか確認してください。不整合は **major** です。また、`Duration` が「未指定」なのにマーカーが存在する場合も **major** として報告してください。
|
|
10
|
+
- (d) **先鋭度・密度**: `policy takt-marp-general-slide-quality` の先鋭度・密度基準に従い、汎用タイトル・リード文は **major**、置換可能な低密度 bullet 列挙は **minor**(可読性に明確な悪影響がある場合は **major**)として判定してください。好みだけの指摘は finding にしないでください。
|
|
11
|
+
- (e) **`html: true` 欠落と font path 解決不能**: `SLIDES.md` に HTML 要素(inline SVG 含む)があるのに front matter に `html: true` がない場合は **blocker** です。`@font-face` を宣言しているが path が `SLIDES.md` からの相対 path として解決不能な場合は **major** です(フォールバックスタックで描画は維持されるため blocker としない)。
|
|
12
|
+
4. render output の有無や表示崩れは polish command の範囲として扱い、この review の成功条件にしないでください。
|
|
13
|
+
5. 修正が必要な finding だけを stable `finding_id` 付きで `review/compose-review.md` に記録してください。
|
|
14
|
+
6. 既定 severity から逸脱する場合は、finding の evidence に理由を記してください。
|
|
15
|
+
|
|
16
|
+
**判定基準:**
|
|
17
|
+
- compose source artifact の修正が不要なら `approved` としてください。
|
|
18
|
+
- `design-system.md`、`SLIDES.md`、`images/*.svg` の修正で解消できる問題がある場合は `needs_fix` としてください。
|
|
19
|
+
- plan の変更が必要な問題は source artifact を勝手に直さず `blocked` としてください。
|
|
20
|
+
|
|
21
|
+
**report file format:**
|
|
22
|
+
- `review/compose-review.md` は YAML front matter で開始し、`command: compose`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: review`、`cycle`、`state: reviewed`、`result`、`finding_count`、`blocking_finding_count` を含めてください。
|
|
23
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
24
|
+
|
|
25
|
+
**必須出力**
|
|
26
|
+
## Compose Review
|
|
27
|
+
- Result: approved / needs_fix / blocked
|
|
28
|
+
- Findings:
|
|
29
|
+
- Out-of-scope findings:
|
|
30
|
+
- Blocking issues:
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
承認済みのplanに沿ってMarp Markdownをcomposeしてください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `brief.normalized.md`、`plan.md`、`design-system.md`を読んでください。
|
|
5
|
+
2. `SLIDES.md`をMarp形式で作成または更新してください。
|
|
6
|
+
3. 各スライドにspeaker notesを付けてください。`brief.normalized.md` の `Event Context` の `Duration` の値が「未指定」以外(分単位の数値)の場合は、各スライドのspeaker notes冒頭行に尺マーカー `【N分 / 累計 M:SS】` を書き、最終スライドの累計を発表時間と整合させてください。`Duration` が「未指定」の場合はマーカーを書かず、推測した時間を記載してはなりません。各スライドのspeaker notesには、聴衆に最も伝えるべき1点(強調点)を含めてください。
|
|
7
|
+
4. visual予定があるスライドには、planの `Visual:` 値に対応する placeholder(例: `<!-- Visual: svg: <ファイル名またはテーマ> -->`、`<!-- Visual: existing: <パス> -->`)を配置してください。SVG markup と画像参照の挿入(外部ファイル・inline・既存画像のすべて)は generate_visuals が所有します。
|
|
8
|
+
5. planの `Layout` と `design-system.md` に従い、Marp classとCSS tokenで表現してください。
|
|
9
|
+
6. `SLIDES.md` のCSSは `design-system.md` のtokenに揃え、スライドごとの個別 `font-size`、`line-height`、`margin`、`padding` の追加を避けてください。
|
|
10
|
+
7. render output の生成や品質判定は行わず、source artifact の作成に集中してください。
|
|
11
|
+
|
|
12
|
+
**コンテキスト反映規約:**
|
|
13
|
+
- `brief.normalized.md` の `Event Context` の `Name`(イベント名)の値が「未指定」以外の場合は、タイトルスライドに反映してください。
|
|
14
|
+
- `Speaker Profile` 節の内容が「未指定」以外の場合は、自己紹介相当スライドに反映してください。
|
|
15
|
+
- 値が「未指定」の項目・節は反映せず、値を捏造・補完してはなりません(節自体は contract 上常に存在します)。
|
|
16
|
+
|
|
17
|
+
**機械規約適合:**
|
|
18
|
+
- `SLIDES.md` 本文にHTML要素(inline SVG含む)を使う場合は、front matterに `html: true` を設定してください。
|
|
19
|
+
- fontには日本語優先フォールバックスタック(例: `"Noto Sans JP", "Hiragino Sans", "Yu Gothic", sans-serif`)を必ず指定してください。`@font-face` を宣言する場合は、`SLIDES.md` からの相対pathが実在するファイルのみを参照してください。pathが存在しない環境では `@font-face` を省略し、フォールバックスタックのみで描画してください。
|
|
20
|
+
|
|
21
|
+
**禁止事項**
|
|
22
|
+
- planの中心メッセージを変更しないでください。
|
|
23
|
+
- official delivery artifact や `.takt/render/` を成功条件にしないでください。
|
|
24
|
+
- approval file を生成しないでください。
|
|
25
|
+
- SVG markup(外部ファイル・inline両形式)を書かないでください(generate_visualsが所有)。
|
|
26
|
+
- 発表時間・イベント名・登壇者情報が「未指定」の場合、値を推測・捏造・補完しないでください。
|
|
27
|
+
|
|
28
|
+
**必須出力**
|
|
29
|
+
## Compose Slides Result
|
|
30
|
+
- Status: composed / needs_input
|
|
31
|
+
- Files changed:
|
|
32
|
+
- SVG placeholders:
|
|
33
|
+
- Layout decisions:
|
|
34
|
+
- Design system usage:
|
|
35
|
+
- Human review points:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
compose command の work 結果を、後続の review/fix/supervision が読める形で要約してください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `design-system.md`、`SLIDES.md`、`images/*.svg` の存在と変更状況を確認してください。
|
|
5
|
+
2. compose source artifacts が `plan.md` と `design-system.md` の範囲に収まっているか確認してください。
|
|
6
|
+
3. render output を成功条件に含めず、source artifact の作成・変更だけを整理してください。
|
|
7
|
+
4. `review/compose-work.md` に work summary を書いてください。
|
|
8
|
+
|
|
9
|
+
**判定基準:**
|
|
10
|
+
- `design-system.md`、`SLIDES.md`、必要な `images/*.svg` が確認できる場合は `passed` としてください。
|
|
11
|
+
- compose source artifact が不足する場合は `needs_input` としてください。
|
|
12
|
+
|
|
13
|
+
**report file format:**
|
|
14
|
+
- `review/compose-work.md` は YAML front matter で開始し、`command: compose`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: work`、`cycle`、`state: worked`、`result`、`source_artifact_count` を含めてください。
|
|
15
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
16
|
+
|
|
17
|
+
**必須出力**
|
|
18
|
+
## Compose Work Summary
|
|
19
|
+
- Result: passed / needs_input
|
|
20
|
+
- Source artifacts:
|
|
21
|
+
- Created or changed artifacts:
|
|
22
|
+
- Human review points:
|
|
23
|
+
- Blocking issues:
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
official delivery artifact を build してください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `plan.md` の `deliverables: [html, pdf, pptx]` を authoritative delivery request として読んでください。
|
|
5
|
+
2. export 前に `dist/<deck>/` を削除または空にしてください。
|
|
6
|
+
3. `html` が requested の場合は `npm run build:html -- <deck>` で生成してください。
|
|
7
|
+
4. `pdf` が requested の場合は `npm run build:pdf -- <deck>` で生成してください。
|
|
8
|
+
5. `pptx` が requested の場合だけ `npm run build:pptx -- <deck>` で生成してください。
|
|
9
|
+
6. `review/deliver-work.md` に `Cleaned directory:` として export 前に `dist/<deck>/` を削除または空にした evidence を記録し、clean/build 結果と生成 artifact を記録してください。
|
|
10
|
+
|
|
11
|
+
**判定基準:**
|
|
12
|
+
- requested deliverables に対応する `SLIDES.html` / `SLIDES.pdf` / `SLIDES.pptx` だけが `dist/<deck>/` に存在する場合は `passed` としてください。
|
|
13
|
+
- `dist/<deck>/` に stale artifact が混ざる場合、または requested artifact が作れない場合は `failed` としてください。
|
|
14
|
+
|
|
15
|
+
**禁止事項**
|
|
16
|
+
- visual/layout inspection を行わないでください。
|
|
17
|
+
- `design-system.md`、`SLIDES.md`、`images/*.svg` の visual polish を広げないでください。
|
|
18
|
+
- `brief.md` の自由記述から deliverable 種別を追加しないでください。
|
|
19
|
+
|
|
20
|
+
**report file format:**
|
|
21
|
+
- `review/deliver-work.md` は YAML front matter で開始し、`command: deliver`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: work`、`cycle`、`state: worked`、`result`、`source_artifact_count` を含めてください。
|
|
22
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
23
|
+
|
|
24
|
+
**必須出力**
|
|
25
|
+
## Delivery Build
|
|
26
|
+
- Result: passed / failed
|
|
27
|
+
- Cleaned directory:
|
|
28
|
+
- Requested deliverables:
|
|
29
|
+
- Generated artifacts:
|
|
30
|
+
- Blocking issues:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{extends:fix}
|
|
2
|
+
|
|
3
|
+
delivery verification finding だけを修正してください。
|
|
4
|
+
|
|
5
|
+
**やること:**
|
|
6
|
+
1. `review/deliver-verify.md` の finding を読み、delivery artifact の存在、path、readability、unrequested artifact の問題だけを扱ってください。
|
|
7
|
+
2. 必要に応じて `dist/<deck>/` の clean と再buildを行ってください。
|
|
8
|
+
3. visual/layout/content/design-token の問題は修正せず、polish command の範囲として記録してください。
|
|
9
|
+
4. `review/deliver-fix.md` に finding ごとの対応結果を書いてください。
|
|
10
|
+
|
|
11
|
+
**判定基準:**
|
|
12
|
+
- delivery finding をすべて反映または理由付きで非対応にした場合は `fixed` としてください。
|
|
13
|
+
- 安全に修正できない場合は `blocked` としてください。
|
|
14
|
+
|
|
15
|
+
**report file format:**
|
|
16
|
+
- `review/deliver-fix.md` は YAML front matter で開始し、`command: deliver`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: fix`、`cycle`、`state: fixed`、`result`、`applied_finding_count`、`rejected_finding_count` を含めてください。
|
|
17
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
18
|
+
|
|
19
|
+
**必須出力**
|
|
20
|
+
## Delivery Fix
|
|
21
|
+
- Result: fixed / blocked
|
|
22
|
+
- Applied findings:
|
|
23
|
+
- Rejected findings:
|
|
24
|
+
- Files changed:
|
|
25
|
+
- Blocking issues:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
official delivery artifact の completeness を検証してください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `plan.md` の `deliverables` と `dist/<deck>/` の official artifacts を照合してください。
|
|
5
|
+
2. requested artifact が `SLIDES.html` / `SLIDES.pdf` / `SLIDES.pptx` として存在し、読み取り可能であることを確認してください。
|
|
6
|
+
3. unrequested official artifact または余分な同種 artifact が混ざっていないことを確認してください。
|
|
7
|
+
4. `review/deliver-work.md` と `review/deliver-verify.md` が artifact path と requested deliverables を同じ名前で記録していることを確認してください。
|
|
8
|
+
5. `review/deliver-verify.md` に delivery verification finding を記録してください。
|
|
9
|
+
|
|
10
|
+
**判定基準:**
|
|
11
|
+
- requested artifact が存在し、不要 artifact がなければ `approved` としてください。
|
|
12
|
+
- delivery artifact の再生成や path 修正で解消できる問題があれば `needs_fix` としてください。
|
|
13
|
+
- visual/layout の再評価が必要な問題は scope 外として扱い、delivery finding にしないでください。
|
|
14
|
+
|
|
15
|
+
**report file format:**
|
|
16
|
+
- `review/deliver-verify.md` は YAML front matter で開始し、`command: deliver`、`target: slides/<deck>`、`generated_at`、`workflow_run_id`、`step: verify`、`cycle`、`state: verified`、`result`、`finding_count`、`blocking_finding_count` を含めてください。
|
|
17
|
+
- front matter を閉じる `---` の後に Markdown body を書いてください。front matter より前に本文を書いてはいけません。
|
|
18
|
+
|
|
19
|
+
**必須出力**
|
|
20
|
+
## Delivery Verify
|
|
21
|
+
- Result: approved / needs_fix / blocked
|
|
22
|
+
- Artifact checks:
|
|
23
|
+
- Unrequested artifacts:
|
|
24
|
+
- Findings:
|
|
25
|
+
- Blocking issues:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
承認済みのplanからdeck-localな軽量デザインシステムを作成してください。
|
|
2
|
+
|
|
3
|
+
**やること:**
|
|
4
|
+
1. `brief.normalized.md`、`plan.md`、既存の `SLIDES.md` があれば確認してください。
|
|
5
|
+
2. `slides/<deck>/design-system.md` を作成または更新してください。
|
|
6
|
+
3. typography、spacing、layout、visual、color、QA rules をdeck単位のtokenとして定義してください。
|
|
7
|
+
4. tokenは `SLIDES.md` のfront matter CSSに転記しやすい名前にしてください。
|
|
8
|
+
5. スライドごとの個別調整ではなく、classとCSS変数で一括制御できる設計にしてください。
|
|
9
|
+
6. planの `Layout` に対応する class の使い分けを、knowledge `takt-marp-repo-conventions` の「Layout 語彙」表に従って定義してください。
|
|
10
|
+
7. planの `Layout` に `custom: <class名> — <用途>` 句がある場合、同名 class を新規定義してください。命名は kebab-case とし、deck の既存 token 体系(CSS 変数・class 命名)と整合させてください。
|
|
11
|
+
8. 新規定義した class(および使用する modifier の組み合わせ)を deck-local `design-system.md` に以下の項目で文書化してください。後続の review / fix がその class を識別できる記述にしてください。
|
|
12
|
+
- class 名
|
|
13
|
+
- 用途(1行)
|
|
14
|
+
- 構造(CSS レイアウト・HTML 構造の概要)
|
|
15
|
+
- 使用スライド番号
|
|
16
|
+
|
|
17
|
+
**必須項目**
|
|
18
|
+
- Typography tokens: font family、letter-spacing、H1、lead、bullet、code label、line-height
|
|
19
|
+
- Spacing tokens: section padding、column gap、list gap、image margins
|
|
20
|
+
- Layout tokens: 1列/2列のclass、列比率、align-items、画像最大高
|
|
21
|
+
- Visual tokens: SVG viewBox、外周余白、図形内余白、SVG text size
|
|
22
|
+
- Color tokens: text、muted、accent、success、warning、border、surface
|
|
23
|
+
- QA rules: token外の個別値、負のletter-spacing、過度な上/左寄り、図の過小を検出する基準
|
|
24
|
+
|
|
25
|
+
**禁止事項**
|
|
26
|
+
- deck全体で使わないtokenを大量に増やさないでください。
|
|
27
|
+
- スライドごとの個別CSSを前提にしないでください。
|
|
28
|
+
- `brief.md` や `plan.md` の中心メッセージを変更しないでください。
|
|
29
|
+
|
|
30
|
+
**必須出力**
|
|
31
|
+
## Design System Result
|
|
32
|
+
- Status: designed / needs_input
|
|
33
|
+
- Design system file:
|
|
34
|
+
- Token groups:
|
|
35
|
+
- Layout classes:
|
|
36
|
+
- QA rules:
|
|
37
|
+
- Files changed:
|