@jakkrichm/create-nexus-devflow 2.0.13 → 2.0.15

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.
Files changed (102) hide show
  1. package/README.md +4 -4
  2. package/dist/bin/create-nexus-devflow.d.ts +2 -0
  3. package/dist/bin/create-nexus-devflow.js +233 -0
  4. package/dist/bin/create-nexus-devflow.js.map +1 -0
  5. package/dist/lib/starter-templates.d.ts +6 -0
  6. package/dist/lib/starter-templates.js +8 -0
  7. package/dist/lib/starter-templates.js.map +1 -0
  8. package/dist/lib/update.d.ts +68 -0
  9. package/dist/lib/update.js +325 -0
  10. package/dist/lib/update.js.map +1 -0
  11. package/dist/scripts/clean-template.d.ts +1 -0
  12. package/dist/scripts/clean-template.js +14 -0
  13. package/dist/scripts/clean-template.js.map +1 -0
  14. package/dist/scripts/prepare-template.d.ts +1 -0
  15. package/dist/scripts/prepare-template.js +89 -0
  16. package/dist/scripts/prepare-template.js.map +1 -0
  17. package/package.json +11 -9
  18. package/template/.agents/skills/00-discover/SKILL.md +2 -0
  19. package/template/.agents/skills/30-plan/SKILL.md +6 -6
  20. package/template/{.claude/skills/40-implement → .agents/skills/40-execute}/SKILL.md +21 -26
  21. package/template/.agents/skills/50-verify/SKILL.md +10 -10
  22. package/template/.agents/skills/60-report/SKILL.md +22 -76
  23. package/template/.agents/skills/70-release/SKILL.md +11 -10
  24. package/template/.agents/skills/agent/SKILL.md +3 -3
  25. package/template/.agents/skills/autopilot/SKILL.md +6 -6
  26. package/template/.agents/skills/brainstorm/SKILL.md +1 -1
  27. package/template/.agents/skills/brief/SKILL.md +1 -1
  28. package/template/.agents/skills/check/SKILL.md +68 -0
  29. package/template/.agents/skills/codebase-design/SKILL.md +2 -2
  30. package/template/.agents/skills/commit/SKILL.md +1 -1
  31. package/template/.agents/skills/complete/SKILL.md +73 -0
  32. package/template/.agents/skills/debug/SKILL.md +2 -2
  33. package/template/.agents/skills/devflow/SKILL.md +89 -80
  34. package/template/.agents/skills/doctor/SKILL.md +1 -1
  35. package/template/.agents/skills/feature/SKILL.md +103 -0
  36. package/template/.agents/skills/fix/SKILL.md +102 -0
  37. package/template/.agents/skills/followup/SKILL.md +5 -5
  38. package/template/.agents/skills/help/SKILL.md +4 -4
  39. package/template/.agents/skills/idea/SKILL.md +57 -0
  40. package/template/.agents/skills/implement/SKILL.md +64 -0
  41. package/template/.agents/skills/insight/SKILL.md +1 -1
  42. package/template/.agents/skills/overview/SKILL.md +114 -0
  43. package/template/.agents/skills/pr/SKILL.md +1 -1
  44. package/template/.agents/skills/preview/SKILL.md +1 -1
  45. package/template/.agents/skills/report-html/SKILL.md +45 -0
  46. package/template/.agents/skills/review/SKILL.md +1 -1
  47. package/template/.agents/skills/rollback/SKILL.md +3 -3
  48. package/template/.agents/skills/security-review/SKILL.md +2 -2
  49. package/template/.agents/skills/simplify/SKILL.md +1 -1
  50. package/template/.agents/skills/spec/SKILL.md +38 -0
  51. package/template/.agents/skills/test/SKILL.md +2 -2
  52. package/template/.agents/skills/try/SKILL.md +2 -2
  53. package/template/.claude/skills/00-discover/SKILL.md +2 -0
  54. package/template/.claude/skills/30-plan/SKILL.md +6 -6
  55. package/template/{.agents/skills/40-implement → .claude/skills/40-execute}/SKILL.md +21 -26
  56. package/template/.claude/skills/50-verify/SKILL.md +10 -10
  57. package/template/.claude/skills/60-report/SKILL.md +22 -76
  58. package/template/.claude/skills/70-release/SKILL.md +11 -10
  59. package/template/.claude/skills/agent/SKILL.md +3 -3
  60. package/template/.claude/skills/autopilot/SKILL.md +6 -6
  61. package/template/.claude/skills/brainstorm/SKILL.md +1 -1
  62. package/template/.claude/skills/brief/SKILL.md +1 -1
  63. package/template/.claude/skills/check/SKILL.md +68 -0
  64. package/template/.claude/skills/codebase-design/SKILL.md +2 -2
  65. package/template/.claude/skills/commit/SKILL.md +1 -1
  66. package/template/.claude/skills/complete/SKILL.md +73 -0
  67. package/template/.claude/skills/debug/SKILL.md +2 -2
  68. package/template/.claude/skills/devflow/SKILL.md +89 -80
  69. package/template/.claude/skills/doctor/SKILL.md +1 -1
  70. package/template/.claude/skills/feature/SKILL.md +103 -0
  71. package/template/.claude/skills/fix/SKILL.md +102 -0
  72. package/template/.claude/skills/followup/SKILL.md +5 -5
  73. package/template/.claude/skills/help/SKILL.md +4 -4
  74. package/template/.claude/skills/idea/SKILL.md +57 -0
  75. package/template/.claude/skills/implement/SKILL.md +64 -0
  76. package/template/.claude/skills/insight/SKILL.md +1 -1
  77. package/template/.claude/skills/overview/SKILL.md +114 -0
  78. package/template/.claude/skills/pr/SKILL.md +1 -1
  79. package/template/.claude/skills/preview/SKILL.md +1 -1
  80. package/template/.claude/skills/report-html/SKILL.md +45 -0
  81. package/template/.claude/skills/review/SKILL.md +1 -1
  82. package/template/.claude/skills/rollback/SKILL.md +3 -3
  83. package/template/.claude/skills/security-review/SKILL.md +2 -2
  84. package/template/.claude/skills/simplify/SKILL.md +1 -1
  85. package/template/.claude/skills/spec/SKILL.md +38 -0
  86. package/template/.claude/skills/test/SKILL.md +2 -2
  87. package/template/.claude/skills/try/SKILL.md +2 -2
  88. package/template/AGENTS.md +72 -74
  89. package/template/devflow/context/ai-interaction.md +3 -2
  90. package/template/devflow/context/coding-standards.md +31 -18
  91. package/template/devflow/context/current-stage.md +4 -3
  92. package/template/devflow/context/findings.md +10 -6
  93. package/template/devflow/context/project-overview.md +33 -11
  94. package/template/devflow/discoveries/.gitkeep +0 -0
  95. package/template/devflow/history/HISTORY.md +6 -0
  96. package/template/devflow/ideas.md +15 -0
  97. package/template/devflow/reference/running-id-contract.md +2 -2
  98. package/template/devflow/runs/.gitkeep +0 -0
  99. package/bin/create-nexus-devflow.js +0 -287
  100. package/lib/starter-templates.js +0 -111
  101. package/lib/update.js +0 -393
  102. package/template/.nexus/nexus-devflow.json +0 -44
@@ -0,0 +1,325 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ export const CONTROL_DIR = ".nexus";
5
+ export const MANIFEST_PATH = `${CONTROL_DIR}/nexus-devflow.json`;
6
+ export const MANIFEST_SCHEMA_VERSION = 1;
7
+ export const MANAGED_ROOTS = {
8
+ common: ["AGENTS.md", "CLAUDE.md", "devflow", "LICENSE"],
9
+ codex: [".agents/skills"],
10
+ antigravity: [".agents/skills", ".agent/workflows"],
11
+ claude: [".claude/skills"]
12
+ };
13
+ export function adapterListFromMode(adapter) {
14
+ if (!adapter || adapter === "both" || adapter === "all") {
15
+ return ["codex", "claude"];
16
+ }
17
+ if (adapter === "antigravity") {
18
+ return ["codex"];
19
+ }
20
+ if (adapter === "codex" || adapter === "claude") {
21
+ return [adapter];
22
+ }
23
+ throw new Error(`Unknown adapter mode: ${adapter}`);
24
+ }
25
+ export function createManifest(version, adapters, templateFiles) {
26
+ const managedFiles = {};
27
+ for (const [relativePath, file] of [...templateFiles.entries()].sort(([a], [b]) => a.localeCompare(b))) {
28
+ managedFiles[relativePath] = file.hash;
29
+ }
30
+ return {
31
+ schemaVersion: MANIFEST_SCHEMA_VERSION,
32
+ name: "nexus-devflow",
33
+ package: "@jakkrichm/create-nexus-devflow",
34
+ version,
35
+ repository: "https://github.com/Jakkrich/nexus-devflow",
36
+ artifactLanguage: "th",
37
+ adapters: [...adapters].sort(),
38
+ workspace: {
39
+ contextDir: "devflow/context",
40
+ historyDir: "devflow/history",
41
+ referenceDir: "devflow/reference",
42
+ runsDir: "devflow/runs",
43
+ discoveriesDir: "devflow/discoveries"
44
+ },
45
+ lifecycle: {
46
+ mainlineStages: [
47
+ "00-discover",
48
+ "10-define",
49
+ "20-spec",
50
+ "30-plan",
51
+ "40-execute",
52
+ "50-verify",
53
+ "60-report",
54
+ "70-release"
55
+ ],
56
+ companionCommands: [
57
+ "goal",
58
+ "brainstorm",
59
+ "research",
60
+ "debug",
61
+ "prd",
62
+ "issue-triage",
63
+ "security-review",
64
+ "check-for-updates",
65
+ "help"
66
+ ]
67
+ },
68
+ managedFiles
69
+ };
70
+ }
71
+ export async function collectManagedTemplateFiles(templateRoot, adapters) {
72
+ const files = new Map();
73
+ const roots = [
74
+ ...MANAGED_ROOTS.common,
75
+ ...adapters.flatMap((adapter) => MANAGED_ROOTS[adapter] || [])
76
+ ];
77
+ for (const relativeRoot of roots) {
78
+ const sourceRoot = path.join(templateRoot, ...relativeRoot.split("/"));
79
+ await collectSourceFiles(sourceRoot, relativeRoot, files);
80
+ }
81
+ return files;
82
+ }
83
+ async function collectSourceFiles(sourcePath, relativePath, files) {
84
+ try {
85
+ const stats = await fs.lstat(sourcePath);
86
+ if (stats.isSymbolicLink()) {
87
+ throw new Error(`Managed template path cannot be a symbolic link: ${relativePath}`);
88
+ }
89
+ if (stats.isDirectory()) {
90
+ const children = (await fs.readdir(sourcePath)).sort();
91
+ for (const child of children) {
92
+ await collectSourceFiles(path.join(sourcePath, child), `${relativePath}/${child}`, files);
93
+ }
94
+ return;
95
+ }
96
+ if (!stats.isFile()) {
97
+ throw new Error(`Managed template path is not a regular file: ${relativePath}`);
98
+ }
99
+ files.set(relativePath, {
100
+ source: sourcePath,
101
+ hash: await hashFile(sourcePath)
102
+ });
103
+ }
104
+ catch (err) {
105
+ if (err.code === "ENOENT") {
106
+ return;
107
+ }
108
+ throw err;
109
+ }
110
+ }
111
+ export async function readManifest(targetDir) {
112
+ const manifestFile = targetPath(targetDir, MANIFEST_PATH);
113
+ await assertNoSymlinkParents(targetDir, MANIFEST_PATH);
114
+ try {
115
+ const content = await fs.readFile(manifestFile, "utf8");
116
+ const data = JSON.parse(content);
117
+ if (!data || data.schemaVersion !== MANIFEST_SCHEMA_VERSION) {
118
+ throw new Error("Unsupported manifest schema version.");
119
+ }
120
+ return data;
121
+ }
122
+ catch (error) {
123
+ if (error.code === "ENOENT") {
124
+ return null;
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ export async function prepareUpdate({ targetDir, templateRoot, version, adapter }) {
130
+ const requestedAdapters = new Set(adapterListFromMode(adapter));
131
+ const previousManifest = await readManifest(targetDir);
132
+ const activeAdapters = new Set([
133
+ ...requestedAdapters,
134
+ ...(previousManifest?.adapters || [])
135
+ ]);
136
+ const templateFiles = await collectManagedTemplateFiles(templateRoot, [...activeAdapters]);
137
+ const nextManifest = createManifest(version, activeAdapters, templateFiles);
138
+ const createList = [];
139
+ const updateList = [];
140
+ const conflictList = [];
141
+ for (const [relativePath, templateFile] of templateFiles) {
142
+ await assertNoSymlinkParents(targetDir, relativePath);
143
+ const targetFile = targetPath(targetDir, relativePath);
144
+ let targetStats = null;
145
+ try {
146
+ targetStats = await fs.lstat(targetFile);
147
+ }
148
+ catch (error) {
149
+ if (error.code !== "ENOENT") {
150
+ throw error;
151
+ }
152
+ }
153
+ if (!targetStats) {
154
+ createList.push(relativePath);
155
+ continue;
156
+ }
157
+ if (targetStats.isSymbolicLink()) {
158
+ conflictList.push({
159
+ relativePath,
160
+ reason: "symlink",
161
+ detail: "Target path is a symbolic link."
162
+ });
163
+ continue;
164
+ }
165
+ if (!targetStats.isFile()) {
166
+ conflictList.push({
167
+ relativePath,
168
+ reason: "not_file",
169
+ detail: "Target path exists but is not a regular file."
170
+ });
171
+ continue;
172
+ }
173
+ const currentHash = await hashFile(targetFile);
174
+ if (currentHash === templateFile.hash) {
175
+ continue;
176
+ }
177
+ const recordedHash = previousManifest?.managedFiles?.[relativePath];
178
+ if (recordedHash && recordedHash === currentHash) {
179
+ updateList.push(relativePath);
180
+ continue;
181
+ }
182
+ conflictList.push({
183
+ relativePath,
184
+ reason: "customized",
185
+ detail: recordedHash
186
+ ? "File was modified locally since last install."
187
+ : "File exists in project and differs from template."
188
+ });
189
+ }
190
+ const orphanedFiles = [];
191
+ if (previousManifest) {
192
+ for (const [relativePath, recordedHash] of Object.entries(previousManifest.managedFiles)) {
193
+ if (templateFiles.has(relativePath)) {
194
+ continue;
195
+ }
196
+ await assertNoSymlinkParents(targetDir, relativePath);
197
+ const targetFile = targetPath(targetDir, relativePath);
198
+ let targetStats = null;
199
+ try {
200
+ targetStats = await fs.lstat(targetFile);
201
+ }
202
+ catch (error) {
203
+ if (error.code !== "ENOENT") {
204
+ throw error;
205
+ }
206
+ }
207
+ if (!targetStats || !targetStats.isFile()) {
208
+ continue;
209
+ }
210
+ const currentHash = await hashFile(targetFile);
211
+ if (currentHash === recordedHash) {
212
+ orphanedFiles.push(relativePath);
213
+ }
214
+ }
215
+ }
216
+ return {
217
+ targetDir,
218
+ templateRoot,
219
+ previousManifest,
220
+ nextManifest,
221
+ activeAdapters: [...activeAdapters].sort(),
222
+ templateFiles,
223
+ createList,
224
+ updateList,
225
+ conflictList,
226
+ orphanedFiles
227
+ };
228
+ }
229
+ export async function applyPreparedUpdate(prepared, { replaceConflicts = false } = {}) {
230
+ if (prepared.conflictList.length > 0 && !replaceConflicts) {
231
+ throw new Error(`Cannot apply update with ${prepared.conflictList.length} conflict(s). Pass force/replace option or resolve conflicts.`);
232
+ }
233
+ const writeTargets = [
234
+ ...prepared.createList,
235
+ ...prepared.updateList,
236
+ ...(replaceConflicts ? prepared.conflictList.map((item) => item.relativePath) : [])
237
+ ];
238
+ let appliedCount = 0;
239
+ for (const relativePath of writeTargets) {
240
+ const templateFile = prepared.templateFiles.get(relativePath);
241
+ if (!templateFile) {
242
+ continue;
243
+ }
244
+ await copyFileAtomic(prepared.targetDir, relativePath, templateFile.source);
245
+ appliedCount++;
246
+ }
247
+ let removedCount = 0;
248
+ for (const relativePath of prepared.orphanedFiles) {
249
+ const fileToRemove = targetPath(prepared.targetDir, relativePath);
250
+ try {
251
+ await fs.unlink(fileToRemove);
252
+ removedCount++;
253
+ await cleanEmptyParentDirectories(prepared.targetDir, fileToRemove);
254
+ }
255
+ catch (error) {
256
+ if (error.code !== "ENOENT") {
257
+ throw error;
258
+ }
259
+ }
260
+ }
261
+ await writeInstallManifest(prepared.targetDir, prepared.nextManifest);
262
+ return {
263
+ appliedCount,
264
+ removedCount
265
+ };
266
+ }
267
+ export async function cleanEmptyParentDirectories(targetDir, filePath) {
268
+ let parentDir = path.dirname(filePath);
269
+ const resolvedTarget = path.resolve(targetDir);
270
+ while (parentDir !== resolvedTarget && parentDir.startsWith(resolvedTarget)) {
271
+ try {
272
+ const entries = await fs.readdir(parentDir);
273
+ if (entries.length === 0) {
274
+ await fs.rmdir(parentDir);
275
+ parentDir = path.dirname(parentDir);
276
+ }
277
+ else {
278
+ break;
279
+ }
280
+ }
281
+ catch {
282
+ break;
283
+ }
284
+ }
285
+ }
286
+ export async function writeInstallManifest(targetDir, manifest) {
287
+ const manifestFile = targetPath(targetDir, MANIFEST_PATH);
288
+ await fs.mkdir(path.dirname(manifestFile), { recursive: true });
289
+ await fs.writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
290
+ }
291
+ export async function copyFileAtomic(targetDir, relativePath, sourcePath) {
292
+ await assertNoSymlinkParents(targetDir, relativePath);
293
+ const destinationPath = targetPath(targetDir, relativePath);
294
+ await fs.mkdir(path.dirname(destinationPath), { recursive: true });
295
+ const tempPath = `${destinationPath}.tmp-${process.pid}-${Date.now()}`;
296
+ await fs.copyFile(sourcePath, tempPath);
297
+ await fs.rename(tempPath, destinationPath);
298
+ }
299
+ export function targetPath(targetDir, relativePath) {
300
+ return path.resolve(targetDir, ...relativePath.split("/"));
301
+ }
302
+ export async function assertNoSymlinkParents(targetDir, relativePath) {
303
+ const parts = relativePath.split("/");
304
+ let current = path.resolve(targetDir);
305
+ for (let i = 0; i < parts.length - 1; i++) {
306
+ current = path.join(current, parts[i]);
307
+ try {
308
+ const stats = await fs.lstat(current);
309
+ if (stats.isSymbolicLink()) {
310
+ throw new Error(`Target sub-path "${parts.slice(0, i + 1).join("/")}" is a symbolic link.`);
311
+ }
312
+ }
313
+ catch (error) {
314
+ if (error.code === "ENOENT") {
315
+ break;
316
+ }
317
+ throw error;
318
+ }
319
+ }
320
+ }
321
+ export async function hashFile(filePath) {
322
+ const content = await fs.readFile(filePath);
323
+ return crypto.createHash("sha256").update(content).digest("hex");
324
+ }
325
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../lib/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ const packageRoot = path.resolve(__dirname, "..");
6
+ const templateRoot = path.join(packageRoot, "template");
7
+ async function main() {
8
+ await fs.rm(templateRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
9
+ }
10
+ main().catch((error) => {
11
+ console.error(error instanceof Error ? error.message : String(error));
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=clean-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-template.js","sourceRoot":"","sources":["../../scripts/clean-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAExD,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
+ const packageRoot = path.resolve(__dirname, "..");
6
+ const repoRoot = path.resolve(packageRoot, "..", "..");
7
+ const templateRoot = path.join(packageRoot, "template");
8
+ const entries = [
9
+ "AGENTS.md",
10
+ "CLAUDE.md",
11
+ ".agents",
12
+ ".claude",
13
+ "devflow",
14
+ "LICENSE"
15
+ ];
16
+ async function copyEntry(entry) {
17
+ const source = path.join(repoRoot, entry);
18
+ const target = path.join(templateRoot, entry);
19
+ try {
20
+ await fs.cp(source, target, {
21
+ recursive: true,
22
+ filter: (src) => {
23
+ const normalized = path.relative(repoRoot, src).replace(/\\/g, "/");
24
+ if (normalized.startsWith("devflow/runs/") &&
25
+ !normalized.endsWith(".gitkeep") &&
26
+ !normalized.endsWith("README.md")) {
27
+ return false;
28
+ }
29
+ if (normalized.startsWith("devflow/discoveries/") &&
30
+ !normalized.endsWith(".gitkeep") &&
31
+ !normalized.endsWith("README.md")) {
32
+ return false;
33
+ }
34
+ if (normalized.includes(".agents/skills/sync-upstream") ||
35
+ normalized.includes(".claude/skills/sync-upstream")) {
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ });
41
+ }
42
+ catch (err) {
43
+ if (err.code !== "ENOENT") {
44
+ throw err;
45
+ }
46
+ }
47
+ }
48
+ async function ensureEmptyDirectories() {
49
+ const runsDir = path.join(templateRoot, "devflow", "runs");
50
+ const discDir = path.join(templateRoot, "devflow", "discoveries");
51
+ await fs.mkdir(runsDir, { recursive: true });
52
+ await fs.mkdir(discDir, { recursive: true });
53
+ await fs.writeFile(path.join(runsDir, ".gitkeep"), "", "utf8");
54
+ await fs.writeFile(path.join(discDir, ".gitkeep"), "", "utf8");
55
+ }
56
+ async function sanitizeAgentsEntryFile(filePath) {
57
+ try {
58
+ let content = await fs.readFile(filePath, "utf8");
59
+ const maintainerCommandsRegex = /## Verification & Commands[\s\S]*$/;
60
+ const starterCommands = `## Commands
61
+
62
+ - Dev Server: \`npm run dev\`
63
+ - Build: \`npm run build\`
64
+ - Test: \`npm test\`
65
+ - Verify: \`npm run check\` (Run \`/onboard\` to auto-configure)
66
+ `;
67
+ content = content.replace(maintainerCommandsRegex, starterCommands);
68
+ await fs.writeFile(filePath, content, "utf8");
69
+ }
70
+ catch (error) {
71
+ if (error.code !== "ENOENT") {
72
+ throw error;
73
+ }
74
+ }
75
+ }
76
+ async function main() {
77
+ await fs.rm(templateRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
78
+ await fs.mkdir(templateRoot, { recursive: true });
79
+ for (const entry of entries) {
80
+ await copyEntry(entry);
81
+ }
82
+ await ensureEmptyDirectories();
83
+ await sanitizeAgentsEntryFile(path.join(templateRoot, "AGENTS.md"));
84
+ }
85
+ main().catch((error) => {
86
+ console.error(error instanceof Error ? error.message : String(error));
87
+ process.exit(1);
88
+ });
89
+ //# sourceMappingURL=prepare-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-template.js","sourceRoot":"","sources":["../../scripts/prepare-template.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakkrichm/create-nexus-devflow",
3
- "version": "2.0.13",
3
+ "version": "2.0.15",
4
4
  "description": "Installer package for Nexus-DevFlow agentic workflow layer.",
5
5
  "license": "MIT",
6
6
  "author": "Jakkrich",
@@ -25,20 +25,22 @@
25
25
  "workflow",
26
26
  "scaffold"
27
27
  ],
28
+ "type": "module",
28
29
  "bin": {
29
- "create-nexus-devflow": "bin/create-nexus-devflow.js",
30
- "nexus-devflow": "bin/create-nexus-devflow.js"
30
+ "create-nexus-devflow": "dist/bin/create-nexus-devflow.js",
31
+ "nexus-devflow": "dist/bin/create-nexus-devflow.js"
31
32
  },
32
33
  "scripts": {
33
- "test": "node --test",
34
+ "build": "tsc -p tsconfig.json",
35
+ "test": "tsx --test test/update.test.ts",
34
36
  "check:pack": "npm pack --dry-run",
35
- "prepare-template": "node scripts/prepare-template.js",
36
- "prepack": "node scripts/prepare-template.js",
37
- "postpack": "node scripts/clean-template.js"
37
+ "prepare-template": "tsx scripts/prepare-template.ts",
38
+ "clean-template": "tsx scripts/clean-template.ts",
39
+ "prepack": "npm run build && npm run prepare-template",
40
+ "postpack": "npm run clean-template"
38
41
  },
39
42
  "files": [
40
- "bin/",
41
- "lib/",
43
+ "dist/",
42
44
  "template/",
43
45
  "README.md",
44
46
  "LICENSE",
@@ -14,12 +14,14 @@ Explore a request before delivery commitment. Create or resume a Discovery ID, c
14
14
 
15
15
  ```text
16
16
  00-discover {title or request}
17
+ 00-discover IDEA-xxx
17
18
  00-discover {discovery-id}
18
19
  ```
19
20
 
20
21
  Use this when:
21
22
 
22
23
  - a new request needs discussion before the team commits to delivery
24
+ - exploring a pending idea from `devflow/ideas.md` (`00-discover IDEA-xxx`)
23
25
  - the best route may be `Brainstorm`, `PRD`, `Research`, or `Debug`
24
26
  - supporting findings need to be synthesized into a go/no-go decision
25
27
 
@@ -48,7 +48,7 @@ Run planning as an evidence loop, not as a one-shot outline.
48
48
  - **Observation**: use concrete evidence such as file paths, existing patterns, package scripts, validation commands, and unresolved assumptions.
49
49
  - **Adjustment**: if evidence is missing, search/read more, recommend `Research` or `Agent codebase-explorer`, split the work, or route back to `20-spec` when the contract is not plan-ready.
50
50
  - **Stop Condition**: stop only when phases are ordered, subtasks are scoped, verification is explicit, test decisions are recorded, and any blockers are visible.
51
- - **Handoff**: `30-plan.md` must give `40-implement` enough context to select one scoped unit and execute it without inventing intent.
51
+ - **Handoff**: `30-plan.md` must give `40-execute` enough context to select one scoped unit and execute it without inventing intent.
52
52
 
53
53
  ### 1. Read Task Artifacts
54
54
 
@@ -161,12 +161,12 @@ If validation fails, repair only what is necessary and keep `30-plan.md` aligned
161
161
 
162
162
  ### 7. Manual Review Soft Gate
163
163
 
164
- Before recommending `40-implement`, check whether the plan still shows pending review.
164
+ Before recommending `40-execute`, check whether the plan still shows pending review.
165
165
  If `Approval Status` is still pending or major dependencies remain unresolved:
166
166
 
167
167
  - warn that implementation should wait for review
168
168
  - recommend human confirmation of sequencing, scope, and verification strategy
169
- - keep `40-implement` as a soft recommendation only
169
+ - keep `40-execute` as a soft recommendation only
170
170
 
171
171
  ## Output Checklist
172
172
 
@@ -184,7 +184,7 @@ If `Approval Status` is still pending or major dependencies remain unresolved:
184
184
 
185
185
  - Classification: Mainline workflow
186
186
  - Previous state: `20-spec`
187
- - Next state: `40-implement` when execution steps and verification are clear
187
+ - Next state: `40-execute` when execution steps and verification are clear
188
188
  - Common companion commands: `Research` or `Agent` when architecture, data flow, or external constraints still need investigation; support skills: `grill-with-docs`, `domain-modeling`, `codebase-design`, `tdd`, and `to-issues` for final design stress-testing, durable terminology capture, test planning, and issue packaging
189
189
 
190
190
  ## Sources
@@ -192,11 +192,11 @@ If `Approval Status` is still pending or major dependencies remain unresolved:
192
192
  - `AGENTS.md`
193
193
  - `docs/workspace-artifacts.md`
194
194
  - `.agent/resources/schemas/plan.template.md`
195
- - Related commands: `20-spec`, `Research`, `Agent`, `40-implement`
195
+ - Related commands: `20-spec`, `Research`, `Agent`, `40-execute`
196
196
 
197
197
  ## Next Workflow Recommendation
198
198
 
199
- - **Primary**: `40-implement {ID}`
199
+ - **Primary**: `40-execute {ID}`
200
200
  - **Why**: Approved planning is the gate before implementation in DevFlow 2.0.
201
201
  - **Alternatives**:
202
202
  - `Research` - choose this when the plan still depends on missing evidence.