@jakkrichm/create-nexus-devflow 2.17.0 → 2.17.2
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/dist/bin/create-nexus-devflow.d.ts +1 -1
- package/dist/bin/create-nexus-devflow.js +0 -37
- package/dist/bin/create-nexus-devflow.js.map +1 -1
- package/dist/lib/tooling/commands/summarize-run-status.js +1 -3
- package/dist/lib/tooling/commands/summarize-run-status.js.map +1 -1
- package/dist/lib/tooling/registry.js +0 -2
- package/dist/lib/tooling/registry.js.map +1 -1
- package/dist/lib/update.d.ts +3 -8
- package/dist/lib/update.js.map +1 -1
- package/dist/scripts/prepare-template.js +15 -75
- package/dist/scripts/prepare-template.js.map +1 -1
- package/package.json +1 -1
- package/template/AGENTS.md +9 -10
- package/template/devflow/{30-planning/build-plan.md → build-plan.md} +2 -9
- package/dist/lib/tooling/commands/migrate-structure.d.ts +0 -8
- package/dist/lib/tooling/commands/migrate-structure.js +0 -197
- package/dist/lib/tooling/commands/migrate-structure.js.map +0 -1
- package/dist/lib/workspace-paths.d.ts +0 -15
- package/dist/lib/workspace-paths.js +0 -61
- package/dist/lib/workspace-paths.js.map +0 -1
- package/template/devflow/40-tasks/.gitkeep +0 -0
- package/template/devflow/40-tasks/README.md +0 -11
- package/template/devflow/60-docs/migration-guide-decade-numbered.md +0 -93
- /package/template/devflow/{00-context → context}/ai-interaction.md +0 -0
- /package/template/devflow/{00-context → context}/coding-standards.md +0 -0
- /package/template/devflow/{00-context → context}/glossary.md +0 -0
- /package/template/devflow/{00-context → context}/project-overview.md +0 -0
- /package/template/devflow/{20-discovery/decisions → decisions}/.gitkeep +0 -0
- /package/template/devflow/{20-discovery/decisions → decisions}/README.md +0 -0
- /package/template/devflow/{20-discovery/discoveries → discoveries}/.gitkeep +0 -0
- /package/template/devflow/{60-docs → docs}/USAGE.md +0 -0
- /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-architecture.html +0 -0
- /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-architecture.json +0 -0
- /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-lifecycle.html +0 -0
- /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-lifecycle.json +0 -0
- /package/template/devflow/{60-docs → docs}/examples/living-spec/adr.example.md +0 -0
- /package/template/devflow/{60-docs → docs}/examples/living-spec/current-feature.example.md +0 -0
- /package/template/devflow/{60-docs → docs}/examples/living-spec/discovery.example.md +0 -0
- /package/template/devflow/{60-docs → docs}/examples/living-spec/ideas.example.md +0 -0
- /package/template/devflow/{60-docs → docs}/governance-rules.md +0 -0
- /package/template/devflow/{60-docs → docs}/manual-review-workflow-spec.md +0 -0
- /package/template/devflow/{60-docs → docs}/markdown-metadata-contract.md +0 -0
- /package/template/devflow/{60-docs → docs}/quickstart.md +0 -0
- /package/template/devflow/{60-docs → docs}/release-process.md +0 -0
- /package/template/devflow/{60-docs → docs}/skill-selection-policy.md +0 -0
- /package/template/devflow/{60-docs → docs}/workflow-surface-map.md +0 -0
- /package/template/devflow/{50-history → history}/HISTORY.md +0 -0
- /package/template/devflow/{50-history → history}/features/README.md +0 -0
- /package/template/devflow/{50-history → history}/fixes/README.md +0 -0
- /package/template/devflow/{50-history → history}/rollbacks/README.md +0 -0
- /package/template/devflow/{10-ideation/ideas.md → ideas.md} +0 -0
- /package/template/devflow/{30-planning/project-plan.md → project-plan.md} +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/build-plan-template.md +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/feature-spec-template.md +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/mockup.html +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/project-overview-template.md +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/project-plan-template.md +0 -0
- /package/template/devflow/{10-ideation/reference → reference}/running-id-contract.md +0 -0
|
@@ -66,41 +66,6 @@ async function copyEntry(entry, inventory) {
|
|
|
66
66
|
!normalized.endsWith("README.md")) {
|
|
67
67
|
return false;
|
|
68
68
|
}
|
|
69
|
-
if (normalized.startsWith("devflow/00-context/") &&
|
|
70
|
-
normalized !== "devflow/00-context" &&
|
|
71
|
-
normalized !== "devflow/00-context/project-overview.md" &&
|
|
72
|
-
normalized !== "devflow/00-context/coding-standards.md" &&
|
|
73
|
-
normalized !== "devflow/00-context/ai-interaction.md" &&
|
|
74
|
-
normalized !== "devflow/00-context/glossary.md") {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
if (normalized.startsWith("devflow/40-tasks/") &&
|
|
78
|
-
!normalized.endsWith(".gitkeep") &&
|
|
79
|
-
!normalized.endsWith("README.md")) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
if (normalized.startsWith("devflow/50-history/features/") &&
|
|
83
|
-
!normalized.endsWith("README.md")) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
if (normalized.startsWith("devflow/50-history/fixes/") &&
|
|
87
|
-
!normalized.endsWith("README.md")) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
if (normalized.startsWith("devflow/50-history/rollbacks/") &&
|
|
91
|
-
!normalized.endsWith("README.md")) {
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
if (normalized.startsWith("devflow/20-discovery/discoveries/") &&
|
|
95
|
-
!normalized.endsWith(".gitkeep") &&
|
|
96
|
-
!normalized.endsWith("README.md")) {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
if (normalized.startsWith("devflow/20-discovery/decisions/") &&
|
|
100
|
-
!normalized.endsWith(".gitkeep") &&
|
|
101
|
-
!normalized.endsWith("README.md")) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
69
|
if (matchesPrefix(normalized, "devflow/inbox") ||
|
|
105
70
|
matchesPrefix(normalized, "devflow/analysis") ||
|
|
106
71
|
matchesPrefix(normalized, "devflow/scratch") ||
|
|
@@ -112,17 +77,6 @@ async function copyEntry(entry, inventory) {
|
|
|
112
77
|
matchesPrefix(normalized, "devflow/reports") ||
|
|
113
78
|
matchesPrefix(normalized, "devflow/docs/playbooks") ||
|
|
114
79
|
matchesPrefix(normalized, "devflow/research") ||
|
|
115
|
-
matchesPrefix(normalized, "devflow/10-ideation/inbox") ||
|
|
116
|
-
matchesPrefix(normalized, "devflow/10-ideation/scratch") ||
|
|
117
|
-
matchesPrefix(normalized, "devflow/10-ideation/brainstorm") ||
|
|
118
|
-
matchesPrefix(normalized, "devflow/10-ideation/brainstorms") ||
|
|
119
|
-
matchesPrefix(normalized, "devflow/20-discovery/analysis") ||
|
|
120
|
-
matchesPrefix(normalized, "devflow/20-discovery/reports") ||
|
|
121
|
-
matchesPrefix(normalized, "devflow/20-discovery/research") ||
|
|
122
|
-
matchesPrefix(normalized, "devflow/20-discovery/scratch") ||
|
|
123
|
-
matchesPrefix(normalized, "devflow/20-discovery/brainstorm") ||
|
|
124
|
-
matchesPrefix(normalized, "devflow/20-discovery/brainstorms") ||
|
|
125
|
-
matchesPrefix(normalized, "devflow/60-docs/playbooks") ||
|
|
126
80
|
matchesPrefix(normalized, "prototypes") ||
|
|
127
81
|
matchesPrefix(normalized, "evals") ||
|
|
128
82
|
matchesPrefix(normalized, ".nexus")) {
|
|
@@ -146,26 +100,18 @@ async function copyEntry(entry, inventory) {
|
|
|
146
100
|
}
|
|
147
101
|
}
|
|
148
102
|
async function ensureEmptyDirectories() {
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
path.join(templateRoot, "devflow", "60-docs")
|
|
162
|
-
];
|
|
163
|
-
for (const dir of dirs) {
|
|
164
|
-
await fs.mkdir(dir, { recursive: true });
|
|
165
|
-
}
|
|
166
|
-
await fs.writeFile(path.join(templateRoot, "devflow", "20-discovery", "discoveries", ".gitkeep"), "", "utf8");
|
|
167
|
-
await fs.writeFile(path.join(templateRoot, "devflow", "20-discovery", "decisions", ".gitkeep"), "", "utf8");
|
|
168
|
-
await fs.writeFile(path.join(templateRoot, "devflow", "40-tasks", ".gitkeep"), "", "utf8");
|
|
103
|
+
const discDir = path.join(templateRoot, "devflow", "discoveries");
|
|
104
|
+
const decDir = path.join(templateRoot, "devflow", "decisions");
|
|
105
|
+
const featDir = path.join(templateRoot, "devflow", "history", "features");
|
|
106
|
+
const fixDir = path.join(templateRoot, "devflow", "history", "fixes");
|
|
107
|
+
const rollDir = path.join(templateRoot, "devflow", "history", "rollbacks");
|
|
108
|
+
await fs.mkdir(discDir, { recursive: true });
|
|
109
|
+
await fs.mkdir(decDir, { recursive: true });
|
|
110
|
+
await fs.mkdir(featDir, { recursive: true });
|
|
111
|
+
await fs.mkdir(fixDir, { recursive: true });
|
|
112
|
+
await fs.mkdir(rollDir, { recursive: true });
|
|
113
|
+
await fs.writeFile(path.join(discDir, ".gitkeep"), "", "utf8");
|
|
114
|
+
await fs.writeFile(path.join(decDir, ".gitkeep"), "", "utf8");
|
|
169
115
|
}
|
|
170
116
|
async function sanitizeStarterFiles() {
|
|
171
117
|
// 1. Sanitize AGENTS.md
|
|
@@ -208,9 +154,7 @@ This master ledger tracks all released delivery runs, milestones, and rollbacks
|
|
|
208
154
|
- **\`fixes/\`**: Bug fixes, hotfixes, regressions, security patches, and performance optimizations.
|
|
209
155
|
- **\`rollbacks/\`**: Safe feature reversal and rollback execution records.
|
|
210
156
|
`;
|
|
211
|
-
|
|
212
|
-
await fs.mkdir(path.dirname(historyPath), { recursive: true });
|
|
213
|
-
await fs.writeFile(historyPath, starterHistory, "utf8");
|
|
157
|
+
await fs.writeFile(path.join(templateRoot, "devflow", "history", "HISTORY.md"), starterHistory, "utf8");
|
|
214
158
|
// 3. Clean Starter ideas.md
|
|
215
159
|
const starterIdeas = `# 🔮 Centralized Idea Inbox & Backlog
|
|
216
160
|
|
|
@@ -232,9 +176,7 @@ This master ledger tracks all released delivery runs, milestones, and rollbacks
|
|
|
232
176
|
| ID | Title | Shipped In | Completed Date |
|
|
233
177
|
| :--- | :--- | :--- | :--- |
|
|
234
178
|
`;
|
|
235
|
-
|
|
236
|
-
await fs.mkdir(path.dirname(ideasPath), { recursive: true });
|
|
237
|
-
await fs.writeFile(ideasPath, starterIdeas, "utf8");
|
|
179
|
+
await fs.writeFile(path.join(templateRoot, "devflow", "ideas.md"), starterIdeas, "utf8");
|
|
238
180
|
// 4. Clean Starter project-overview.md
|
|
239
181
|
const starterOverview = `# Project Overview & Source of Truth
|
|
240
182
|
|
|
@@ -264,9 +206,7 @@ This master ledger tracks all released delivery runs, milestones, and rollbacks
|
|
|
264
206
|
## 7. Known Architectural Focus Areas
|
|
265
207
|
- Upcoming priorities, refactoring targets, or known technical considerations.
|
|
266
208
|
`;
|
|
267
|
-
|
|
268
|
-
await fs.mkdir(path.dirname(overviewPath), { recursive: true });
|
|
269
|
-
await fs.writeFile(overviewPath, starterOverview, "utf8");
|
|
209
|
+
await fs.writeFile(path.join(templateRoot, "devflow", "context", "project-overview.md"), starterOverview, "utf8");
|
|
270
210
|
}
|
|
271
211
|
async function main() {
|
|
272
212
|
const inventory = await loadCoreSkillInventory(path.join(repoRoot, "agent-bundle.manifest.json"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-template.js","sourceRoot":"","sources":["../../scripts/prepare-template.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prepare-template.js","sourceRoot":"","sources":["../../scripts/prepare-template.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/template/AGENTS.md
CHANGED
|
@@ -5,21 +5,20 @@ Instructions for AI coding agents working in this project. This is the cross-too
|
|
|
5
5
|
## What this is
|
|
6
6
|
|
|
7
7
|
This project uses **Nexus-DevFlow**, an agentic workflow layer supporting **The 3-Pillars Workspace Architecture & Pure Task-Isolated Living Spec Model**:
|
|
8
|
-
1. **🔮 Future (Backlog)**: `devflow/ideas.md`, `devflow/project-plan.md`, `devflow/build-plan.md`
|
|
9
|
-
2. **⚡ Present (Active Context)**: `devflow/context/`
|
|
10
|
-
3. **📦 Past (History Archive)**: `devflow/history/`
|
|
8
|
+
1. **🔮 Future (Backlog)**: `devflow/ideas.md`, `devflow/project-plan.md`, `devflow/build-plan.md` — Centralized Idea Inbox & Master Build Plan.
|
|
9
|
+
2. **⚡ Present (Active Context)**: `devflow/context/` — Global Shared Source of Truth (`project-overview.md`, `coding-standards.md`, `ai-interaction.md`, `glossary.md`) & Active Task Workspaces (`devflow/context/{xxx-slug}/`).
|
|
10
|
+
3. **📦 Past (History Archive)**: `devflow/history/` — Categorized delivery archives (`features/`, `fixes/`, `rollbacks/`, and `HISTORY.md`).
|
|
11
11
|
|
|
12
|
-
To start a new project, scaffold the application first in an empty folder, then run `npx nexus-devflow` (or `npm create @jakkrichm/nexus-devflow`) to overlay DevFlow onto your codebase.
|
|
12
|
+
To start a new project, scaffold the application first in an empty folder, then run `npx nexus-devflow` (or `npm create @jakkrichm/nexus-devflow`) to overlay DevFlow onto your codebase.
|
|
13
13
|
|
|
14
14
|
## Read these for full context
|
|
15
15
|
|
|
16
16
|
- `devflow/config.json` - deterministic project workflow settings
|
|
17
|
-
- `devflow/
|
|
18
|
-
- `devflow/
|
|
19
|
-
- `devflow/
|
|
20
|
-
- `devflow/
|
|
21
|
-
- `devflow/
|
|
22
|
-
|
|
17
|
+
- `devflow/context/project-overview.md` - the project's source of truth
|
|
18
|
+
- `devflow/context/coding-standards.md` - engineering conventions & rules to follow
|
|
19
|
+
- `devflow/context/ai-interaction.md` - how to interact with the user on this project
|
|
20
|
+
- `devflow/context/glossary.md` - domain terms & architecture definitions
|
|
21
|
+
- `devflow/context/{xxx-slug}/` - active task living spec, stage, findings ledger, and independent review receipt
|
|
23
22
|
|
|
24
23
|
## Project configuration
|
|
25
24
|
|
|
@@ -285,18 +285,11 @@
|
|
|
285
285
|
- *Dependencies*: Feature 28 (`073`), DISC-20260911-001
|
|
286
286
|
- *Scope*: นำเข้า 5 เสาหลักความปลอดภัยและความแม่นยำจาก AI Blueprint v1.6.1: (1) ปฏิเสธ Symlink paths และตรวจ type compatibility ในตัวติดตั้ง `create-nexus-devflow`, (2) สร้างสัญญา `completion-recovery.md` พร้อม JSON comment annotation `<!-- devflow:completion ... -->` กู้คืนการส่งมอบงานที่สะดุด, (3) สร้างสัญญา `build-history.md` รองรับการตั้งชื่อ `--build-N` เมื่อ Rebuild ฟีเจอร์ที่เคยถูก Rollback, (4) ขยาย `lib/review.ts` ให้รองรับ `specSnapshot` สำหรับ Local-only spec review, (5) บูรณาการ `classifyWorkEvidence` ใน `project-status-engine.ts` และ `dashboard.ts` ป้องกัน False Ready State เมื่อ verification failed หรือพบ malformed records, (6) ซิงก์สคิลและเอกสารทั้ง `.agents/` และ `.claude/` พร้อม automated tests ผ่าน 100%
|
|
287
287
|
|
|
288
|
+
---
|
|
289
|
+
|
|
288
290
|
## 🔌 Phase 37: AI-Orchestrated Project-Local Vendor Skill Ingestion (`/vendor`)
|
|
289
291
|
|
|
290
292
|
- [x] **37. AI-Orchestrated Project-Local Vendor Skill Ingestion (`DISC-20260911-002`, `087-ai-orchestrated-vendor-skill-ingestion`)** `[Size: M]`
|
|
291
293
|
- *Dependencies*: Feature 33 (`083`), Feature 34 (`084`), DISC-20260911-002
|
|
292
294
|
- *Scope*: พัฒนาคำสั่ง `/vendor` (พร้อม aliases: `skill-add`, `equip`, `ingest`) สำหรับนำเข้า Git repository ลงในระดับโปรเจกต์ `devflow/.vendor/<slug>/`, ให้ AI Agent สำรวจโค้ดและสังเคราะห์ Custom Wrapper Skill ใน `.agents/skills/<slug>/SKILL.md` และ `.claude/skills/<slug>/SKILL.md`, พัฒนากลไก Update Protection ใน `update.ts` เพื่อป้องกันไม่ให้คำสั่งอัปเดต DevFlow ลบ custom skills เหล่านี้, บันทึก metadata ลง `.nexus/nexus-devflow.json`, ปรับปรุง CLI `nexus-devflow skill update all` ให้รองรับการ pull upstream ใน `.vendor/` โดยคงรักษา custom wrapper ที่ AI เขียนไว้, พร้อมเขียน Automated Unit Tests ครอบคลุม 100%
|
|
293
295
|
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## 📂 Phase 38: Decade-Numbered Folder Architecture & Multi-Version Migration Engine
|
|
297
|
-
|
|
298
|
-
- [x] **38. Decade-Numbered Folder Architecture, Legacy Path Resolver & Structure Migration Engine (`REQ-20260911-001`, `088-decade-numbered-folder-architecture`)** `[Size: M]`
|
|
299
|
-
- *Dependencies*: None
|
|
300
|
-
- *Scope*: ปรับสถาปัตยกรรมโฟลเดอร์ของ DevFlow ให้จัดเรียงตาม Decade-Numbered Stages (`00-context`, `10-ideation`, `20-discovery`, `30-planning`, `40-tasks`, `50-history`, `60-docs`), สร้าง Dynamic Path Resolver Engine รองรับ Client เวอร์ชันเก่าแบบ Zero-Breaking Change, พัฒนา CLI Subcommand `nexus-devflow migrate-structure` ทำการย้ายโฟลเดอร์และอัปเดต Manifest/Config อัตโนมัติ, ลบโฟลเดอร์ Legacy `devflow/runs/`, อัปเดตคู่มือ `AGENTS.md`, `CLAUDE.md`, `README.md`, Playbooks และเขียน Automated Tests ครอบคลุม
|
|
301
|
-
|
|
302
|
-
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export interface MigrationResult {
|
|
2
|
-
success: boolean;
|
|
3
|
-
moved: string[];
|
|
4
|
-
warnings: string[];
|
|
5
|
-
}
|
|
6
|
-
export declare function migrateDevflowStructure(projectRoot: string): Promise<MigrationResult>;
|
|
7
|
-
import type { ToolCommand } from "../types.js";
|
|
8
|
-
export declare const migrateStructureCommand: ToolCommand<MigrationResult>;
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
async function pathExists(p) {
|
|
4
|
-
try {
|
|
5
|
-
await fs.stat(p);
|
|
6
|
-
return true;
|
|
7
|
-
}
|
|
8
|
-
catch {
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
async function movePath(src, dest, moved, warnings) {
|
|
13
|
-
if (!(await pathExists(src)))
|
|
14
|
-
return;
|
|
15
|
-
if (path.resolve(src) === path.resolve(dest))
|
|
16
|
-
return;
|
|
17
|
-
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
18
|
-
try {
|
|
19
|
-
await fs.rename(src, dest);
|
|
20
|
-
moved.push(`${src} -> ${dest}`);
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
try {
|
|
24
|
-
const stat = await fs.stat(src);
|
|
25
|
-
if (stat.isDirectory()) {
|
|
26
|
-
await fs.cp(src, dest, { recursive: true });
|
|
27
|
-
await fs.rm(src, { recursive: true, force: true });
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
await fs.copyFile(src, dest);
|
|
31
|
-
await fs.unlink(src);
|
|
32
|
-
}
|
|
33
|
-
moved.push(`${src} -> ${dest}`);
|
|
34
|
-
}
|
|
35
|
-
catch (fallbackErr) {
|
|
36
|
-
warnings.push(`Failed to move ${src} -> ${dest}: ${fallbackErr.message}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export async function migrateDevflowStructure(projectRoot) {
|
|
41
|
-
const moved = [];
|
|
42
|
-
const warnings = [];
|
|
43
|
-
const devflowDir = path.join(projectRoot, "devflow");
|
|
44
|
-
if (!(await pathExists(devflowDir))) {
|
|
45
|
-
return {
|
|
46
|
-
success: false,
|
|
47
|
-
moved: [],
|
|
48
|
-
warnings: ["Directory devflow does not exist"]
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// Ensure target decade directories exist
|
|
52
|
-
const targetDirs = [
|
|
53
|
-
"00-context",
|
|
54
|
-
"10-ideation",
|
|
55
|
-
"20-discovery",
|
|
56
|
-
"30-planning",
|
|
57
|
-
"40-tasks",
|
|
58
|
-
"50-history",
|
|
59
|
-
"60-docs"
|
|
60
|
-
];
|
|
61
|
-
for (const d of targetDirs) {
|
|
62
|
-
await fs.mkdir(path.join(devflowDir, d), { recursive: true });
|
|
63
|
-
}
|
|
64
|
-
// 1. Handle devflow/context/
|
|
65
|
-
const oldContextDir = path.join(devflowDir, "context");
|
|
66
|
-
if (await pathExists(oldContextDir)) {
|
|
67
|
-
const entries = await fs.readdir(oldContextDir, { withFileTypes: true });
|
|
68
|
-
for (const entry of entries) {
|
|
69
|
-
const src = path.join(oldContextDir, entry.name);
|
|
70
|
-
if (entry.isDirectory()) {
|
|
71
|
-
// Active task folder -> devflow/40-tasks/{task-slug}
|
|
72
|
-
const dest = path.join(devflowDir, "40-tasks", entry.name);
|
|
73
|
-
await movePath(src, dest, moved, warnings);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
// Context file -> devflow/00-context/{file}
|
|
77
|
-
const dest = path.join(devflowDir, "00-context", entry.name);
|
|
78
|
-
await movePath(src, dest, moved, warnings);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Remove empty old context dir
|
|
82
|
-
try {
|
|
83
|
-
await fs.rm(oldContextDir, { recursive: true, force: true });
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// ignore
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// 2. Handle 10-ideation (ideas.md, inbox/, reference/)
|
|
90
|
-
await movePath(path.join(devflowDir, "ideas.md"), path.join(devflowDir, "10-ideation", "ideas.md"), moved, warnings);
|
|
91
|
-
await movePath(path.join(devflowDir, "inbox"), path.join(devflowDir, "10-ideation", "inbox"), moved, warnings);
|
|
92
|
-
await movePath(path.join(devflowDir, "reference"), path.join(devflowDir, "10-ideation", "reference"), moved, warnings);
|
|
93
|
-
// 3. Handle 20-discovery (analysis/, discoveries/, decisions/, research/)
|
|
94
|
-
await movePath(path.join(devflowDir, "analysis"), path.join(devflowDir, "20-discovery", "analysis"), moved, warnings);
|
|
95
|
-
await movePath(path.join(devflowDir, "discoveries"), path.join(devflowDir, "20-discovery", "discoveries"), moved, warnings);
|
|
96
|
-
await movePath(path.join(devflowDir, "decisions"), path.join(devflowDir, "20-discovery", "decisions"), moved, warnings);
|
|
97
|
-
await movePath(path.join(devflowDir, "research"), path.join(devflowDir, "20-discovery", "research"), moved, warnings);
|
|
98
|
-
// 4. Handle 30-planning (project-plan.md, build-plan.md)
|
|
99
|
-
await movePath(path.join(devflowDir, "project-plan.md"), path.join(devflowDir, "30-planning", "project-plan.md"), moved, warnings);
|
|
100
|
-
await movePath(path.join(devflowDir, "build-plan.md"), path.join(devflowDir, "30-planning", "build-plan.md"), moved, warnings);
|
|
101
|
-
// 5. Handle 50-history (history/)
|
|
102
|
-
const oldHistoryDir = path.join(devflowDir, "history");
|
|
103
|
-
if (await pathExists(oldHistoryDir)) {
|
|
104
|
-
const historyEntries = await fs.readdir(oldHistoryDir, { withFileTypes: true });
|
|
105
|
-
for (const entry of historyEntries) {
|
|
106
|
-
const src = path.join(oldHistoryDir, entry.name);
|
|
107
|
-
const dest = path.join(devflowDir, "50-history", entry.name);
|
|
108
|
-
await movePath(src, dest, moved, warnings);
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
await fs.rm(oldHistoryDir, { recursive: true, force: true });
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// ignore
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// 6. Handle 60-docs (docs/)
|
|
118
|
-
const oldDocsDir = path.join(devflowDir, "docs");
|
|
119
|
-
if (await pathExists(oldDocsDir)) {
|
|
120
|
-
const docsEntries = await fs.readdir(oldDocsDir, { withFileTypes: true });
|
|
121
|
-
for (const entry of docsEntries) {
|
|
122
|
-
const src = path.join(oldDocsDir, entry.name);
|
|
123
|
-
const dest = path.join(devflowDir, "60-docs", entry.name);
|
|
124
|
-
await movePath(src, dest, moved, warnings);
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
await fs.rm(oldDocsDir, { recursive: true, force: true });
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
// ignore
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// 7. Clean up legacy runs folder
|
|
134
|
-
const oldRunsDir = path.join(devflowDir, "runs");
|
|
135
|
-
if (await pathExists(oldRunsDir)) {
|
|
136
|
-
try {
|
|
137
|
-
await fs.rm(oldRunsDir, { recursive: true, force: true });
|
|
138
|
-
moved.push(`${oldRunsDir} (removed legacy runs folder)`);
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
// ignore
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// 8. Update manifest if present
|
|
145
|
-
const manifestPath = path.join(projectRoot, ".nexus", "nexus-devflow.json");
|
|
146
|
-
if (await pathExists(manifestPath)) {
|
|
147
|
-
try {
|
|
148
|
-
const manifestContent = await fs.readFile(manifestPath, "utf8");
|
|
149
|
-
const manifest = JSON.parse(manifestContent);
|
|
150
|
-
const isAlreadyDecade = manifest.workspace?.contextDir === "devflow/00-context";
|
|
151
|
-
if (!isAlreadyDecade) {
|
|
152
|
-
manifest.workspace = {
|
|
153
|
-
...manifest.workspace,
|
|
154
|
-
contextDir: "devflow/00-context",
|
|
155
|
-
ideationDir: "devflow/10-ideation",
|
|
156
|
-
discoveryDir: "devflow/20-discovery",
|
|
157
|
-
planningDir: "devflow/30-planning",
|
|
158
|
-
tasksDir: "devflow/40-tasks",
|
|
159
|
-
historyDir: "devflow/50-history",
|
|
160
|
-
docsDir: "devflow/60-docs"
|
|
161
|
-
};
|
|
162
|
-
delete manifest.workspace.runsDir;
|
|
163
|
-
await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
|
|
164
|
-
moved.push(`${manifestPath} (updated workspace paths)`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
catch (err) {
|
|
168
|
-
warnings.push(`Could not update manifest: ${err.message}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return {
|
|
172
|
-
success: true,
|
|
173
|
-
moved,
|
|
174
|
-
warnings
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
export const migrateStructureCommand = {
|
|
178
|
-
name: "migrate-structure",
|
|
179
|
-
description: "Migrate legacy devflow folder structure to Decade-Numbered layout (00-context, 10-ideation, etc.)",
|
|
180
|
-
async run(args, options) {
|
|
181
|
-
const projectRoot = options?.projectRoot || options?.cwd || process.cwd();
|
|
182
|
-
const result = await migrateDevflowStructure(projectRoot);
|
|
183
|
-
if (!result.success) {
|
|
184
|
-
return {
|
|
185
|
-
ok: false,
|
|
186
|
-
message: result.warnings.join("\n") || "Migration failed",
|
|
187
|
-
data: result
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
return {
|
|
191
|
-
ok: true,
|
|
192
|
-
message: `Successfully migrated devflow structure (${result.moved.length} items processed)`,
|
|
193
|
-
data: result
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
};
|
|
197
|
-
//# sourceMappingURL=migrate-structure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-structure.js","sourceRoot":"","sources":["../../../../lib/tooling/commands/migrate-structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface WorkspacePaths {
|
|
2
|
-
contextDir: string;
|
|
3
|
-
ideationDir: string;
|
|
4
|
-
discoveryDir: string;
|
|
5
|
-
planningDir: string;
|
|
6
|
-
tasksDir: string;
|
|
7
|
-
historyDir: string;
|
|
8
|
-
docsDir: string;
|
|
9
|
-
referenceDir: string;
|
|
10
|
-
isDecadeNumbered: boolean;
|
|
11
|
-
}
|
|
12
|
-
export declare const LEGACY_WORKSPACE_PATHS: WorkspacePaths;
|
|
13
|
-
export declare const DECADE_NUMBERED_WORKSPACE_PATHS: WorkspacePaths;
|
|
14
|
-
export declare function isDecadeNumberedLayout(projectRoot: string): Promise<boolean>;
|
|
15
|
-
export declare function resolveWorkspacePaths(projectRoot: string): Promise<WorkspacePaths>;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export const LEGACY_WORKSPACE_PATHS = {
|
|
4
|
-
contextDir: "devflow/context",
|
|
5
|
-
ideationDir: "devflow",
|
|
6
|
-
discoveryDir: "devflow/discoveries",
|
|
7
|
-
planningDir: "devflow",
|
|
8
|
-
tasksDir: "devflow/context",
|
|
9
|
-
historyDir: "devflow/history",
|
|
10
|
-
docsDir: "devflow/docs",
|
|
11
|
-
referenceDir: "devflow/reference",
|
|
12
|
-
isDecadeNumbered: false
|
|
13
|
-
};
|
|
14
|
-
export const DECADE_NUMBERED_WORKSPACE_PATHS = {
|
|
15
|
-
contextDir: "devflow/00-context",
|
|
16
|
-
ideationDir: "devflow/10-ideation",
|
|
17
|
-
discoveryDir: "devflow/20-discovery",
|
|
18
|
-
planningDir: "devflow/30-planning",
|
|
19
|
-
tasksDir: "devflow/40-tasks",
|
|
20
|
-
historyDir: "devflow/50-history",
|
|
21
|
-
docsDir: "devflow/60-docs",
|
|
22
|
-
referenceDir: "devflow/10-ideation/reference",
|
|
23
|
-
isDecadeNumbered: true
|
|
24
|
-
};
|
|
25
|
-
export async function isDecadeNumberedLayout(projectRoot) {
|
|
26
|
-
try {
|
|
27
|
-
const stat = await fs.stat(path.join(projectRoot, "devflow", "00-context"));
|
|
28
|
-
return stat.isDirectory();
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export async function resolveWorkspacePaths(projectRoot) {
|
|
35
|
-
// 1. Check manifest for custom workspace configuration
|
|
36
|
-
try {
|
|
37
|
-
const manifestPath = path.join(projectRoot, ".nexus", "nexus-devflow.json");
|
|
38
|
-
const content = await fs.readFile(manifestPath, "utf8");
|
|
39
|
-
const manifest = JSON.parse(content);
|
|
40
|
-
if (manifest && typeof manifest === "object" && manifest.workspace) {
|
|
41
|
-
const isDecade = Boolean(manifest.workspace.contextDir?.includes("00-context") ||
|
|
42
|
-
(await isDecadeNumberedLayout(projectRoot)));
|
|
43
|
-
const base = isDecade ? DECADE_NUMBERED_WORKSPACE_PATHS : LEGACY_WORKSPACE_PATHS;
|
|
44
|
-
return {
|
|
45
|
-
...base,
|
|
46
|
-
...manifest.workspace,
|
|
47
|
-
isDecadeNumbered: isDecade
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// Fall through to auto-detection
|
|
53
|
-
}
|
|
54
|
-
// 2. Physical directory inspection
|
|
55
|
-
if (await isDecadeNumberedLayout(projectRoot)) {
|
|
56
|
-
return { ...DECADE_NUMBERED_WORKSPACE_PATHS };
|
|
57
|
-
}
|
|
58
|
-
// 3. Fallback to legacy flat layout
|
|
59
|
-
return { ...LEGACY_WORKSPACE_PATHS };
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=workspace-paths.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-paths.js","sourceRoot":"","sources":["../../lib/workspace-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAc7B,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,qBAAqB;IACnC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,iBAAiB;IAC7B,OAAO,EAAE,cAAc;IACvB,YAAY,EAAE,mBAAmB;IACjC,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAmB;IAC7D,UAAU,EAAE,oBAAoB;IAChC,WAAW,EAAE,qBAAqB;IAClC,YAAY,EAAE,sBAAsB;IACpC,WAAW,EAAE,qBAAqB;IAClC,QAAQ,EAAE,kBAAkB;IAC5B,UAAU,EAAE,oBAAoB;IAChC,OAAO,EAAE,iBAAiB;IAC1B,YAAY,EAAE,+BAA+B;IAC7C,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IAC9D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,OAAO,CACtB,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC;gBACrD,CAAC,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAC5C,CAAC;YACF,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,sBAAsB,CAAC;YACjF,OAAO;gBACL,GAAG,IAAI;gBACP,GAAG,QAAQ,CAAC,SAAS;gBACrB,gBAAgB,EAAE,QAAQ;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,GAAG,+BAA+B,EAAE,CAAC;IAChD,CAAC;IAED,oCAAoC;IACpC,OAAO,EAAE,GAAG,sBAAsB,EAAE,CAAC;AACvC,CAAC"}
|
|
File without changes
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# ⚡ 40-tasks: Active Living Spec Workspaces
|
|
2
|
-
|
|
3
|
-
This directory contains active, isolated task workspaces (`{xxx-slug}/`) during development.
|
|
4
|
-
|
|
5
|
-
Each active task folder contains:
|
|
6
|
-
- `spec.md` - Task-isolated living specification and implementation checklist
|
|
7
|
-
- `stage.md` - Lifecycle stage tracker (`defined`, `in-progress`, `checked`, `verified`)
|
|
8
|
-
- `findings.md` - Dedicated findings ledger for audit and verification proof
|
|
9
|
-
- `review.md` - Optional independent review request and receipt
|
|
10
|
-
|
|
11
|
-
When a task is completed via `/complete`, its spec is archived to `devflow/50-history/features/` (or `fixes/`, `rollbacks/`) and the active folder in `40-tasks/` is cleanly removed.
|