forgetrail 0.3.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/CONTINUATION_PROMPT.md +42 -0
- package/INITIAL_PROMPT.md +214 -0
- package/LICENSE +201 -0
- package/README.md +198 -0
- package/TRACKING_SCHEMA.md +162 -0
- package/TRY_FORGETRAIL.md +78 -0
- package/WORKFLOW.md +921 -0
- package/content/AGENT_INTEGRATION_claude.md +38 -0
- package/content/AGENT_INTEGRATION_cursor.md +53 -0
- package/content/AGENT_INTEGRATION_generic.md +50 -0
- package/content/AGENT_INTEGRATION_grok.md +82 -0
- package/content/DEV_AUTOMATION_SCRIPTS.md +103 -0
- package/content/FORGETRAIL_LITE.md +1202 -0
- package/content/FORGETRAIL_LITE_UPDATES.md +13 -0
- package/content/FORGETRAIL_PROGRESS.md +26 -0
- package/content/GENESIS_SPEC_PROMPT.md +70 -0
- package/content/GENESIS_STUB.md +18 -0
- package/content/GREENFIELD_INTAKE.md +76 -0
- package/content/KICKOFF_WITHOUT_MCP.md +16 -0
- package/content/LITE_WORKFLOW_TRACKING.json +42 -0
- package/content/NEW_PROJECT_BOOTSTRAP.md +180 -0
- package/content/ONE_CLICK_DEV_SETUP.md +142 -0
- package/content/PLAN_MODE_PATTERNS.md +43 -0
- package/content/POCKETBASE_SCHEMA_SCRIPT.md +52 -0
- package/content/POST_BOOTSTRAP_USER_MESSAGE.md +51 -0
- package/content/SCAFFOLD_INSTALL.json +110 -0
- package/content/SESSION_RESUME_MCP.md +35 -0
- package/content/SYSTEM_HEALTH_CHECKS.md +131 -0
- package/content/USER_REPLY_FORMAT.md +41 -0
- package/content/cursor-rules/forgetrail-lessons-gate.mdc +30 -0
- package/content/cursor-rules/forgetrail-lessons-mcp.mdc +24 -0
- package/content/cursor-rules/forgetrail-no-trailer.mdc +49 -0
- package/content/cursor-rules/forgetrail-phase-status.mdc +61 -0
- package/content/cursor-rules/forgetrail-updates-log.mdc +30 -0
- package/content/cursor-rules/spec-completion.mdc +33 -0
- package/content/cursor-rules/specs-and-todo.mdc +26 -0
- package/content/cursor-rules/url-host-matching.mdc +31 -0
- package/content/cursor-rules/us-english.mdc +9 -0
- package/content/cursor-rules/user-facing-content.mdc +31 -0
- package/content/examples/GENESIS_SAMPLE_mars-habitat-roster.md +154 -0
- package/content/forgetrail-workspace-README.md +43 -0
- package/content/scripts/forgetrail-dev-launcher.mjs +208 -0
- package/content/scripts/forgetrail-env.mjs +51 -0
- package/content/scripts/setup-ollama.mjs +207 -0
- package/content/scripts/setup-pocketbase.mjs +133 -0
- package/content/scripts/test-ollama.mjs +71 -0
- package/content/scripts/test-pocketbase.mjs +110 -0
- package/content/skills/forgetrail/SKILL.md +92 -0
- package/docs/AUTOMATED_TESTING.md +269 -0
- package/docs/BLACK_HAT_REPORT.md +143 -0
- package/docs/BRAND_AND_PRODUCT.md +381 -0
- package/docs/BUGS.md +62 -0
- package/docs/BUSINESS_PLAN.md +256 -0
- package/docs/CODE_QUALITY.md +170 -0
- package/docs/CONTEXT_PROMPT.md +357 -0
- package/docs/DEPLOYMENT.md +181 -0
- package/docs/DESIGN_SYSTEM.md +414 -0
- package/docs/DEV_ESTIMATE.md +127 -0
- package/docs/FORGETRAIL_RENAME.md +193 -0
- package/docs/IDEAS.md +19 -0
- package/docs/MARKETING_GROWTH.md +301 -0
- package/docs/NAMING_EXPLORATION.md +406 -0
- package/docs/NPM.md +98 -0
- package/docs/PHASE_1_BRIEF.md +161 -0
- package/docs/README.md +75 -0
- package/docs/SPEC_FEATURE_TEMPLATE.md +155 -0
- package/docs/SPEC_UI_CHROME_NAV_TEMPLATE.md +48 -0
- package/docs/TECHNICAL_REFERENCE.md +836 -0
- package/docs/TEST_PLAN.md +467 -0
- package/docs/TODO.md +125 -0
- package/package.json +68 -0
- package/prompts/black-hat-audit.md +235 -0
- package/prompts/brand-copy-edit-pass.md +55 -0
- package/prompts/cialdini-marketing-audit.md +141 -0
- package/prompts/competitor-deep-dive.md +201 -0
- package/prompts/docs-alignment-audit.md +108 -0
- package/prompts/engineering-skill-library.md +75 -0
- package/prompts/landing-page-rewrite.md +63 -0
- package/prompts/microcopy-centralization.md +128 -0
- package/prompts/panel-usability-audit.md +197 -0
- package/prompts/personal-beta-outreach.md +195 -0
- package/prompts/pre-launch-audit.md +148 -0
- package/prompts/product-feedback-to-spec.md +76 -0
- package/prompts/propagate-to-forgetrail.md +315 -0
- package/prompts/user-facing-content-sync-audit.md +200 -0
- package/prompts/ux-cohesion-audit.md +165 -0
- package/scripts/ensure-lease.mjs +23 -0
- package/scripts/forgetrail-cli.mjs +85 -0
- package/scripts/install-forgetrail-lite.mjs +11 -0
- package/scripts/install-forgetrail.mjs +11 -0
- package/scripts/install-lib.mjs +115 -0
- package/scripts/install.mjs +163 -0
- package/scripts/link-global.mjs +100 -0
- package/scripts/mcp-lib.mjs +177 -0
- package/scripts/mcp-status.mjs +155 -0
- package/scripts/publish-gate.mjs +110 -0
- package/scripts/rename-to-forgetrail.mjs +273 -0
- package/workflow_tracking.json +124 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Mechanical ForgeKit → ForgeTrail rename for a repo root.
|
|
4
|
+
* Skips this file. Protects GitHub slug Catalyst-Forge-LLC/forge-kit
|
|
5
|
+
* and local clone paths under workspace/forge-kit.
|
|
6
|
+
*
|
|
7
|
+
* Usage: node scripts/rename-to-forgetrail.mjs --root /path/to/repo
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { existsSync, readdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { dirname, join, relative } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
|
|
14
|
+
const SELF = fileURLToPath(import.meta.url);
|
|
15
|
+
const SKIP_DIRS = new Set([
|
|
16
|
+
".git",
|
|
17
|
+
"node_modules",
|
|
18
|
+
"dist",
|
|
19
|
+
".svelte-kit",
|
|
20
|
+
"build",
|
|
21
|
+
"coverage",
|
|
22
|
+
"pb_data",
|
|
23
|
+
"__ARCHIVE",
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
const TEXT_EXT = new Set([
|
|
27
|
+
".md",
|
|
28
|
+
".mdc",
|
|
29
|
+
".txt",
|
|
30
|
+
".json",
|
|
31
|
+
".jsonc",
|
|
32
|
+
".js",
|
|
33
|
+
".mjs",
|
|
34
|
+
".cjs",
|
|
35
|
+
".ts",
|
|
36
|
+
".tsx",
|
|
37
|
+
".html",
|
|
38
|
+
".css",
|
|
39
|
+
".yml",
|
|
40
|
+
".yaml",
|
|
41
|
+
".toml",
|
|
42
|
+
".sh",
|
|
43
|
+
".bat",
|
|
44
|
+
".ps1",
|
|
45
|
+
".svg",
|
|
46
|
+
".xml",
|
|
47
|
+
".gitignore",
|
|
48
|
+
".npmignore",
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
const FILE_RENAMES = [
|
|
52
|
+
["TRY_FORGEKIT.md", "TRY_FORGETRAIL.md"],
|
|
53
|
+
["FORGEKIT_LITE_UPDATES.md", "FORGETRAIL_LITE_UPDATES.md"],
|
|
54
|
+
["FORGEKIT_LITE.md", "FORGETRAIL_LITE.md"],
|
|
55
|
+
["FORGEKIT_PROGRESS.md", "FORGETRAIL_PROGRESS.md"],
|
|
56
|
+
["forgekit-workspace-README.md", "forgetrail-workspace-README.md"],
|
|
57
|
+
["propagate-to-forgekit.md", "propagate-to-forgetrail.md"],
|
|
58
|
+
["Propagate to ForgeKit.md", "Propagate to ForgeTrail.md"],
|
|
59
|
+
["try-forgekit-checklist.md", "try-forgetrail-checklist.md"],
|
|
60
|
+
["forgekit-cli.mjs", "forgetrail-cli.mjs"],
|
|
61
|
+
["install-forgekit-lite.mjs", "install-forgetrail-lite.mjs"],
|
|
62
|
+
["install-forgekit.mjs", "install-forgetrail.mjs"],
|
|
63
|
+
["forgekit-dev-launcher.mjs", "forgetrail-dev-launcher.mjs"],
|
|
64
|
+
["forgekit-env.mjs", "forgetrail-env.mjs"],
|
|
65
|
+
["forgekit.html", "forgetrail.html"],
|
|
66
|
+
["forgekit-as-product.md", "forgetrail-as-product.md"],
|
|
67
|
+
["forgekit-modern-agents-evolution.md", "forgetrail-modern-agents-evolution.md"],
|
|
68
|
+
["forgekit-prelaunch-review.md", "forgetrail-prelaunch-review.md"],
|
|
69
|
+
["forgekit-new-user-experience.md", "forgetrail-new-user-experience.md"],
|
|
70
|
+
["forgekit-no-trailer.mdc", "forgetrail-no-trailer.mdc"],
|
|
71
|
+
["forgekit-updates-log.mdc", "forgetrail-updates-log.mdc"],
|
|
72
|
+
["forgekit-phase-status.mdc", "forgetrail-phase-status.mdc"],
|
|
73
|
+
["forgekit-lessons-gate.mdc", "forgetrail-lessons-gate.mdc"],
|
|
74
|
+
["forgekit-lessons-mcp.mdc", "forgetrail-lessons-mcp.mdc"],
|
|
75
|
+
["forgekit-propagation.mdc", "forgetrail-propagation.mdc"],
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
const DIR_RENAMES = [
|
|
79
|
+
[".forgekit", ".forgetrail"],
|
|
80
|
+
["_forgekit", "_forgetrail"],
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
const OLD = "ForgeKit";
|
|
84
|
+
const NEW = "ForgeTrail";
|
|
85
|
+
const oldLower = OLD.toLowerCase();
|
|
86
|
+
const newLower = NEW.toLowerCase();
|
|
87
|
+
const OLD_UP = OLD.toUpperCase();
|
|
88
|
+
const NEW_UP = NEW.toUpperCase();
|
|
89
|
+
|
|
90
|
+
const REPLACEMENTS = [
|
|
91
|
+
[`get${OLD}CursorLessonsRules`, `get${NEW}CursorLessonsRules`],
|
|
92
|
+
[`get${OLD}CursorPhaseRule`, `get${NEW}CursorPhaseRule`],
|
|
93
|
+
[`get${OLD}LiteUpdates`, `get${NEW}LiteUpdates`],
|
|
94
|
+
[`get${OLD}Lite`, `get${NEW}Lite`],
|
|
95
|
+
[`get${OLD}Skill`, `get${NEW}Skill`],
|
|
96
|
+
[`strip${OLD}TemplateToShell`, `strip${NEW}TemplateToShell`],
|
|
97
|
+
[`runInstall${OLD}`, `runInstall${NEW}`],
|
|
98
|
+
[`${OLD_UP}_TEMPLATE_DEFAULT_MODE`, `${NEW_UP}_TEMPLATE_DEFAULT_MODE`],
|
|
99
|
+
[`${OLD_UP}_LITE_UPDATES`, `${NEW_UP}_LITE_UPDATES`],
|
|
100
|
+
[`${OLD_UP}_PROGRESS`, `${NEW_UP}_PROGRESS`],
|
|
101
|
+
[`${OLD_UP}_LITE`, `${NEW_UP}_LITE`],
|
|
102
|
+
[`${OLD_UP}_ROOT`, `${NEW_UP}_ROOT`],
|
|
103
|
+
[`${OLD_UP}_TARGET`, `${NEW_UP}_TARGET`],
|
|
104
|
+
[`TRY_${OLD_UP}`, `TRY_${NEW_UP}`],
|
|
105
|
+
[`try-${oldLower}`, `try-${newLower}`],
|
|
106
|
+
[`propagate-to-${oldLower}`, `propagate-to-${newLower}`],
|
|
107
|
+
[`Propagate to ${OLD}`, `Propagate to ${NEW}`],
|
|
108
|
+
[`${oldLower}-workspace-README`, `${newLower}-workspace-README`],
|
|
109
|
+
[`${oldLower}-dev-launcher`, `${newLower}-dev-launcher`],
|
|
110
|
+
[`${oldLower}-phase-status`, `${newLower}-phase-status`],
|
|
111
|
+
[`${oldLower}-lessons-gate`, `${newLower}-lessons-gate`],
|
|
112
|
+
[`${oldLower}-lessons-mcp`, `${newLower}-lessons-mcp`],
|
|
113
|
+
[`${oldLower}-no-trailer`, `${newLower}-no-trailer`],
|
|
114
|
+
[`${oldLower}-updates-log`, `${newLower}-updates-log`],
|
|
115
|
+
[`${oldLower}-propagation`, `${newLower}-propagation`],
|
|
116
|
+
[`install-${oldLower}-lite`, `install-${newLower}-lite`],
|
|
117
|
+
[`install-${oldLower}`, `install-${newLower}`],
|
|
118
|
+
[`install:${oldLower}`, `install:${newLower}`],
|
|
119
|
+
[`${oldLower}:status`, `${newLower}:status`],
|
|
120
|
+
[`${oldLower}-cli`, `${newLower}-cli`],
|
|
121
|
+
[`${oldLower}-env`, `${newLower}-env`],
|
|
122
|
+
[`${oldLower}-mcp`, `${newLower}-mcp`],
|
|
123
|
+
[`user-${oldLower}`, `user-${newLower}`],
|
|
124
|
+
[`skills/${oldLower}`, `skills/${newLower}`],
|
|
125
|
+
[`.${oldLower}`, `.${newLower}`],
|
|
126
|
+
[`_${oldLower}`, `_${newLower}`],
|
|
127
|
+
[OLD, NEW],
|
|
128
|
+
[OLD_UP, NEW_UP],
|
|
129
|
+
[oldLower, newLower],
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
const GH_SLUG = "Catalyst-Forge-LLC/forge-kit";
|
|
133
|
+
const GH_TOKEN = "@@GH_SLUG@@";
|
|
134
|
+
const PATH_PROTECT = [
|
|
135
|
+
["Z:/workspace/forge-kit", "@@P1@@"],
|
|
136
|
+
["Z:\\workspace\\forge-kit", "@@P2@@"],
|
|
137
|
+
["/z/workspace/forge-kit", "@@P3@@"],
|
|
138
|
+
["z:/workspace/forge-kit", "@@P4@@"],
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
function parseArgs(argv) {
|
|
142
|
+
let root = dirname(SELF) + "/..";
|
|
143
|
+
for (let i = 0; i < argv.length; i++) {
|
|
144
|
+
if (argv[i] === "--root") root = argv[++i];
|
|
145
|
+
}
|
|
146
|
+
return { root };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function isTextFile(name, filePath) {
|
|
150
|
+
const dot = name.lastIndexOf(".");
|
|
151
|
+
if (dot !== -1) return TEXT_EXT.has(name.slice(dot));
|
|
152
|
+
try {
|
|
153
|
+
const buf = readFileSync(filePath);
|
|
154
|
+
return !buf.includes(0) && buf.length < 512_000;
|
|
155
|
+
} catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function walk(dir, acc = []) {
|
|
161
|
+
let entries;
|
|
162
|
+
try {
|
|
163
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
164
|
+
} catch {
|
|
165
|
+
return acc;
|
|
166
|
+
}
|
|
167
|
+
for (const ent of entries) {
|
|
168
|
+
if (SKIP_DIRS.has(ent.name)) continue;
|
|
169
|
+
const full = join(dir, ent.name);
|
|
170
|
+
if (ent.isDirectory()) walk(full, acc);
|
|
171
|
+
else acc.push(full);
|
|
172
|
+
}
|
|
173
|
+
return acc;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function protect(text) {
|
|
177
|
+
let out = text.split(GH_SLUG).join(GH_TOKEN);
|
|
178
|
+
for (const [from, token] of PATH_PROTECT) out = out.split(from).join(token);
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function unprotect(text) {
|
|
183
|
+
let out = text.split(GH_TOKEN).join(GH_SLUG);
|
|
184
|
+
for (const [from, token] of PATH_PROTECT) out = out.split(token).join(from);
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function replaceContent(text) {
|
|
189
|
+
let out = protect(text);
|
|
190
|
+
for (const [from, to] of REPLACEMENTS) out = out.split(from).join(to);
|
|
191
|
+
return unprotect(out);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function renamePairs(root, pairs, dirs) {
|
|
195
|
+
const found = [];
|
|
196
|
+
const visit = (dir) => {
|
|
197
|
+
let entries;
|
|
198
|
+
try {
|
|
199
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
200
|
+
} catch {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
for (const ent of entries) {
|
|
204
|
+
if (SKIP_DIRS.has(ent.name)) continue;
|
|
205
|
+
const full = join(dir, ent.name);
|
|
206
|
+
if (ent.isDirectory()) {
|
|
207
|
+
visit(full);
|
|
208
|
+
if (dirs && pairs.some(([oldName]) => ent.name === oldName)) found.push(full);
|
|
209
|
+
} else if (!dirs && pairs.some(([oldName]) => ent.name === oldName)) {
|
|
210
|
+
found.push(full);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
visit(root);
|
|
215
|
+
if (dirs) {
|
|
216
|
+
for (const [oldName] of pairs) {
|
|
217
|
+
const candidate = join(root, oldName);
|
|
218
|
+
if (existsSync(candidate) && !found.includes(candidate)) found.push(candidate);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
found.sort((a, b) => b.length - a.length);
|
|
222
|
+
for (const from of found) {
|
|
223
|
+
const name = from.split(/[/\\]/).pop();
|
|
224
|
+
const pair = pairs.find(([oldName]) => oldName === name);
|
|
225
|
+
if (!pair) continue;
|
|
226
|
+
const to = join(dirname(from), pair[1]);
|
|
227
|
+
if (existsSync(to)) {
|
|
228
|
+
console.warn(`skip exists: ${relative(root, to)}`);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
renameSync(from, to);
|
|
232
|
+
console.log(`mv ${relative(root, from)} → ${relative(root, to)}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function main() {
|
|
237
|
+
const { root } = parseArgs(process.argv.slice(2));
|
|
238
|
+
if (!existsSync(root) || !statSync(root).isDirectory()) {
|
|
239
|
+
console.error(`Not a directory: ${root}`);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
console.log(`Rename root: ${root}`);
|
|
243
|
+
renamePairs(root, DIR_RENAMES, true);
|
|
244
|
+
renamePairs(root, FILE_RENAMES, false);
|
|
245
|
+
|
|
246
|
+
const skillOld = join(root, "content", "skills", oldLower);
|
|
247
|
+
const skillNew = join(root, "content", "skills", newLower);
|
|
248
|
+
if (existsSync(skillOld) && !existsSync(skillNew)) {
|
|
249
|
+
renameSync(skillOld, skillNew);
|
|
250
|
+
console.log(`mv content/skills/${oldLower} → content/skills/${newLower}`);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
let changed = 0;
|
|
254
|
+
for (const file of walk(root)) {
|
|
255
|
+
if (file === SELF) continue;
|
|
256
|
+
const name = file.split(/[/\\]/).pop();
|
|
257
|
+
if (!isTextFile(name, file)) continue;
|
|
258
|
+
let raw;
|
|
259
|
+
try {
|
|
260
|
+
raw = readFileSync(file, "utf8");
|
|
261
|
+
} catch {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const next = replaceContent(raw);
|
|
265
|
+
if (next !== raw) {
|
|
266
|
+
writeFileSync(file, next);
|
|
267
|
+
changed += 1;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
console.log(`Updated ${changed} files`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
main();
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"project": {
|
|
3
|
+
"name": "",
|
|
4
|
+
"created": "",
|
|
5
|
+
"description": "",
|
|
6
|
+
"archetype": "product",
|
|
7
|
+
"status": "active"
|
|
8
|
+
},
|
|
9
|
+
"currentPhase": "1-architecture",
|
|
10
|
+
"phases": {
|
|
11
|
+
"1-architecture": {
|
|
12
|
+
"status": "not_started",
|
|
13
|
+
"startedAt": null,
|
|
14
|
+
"completedAt": null,
|
|
15
|
+
"exitCriteriaMet": [],
|
|
16
|
+
"exitCriteriaRemaining": [
|
|
17
|
+
"Tech choices confirmed",
|
|
18
|
+
"Folder structure confirmed",
|
|
19
|
+
"Data model shape confirmed",
|
|
20
|
+
"First feature batch defined",
|
|
21
|
+
"Claude's understanding verified by user",
|
|
22
|
+
"PHASE_1_BRIEF.md created, complete, and locked (docs/)",
|
|
23
|
+
"Major decisions recorded in workflow_tracking.json decisions[]"
|
|
24
|
+
],
|
|
25
|
+
"notes": []
|
|
26
|
+
},
|
|
27
|
+
"2-scaffolding": {
|
|
28
|
+
"status": "not_started",
|
|
29
|
+
"startedAt": null,
|
|
30
|
+
"completedAt": null,
|
|
31
|
+
"exitCriteriaMet": [],
|
|
32
|
+
"exitCriteriaRemaining": [
|
|
33
|
+
"App runs with pnpm dev",
|
|
34
|
+
"Real data visible on screen",
|
|
35
|
+
"Core CRUD works",
|
|
36
|
+
"Hero flow functions end to end",
|
|
37
|
+
"CONTEXT_PROMPT.md created and populated by merging PHASE_1_BRIEF.md (then template lessons as needed)",
|
|
38
|
+
"README.md created (from ForgeTrail template)",
|
|
39
|
+
"TODO.md created (from ForgeTrail template, seeded from PHASE_1_BRIEF §11)",
|
|
40
|
+
"IDEAS.md created (from ForgeTrail template)",
|
|
41
|
+
"Phase 2 doc scope only per WORKFLOW §1a (no premature extra templates)"
|
|
42
|
+
],
|
|
43
|
+
"notes": []
|
|
44
|
+
},
|
|
45
|
+
"3-stabilization": {
|
|
46
|
+
"status": "not_started",
|
|
47
|
+
"startedAt": null,
|
|
48
|
+
"completedAt": null,
|
|
49
|
+
"exitCriteriaMet": [],
|
|
50
|
+
"exitCriteriaRemaining": [
|
|
51
|
+
"Environment variables resolve correctly",
|
|
52
|
+
"APIs return real data",
|
|
53
|
+
"Core workflow completes without infrastructure errors",
|
|
54
|
+
"Error messages are human-readable (not just status codes)"
|
|
55
|
+
],
|
|
56
|
+
"notes": []
|
|
57
|
+
},
|
|
58
|
+
"4-feature-iteration": {
|
|
59
|
+
"status": "not_started",
|
|
60
|
+
"startedAt": null,
|
|
61
|
+
"completedAt": null,
|
|
62
|
+
"exitCriteriaMet": [],
|
|
63
|
+
"exitCriteriaRemaining": ["Core value proposition delivered", "Hero flow works with real data including edge cases", "Features tested beyond happy path"],
|
|
64
|
+
"notes": [],
|
|
65
|
+
"iterations": []
|
|
66
|
+
},
|
|
67
|
+
"5-refactoring": {
|
|
68
|
+
"status": "not_started",
|
|
69
|
+
"startedAt": null,
|
|
70
|
+
"completedAt": null,
|
|
71
|
+
"exitCriteriaMet": [],
|
|
72
|
+
"exitCriteriaRemaining": [
|
|
73
|
+
"No file exceeds ~500 lines without justification",
|
|
74
|
+
"Shared utilities extracted",
|
|
75
|
+
"No duplicated patterns",
|
|
76
|
+
"Build passes after each refactor"
|
|
77
|
+
],
|
|
78
|
+
"notes": []
|
|
79
|
+
},
|
|
80
|
+
"6-strategic-review": {
|
|
81
|
+
"status": "not_started",
|
|
82
|
+
"startedAt": null,
|
|
83
|
+
"completedAt": null,
|
|
84
|
+
"exitCriteriaMet": [],
|
|
85
|
+
"exitCriteriaRemaining": [
|
|
86
|
+
"BRAND_AND_PRODUCT.md created (from ForgeTrail template)",
|
|
87
|
+
"TODO reorganized by brand value pillars",
|
|
88
|
+
"Features mapped to brand pillars",
|
|
89
|
+
"Gap between brand promise and product identified",
|
|
90
|
+
"IDEAS.md processed into TODO",
|
|
91
|
+
"Build order decided"
|
|
92
|
+
],
|
|
93
|
+
"notes": []
|
|
94
|
+
},
|
|
95
|
+
"7-hardening": {
|
|
96
|
+
"status": "not_started",
|
|
97
|
+
"startedAt": null,
|
|
98
|
+
"completedAt": null,
|
|
99
|
+
"exitCriteriaMet": [],
|
|
100
|
+
"exitCriteriaRemaining": [
|
|
101
|
+
"CODE_QUALITY.md produced (from ForgeTrail template) and critical findings fixed",
|
|
102
|
+
"BLACK_HAT_REPORT.md produced (via ForgeTrail security audit) and critical/high findings fixed",
|
|
103
|
+
"All findings triaged into TODO.md with P0/P1/P2 priority",
|
|
104
|
+
"All LLM outputs checked against field size limits",
|
|
105
|
+
"No silent failures in core workflows (grep for empty catch blocks)",
|
|
106
|
+
"All API routes return errors in consistent format",
|
|
107
|
+
"All user input validated (centralized Zod schemas recommended)",
|
|
108
|
+
"No unvalidated as-any casts on critical paths",
|
|
109
|
+
"DEPLOYMENT.md created (from ForgeTrail template)",
|
|
110
|
+
"BUSINESS_PLAN.md created if pursuing paid users (from ForgeTrail template)",
|
|
111
|
+
"TEST_PLAN.md complete or extended (from ForgeTrail template)",
|
|
112
|
+
"TECHNICAL_REFERENCE.md complete and current",
|
|
113
|
+
"Auth flow works end to end (if applicable)",
|
|
114
|
+
"Payment flow works end to end (if applicable)",
|
|
115
|
+
"Docs alignment audit passed (via ForgeTrail docs-alignment audit)",
|
|
116
|
+
"All documentation consolidated and cross-referenced"
|
|
117
|
+
],
|
|
118
|
+
"notes": []
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"decisions": [],
|
|
122
|
+
"gotchas": [],
|
|
123
|
+
"sessions": []
|
|
124
|
+
}
|