@jakkrichm/create-nexus-devflow 2.0.25 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -8
- package/dist/bin/create-nexus-devflow.d.ts +22 -1
- package/dist/bin/create-nexus-devflow.js +658 -11
- package/dist/bin/create-nexus-devflow.js.map +1 -1
- package/dist/lib/branch-context.d.ts +39 -0
- package/dist/lib/branch-context.js +196 -0
- package/dist/lib/branch-context.js.map +1 -0
- package/dist/lib/code-graph.d.ts +30 -0
- package/dist/lib/code-graph.js +209 -0
- package/dist/lib/code-graph.js.map +1 -0
- package/dist/lib/command-catalog.d.ts +11 -0
- package/dist/lib/command-catalog.js +63 -0
- package/dist/lib/command-catalog.js.map +1 -0
- package/dist/lib/context-slicer.d.ts +31 -0
- package/dist/lib/context-slicer.js +234 -0
- package/dist/lib/context-slicer.js.map +1 -0
- package/dist/lib/current-work.js +97 -49
- package/dist/lib/current-work.js.map +1 -1
- package/dist/lib/dashboard-page.d.ts +2 -0
- package/dist/lib/dashboard-page.js +285 -0
- package/dist/lib/dashboard-page.js.map +1 -0
- package/dist/lib/dashboard-snapshot.d.ts +62 -0
- package/dist/lib/dashboard-snapshot.js +114 -0
- package/dist/lib/dashboard-snapshot.js.map +1 -0
- package/dist/lib/dashboard.d.ts +2 -0
- package/dist/lib/dashboard.js +398 -8
- package/dist/lib/dashboard.js.map +1 -1
- package/dist/lib/discoveries.d.ts +19 -0
- package/dist/lib/discoveries.js +81 -0
- package/dist/lib/discoveries.js.map +1 -0
- package/dist/lib/doctor.d.ts +26 -0
- package/dist/lib/doctor.js +474 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/drift-reconciler.d.ts +38 -0
- package/dist/lib/drift-reconciler.js +155 -0
- package/dist/lib/drift-reconciler.js.map +1 -0
- package/dist/lib/findings.d.ts +26 -2
- package/dist/lib/findings.js +165 -1
- package/dist/lib/findings.js.map +1 -1
- package/dist/lib/gatekeeper.d.ts +20 -0
- package/dist/lib/gatekeeper.js +106 -0
- package/dist/lib/gatekeeper.js.map +1 -0
- package/dist/lib/git-hooks.d.ts +16 -0
- package/dist/lib/git-hooks.js +103 -0
- package/dist/lib/git-hooks.js.map +1 -0
- package/dist/lib/history.d.ts +6 -1
- package/dist/lib/history.js +98 -11
- package/dist/lib/history.js.map +1 -1
- package/dist/lib/ide-extension.d.ts +38 -0
- package/dist/lib/ide-extension.js +61 -0
- package/dist/lib/ide-extension.js.map +1 -0
- package/dist/lib/ideas.d.ts +26 -0
- package/dist/lib/ideas.js +179 -0
- package/dist/lib/ideas.js.map +1 -0
- package/dist/lib/mcp.d.ts +36 -0
- package/dist/lib/mcp.js +653 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/status.d.ts +3 -1
- package/dist/lib/status.js +60 -6
- package/dist/lib/status.js.map +1 -1
- package/dist/lib/swarm-orchestrator.d.ts +31 -0
- package/dist/lib/swarm-orchestrator.js +134 -0
- package/dist/lib/swarm-orchestrator.js.map +1 -0
- package/dist/lib/update.js +2 -2
- package/dist/lib/update.js.map +1 -1
- package/dist/lib/version-check.d.ts +22 -0
- package/dist/lib/version-check.js +59 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/lib/webview-studio.d.ts +8 -0
- package/dist/lib/webview-studio.js +463 -0
- package/dist/lib/webview-studio.js.map +1 -0
- package/dist/lib/workflow-state.d.ts +23 -0
- package/dist/lib/workflow-state.js +128 -0
- package/dist/lib/workflow-state.js.map +1 -0
- package/dist/scripts/prepare-template.js +3 -3
- package/package.json +1 -1
- package/template/{.claude/skills/00-discover → .agents/skills/00-explore}/SKILL.md +10 -10
- package/template/.agents/skills/10-define/SKILL.md +4 -4
- package/template/.agents/skills/20-spec/SKILL.md +2 -3
- package/template/.agents/skills/30-plan/SKILL.md +2 -3
- package/template/.agents/skills/40-execute/SKILL.md +2 -2
- package/template/.agents/skills/50-verify/SKILL.md +2 -2
- package/template/.agents/skills/60-report/SKILL.md +3 -3
- package/template/{.claude/skills/70-release → .agents/skills/70-deliver}/SKILL.md +7 -13
- package/template/.agents/skills/adopt/SKILL.md +136 -73
- package/template/.agents/skills/audit/SKILL.md +275 -0
- package/template/.agents/skills/autopilot/SKILL.md +228 -147
- package/template/.agents/skills/brainstorm/SKILL.md +3 -3
- package/template/.agents/skills/brief/SKILL.md +74 -51
- package/template/.agents/skills/check/SKILL.md +96 -76
- package/template/.agents/skills/ci/SKILL.md +140 -61
- package/template/.agents/skills/complete/SKILL.md +156 -101
- package/template/.agents/skills/convert-any-to-md/SKILL.md +2 -2
- package/template/.agents/skills/debug/SKILL.md +124 -49
- package/template/.agents/skills/devflow/SKILL.md +16 -10
- package/template/.agents/skills/discovery/SKILL.md +166 -0
- package/template/.agents/skills/doctor/SKILL.md +188 -72
- package/template/.agents/skills/feature/SKILL.md +195 -102
- package/template/.agents/skills/fix/SKILL.md +41 -90
- package/template/.agents/skills/idea/SKILL.md +3 -3
- package/template/.agents/skills/implement/SKILL.md +189 -46
- package/template/.agents/skills/onboard/SKILL.md +215 -85
- package/template/.agents/skills/overview/SKILL.md +51 -85
- package/template/.agents/skills/prototype/SKILL.md +82 -27
- package/template/.agents/skills/release/SKILL.md +160 -0
- package/template/.agents/skills/report-html/SKILL.md +2 -2
- package/template/.agents/skills/rollback/SKILL.md +123 -77
- package/template/.agents/skills/status/SKILL.md +109 -0
- package/template/.agents/skills/test/SKILL.md +2 -2
- package/template/.agents/skills/tests/SKILL.md +126 -0
- package/template/.agents/skills/try/SKILL.md +77 -65
- package/template/{.agents/skills/00-discover → .claude/skills/00-explore}/SKILL.md +9 -9
- package/template/.claude/skills/10-define/SKILL.md +2 -2
- package/template/.claude/skills/20-spec/SKILL.md +1 -1
- package/template/.claude/skills/30-plan/SKILL.md +1 -1
- package/template/.claude/skills/60-report/SKILL.md +1 -1
- package/template/{.agents/skills/70-release → .claude/skills/70-deliver}/SKILL.md +6 -12
- package/template/.claude/skills/adopt/SKILL.md +2 -2
- package/template/.claude/skills/audit/SKILL.md +141 -0
- package/template/.claude/skills/autopilot/SKILL.md +74 -52
- package/template/.claude/skills/brief/SKILL.md +67 -45
- package/template/.claude/skills/ci/SKILL.md +1 -1
- package/template/.claude/skills/complete/SKILL.md +1 -1
- package/template/.claude/skills/debug/SKILL.md +1 -1
- package/template/.claude/skills/devflow/SKILL.md +7 -7
- package/template/.claude/skills/discovery/SKILL.md +145 -0
- package/template/.claude/skills/doctor/SKILL.md +1 -1
- package/template/.claude/skills/feature/SKILL.md +67 -18
- package/template/.claude/skills/fix/SKILL.md +1 -1
- package/template/.claude/skills/idea/SKILL.md +2 -2
- package/template/.claude/skills/onboard/SKILL.md +3 -3
- package/template/.claude/skills/overview/SKILL.md +39 -88
- package/template/.claude/skills/prototype/SKILL.md +1 -1
- package/template/.claude/skills/release/SKILL.md +171 -0
- package/template/.claude/skills/rollback/SKILL.md +2 -2
- package/template/AGENTS.md +5 -5
- package/template/devflow/build-plan.md +62 -0
- package/template/devflow/context/ai-interaction.md +4 -4
- package/template/devflow/context/coding-standards.md +3 -3
- package/template/devflow/context/current-stage.md +1 -1
- package/template/devflow/context/findings.md +1 -1
- package/template/devflow/history/HISTORY.md +2 -2
- package/template/devflow/project-plan.md +79 -0
- package/template/devflow/reference/mockup.html +476 -0
- package/template/devflow/reference/project-overview-template.md +39 -0
- package/template/devflow/reference/running-id-contract.md +24 -2
- package/template/devflow/reference/studio.html +504 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface DiscoveryItem {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
date: string | null;
|
|
5
|
+
decision: "Proceed" | "Defer" | "Reject" | "Unknown";
|
|
6
|
+
approvalStatus: string | null;
|
|
7
|
+
status: string | null;
|
|
8
|
+
file: string;
|
|
9
|
+
}
|
|
10
|
+
interface DiscoverySummary {
|
|
11
|
+
total: number;
|
|
12
|
+
activeId: string | null;
|
|
13
|
+
active: DiscoveryItem | null;
|
|
14
|
+
recent: DiscoveryItem[];
|
|
15
|
+
}
|
|
16
|
+
declare function readDiscoveries(projectRoot: string, activeId?: string | null): Promise<DiscoverySummary>;
|
|
17
|
+
declare function parseDiscovery(markdown: string, file: string, fallbackId: string): DiscoveryItem;
|
|
18
|
+
export { parseDiscovery, readDiscoveries };
|
|
19
|
+
export type { DiscoveryItem, DiscoverySummary };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
async function readDiscoveries(projectRoot, activeId = null) {
|
|
4
|
+
const root = path.join(projectRoot, "devflow", "discoveries");
|
|
5
|
+
let entries;
|
|
6
|
+
try {
|
|
7
|
+
entries = await fs.readdir(root, { withFileTypes: true });
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (getErrorCode(error) === "ENOENT")
|
|
11
|
+
return emptySummary(activeId);
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
const items = await Promise.all(entries
|
|
15
|
+
.filter((entry) => entry.isDirectory() && !entry.isSymbolicLink())
|
|
16
|
+
.map(async (entry) => {
|
|
17
|
+
const file = path.join(entry.name, "00-explore.md");
|
|
18
|
+
try {
|
|
19
|
+
const markdown = await fs.readFile(path.join(root, file), "utf8");
|
|
20
|
+
return parseDiscovery(markdown, file, entry.name);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (getErrorCode(error) === "ENOENT")
|
|
24
|
+
return null;
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
const valid = items.filter((item) => item !== null)
|
|
29
|
+
.sort((left, right) => right.id.localeCompare(left.id));
|
|
30
|
+
return {
|
|
31
|
+
total: valid.length,
|
|
32
|
+
activeId,
|
|
33
|
+
active: valid.find((item) => item.id === activeId) || null,
|
|
34
|
+
recent: valid.slice(0, 6)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function parseDiscovery(markdown, file, fallbackId) {
|
|
38
|
+
const id = field(markdown, "Discovery ID") || fallbackId.match(/DISC-\d{8}-\d{3}/)?.[0] || fallbackId;
|
|
39
|
+
const heading = markdown.match(/^#\s+(.+)$/m)?.[1]?.trim() || fallbackId;
|
|
40
|
+
const title = heading
|
|
41
|
+
.replace(/^.*?\]\s*/, "")
|
|
42
|
+
.replace(/^Discovery Document:\s*/i, "")
|
|
43
|
+
.trim();
|
|
44
|
+
const finalDecision = markdown.match(/Final Decision:\s*`?(Proceed|Defer|Reject)`?/i)?.[1];
|
|
45
|
+
const status = field(markdown, "Status");
|
|
46
|
+
const statusDecision = status?.match(/\b(Proceed|Defer|Reject)\b/i)?.[1];
|
|
47
|
+
const normalizedDecision = finalDecision || statusDecision;
|
|
48
|
+
return {
|
|
49
|
+
id,
|
|
50
|
+
title,
|
|
51
|
+
date: field(markdown, "Date"),
|
|
52
|
+
decision: normalizeDecision(normalizedDecision),
|
|
53
|
+
approvalStatus: field(markdown, "Approval Status"),
|
|
54
|
+
status,
|
|
55
|
+
file: file.replaceAll("\\", "/")
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function field(markdown, label) {
|
|
59
|
+
const escaped = label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
60
|
+
return markdown.match(new RegExp(`\\*\\*${escaped}\\*\\*:\\s*\\x60?([^\\r\\n\\x60]+)`, "i"))?.[1]?.trim() || null;
|
|
61
|
+
}
|
|
62
|
+
function normalizeDecision(value) {
|
|
63
|
+
const normalized = value?.toLowerCase();
|
|
64
|
+
if (normalized === "proceed")
|
|
65
|
+
return "Proceed";
|
|
66
|
+
if (normalized === "defer")
|
|
67
|
+
return "Defer";
|
|
68
|
+
if (normalized === "reject")
|
|
69
|
+
return "Reject";
|
|
70
|
+
return "Unknown";
|
|
71
|
+
}
|
|
72
|
+
function emptySummary(activeId) {
|
|
73
|
+
return { total: 0, activeId, active: null, recent: [] };
|
|
74
|
+
}
|
|
75
|
+
function getErrorCode(error) {
|
|
76
|
+
return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string"
|
|
77
|
+
? error.code
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
export { parseDiscovery, readDiscoveries };
|
|
81
|
+
//# sourceMappingURL=discoveries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discoveries.js","sourceRoot":"","sources":["../../lib/discoveries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface DoctorCheck {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
status: "pass" | "warn" | "fail";
|
|
5
|
+
message: string;
|
|
6
|
+
fixable: boolean;
|
|
7
|
+
fixed?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface DoctorReport {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
isDevFlowProject: boolean;
|
|
12
|
+
checks: DoctorCheck[];
|
|
13
|
+
totalChecks: number;
|
|
14
|
+
passCount: number;
|
|
15
|
+
warnCount: number;
|
|
16
|
+
failCount: number;
|
|
17
|
+
fixedCount: number;
|
|
18
|
+
}
|
|
19
|
+
export interface DoctorOptions {
|
|
20
|
+
fix?: boolean;
|
|
21
|
+
color?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function runDoctor(projectRoot: string, options?: DoctorOptions): Promise<DoctorReport>;
|
|
24
|
+
export declare function formatDoctorHuman(report: DoctorReport, options?: {
|
|
25
|
+
color?: boolean;
|
|
26
|
+
}): string;
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isDevFlowProjectRoot } from "./project-root.js";
|
|
4
|
+
import { createStyle } from "./ui.js";
|
|
5
|
+
const DEFAULT_FINDINGS_STUB = `# Findings Ledger
|
|
6
|
+
|
|
7
|
+
> **Generated Ledger File.** Tracks quality findings, security vulnerabilities, regression risks, and architectural debt raised during review and QA passes.
|
|
8
|
+
>
|
|
9
|
+
> **Finding Format**:
|
|
10
|
+
> \`### <ID> [<SEVERITY>] <STATUS> - <Title>\`
|
|
11
|
+
> - **Severities**: \`P0\` (Critical Blocker), \`P1\` (High Blocker), \`P2\` (Medium), \`P3\` (Low / Polish)
|
|
12
|
+
> - **Statuses**: \`unverified\`, \`open\`, \`fixed\`, \`closed\`, \`accepted\`, \`invalid\`
|
|
13
|
+
> - **Release Gate Rule**: Any \`P0\` or \`P1\` finding in \`open\` or \`fixed\` status unconditionally blocks \`/complete\` and \`70-deliver\`.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
_No active findings recorded. QA and audit passes append findings here as they are discovered._
|
|
18
|
+
`;
|
|
19
|
+
const DEFAULT_CURRENT_STAGE_STUB = `# Current DevFlow Run Status
|
|
20
|
+
|
|
21
|
+
- **Active Discovery ID**: \`None\`
|
|
22
|
+
- **Active Running ID**: \`None\`
|
|
23
|
+
- **Current Stage**: \`Idle (Ready for /feature or /fix)\`
|
|
24
|
+
- **Living Spec**: \`None\`
|
|
25
|
+
- **Last Completed Run**: \`None\`
|
|
26
|
+
- **Last Updated**: ${new Date().toISOString().split("T")[0]}
|
|
27
|
+
`;
|
|
28
|
+
const DEFAULT_CURRENT_FEATURE_STUB = `# Current Feature
|
|
29
|
+
|
|
30
|
+
_Nothing in progress. Run /feature, /fix, or /rollback to start._
|
|
31
|
+
`;
|
|
32
|
+
const DEFAULT_IDEAS_STUB = `# 💡 DevFlow Idea Inbox & Backlog
|
|
33
|
+
|
|
34
|
+
บันทึกไอเดียที่รอดำเนินการ พร้อมบทวิเคราะห์ความเป็นไปได้เบื้องต้นจาก AI (บันทึกด้วยคำสั่ง \`/idea "<text>"\`)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 📌 Pending Ideas
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 📦 Archived / Shipped Ideas
|
|
43
|
+
`;
|
|
44
|
+
const DEFAULT_HISTORY_STUB = `# Nexus-DevFlow Master Release History Ledger
|
|
45
|
+
|
|
46
|
+
This master ledger tracks all released delivery runs, milestones, and rollbacks in chronological order. Each entry is recorded during \`/complete\` or \`70-deliver\` and links to its exact Git commit hash, release status, category, and archived delivery artifacts.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 📜 Master Release Log
|
|
51
|
+
|
|
52
|
+
| Completed Date | Run ID | Category | Title | Git Commit | Status | Archive Link |
|
|
53
|
+
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 🗄️ History Categories (The Core 3 Model)
|
|
58
|
+
|
|
59
|
+
- **\`features/\`**: New user-facing features, enhancements, architecture migrations, refactoring, and tooling/infra.
|
|
60
|
+
- **\`fixes/\`**: Bug fixes, hotfixes, regressions, security patches, and performance optimizations.
|
|
61
|
+
- **\`rollbacks/\`**: Safe feature reversal and rollback execution records.
|
|
62
|
+
`;
|
|
63
|
+
const DEFAULT_PROJECT_PLAN_STUB = `# 🗺️ Project Plan (User-Owned Architectural Vision)
|
|
64
|
+
|
|
65
|
+
> **Document Type**: Project Plan (User-Owned)
|
|
66
|
+
> **Purpose**: Single source of truth for high-level product vision, architecture, constraints, and non-goals. Distilled into \`devflow/context/project-overview.md\` by \`/overview\`.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 1. Product Vision & Problem Statement
|
|
71
|
+
- **What this is**: A description of the project and the core problem it solves.
|
|
72
|
+
- **Target Audience**: Who will use this system and why.
|
|
73
|
+
- **Core Value Proposition**: Key differentiator and value delivered.
|
|
74
|
+
|
|
75
|
+
## 2. Architecture & Tech Stack
|
|
76
|
+
- **Runtime / Framework**: Primary language, framework, and runtime (e.g. Node.js, Next.js, FastAPI, Go).
|
|
77
|
+
- **Storage / Database**: Data persistence layers, caching, and state storage.
|
|
78
|
+
- **Key Modules / Services**: High-level module breakdown and directory responsibilities.
|
|
79
|
+
- **Integration Points**: External APIs, MCP servers, or third-party services.
|
|
80
|
+
|
|
81
|
+
## 3. Constraints & Non-Goals
|
|
82
|
+
- **Non-Goals**: What this project explicitly will NOT do in the current scope.
|
|
83
|
+
- **Technical Constraints**: Performance targets, security standards, offline requirements, or backward compatibility rules.
|
|
84
|
+
- **Delivery Rules**: Dual-Track workflow discipline (Fast-Track for standard features, Deep-Track for epics).
|
|
85
|
+
|
|
86
|
+
## 4. Key Milestones & Roadmap
|
|
87
|
+
- **Milestone 1**: Core Foundation & MVP
|
|
88
|
+
- **Milestone 2**: Feature Expansion & Integrations
|
|
89
|
+
- **Milestone 3**: Enterprise Hardening & Release Polish
|
|
90
|
+
`;
|
|
91
|
+
const DEFAULT_BUILD_PLAN_STUB = `# 📋 Build Plan (User-Owned Feature Queue)
|
|
92
|
+
|
|
93
|
+
> **Document Type**: Build Plan (User-Owned)
|
|
94
|
+
> **Purpose**: Master sequential feature build queue with dependencies and sizing. Inspected by \`/brief\` and consumed by \`/feature\`.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🚀 Phase 1: Core Foundation & MVP
|
|
99
|
+
|
|
100
|
+
- [ ] **1. Project Baseline & Context Setup** \`[Size: S]\`
|
|
101
|
+
- *Dependencies*: None
|
|
102
|
+
- *Scope*: Configure project scaffolding, coding standards, and initial workspace verification.
|
|
103
|
+
- [ ] **2. Core Data Models & Store** \`[Size: M]\`
|
|
104
|
+
- *Dependencies*: Feature 1
|
|
105
|
+
- *Scope*: Implement foundational data schemas, types, and persistence layer.
|
|
106
|
+
- [ ] **3. Primary User Interface & Navigation** \`[Size: M]\`
|
|
107
|
+
- *Dependencies*: Feature 2
|
|
108
|
+
- *Scope*: Build core views, interactive components, and responsive layout.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## ⚡ Phase 2: Feature Expansion & Integrations
|
|
113
|
+
|
|
114
|
+
- [ ] **4. Automated Quality Gates & CI Pipeline** \`[Size: M]\`
|
|
115
|
+
- *Dependencies*: Phase 1
|
|
116
|
+
- *Scope*: Wire up \`nexus-devflow check-gate\`, GitHub Actions workflows, and pre-commit hooks.
|
|
117
|
+
- [ ] **5. External Services & Tooling** \`[Size: L]\`
|
|
118
|
+
- *Dependencies*: Feature 4
|
|
119
|
+
- *Scope*: Integrate third-party APIs, MCP servers, or background worker jobs.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 📦 Phase 3: Hardening & Production Release
|
|
124
|
+
|
|
125
|
+
- [ ] **6. Security & Performance Audit** \`[Size: M]\`
|
|
126
|
+
- *Dependencies*: Phase 2
|
|
127
|
+
- *Scope*: Run \`/audit\`, resolve P0/P1 blockers, and optimize asset bundle sizes.
|
|
128
|
+
- [ ] **7. Production Deployment & Cloud Smoke Tests** \`[Size: S]\`
|
|
129
|
+
- *Dependencies*: Feature 6
|
|
130
|
+
- *Scope*: Configure Render / Vercel deployment and run end-to-end smoke tests.
|
|
131
|
+
`;
|
|
132
|
+
async function fileExists(filePath) {
|
|
133
|
+
try {
|
|
134
|
+
const stats = await fs.lstat(filePath);
|
|
135
|
+
return stats.isFile();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function dirExists(dirPath) {
|
|
142
|
+
try {
|
|
143
|
+
const stats = await fs.lstat(dirPath);
|
|
144
|
+
return stats.isDirectory();
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export async function runDoctor(projectRoot, options = {}) {
|
|
151
|
+
const isDevFlow = await isDevFlowProjectRoot(projectRoot);
|
|
152
|
+
const checks = [];
|
|
153
|
+
// Check 1: Project Root
|
|
154
|
+
if (isDevFlow) {
|
|
155
|
+
checks.push({
|
|
156
|
+
id: "project_root",
|
|
157
|
+
name: "DevFlow Project Root",
|
|
158
|
+
status: "pass",
|
|
159
|
+
message: "Directory contains DevFlow workspace markers (AGENTS.md & devflow/).",
|
|
160
|
+
fixable: false
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
checks.push({
|
|
165
|
+
id: "project_root",
|
|
166
|
+
name: "DevFlow Project Root",
|
|
167
|
+
status: "fail",
|
|
168
|
+
message: "Not a recognized DevFlow project directory.",
|
|
169
|
+
fixable: false
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Check 2: Internal State Manifest
|
|
173
|
+
const manifestPath = path.join(projectRoot, ".nexus", "nexus-devflow.json");
|
|
174
|
+
const hasManifest = await fileExists(manifestPath);
|
|
175
|
+
if (hasManifest) {
|
|
176
|
+
try {
|
|
177
|
+
const parsed = JSON.parse(await fs.readFile(manifestPath, "utf8"));
|
|
178
|
+
checks.push({
|
|
179
|
+
id: "manifest_state",
|
|
180
|
+
name: "Internal State Manifest (.nexus/)",
|
|
181
|
+
status: "pass",
|
|
182
|
+
message: `Manifest valid (version: ${parsed.version || "unknown"}, mode: ${parsed.mode || "standard"}).`,
|
|
183
|
+
fixable: false
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
checks.push({
|
|
188
|
+
id: "manifest_state",
|
|
189
|
+
name: "Internal State Manifest (.nexus/)",
|
|
190
|
+
status: "warn",
|
|
191
|
+
message: "Manifest file is malformed JSON.",
|
|
192
|
+
fixable: true
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
checks.push({
|
|
198
|
+
id: "manifest_state",
|
|
199
|
+
name: "Internal State Manifest (.nexus/)",
|
|
200
|
+
status: "warn",
|
|
201
|
+
message: "Manifest (.nexus/nexus-devflow.json) not found.",
|
|
202
|
+
fixable: true
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Check 3: Adapters
|
|
206
|
+
const hasAgentsDir = await dirExists(path.join(projectRoot, ".agents"));
|
|
207
|
+
const hasClaudeDir = await dirExists(path.join(projectRoot, ".claude"));
|
|
208
|
+
if (hasAgentsDir || hasClaudeDir) {
|
|
209
|
+
const adapters = [];
|
|
210
|
+
if (hasAgentsDir)
|
|
211
|
+
adapters.push("Codex/Copilot/Antigravity (.agents)");
|
|
212
|
+
if (hasClaudeDir)
|
|
213
|
+
adapters.push("Claude Code (.claude)");
|
|
214
|
+
checks.push({
|
|
215
|
+
id: "ai_adapters",
|
|
216
|
+
name: "AI Tool Adapters",
|
|
217
|
+
status: "pass",
|
|
218
|
+
message: `Active adapters detected: ${adapters.join(", ")}.`,
|
|
219
|
+
fixable: false
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
checks.push({
|
|
224
|
+
id: "ai_adapters",
|
|
225
|
+
name: "AI Tool Adapters",
|
|
226
|
+
status: "warn",
|
|
227
|
+
message: "No AI adapter folders (.agents or .claude) detected.",
|
|
228
|
+
fixable: false
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// Check 4: Core Context Files
|
|
232
|
+
const contextFiles = [
|
|
233
|
+
{ name: "current-stage.md", path: path.join("devflow", "context", "current-stage.md"), stub: DEFAULT_CURRENT_STAGE_STUB },
|
|
234
|
+
{ name: "current-feature.md", path: path.join("devflow", "context", "current-feature.md"), stub: DEFAULT_CURRENT_FEATURE_STUB },
|
|
235
|
+
{ name: "findings.md", path: path.join("devflow", "context", "findings.md"), stub: DEFAULT_FINDINGS_STUB },
|
|
236
|
+
{ name: "project-overview.md", path: path.join("devflow", "context", "project-overview.md"), stub: "# Project Overview\n\n_Source of truth for project architecture and domain rules._\n" },
|
|
237
|
+
{ name: "coding-standards.md", path: path.join("devflow", "context", "coding-standards.md"), stub: "# Coding Standards\n\n_Engineering conventions and quality standards._\n" },
|
|
238
|
+
{ name: "ai-interaction.md", path: path.join("devflow", "context", "ai-interaction.md"), stub: "# AI Interaction Guidelines\n\n_Rules and guidelines for interacting with AI agents._\n" }
|
|
239
|
+
];
|
|
240
|
+
for (const cf of contextFiles) {
|
|
241
|
+
const absPath = path.join(projectRoot, cf.path);
|
|
242
|
+
const exists = await fileExists(absPath);
|
|
243
|
+
if (exists) {
|
|
244
|
+
checks.push({
|
|
245
|
+
id: `context_${cf.name}`,
|
|
246
|
+
name: `Context File (${cf.name})`,
|
|
247
|
+
status: "pass",
|
|
248
|
+
message: `Found at ${cf.path}.`,
|
|
249
|
+
fixable: false
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
let fixed = false;
|
|
254
|
+
if (options.fix) {
|
|
255
|
+
await fs.mkdir(path.dirname(absPath), { recursive: true });
|
|
256
|
+
await fs.writeFile(absPath, cf.stub, "utf8");
|
|
257
|
+
fixed = true;
|
|
258
|
+
}
|
|
259
|
+
checks.push({
|
|
260
|
+
id: `context_${cf.name}`,
|
|
261
|
+
name: `Context File (${cf.name})`,
|
|
262
|
+
status: fixed ? "pass" : "warn",
|
|
263
|
+
message: fixed ? `Restored stub at ${cf.path}.` : `Missing at ${cf.path}.`,
|
|
264
|
+
fixable: true,
|
|
265
|
+
fixed
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Check 5: Planning Documents (project-plan.md & build-plan.md)
|
|
270
|
+
const projectPlanPath = path.join(projectRoot, "devflow", "project-plan.md");
|
|
271
|
+
const buildPlanPath = path.join(projectRoot, "devflow", "build-plan.md");
|
|
272
|
+
const hasProjectPlan = await fileExists(projectPlanPath);
|
|
273
|
+
const hasBuildPlan = await fileExists(buildPlanPath);
|
|
274
|
+
if (hasProjectPlan && hasBuildPlan) {
|
|
275
|
+
checks.push({
|
|
276
|
+
id: "planning_documents",
|
|
277
|
+
name: "Planning Documents (project-plan.md & build-plan.md)",
|
|
278
|
+
status: "pass",
|
|
279
|
+
message: "Both project-plan.md and build-plan.md are present.",
|
|
280
|
+
fixable: false
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else if (hasProjectPlan || hasBuildPlan) {
|
|
284
|
+
let fixed = false;
|
|
285
|
+
if (options.fix) {
|
|
286
|
+
if (!hasProjectPlan)
|
|
287
|
+
await fs.writeFile(projectPlanPath, DEFAULT_PROJECT_PLAN_STUB, "utf8");
|
|
288
|
+
if (!hasBuildPlan)
|
|
289
|
+
await fs.writeFile(buildPlanPath, DEFAULT_BUILD_PLAN_STUB, "utf8");
|
|
290
|
+
fixed = true;
|
|
291
|
+
}
|
|
292
|
+
checks.push({
|
|
293
|
+
id: "planning_documents",
|
|
294
|
+
name: "Planning Documents (project-plan.md & build-plan.md)",
|
|
295
|
+
status: fixed ? "pass" : "warn",
|
|
296
|
+
message: fixed
|
|
297
|
+
? "Restored missing planning document."
|
|
298
|
+
: `Partially present (${hasProjectPlan ? "project-plan.md present" : "build-plan.md present"}).`,
|
|
299
|
+
fixable: true,
|
|
300
|
+
fixed
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
let fixed = false;
|
|
305
|
+
if (options.fix) {
|
|
306
|
+
await fs.writeFile(projectPlanPath, DEFAULT_PROJECT_PLAN_STUB, "utf8");
|
|
307
|
+
await fs.writeFile(buildPlanPath, DEFAULT_BUILD_PLAN_STUB, "utf8");
|
|
308
|
+
fixed = true;
|
|
309
|
+
}
|
|
310
|
+
checks.push({
|
|
311
|
+
id: "planning_documents",
|
|
312
|
+
name: "Planning Documents (project-plan.md & build-plan.md)",
|
|
313
|
+
status: fixed ? "pass" : "warn",
|
|
314
|
+
message: fixed
|
|
315
|
+
? "Initialized project-plan.md and build-plan.md."
|
|
316
|
+
: "User-owned planning documents not configured (optional, recommended for long-term roadmap).",
|
|
317
|
+
fixable: true,
|
|
318
|
+
fixed
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// Check 6: Ideas File
|
|
322
|
+
const ideasPath = path.join(projectRoot, "devflow", "ideas.md");
|
|
323
|
+
const hasIdeas = await fileExists(ideasPath);
|
|
324
|
+
if (hasIdeas) {
|
|
325
|
+
checks.push({
|
|
326
|
+
id: "ideas_inbox",
|
|
327
|
+
name: "Idea Inbox (devflow/ideas.md)",
|
|
328
|
+
status: "pass",
|
|
329
|
+
message: "Found at devflow/ideas.md.",
|
|
330
|
+
fixable: false
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
let fixed = false;
|
|
335
|
+
if (options.fix) {
|
|
336
|
+
await fs.mkdir(path.dirname(ideasPath), { recursive: true });
|
|
337
|
+
await fs.writeFile(ideasPath, DEFAULT_IDEAS_STUB, "utf8");
|
|
338
|
+
fixed = true;
|
|
339
|
+
}
|
|
340
|
+
checks.push({
|
|
341
|
+
id: "ideas_inbox",
|
|
342
|
+
name: "Idea Inbox (devflow/ideas.md)",
|
|
343
|
+
status: fixed ? "pass" : "warn",
|
|
344
|
+
message: fixed ? "Restored stub at devflow/ideas.md." : "Missing devflow/ideas.md.",
|
|
345
|
+
fixable: true,
|
|
346
|
+
fixed
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
// Check 7: History Directory Structure
|
|
350
|
+
const historyDir = path.join(projectRoot, "devflow", "history");
|
|
351
|
+
const historyLedger = path.join(historyDir, "HISTORY.md");
|
|
352
|
+
const featuresDir = path.join(historyDir, "features");
|
|
353
|
+
const fixesDir = path.join(historyDir, "fixes");
|
|
354
|
+
const rollbacksDir = path.join(historyDir, "rollbacks");
|
|
355
|
+
const hasHistory = await dirExists(historyDir);
|
|
356
|
+
const hasLedger = await fileExists(historyLedger);
|
|
357
|
+
const hasFeatures = await dirExists(featuresDir);
|
|
358
|
+
const hasFixes = await dirExists(fixesDir);
|
|
359
|
+
const hasRollbacks = await dirExists(rollbacksDir);
|
|
360
|
+
if (hasHistory && hasLedger && hasFeatures && hasFixes && hasRollbacks) {
|
|
361
|
+
checks.push({
|
|
362
|
+
id: "history_structure",
|
|
363
|
+
name: "History Ledger & Archives (devflow/history/)",
|
|
364
|
+
status: "pass",
|
|
365
|
+
message: "Master ledger and categorized subdirectories (features, fixes, rollbacks) intact.",
|
|
366
|
+
fixable: false
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
let fixed = false;
|
|
371
|
+
if (options.fix) {
|
|
372
|
+
await fs.mkdir(featuresDir, { recursive: true });
|
|
373
|
+
await fs.mkdir(fixesDir, { recursive: true });
|
|
374
|
+
await fs.mkdir(rollbacksDir, { recursive: true });
|
|
375
|
+
if (!hasLedger) {
|
|
376
|
+
await fs.writeFile(historyLedger, DEFAULT_HISTORY_STUB, "utf8");
|
|
377
|
+
}
|
|
378
|
+
fixed = true;
|
|
379
|
+
}
|
|
380
|
+
checks.push({
|
|
381
|
+
id: "history_structure",
|
|
382
|
+
name: "History Ledger & Archives (devflow/history/)",
|
|
383
|
+
status: fixed ? "pass" : "warn",
|
|
384
|
+
message: fixed ? "Repaired devflow/history/ directories and HISTORY.md." : "devflow/history/ structure incomplete.",
|
|
385
|
+
fixable: true,
|
|
386
|
+
fixed
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
// Check 8: Reference & Discoveries Directories
|
|
390
|
+
const refDir = path.join(projectRoot, "devflow", "reference");
|
|
391
|
+
const discDir = path.join(projectRoot, "devflow", "discoveries");
|
|
392
|
+
const hasRef = await dirExists(refDir);
|
|
393
|
+
const hasDisc = await dirExists(discDir);
|
|
394
|
+
if (hasRef && hasDisc) {
|
|
395
|
+
checks.push({
|
|
396
|
+
id: "reference_discoveries",
|
|
397
|
+
name: "Support Folders (reference/ & discoveries/)",
|
|
398
|
+
status: "pass",
|
|
399
|
+
message: "Folders present for document conversion and discovery storage.",
|
|
400
|
+
fixable: false
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
let fixed = false;
|
|
405
|
+
if (options.fix) {
|
|
406
|
+
await fs.mkdir(refDir, { recursive: true });
|
|
407
|
+
await fs.mkdir(discDir, { recursive: true });
|
|
408
|
+
fixed = true;
|
|
409
|
+
}
|
|
410
|
+
checks.push({
|
|
411
|
+
id: "reference_discoveries",
|
|
412
|
+
name: "Support Folders (reference/ & discoveries/)",
|
|
413
|
+
status: fixed ? "pass" : "warn",
|
|
414
|
+
message: fixed ? "Created devflow/reference/ and devflow/discoveries/." : "Missing reference/ or discoveries/ folder.",
|
|
415
|
+
fixable: true,
|
|
416
|
+
fixed
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
let passCount = 0;
|
|
420
|
+
let warnCount = 0;
|
|
421
|
+
let failCount = 0;
|
|
422
|
+
let fixedCount = 0;
|
|
423
|
+
for (const c of checks) {
|
|
424
|
+
if (c.fixed)
|
|
425
|
+
fixedCount++;
|
|
426
|
+
if (c.status === "pass")
|
|
427
|
+
passCount++;
|
|
428
|
+
else if (c.status === "warn")
|
|
429
|
+
warnCount++;
|
|
430
|
+
else if (c.status === "fail")
|
|
431
|
+
failCount++;
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
projectRoot,
|
|
435
|
+
isDevFlowProject: isDevFlow,
|
|
436
|
+
checks,
|
|
437
|
+
totalChecks: checks.length,
|
|
438
|
+
passCount,
|
|
439
|
+
warnCount,
|
|
440
|
+
failCount,
|
|
441
|
+
fixedCount
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
export function formatDoctorHuman(report, options = {}) {
|
|
445
|
+
const style = createStyle(options.color);
|
|
446
|
+
const lines = [];
|
|
447
|
+
lines.push(style.bold(`Nexus-DevFlow Doctor Health Report (${report.passCount} passed, ${report.warnCount} warnings, ${report.failCount} failed)`));
|
|
448
|
+
if (report.fixedCount > 0) {
|
|
449
|
+
lines.push(style.green(` ⚡ Auto-healed ${report.fixedCount} items via --fix`));
|
|
450
|
+
}
|
|
451
|
+
lines.push("");
|
|
452
|
+
for (const check of report.checks) {
|
|
453
|
+
let icon = style.green("✔");
|
|
454
|
+
if (check.status === "warn")
|
|
455
|
+
icon = style.yellow("⚠");
|
|
456
|
+
if (check.status === "fail")
|
|
457
|
+
icon = style.red("✖");
|
|
458
|
+
let statusText = style.green("PASS");
|
|
459
|
+
if (check.status === "warn")
|
|
460
|
+
statusText = style.yellow("WARN");
|
|
461
|
+
if (check.status === "fail")
|
|
462
|
+
statusText = style.red("FAIL");
|
|
463
|
+
if (check.fixed)
|
|
464
|
+
statusText = style.cyan("FIXED");
|
|
465
|
+
lines.push(` ${icon} ${style.bold(check.name)} [${statusText}]`);
|
|
466
|
+
lines.push(` ${style.dim(check.message)}`);
|
|
467
|
+
}
|
|
468
|
+
lines.push("");
|
|
469
|
+
if (report.warnCount > 0 && report.fixedCount === 0) {
|
|
470
|
+
lines.push(style.yellow("Tip: Run `nexus-devflow doctor --fix` to automatically repair missing context and folders."));
|
|
471
|
+
}
|
|
472
|
+
return lines.join("\n").trimEnd();
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../lib/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface GitDriftReport {
|
|
2
|
+
hasDrift: boolean;
|
|
3
|
+
undocumentedFiles: string[];
|
|
4
|
+
phantomFiles: string[];
|
|
5
|
+
matchedFiles: string[];
|
|
6
|
+
gitModifiedFiles: string[];
|
|
7
|
+
specFiles: string[];
|
|
8
|
+
stageDrift: {
|
|
9
|
+
isDrifted: boolean;
|
|
10
|
+
activeBranch: string | null;
|
|
11
|
+
stageRunningId: string | null;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface ReconcileResult {
|
|
15
|
+
reconciled: boolean;
|
|
16
|
+
addedFiles: string[];
|
|
17
|
+
healedStage: boolean;
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Normalizes file path to forward slashes relative to workspace root.
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeRelativePath(projectRoot: string, filePath: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Parses the "Files to Modify/Create" section from a living spec markdown.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseSpecFilesList(specContent: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Detects git drift between modified repository files and spec declaration.
|
|
30
|
+
*/
|
|
31
|
+
export declare function detectGitDrift(projectRoot: string, explicitBranch?: string): Promise<GitDriftReport>;
|
|
32
|
+
/**
|
|
33
|
+
* Automatically reconciles and synchronizes living spec and stage file.
|
|
34
|
+
*/
|
|
35
|
+
export declare function reconcileState(projectRoot: string, options?: {
|
|
36
|
+
autoAddUndocumented?: boolean;
|
|
37
|
+
healStage?: boolean;
|
|
38
|
+
}): Promise<ReconcileResult>;
|