@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.
- package/README.md +4 -4
- package/dist/bin/create-nexus-devflow.d.ts +2 -0
- package/dist/bin/create-nexus-devflow.js +233 -0
- package/dist/bin/create-nexus-devflow.js.map +1 -0
- package/dist/lib/starter-templates.d.ts +6 -0
- package/dist/lib/starter-templates.js +8 -0
- package/dist/lib/starter-templates.js.map +1 -0
- package/dist/lib/update.d.ts +68 -0
- package/dist/lib/update.js +325 -0
- package/dist/lib/update.js.map +1 -0
- package/dist/scripts/clean-template.d.ts +1 -0
- package/dist/scripts/clean-template.js +14 -0
- package/dist/scripts/clean-template.js.map +1 -0
- package/dist/scripts/prepare-template.d.ts +1 -0
- package/dist/scripts/prepare-template.js +89 -0
- package/dist/scripts/prepare-template.js.map +1 -0
- package/package.json +11 -9
- package/template/.agents/skills/00-discover/SKILL.md +2 -0
- package/template/.agents/skills/30-plan/SKILL.md +6 -6
- package/template/{.claude/skills/40-implement → .agents/skills/40-execute}/SKILL.md +21 -26
- package/template/.agents/skills/50-verify/SKILL.md +10 -10
- package/template/.agents/skills/60-report/SKILL.md +22 -76
- package/template/.agents/skills/70-release/SKILL.md +11 -10
- package/template/.agents/skills/agent/SKILL.md +3 -3
- package/template/.agents/skills/autopilot/SKILL.md +6 -6
- package/template/.agents/skills/brainstorm/SKILL.md +1 -1
- package/template/.agents/skills/brief/SKILL.md +1 -1
- package/template/.agents/skills/check/SKILL.md +68 -0
- package/template/.agents/skills/codebase-design/SKILL.md +2 -2
- package/template/.agents/skills/commit/SKILL.md +1 -1
- package/template/.agents/skills/complete/SKILL.md +73 -0
- package/template/.agents/skills/debug/SKILL.md +2 -2
- package/template/.agents/skills/devflow/SKILL.md +89 -80
- package/template/.agents/skills/doctor/SKILL.md +1 -1
- package/template/.agents/skills/feature/SKILL.md +103 -0
- package/template/.agents/skills/fix/SKILL.md +102 -0
- package/template/.agents/skills/followup/SKILL.md +5 -5
- package/template/.agents/skills/help/SKILL.md +4 -4
- package/template/.agents/skills/idea/SKILL.md +57 -0
- package/template/.agents/skills/implement/SKILL.md +64 -0
- package/template/.agents/skills/insight/SKILL.md +1 -1
- package/template/.agents/skills/overview/SKILL.md +114 -0
- package/template/.agents/skills/pr/SKILL.md +1 -1
- package/template/.agents/skills/preview/SKILL.md +1 -1
- package/template/.agents/skills/report-html/SKILL.md +45 -0
- package/template/.agents/skills/review/SKILL.md +1 -1
- package/template/.agents/skills/rollback/SKILL.md +3 -3
- package/template/.agents/skills/security-review/SKILL.md +2 -2
- package/template/.agents/skills/simplify/SKILL.md +1 -1
- package/template/.agents/skills/spec/SKILL.md +38 -0
- package/template/.agents/skills/test/SKILL.md +2 -2
- package/template/.agents/skills/try/SKILL.md +2 -2
- package/template/.claude/skills/00-discover/SKILL.md +2 -0
- package/template/.claude/skills/30-plan/SKILL.md +6 -6
- package/template/{.agents/skills/40-implement → .claude/skills/40-execute}/SKILL.md +21 -26
- package/template/.claude/skills/50-verify/SKILL.md +10 -10
- package/template/.claude/skills/60-report/SKILL.md +22 -76
- package/template/.claude/skills/70-release/SKILL.md +11 -10
- package/template/.claude/skills/agent/SKILL.md +3 -3
- package/template/.claude/skills/autopilot/SKILL.md +6 -6
- package/template/.claude/skills/brainstorm/SKILL.md +1 -1
- package/template/.claude/skills/brief/SKILL.md +1 -1
- package/template/.claude/skills/check/SKILL.md +68 -0
- package/template/.claude/skills/codebase-design/SKILL.md +2 -2
- package/template/.claude/skills/commit/SKILL.md +1 -1
- package/template/.claude/skills/complete/SKILL.md +73 -0
- package/template/.claude/skills/debug/SKILL.md +2 -2
- package/template/.claude/skills/devflow/SKILL.md +89 -80
- package/template/.claude/skills/doctor/SKILL.md +1 -1
- package/template/.claude/skills/feature/SKILL.md +103 -0
- package/template/.claude/skills/fix/SKILL.md +102 -0
- package/template/.claude/skills/followup/SKILL.md +5 -5
- package/template/.claude/skills/help/SKILL.md +4 -4
- package/template/.claude/skills/idea/SKILL.md +57 -0
- package/template/.claude/skills/implement/SKILL.md +64 -0
- package/template/.claude/skills/insight/SKILL.md +1 -1
- package/template/.claude/skills/overview/SKILL.md +114 -0
- package/template/.claude/skills/pr/SKILL.md +1 -1
- package/template/.claude/skills/preview/SKILL.md +1 -1
- package/template/.claude/skills/report-html/SKILL.md +45 -0
- package/template/.claude/skills/review/SKILL.md +1 -1
- package/template/.claude/skills/rollback/SKILL.md +3 -3
- package/template/.claude/skills/security-review/SKILL.md +2 -2
- package/template/.claude/skills/simplify/SKILL.md +1 -1
- package/template/.claude/skills/spec/SKILL.md +38 -0
- package/template/.claude/skills/test/SKILL.md +2 -2
- package/template/.claude/skills/try/SKILL.md +2 -2
- package/template/AGENTS.md +72 -74
- package/template/devflow/context/ai-interaction.md +3 -2
- package/template/devflow/context/coding-standards.md +31 -18
- package/template/devflow/context/current-stage.md +4 -3
- package/template/devflow/context/findings.md +10 -6
- package/template/devflow/context/project-overview.md +33 -11
- package/template/devflow/discoveries/.gitkeep +0 -0
- package/template/devflow/history/HISTORY.md +6 -0
- package/template/devflow/ideas.md +15 -0
- package/template/devflow/reference/running-id-contract.md +2 -2
- package/template/devflow/runs/.gitkeep +0 -0
- package/bin/create-nexus-devflow.js +0 -287
- package/lib/starter-templates.js +0 -111
- package/lib/update.js +0 -393
- 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.
|
|
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
|
-
"
|
|
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": "
|
|
36
|
-
"
|
|
37
|
-
"
|
|
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
|
-
"
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
195
|
+
- Related commands: `20-spec`, `Research`, `Agent`, `40-execute`
|
|
196
196
|
|
|
197
197
|
## Next Workflow Recommendation
|
|
198
198
|
|
|
199
|
-
- **Primary**: `40-
|
|
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.
|