@tuan_son.dinh/gsd 2.6.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/LICENSE +21 -0
- package/README.md +453 -0
- package/dist/app-paths.d.ts +4 -0
- package/dist/app-paths.js +6 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +269 -0
- package/dist/loader.d.ts +2 -0
- package/dist/loader.js +70 -0
- package/dist/logo.d.ts +16 -0
- package/dist/logo.js +25 -0
- package/dist/onboarding.d.ts +43 -0
- package/dist/onboarding.js +418 -0
- package/dist/pi-migration.d.ts +14 -0
- package/dist/pi-migration.js +57 -0
- package/dist/resource-loader.d.ts +22 -0
- package/dist/resource-loader.js +60 -0
- package/dist/tool-bootstrap.d.ts +4 -0
- package/dist/tool-bootstrap.js +74 -0
- package/dist/wizard.d.ts +7 -0
- package/dist/wizard.js +25 -0
- package/package.json +60 -0
- package/patches/@mariozechner+pi-coding-agent+0.57.1.patch +108 -0
- package/patches/@mariozechner+pi-tui+0.57.1.patch +47 -0
- package/pkg/dist/modes/interactive/theme/dark.json +85 -0
- package/pkg/dist/modes/interactive/theme/light.json +84 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +78 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.js +949 -0
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -0
- package/pkg/package.json +8 -0
- package/scripts/postinstall.js +127 -0
- package/src/resources/GSD-WORKFLOW.md +661 -0
- package/src/resources/agents/researcher.md +29 -0
- package/src/resources/agents/scout.md +56 -0
- package/src/resources/agents/worker.md +31 -0
- package/src/resources/extensions/ask-user-questions.ts +249 -0
- package/src/resources/extensions/bg-shell/index.ts +2808 -0
- package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
- package/src/resources/extensions/browser-tools/core.js +1057 -0
- package/src/resources/extensions/browser-tools/index.ts +4989 -0
- package/src/resources/extensions/browser-tools/package.json +20 -0
- package/src/resources/extensions/context7/index.ts +428 -0
- package/src/resources/extensions/context7/package.json +11 -0
- package/src/resources/extensions/get-secrets-from-user.ts +352 -0
- package/src/resources/extensions/google-search/index.ts +323 -0
- package/src/resources/extensions/google-search/package.json +9 -0
- package/src/resources/extensions/gsd/activity-log.ts +69 -0
- package/src/resources/extensions/gsd/auto.ts +2744 -0
- package/src/resources/extensions/gsd/commands.ts +313 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +85 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +521 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +176 -0
- package/src/resources/extensions/gsd/doctor.ts +690 -0
- package/src/resources/extensions/gsd/files.ts +732 -0
- package/src/resources/extensions/gsd/git-service.ts +597 -0
- package/src/resources/extensions/gsd/gitignore.ts +168 -0
- package/src/resources/extensions/gsd/guided-flow.ts +817 -0
- package/src/resources/extensions/gsd/index.ts +558 -0
- package/src/resources/extensions/gsd/metrics.ts +374 -0
- package/src/resources/extensions/gsd/migrate/command.ts +218 -0
- package/src/resources/extensions/gsd/migrate/index.ts +42 -0
- package/src/resources/extensions/gsd/migrate/parser.ts +323 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +624 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +48 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +346 -0
- package/src/resources/extensions/gsd/migrate/types.ts +370 -0
- package/src/resources/extensions/gsd/migrate/validator.ts +55 -0
- package/src/resources/extensions/gsd/migrate/writer.ts +539 -0
- package/src/resources/extensions/gsd/observability-validator.ts +408 -0
- package/src/resources/extensions/gsd/package.json +11 -0
- package/src/resources/extensions/gsd/paths.ts +308 -0
- package/src/resources/extensions/gsd/preferences.ts +757 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +50 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +29 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +189 -0
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +61 -0
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +59 -0
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -0
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +23 -0
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +11 -0
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +65 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +51 -0
- package/src/resources/extensions/gsd/prompts/queue.md +85 -0
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +39 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +37 -0
- package/src/resources/extensions/gsd/prompts/research-slice.md +28 -0
- package/src/resources/extensions/gsd/prompts/review-migration.md +66 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +109 -0
- package/src/resources/extensions/gsd/prompts/system.md +187 -0
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
- package/src/resources/extensions/gsd/session-forensics.ts +487 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +137 -0
- package/src/resources/extensions/gsd/state.ts +460 -0
- package/src/resources/extensions/gsd/templates/context.md +76 -0
- package/src/resources/extensions/gsd/templates/decisions.md +8 -0
- package/src/resources/extensions/gsd/templates/milestone-summary.md +73 -0
- package/src/resources/extensions/gsd/templates/plan.md +131 -0
- package/src/resources/extensions/gsd/templates/preferences.md +24 -0
- package/src/resources/extensions/gsd/templates/project.md +31 -0
- package/src/resources/extensions/gsd/templates/reassessment.md +28 -0
- package/src/resources/extensions/gsd/templates/requirements.md +81 -0
- package/src/resources/extensions/gsd/templates/research.md +46 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +118 -0
- package/src/resources/extensions/gsd/templates/slice-context.md +58 -0
- package/src/resources/extensions/gsd/templates/slice-summary.md +99 -0
- package/src/resources/extensions/gsd/templates/state.md +19 -0
- package/src/resources/extensions/gsd/templates/task-plan.md +52 -0
- package/src/resources/extensions/gsd/templates/task-summary.md +57 -0
- package/src/resources/extensions/gsd/templates/uat.md +54 -0
- package/src/resources/extensions/gsd/tests/activity-log-prune.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +225 -0
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +689 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/doctor.test.ts +505 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +1313 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +308 -0
- package/src/resources/extensions/gsd/tests/metrics-io.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +390 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +786 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +657 -0
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +443 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +318 -0
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +420 -0
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +309 -0
- package/src/resources/extensions/gsd/tests/parsers.test.ts +1351 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +521 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +34 -0
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +247 -0
- package/src/resources/extensions/gsd/tests/workflow-config.test.mjs +53 -0
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +253 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +264 -0
- package/src/resources/extensions/gsd/types.ts +159 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +184 -0
- package/src/resources/extensions/gsd/workspace-index.ts +203 -0
- package/src/resources/extensions/gsd/worktree-command.ts +845 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +392 -0
- package/src/resources/extensions/gsd/worktree.ts +183 -0
- package/src/resources/extensions/mac-tools/index.ts +852 -0
- package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
- package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
- package/src/resources/extensions/mcporter/index.ts +429 -0
- package/src/resources/extensions/remote-questions/config.ts +81 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +128 -0
- package/src/resources/extensions/remote-questions/format.ts +163 -0
- package/src/resources/extensions/remote-questions/manager.ts +192 -0
- package/src/resources/extensions/remote-questions/remote-command.ts +307 -0
- package/src/resources/extensions/remote-questions/slack-adapter.ts +92 -0
- package/src/resources/extensions/remote-questions/status.ts +31 -0
- package/src/resources/extensions/remote-questions/store.ts +77 -0
- package/src/resources/extensions/remote-questions/types.ts +75 -0
- package/src/resources/extensions/search-the-web/cache.ts +78 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +95 -0
- package/src/resources/extensions/search-the-web/format.ts +258 -0
- package/src/resources/extensions/search-the-web/http.ts +238 -0
- package/src/resources/extensions/search-the-web/index.ts +65 -0
- package/src/resources/extensions/search-the-web/native-search.ts +157 -0
- package/src/resources/extensions/search-the-web/provider.ts +118 -0
- package/src/resources/extensions/search-the-web/tavily.ts +116 -0
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +519 -0
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +561 -0
- package/src/resources/extensions/search-the-web/tool-search.ts +576 -0
- package/src/resources/extensions/search-the-web/url-utils.ts +91 -0
- package/src/resources/extensions/shared/confirm-ui.ts +126 -0
- package/src/resources/extensions/shared/interview-ui.ts +613 -0
- package/src/resources/extensions/shared/next-action-ui.ts +197 -0
- package/src/resources/extensions/shared/progress-widget.ts +282 -0
- package/src/resources/extensions/shared/terminal.ts +23 -0
- package/src/resources/extensions/shared/thinking-widget.ts +107 -0
- package/src/resources/extensions/shared/ui.ts +400 -0
- package/src/resources/extensions/shared/wizard-ui.ts +551 -0
- package/src/resources/extensions/slash-commands/audit.ts +88 -0
- package/src/resources/extensions/slash-commands/clear.ts +10 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +297 -0
- package/src/resources/extensions/slash-commands/create-slash-command.ts +234 -0
- package/src/resources/extensions/slash-commands/index.ts +12 -0
- package/src/resources/extensions/subagent/agents.ts +126 -0
- package/src/resources/extensions/subagent/index.ts +1020 -0
- package/src/resources/extensions/voice/index.ts +195 -0
- package/src/resources/extensions/voice/speech-recognizer.swift +154 -0
- package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
- package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
- package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
- package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
- package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
- package/src/resources/skills/frontend-design/SKILL.md +45 -0
- package/src/resources/skills/swiftui/SKILL.md +208 -0
- package/src/resources/skills/swiftui/references/animations.md +921 -0
- package/src/resources/skills/swiftui/references/architecture.md +1561 -0
- package/src/resources/skills/swiftui/references/layout-system.md +1186 -0
- package/src/resources/skills/swiftui/references/navigation.md +1492 -0
- package/src/resources/skills/swiftui/references/networking-async.md +214 -0
- package/src/resources/skills/swiftui/references/performance.md +1706 -0
- package/src/resources/skills/swiftui/references/platform-integration.md +204 -0
- package/src/resources/skills/swiftui/references/state-management.md +1443 -0
- package/src/resources/skills/swiftui/references/swiftdata.md +297 -0
- package/src/resources/skills/swiftui/references/testing-debugging.md +247 -0
- package/src/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
- package/src/resources/skills/swiftui/workflows/add-feature.md +191 -0
- package/src/resources/skills/swiftui/workflows/build-new-app.md +311 -0
- package/src/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
- package/src/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
- package/src/resources/skills/swiftui/workflows/ship-app.md +203 -0
- package/src/resources/skills/swiftui/workflows/write-tests.md +235 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// Old .planning format type definitions
|
|
2
|
+
// Defines the contract for parsing legacy .planning directories into typed structures.
|
|
3
|
+
// Zero Pi dependencies — pure type definitions only.
|
|
4
|
+
|
|
5
|
+
// ─── Validation ────────────────────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
export type ValidationSeverity = 'fatal' | 'warning';
|
|
8
|
+
|
|
9
|
+
export interface ValidationIssue {
|
|
10
|
+
file: string;
|
|
11
|
+
severity: ValidationSeverity;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ValidationResult {
|
|
16
|
+
valid: boolean;
|
|
17
|
+
issues: ValidationIssue[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ─── Top-Level Container ───────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export interface PlanningProject {
|
|
23
|
+
/** Absolute path to the .planning directory */
|
|
24
|
+
path: string;
|
|
25
|
+
/** Parsed PROJECT.md content, null if missing */
|
|
26
|
+
project: string | null;
|
|
27
|
+
/** Parsed ROADMAP.md */
|
|
28
|
+
roadmap: PlanningRoadmap | null;
|
|
29
|
+
/** Parsed REQUIREMENTS.md entries */
|
|
30
|
+
requirements: PlanningRequirement[];
|
|
31
|
+
/** Parsed STATE.md */
|
|
32
|
+
state: PlanningState | null;
|
|
33
|
+
/** Parsed config.json */
|
|
34
|
+
config: PlanningConfig | null;
|
|
35
|
+
/** Phase directories keyed by full directory name (e.g. "29-auth-system") */
|
|
36
|
+
phases: Record<string, PlanningPhase>;
|
|
37
|
+
/** Quick tasks from quick/ directory */
|
|
38
|
+
quickTasks: PlanningQuickTask[];
|
|
39
|
+
/** Milestone-level data from milestones/ directory */
|
|
40
|
+
milestones: PlanningMilestone[];
|
|
41
|
+
/** Research files from top-level research/ directory */
|
|
42
|
+
research: PlanningResearch[];
|
|
43
|
+
/** Validation result from pre-flight checks */
|
|
44
|
+
validation: ValidationResult;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ─── Roadmap ───────────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
export interface PlanningRoadmap {
|
|
50
|
+
/** Raw content for reference */
|
|
51
|
+
raw: string;
|
|
52
|
+
/** Milestone sections (for milestone-sectioned roadmaps) */
|
|
53
|
+
milestones: PlanningRoadmapMilestone[];
|
|
54
|
+
/** Flat phase entries (for simple flat roadmaps) */
|
|
55
|
+
phases: PlanningRoadmapEntry[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface PlanningRoadmapMilestone {
|
|
59
|
+
/** Milestone identifier (e.g. "v2.5") */
|
|
60
|
+
id: string;
|
|
61
|
+
/** Milestone title */
|
|
62
|
+
title: string;
|
|
63
|
+
/** Whether the milestone section is collapsed (inside <details>) */
|
|
64
|
+
collapsed: boolean;
|
|
65
|
+
/** Phase entries within this milestone */
|
|
66
|
+
phases: PlanningRoadmapEntry[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface PlanningRoadmapEntry {
|
|
70
|
+
/** Phase number */
|
|
71
|
+
number: number;
|
|
72
|
+
/** Phase title/slug */
|
|
73
|
+
title: string;
|
|
74
|
+
/** Whether the phase checkbox is checked */
|
|
75
|
+
done: boolean;
|
|
76
|
+
/** Raw line text for reference */
|
|
77
|
+
raw: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ─── Phase ─────────────────────────────────────────────────────────────────
|
|
81
|
+
|
|
82
|
+
export interface PlanningPhase {
|
|
83
|
+
/** Full directory name (e.g. "29-auth-system") */
|
|
84
|
+
dirName: string;
|
|
85
|
+
/** Extracted phase number */
|
|
86
|
+
number: number;
|
|
87
|
+
/** Extracted phase slug */
|
|
88
|
+
slug: string;
|
|
89
|
+
/** Plan files keyed by plan number (e.g. "01") */
|
|
90
|
+
plans: Record<string, PlanningPlan>;
|
|
91
|
+
/** Summary files keyed by plan number (e.g. "01"), includes orphans */
|
|
92
|
+
summaries: Record<string, PlanningSummary>;
|
|
93
|
+
/** Research files in phase directory */
|
|
94
|
+
research: PlanningResearch[];
|
|
95
|
+
/** Verification files */
|
|
96
|
+
verifications: PlanningPhaseFile[];
|
|
97
|
+
/** Non-standard extra files */
|
|
98
|
+
extraFiles: PlanningPhaseFile[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ─── Plan (XML-in-Markdown) ────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
export interface PlanningPlan {
|
|
104
|
+
/** File name (e.g. "29-01-PLAN.md") */
|
|
105
|
+
fileName: string;
|
|
106
|
+
/** Plan number within phase (e.g. "01") */
|
|
107
|
+
planNumber: string;
|
|
108
|
+
/** Parsed YAML frontmatter */
|
|
109
|
+
frontmatter: PlanningPlanFrontmatter;
|
|
110
|
+
/** Extracted <objective> content */
|
|
111
|
+
objective: string;
|
|
112
|
+
/** Extracted <tasks> with individual <task> entries */
|
|
113
|
+
tasks: string[];
|
|
114
|
+
/** Extracted <context> content */
|
|
115
|
+
context: string;
|
|
116
|
+
/** Extracted <verification> content */
|
|
117
|
+
verification: string;
|
|
118
|
+
/** Extracted <success_criteria> content */
|
|
119
|
+
successCriteria: string;
|
|
120
|
+
/** Raw content for reference */
|
|
121
|
+
raw: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface PlanningPlanFrontmatter {
|
|
125
|
+
phase: string;
|
|
126
|
+
plan: string;
|
|
127
|
+
type: string;
|
|
128
|
+
wave: number | null;
|
|
129
|
+
depends_on: string[];
|
|
130
|
+
files_modified: string[];
|
|
131
|
+
autonomous: boolean;
|
|
132
|
+
must_haves: PlanningPlanMustHaves | null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface PlanningPlanMustHaves {
|
|
136
|
+
truths: string[];
|
|
137
|
+
artifacts: string[];
|
|
138
|
+
key_links: string[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ─── Summary (YAML Frontmatter) ────────────────────────────────────────────
|
|
142
|
+
|
|
143
|
+
export interface PlanningSummary {
|
|
144
|
+
/** File name (e.g. "29-01-SUMMARY.md") */
|
|
145
|
+
fileName: string;
|
|
146
|
+
/** Plan number within phase (e.g. "01") */
|
|
147
|
+
planNumber: string;
|
|
148
|
+
/** Parsed YAML frontmatter */
|
|
149
|
+
frontmatter: PlanningSummaryFrontmatter;
|
|
150
|
+
/** Body content (after frontmatter) */
|
|
151
|
+
body: string;
|
|
152
|
+
/** Raw content for reference */
|
|
153
|
+
raw: string;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface PlanningSummaryFrontmatter {
|
|
157
|
+
phase: string;
|
|
158
|
+
plan: string;
|
|
159
|
+
subsystem: string;
|
|
160
|
+
tags: string[];
|
|
161
|
+
requires: PlanningSummaryRequires[];
|
|
162
|
+
provides: string[];
|
|
163
|
+
affects: string[];
|
|
164
|
+
'tech-stack': string[];
|
|
165
|
+
'key-files': string[];
|
|
166
|
+
'key-decisions': string[];
|
|
167
|
+
'patterns-established': string[];
|
|
168
|
+
duration: string;
|
|
169
|
+
completed: string;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface PlanningSummaryRequires {
|
|
173
|
+
phase: string;
|
|
174
|
+
provides: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ─── Requirements ──────────────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
export interface PlanningRequirement {
|
|
180
|
+
/** Requirement ID (e.g. "R001") */
|
|
181
|
+
id: string;
|
|
182
|
+
/** Requirement title */
|
|
183
|
+
title: string;
|
|
184
|
+
/** Status (active, validated, deferred, etc.) */
|
|
185
|
+
status: string;
|
|
186
|
+
/** Description text */
|
|
187
|
+
description: string;
|
|
188
|
+
/** Raw section content */
|
|
189
|
+
raw: string;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ─── Research ──────────────────────────────────────────────────────────────
|
|
193
|
+
|
|
194
|
+
export interface PlanningResearch {
|
|
195
|
+
/** File name */
|
|
196
|
+
fileName: string;
|
|
197
|
+
/** Raw content */
|
|
198
|
+
content: string;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ─── Config ────────────────────────────────────────────────────────────────
|
|
202
|
+
|
|
203
|
+
export interface PlanningConfig {
|
|
204
|
+
/** Project name from config */
|
|
205
|
+
projectName: string;
|
|
206
|
+
/** Any other config fields */
|
|
207
|
+
[key: string]: unknown;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ─── Quick Tasks ───────────────────────────────────────────────────────────
|
|
211
|
+
|
|
212
|
+
export interface PlanningQuickTask {
|
|
213
|
+
/** Directory name (e.g. "001-fix-login") */
|
|
214
|
+
dirName: string;
|
|
215
|
+
/** Task number */
|
|
216
|
+
number: number;
|
|
217
|
+
/** Task slug */
|
|
218
|
+
slug: string;
|
|
219
|
+
/** Plan file content, null if missing */
|
|
220
|
+
plan: string | null;
|
|
221
|
+
/** Summary file content, null if missing */
|
|
222
|
+
summary: string | null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ─── Milestones ────────────────────────────────────────────────────────────
|
|
226
|
+
|
|
227
|
+
export interface PlanningMilestone {
|
|
228
|
+
/** Directory or file identifier (e.g. "v2.2") */
|
|
229
|
+
id: string;
|
|
230
|
+
/** Requirements file content, null if missing */
|
|
231
|
+
requirements: string | null;
|
|
232
|
+
/** Roadmap file content, null if missing */
|
|
233
|
+
roadmap: string | null;
|
|
234
|
+
/** Any other files */
|
|
235
|
+
extraFiles: PlanningPhaseFile[];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ─── State ─────────────────────────────────────────────────────────────────
|
|
239
|
+
|
|
240
|
+
export interface PlanningState {
|
|
241
|
+
/** Raw content */
|
|
242
|
+
raw: string;
|
|
243
|
+
/** Extracted current phase */
|
|
244
|
+
currentPhase: string | null;
|
|
245
|
+
/** Extracted status */
|
|
246
|
+
status: string | null;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ─── Generic File Reference ────────────────────────────────────────────────
|
|
250
|
+
|
|
251
|
+
export interface PlanningPhaseFile {
|
|
252
|
+
/** File name */
|
|
253
|
+
fileName: string;
|
|
254
|
+
/** Raw content */
|
|
255
|
+
content: string;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
259
|
+
// GSD Output Types — produced by transformer, consumed by writer (S03)
|
|
260
|
+
// Mirror GSD-2 runtime shapes so deriveState() works on migrated output.
|
|
261
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
262
|
+
|
|
263
|
+
export interface GSDProject {
|
|
264
|
+
milestones: GSDMilestone[];
|
|
265
|
+
/** Raw PROJECT.md text (pass through from old format) */
|
|
266
|
+
projectContent: string;
|
|
267
|
+
requirements: GSDRequirement[];
|
|
268
|
+
/** Empty or pass-through from old project key decisions */
|
|
269
|
+
decisionsContent: string;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export interface GSDMilestone {
|
|
273
|
+
/** e.g. "M001", "M002" */
|
|
274
|
+
id: string;
|
|
275
|
+
/** From old milestone section title or roadmap H1 */
|
|
276
|
+
title: string;
|
|
277
|
+
/** Derived from PROJECT.md description or roadmap H1 */
|
|
278
|
+
vision: string;
|
|
279
|
+
/** Empty [] if none found */
|
|
280
|
+
successCriteria: string[];
|
|
281
|
+
slices: GSDSlice[];
|
|
282
|
+
/** Consolidated research blob, null if no research */
|
|
283
|
+
research: string | null;
|
|
284
|
+
/** Empty [] — old format has no boundary map equivalent */
|
|
285
|
+
boundaryMap: GSDBoundaryEntry[];
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export interface GSDSlice {
|
|
289
|
+
/** e.g. "S01", "S02" */
|
|
290
|
+
id: string;
|
|
291
|
+
/** Titlecased from phase slug */
|
|
292
|
+
title: string;
|
|
293
|
+
/** Default 'medium' */
|
|
294
|
+
risk: 'low' | 'medium' | 'high';
|
|
295
|
+
/** [prev slice ID] for sequential, [] for S01 */
|
|
296
|
+
depends: string[];
|
|
297
|
+
/** From roadmap checkbox */
|
|
298
|
+
done: boolean;
|
|
299
|
+
/** Derived from first plan objective or defaulted */
|
|
300
|
+
demo: string;
|
|
301
|
+
/** Same as demo or phase slug */
|
|
302
|
+
goal: string;
|
|
303
|
+
tasks: GSDTask[];
|
|
304
|
+
/** Per-phase research content, null if none */
|
|
305
|
+
research: string | null;
|
|
306
|
+
/** Only populated if done */
|
|
307
|
+
summary: GSDSliceSummaryData | null;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export interface GSDTask {
|
|
311
|
+
/** e.g. "T01", "T02" */
|
|
312
|
+
id: string;
|
|
313
|
+
/** From plan frontmatter or phase slug + plan number */
|
|
314
|
+
title: string;
|
|
315
|
+
/** From plan objective */
|
|
316
|
+
description: string;
|
|
317
|
+
/** Summary exists for this plan number */
|
|
318
|
+
done: boolean;
|
|
319
|
+
/** From summary duration if available, else '' */
|
|
320
|
+
estimate: string;
|
|
321
|
+
/** From plan frontmatter files_modified */
|
|
322
|
+
files: string[];
|
|
323
|
+
/** From plan frontmatter must_haves.truths */
|
|
324
|
+
mustHaves: string[];
|
|
325
|
+
/** Only populated if done */
|
|
326
|
+
summary: GSDTaskSummaryData | null;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export interface GSDRequirement {
|
|
330
|
+
/** e.g. "R001" */
|
|
331
|
+
id: string;
|
|
332
|
+
title: string;
|
|
333
|
+
/** Default 'core-capability' */
|
|
334
|
+
class: string;
|
|
335
|
+
/** 'active' | 'validated' | 'deferred' */
|
|
336
|
+
status: string;
|
|
337
|
+
description: string;
|
|
338
|
+
/** Default 'inferred' */
|
|
339
|
+
source: string;
|
|
340
|
+
/** Default 'none yet' */
|
|
341
|
+
primarySlice: string;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export interface GSDSliceSummaryData {
|
|
345
|
+
/** From last plan summary's completed field */
|
|
346
|
+
completedAt: string;
|
|
347
|
+
provides: string[];
|
|
348
|
+
keyFiles: string[];
|
|
349
|
+
keyDecisions: string[];
|
|
350
|
+
patternsEstablished: string[];
|
|
351
|
+
duration: string;
|
|
352
|
+
/** From summary body */
|
|
353
|
+
whatHappened: string;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export interface GSDTaskSummaryData {
|
|
357
|
+
completedAt: string;
|
|
358
|
+
provides: string[];
|
|
359
|
+
keyFiles: string[];
|
|
360
|
+
duration: string;
|
|
361
|
+
/** From summary body */
|
|
362
|
+
whatHappened: string;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export interface GSDBoundaryEntry {
|
|
366
|
+
fromSlice: string;
|
|
367
|
+
toSlice: string;
|
|
368
|
+
produces: string;
|
|
369
|
+
consumes: string;
|
|
370
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Old .planning directory validator
|
|
2
|
+
// Pre-flight checks for minimum viable .planning directory.
|
|
3
|
+
// Pure functions, zero Pi dependencies — uses only Node built-ins + exported helpers.
|
|
4
|
+
|
|
5
|
+
import { existsSync, statSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
|
|
8
|
+
import type { ValidationResult, ValidationIssue, ValidationSeverity } from './types.ts';
|
|
9
|
+
|
|
10
|
+
function issue(file: string, severity: ValidationSeverity, message: string): ValidationIssue {
|
|
11
|
+
return { file, severity, message };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Validate that a .planning directory has the minimum required structure.
|
|
16
|
+
* Returns structured issues with severity levels:
|
|
17
|
+
* - fatal: directory doesn't exist (migration cannot proceed)
|
|
18
|
+
* - warning: optional files missing (migration can proceed with reduced data)
|
|
19
|
+
*/
|
|
20
|
+
export async function validatePlanningDirectory(path: string): Promise<ValidationResult> {
|
|
21
|
+
const issues: ValidationIssue[] = [];
|
|
22
|
+
|
|
23
|
+
// Check directory exists
|
|
24
|
+
if (!existsSync(path) || !statSync(path).isDirectory()) {
|
|
25
|
+
issues.push(issue(path, 'fatal', 'Directory does not exist'));
|
|
26
|
+
return { valid: false, issues };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ROADMAP.md — warn if missing (transformer falls back to filesystem phases)
|
|
30
|
+
if (!existsSync(join(path, 'ROADMAP.md'))) {
|
|
31
|
+
issues.push(issue('ROADMAP.md', 'warning',
|
|
32
|
+
'ROADMAP.md not found — milestone structure will be inferred from phases/ directory',
|
|
33
|
+
));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Optional files — warn if missing
|
|
37
|
+
if (!existsSync(join(path, 'PROJECT.md'))) {
|
|
38
|
+
issues.push(issue('PROJECT.md', 'warning', 'PROJECT.md not found — project metadata will be empty'));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!existsSync(join(path, 'REQUIREMENTS.md'))) {
|
|
42
|
+
issues.push(issue('REQUIREMENTS.md', 'warning', 'REQUIREMENTS.md not found — requirements will be empty'));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!existsSync(join(path, 'STATE.md'))) {
|
|
46
|
+
issues.push(issue('STATE.md', 'warning', 'STATE.md not found — state information will be empty'));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!existsSync(join(path, 'phases')) || !statSync(join(path, 'phases')).isDirectory()) {
|
|
50
|
+
issues.push(issue('phases/', 'warning', 'phases/ directory not found — no phase data will be parsed'));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const hasFatal = issues.some(i => i.severity === 'fatal');
|
|
54
|
+
return { valid: !hasFatal, issues };
|
|
55
|
+
}
|