@jakkrichm/create-nexus-devflow 2.17.1 → 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.
Files changed (64) hide show
  1. package/dist/bin/create-nexus-devflow.d.ts +1 -1
  2. package/dist/bin/create-nexus-devflow.js +3 -74
  3. package/dist/bin/create-nexus-devflow.js.map +1 -1
  4. package/dist/lib/doctor.js +1 -2
  5. package/dist/lib/doctor.js.map +1 -1
  6. package/dist/lib/project-config.js +1 -2
  7. package/dist/lib/project-config.js.map +1 -1
  8. package/dist/lib/tooling/commands/summarize-run-status.js +1 -3
  9. package/dist/lib/tooling/commands/summarize-run-status.js.map +1 -1
  10. package/dist/lib/tooling/registry.js +0 -2
  11. package/dist/lib/tooling/registry.js.map +1 -1
  12. package/dist/lib/update.d.ts +3 -13
  13. package/dist/lib/update.js +1 -66
  14. package/dist/lib/update.js.map +1 -1
  15. package/dist/scripts/prepare-template.js +15 -75
  16. package/dist/scripts/prepare-template.js.map +1 -1
  17. package/package.json +1 -1
  18. package/template/AGENTS.md +9 -10
  19. package/template/devflow/{30-planning/build-plan.md → build-plan.md} +2 -9
  20. package/template/devflow/config.json +0 -1
  21. package/dist/lib/tooling/commands/migrate-structure.d.ts +0 -8
  22. package/dist/lib/tooling/commands/migrate-structure.js +0 -200
  23. package/dist/lib/tooling/commands/migrate-structure.js.map +0 -1
  24. package/dist/lib/workspace-paths.d.ts +0 -16
  25. package/dist/lib/workspace-paths.js +0 -85
  26. package/dist/lib/workspace-paths.js.map +0 -1
  27. package/template/devflow/40-tasks/.gitkeep +0 -0
  28. package/template/devflow/40-tasks/README.md +0 -11
  29. package/template/devflow/60-docs/migration-guide-decade-numbered.md +0 -93
  30. /package/template/devflow/{00-context → context}/ai-interaction.md +0 -0
  31. /package/template/devflow/{00-context → context}/coding-standards.md +0 -0
  32. /package/template/devflow/{00-context → context}/glossary.md +0 -0
  33. /package/template/devflow/{00-context → context}/project-overview.md +0 -0
  34. /package/template/devflow/{20-discovery/decisions → decisions}/.gitkeep +0 -0
  35. /package/template/devflow/{20-discovery/decisions → decisions}/README.md +0 -0
  36. /package/template/devflow/{20-discovery/discoveries → discoveries}/.gitkeep +0 -0
  37. /package/template/devflow/{60-docs → docs}/USAGE.md +0 -0
  38. /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-architecture.html +0 -0
  39. /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-architecture.json +0 -0
  40. /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-lifecycle.html +0 -0
  41. /package/template/devflow/{60-docs → docs}/diagrams/nexus-devflow-lifecycle.json +0 -0
  42. /package/template/devflow/{60-docs → docs}/examples/living-spec/adr.example.md +0 -0
  43. /package/template/devflow/{60-docs → docs}/examples/living-spec/current-feature.example.md +0 -0
  44. /package/template/devflow/{60-docs → docs}/examples/living-spec/discovery.example.md +0 -0
  45. /package/template/devflow/{60-docs → docs}/examples/living-spec/ideas.example.md +0 -0
  46. /package/template/devflow/{60-docs → docs}/governance-rules.md +0 -0
  47. /package/template/devflow/{60-docs → docs}/manual-review-workflow-spec.md +0 -0
  48. /package/template/devflow/{60-docs → docs}/markdown-metadata-contract.md +0 -0
  49. /package/template/devflow/{60-docs → docs}/quickstart.md +0 -0
  50. /package/template/devflow/{60-docs → docs}/release-process.md +0 -0
  51. /package/template/devflow/{60-docs → docs}/skill-selection-policy.md +0 -0
  52. /package/template/devflow/{60-docs → docs}/workflow-surface-map.md +0 -0
  53. /package/template/devflow/{50-history → history}/HISTORY.md +0 -0
  54. /package/template/devflow/{50-history → history}/features/README.md +0 -0
  55. /package/template/devflow/{50-history → history}/fixes/README.md +0 -0
  56. /package/template/devflow/{50-history → history}/rollbacks/README.md +0 -0
  57. /package/template/devflow/{10-ideation/ideas.md → ideas.md} +0 -0
  58. /package/template/devflow/{30-planning/project-plan.md → project-plan.md} +0 -0
  59. /package/template/devflow/{10-ideation/reference → reference}/build-plan-template.md +0 -0
  60. /package/template/devflow/{10-ideation/reference → reference}/feature-spec-template.md +0 -0
  61. /package/template/devflow/{10-ideation/reference → reference}/mockup.html +0 -0
  62. /package/template/devflow/{10-ideation/reference → reference}/project-overview-template.md +0 -0
  63. /package/template/devflow/{10-ideation/reference → reference}/project-plan-template.md +0 -0
  64. /package/template/devflow/{10-ideation/reference → reference}/running-id-contract.md +0 -0
@@ -1,200 +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
- referenceDir: "devflow/10-ideation/reference",
162
- discoveriesDir: "devflow/20-discovery/discoveries",
163
- decisionsDir: "devflow/20-discovery/decisions"
164
- };
165
- delete manifest.workspace.runsDir;
166
- await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
167
- moved.push(`${manifestPath} (updated workspace paths)`);
168
- }
169
- }
170
- catch (err) {
171
- warnings.push(`Could not update manifest: ${err.message}`);
172
- }
173
- }
174
- return {
175
- success: true,
176
- moved,
177
- warnings
178
- };
179
- }
180
- export const migrateStructureCommand = {
181
- name: "migrate-structure",
182
- description: "Migrate legacy devflow folder structure to Decade-Numbered layout (00-context, 10-ideation, etc.)",
183
- async run(args, options) {
184
- const projectRoot = options?.projectRoot || options?.cwd || process.cwd();
185
- const result = await migrateDevflowStructure(projectRoot);
186
- if (!result.success) {
187
- return {
188
- ok: false,
189
- message: result.warnings.join("\n") || "Migration failed",
190
- data: result
191
- };
192
- }
193
- return {
194
- ok: true,
195
- message: `Successfully migrated devflow structure (${result.moved.length} items processed)`,
196
- data: result
197
- };
198
- }
199
- };
200
- //# 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,16 +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 hasLegacyDevflowStructure(projectRoot: string): Promise<boolean>;
16
- export declare function resolveWorkspacePaths(projectRoot: string): Promise<WorkspacePaths>;
@@ -1,85 +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 hasLegacyDevflowStructure(projectRoot) {
35
- const devflowDir = path.join(projectRoot, "devflow");
36
- const legacyPaths = [
37
- path.join(devflowDir, "context"),
38
- path.join(devflowDir, "discoveries"),
39
- path.join(devflowDir, "history"),
40
- path.join(devflowDir, "docs"),
41
- path.join(devflowDir, "reference"),
42
- path.join(devflowDir, "runs"),
43
- path.join(devflowDir, "ideas.md"),
44
- path.join(devflowDir, "project-plan.md"),
45
- path.join(devflowDir, "build-plan.md")
46
- ];
47
- for (const p of legacyPaths) {
48
- try {
49
- await fs.stat(p);
50
- return true;
51
- }
52
- catch {
53
- // continue
54
- }
55
- }
56
- return false;
57
- }
58
- export async function resolveWorkspacePaths(projectRoot) {
59
- // 1. Check manifest for custom workspace configuration
60
- try {
61
- const manifestPath = path.join(projectRoot, ".nexus", "nexus-devflow.json");
62
- const content = await fs.readFile(manifestPath, "utf8");
63
- const manifest = JSON.parse(content.replace(/^\uFEFF/, ""));
64
- if (manifest && typeof manifest === "object" && manifest.workspace) {
65
- const isDecade = Boolean(manifest.workspace.contextDir?.includes("00-context") ||
66
- (await isDecadeNumberedLayout(projectRoot)));
67
- const base = isDecade ? DECADE_NUMBERED_WORKSPACE_PATHS : LEGACY_WORKSPACE_PATHS;
68
- return {
69
- ...base,
70
- ...manifest.workspace,
71
- isDecadeNumbered: isDecade
72
- };
73
- }
74
- }
75
- catch {
76
- // Fall through to auto-detection
77
- }
78
- // 2. Physical directory inspection
79
- if (await isDecadeNumberedLayout(projectRoot)) {
80
- return { ...DECADE_NUMBERED_WORKSPACE_PATHS };
81
- }
82
- // 3. Fallback to legacy flat layout
83
- return { ...LEGACY_WORKSPACE_PATHS };
84
- }
85
- //# sourceMappingURL=workspace-paths.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace-paths.js","sourceRoot":"","sources":["../../lib/workspace-paths.ts"],"names":[],"mappings":"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"}
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.
@@ -1,93 +0,0 @@
1
- # คู่มือการย้ายโครงสร้างโฟลเดอร์สู่ Decade-Numbered Stages (Migration Guide)
2
-
3
- > **DevFlow Version**: 2.16.5+
4
- > **Topic**: การจัดระเบียบโฟลเดอร์ `devflow/` ตามลำดับขั้นตอนด้วย Decade-Numbered Stages และการอัปเกรดจากโครงสร้างเดิม
5
-
6
- ---
7
-
8
- ## 🌟 1. สถาปัตยกรรมโฟลเดอร์ Decade-Numbered Stages
9
-
10
- เพื่อแก้ปัญหาโฟลเดอร์ใน `devflow/` กระจัดกระจายและไม่มีตัวเลขจัดเรียงสายตาใน IDE ทาง DevFlow ได้แนะนำโครงสร้าง **Decade-Numbered Stages Structure** (`00-`, `10-`, `20-`, ...) ที่ช่วยให้ทั้งผู้ใช้งานและ AI Agent ไล่ลำดับขั้นตอนการพัฒนาได้อย่างเป็นธรรมชาติ:
11
-
12
- ```text
13
- devflow/
14
- ├── config.json # Root configuration
15
- ├── .state/ # Runtime state (run.json - Git ignored)
16
- ├── .vendor/ # External vendor skills (bughunter, ponytail, ฯลฯ)
17
- │
18
- ├── 00-context/ # [Foundation & Source of Truth]
19
- │ ├── project-overview.md # Living overview (สถาปัตยกรรม & tech stack ล่าสุด)
20
- │ ├── coding-standards.md # กฎระเบียบและมาตรฐานการเขียนโค้ด
21
- │ ├── ai-interaction.md # ข้อกำหนดการทำงานร่วมกับ AI Agent
22
- │ └── glossary.md # พจนานุกรมศัพท์เฉพาะของระบบ
23
- │
24
- ├── 10-ideation/ # [Input & Reference Ingestion]
25
- │ ├── ideas.md # บันทึกไอเดียใหม่ (Idea Inbox)
26
- │ ├── inbox/ # ไฟล์ดิบจากภายนอก (PDF, Excel, Word, ภาพ)
27
- │ └── reference/ # เอกสารที่แปลงเป็น Markdown สะอาดพร้อมใช้งาน
28
- │
29
- ├── 20-discovery/ # [Analysis, Exploration & Architecture]
30
- │ ├── analysis/ # ผลการวิเคราะห์ System Analyst (/analyze)
31
- │ ├── discoveries/ # Pre-flight Spikes & Research (/discovery)
32
- │ ├── decisions/ # บันทึกการตัดสินใจ ADRs (/grill)
33
- │ ├── research/ # เอกสารวิจัยเชิงลึกและ Benchmark
34
- │ ├── 21-prototype/ # (Optional: Static UI mockups / prototype)
35
- │ └── 22-diagrams/ # (Optional: System & Architecture Diagrams)
36
- │
37
- ├── 30-planning/ # [Roadmap & Master Plans]
38
- │ ├── project-plan.md # Master Roadmap & Milestones
39
- │ └── build-plan.md # Master Delivery Checklist
40
- │
41
- ├── 40-tasks/ # [Active Living Spec Workspaces]
42
- │ └── {xxx-slug}/ # Active task workspace (สร้างตอนทำฟีเจอร์/แก้บั๊ก)
43
- │ ├── spec.md # Task-Isolated Living Spec
44
- │ ├── stage.md # ตัวชี้สถานะ Stage
45
- │ ├── findings.md # บันทึกบั๊ก/Audit ประจำงาน
46
- │ └── tickets/ # Tracer-bullet tickets ย่อย
47
- │
48
- ├── 50-history/ # [Shipped & Delivered Archives]
49
- │ ├── HISTORY.md # Release Ledger สรุปภาพรวมประวัติ
50
- │ ├── features/ # ฟีเจอร์ที่ส่งมอบแล้ว
51
- │ ├── fixes/ # บั๊กที่แก้แล้ว
52
- │ └── rollbacks/ # ฟีเจอร์ที่ถูก rollback
53
- │
54
- └── 60-docs/ # [Documentation & System Playbooks]
55
- └── playbooks/ # Interactive HTML Playbooks (5W1H)
56
- ```
57
-
58
- ---
59
-
60
- ## ⚡ 2. จุดเด่นของการใช้เลขทศวรรษ (Decade Convention: `00-`, `10-`, `20-`)
61
-
62
- 1. **ลำดับสายตาใน Editor สวยงาม**: เรียงตามลำดับความก้าวหน้าของโครงการ
63
- 2. **ขยาย Sub-stages ในอนาคตได้ง่าย (Future-Proof)**: สามารถสร้างโฟลเดอร์แทรก เช่น `21-prototype`, `22-diagrams` ได้โดยไม่ต้องแก้เลขนำหน้าของโฟลเดอร์อื่น
64
- 3. **ตัดโฟลเดอร์ Legacy ออก 100%**: ลบโฟลเดอร์ `devflow/runs/` ที่ไม่ได้ใช้งานตั้งแต่ v1.x ออกอย่างปลอดภัย
65
-
66
- ---
67
-
68
- ## 🚀 3. วิธีการ Migrate อัตโนมัติ
69
-
70
- ### 1) รันอัตโนมัติผ่านคำสั่ง `update` (แนะนำที่สุด):
71
- เมื่อโปรเจกต์ Client สั่งอัปเดตเวอร์ชัน DevFlow ด้วยคำสั่ง:
72
- ```bash
73
- npx nexus-devflow update
74
- ```
75
- ระบบจะตรวจจับโครงสร้างโฟลเดอร์อัตโนมัติ:
76
- * **หากยังเป็นโครงสร้างเดิม (Legacy)**: ระบบจะรันกระบวนการ `migrate-structure` ให้อัตโนมัติทันที พร้อมย้ายไฟล์เข้า `00-`, `10-`, `20-`, `30-`, `40-`, `50-`, `60-` และลบ `devflow/runs/`
77
- * **หากเป็นโครงสร้าง Decade-Numbered อยู่แล้ว**: ระบบจะไม่ทำอะไรกับโฟลเดอร์ (No-op) และดำเนินการอัปเดตโค้ดต่อไปอย่างปลอดภัย
78
-
79
- ### 2) สั่ง Migrate ด้วยตัวเองโดยตรง:
80
- หากต้องการย้ายโครงสร้างทันทีโดยไม่อัปเดตส่วนอื่น สามารถสั่งได้ผ่านคำสั่ง:
81
- ```bash
82
- npx nexus-devflow migrate-structure
83
- ```
84
-
85
-
86
- ---
87
-
88
- ## 🛡️ 4. การรองรับ Client เวอร์ชันเก่า (Zero-Breaking Compatibility)
89
-
90
- ระบบ DevFlow มีกลไก **Dynamic Workspace Path Resolver** (`resolveWorkspacePaths`) ที่จะ:
91
- 1. ตรวจสอบว่าโปรเจกต์ใช้โครงสร้าง Decade-Numbered หรือไม่ (มี `devflow/00-context` หรือไม่)
92
- 2. หากไม่พบ จะ **Fallback กลับไปหา Path เดิม (`devflow/context/`, `devflow/history/`) อัตโนมัติ 100%**
93
- 3. โปรเจกต์เก่าที่ยังไม่ได้ Migrate จึงยังคงรันคำสั่งสถานะ, ตรวจสอบคุณภาพ, และบิวด์ได้ตามปกติโดยไม่มีข้อผิดพลาด
File without changes