@gitwhy-cli/whyspec 0.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.
Files changed (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/adapters/agents-md.d.ts +13 -0
  4. package/dist/adapters/agents-md.d.ts.map +1 -0
  5. package/dist/adapters/agents-md.js +165 -0
  6. package/dist/adapters/agents-md.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +13 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +206 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/cursor.d.ts +12 -0
  12. package/dist/adapters/cursor.d.ts.map +1 -0
  13. package/dist/adapters/cursor.js +220 -0
  14. package/dist/adapters/cursor.js.map +1 -0
  15. package/dist/adapters/types.d.ts +16 -0
  16. package/dist/adapters/types.d.ts.map +1 -0
  17. package/dist/adapters/types.js +19 -0
  18. package/dist/adapters/types.js.map +1 -0
  19. package/dist/cli/index.d.ts +3 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +109 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/commands/capture.d.ts +18 -0
  24. package/dist/commands/capture.d.ts.map +1 -0
  25. package/dist/commands/capture.js +85 -0
  26. package/dist/commands/capture.js.map +1 -0
  27. package/dist/commands/debug.d.ts +16 -0
  28. package/dist/commands/debug.d.ts.map +1 -0
  29. package/dist/commands/debug.js +74 -0
  30. package/dist/commands/debug.js.map +1 -0
  31. package/dist/commands/execute.d.ts +36 -0
  32. package/dist/commands/execute.d.ts.map +1 -0
  33. package/dist/commands/execute.js +110 -0
  34. package/dist/commands/execute.js.map +1 -0
  35. package/dist/commands/init.d.ts +14 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +166 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/list.d.ts +23 -0
  40. package/dist/commands/list.d.ts.map +1 -0
  41. package/dist/commands/list.js +95 -0
  42. package/dist/commands/list.js.map +1 -0
  43. package/dist/commands/plan.d.ts +20 -0
  44. package/dist/commands/plan.d.ts.map +1 -0
  45. package/dist/commands/plan.js +48 -0
  46. package/dist/commands/plan.js.map +1 -0
  47. package/dist/commands/search.d.ts +12 -0
  48. package/dist/commands/search.d.ts.map +1 -0
  49. package/dist/commands/search.js +36 -0
  50. package/dist/commands/search.js.map +1 -0
  51. package/dist/commands/show.d.ts +25 -0
  52. package/dist/commands/show.d.ts.map +1 -0
  53. package/dist/commands/show.js +145 -0
  54. package/dist/commands/show.js.map +1 -0
  55. package/dist/commands/status.d.ts +29 -0
  56. package/dist/commands/status.d.ts.map +1 -0
  57. package/dist/commands/status.js +125 -0
  58. package/dist/commands/status.js.map +1 -0
  59. package/dist/commands/template.d.ts +14 -0
  60. package/dist/commands/template.d.ts.map +1 -0
  61. package/dist/commands/template.js +25 -0
  62. package/dist/commands/template.js.map +1 -0
  63. package/dist/core/categorize.d.ts +30 -0
  64. package/dist/core/categorize.d.ts.map +1 -0
  65. package/dist/core/categorize.js +72 -0
  66. package/dist/core/categorize.js.map +1 -0
  67. package/dist/core/config.d.ts +26 -0
  68. package/dist/core/config.d.ts.map +1 -0
  69. package/dist/core/config.js +52 -0
  70. package/dist/core/config.js.map +1 -0
  71. package/dist/core/context.d.ts +27 -0
  72. package/dist/core/context.d.ts.map +1 -0
  73. package/dist/core/context.js +75 -0
  74. package/dist/core/context.js.map +1 -0
  75. package/dist/core/search.d.ts +51 -0
  76. package/dist/core/search.d.ts.map +1 -0
  77. package/dist/core/search.js +235 -0
  78. package/dist/core/search.js.map +1 -0
  79. package/dist/core/storage.d.ts +36 -0
  80. package/dist/core/storage.d.ts.map +1 -0
  81. package/dist/core/storage.js +80 -0
  82. package/dist/core/storage.js.map +1 -0
  83. package/dist/core/templates.d.ts +28 -0
  84. package/dist/core/templates.d.ts.map +1 -0
  85. package/dist/core/templates.js +176 -0
  86. package/dist/core/templates.js.map +1 -0
  87. package/dist/ui/ascii-logo.d.ts +7 -0
  88. package/dist/ui/ascii-logo.d.ts.map +1 -0
  89. package/dist/ui/ascii-logo.js +15 -0
  90. package/dist/ui/ascii-logo.js.map +1 -0
  91. package/dist/ui/tool-picker.d.ts +13 -0
  92. package/dist/ui/tool-picker.d.ts.map +1 -0
  93. package/dist/ui/tool-picker.js +76 -0
  94. package/dist/ui/tool-picker.js.map +1 -0
  95. package/dist/ui/welcome.d.ts +4 -0
  96. package/dist/ui/welcome.d.ts.map +1 -0
  97. package/dist/ui/welcome.js +43 -0
  98. package/dist/ui/welcome.js.map +1 -0
  99. package/dist/utils/changes.d.ts +19 -0
  100. package/dist/utils/changes.d.ts.map +1 -0
  101. package/dist/utils/changes.js +63 -0
  102. package/dist/utils/changes.js.map +1 -0
  103. package/dist/utils/git.d.ts +28 -0
  104. package/dist/utils/git.d.ts.map +1 -0
  105. package/dist/utils/git.js +104 -0
  106. package/dist/utils/git.js.map +1 -0
  107. package/dist/utils/slugify.d.ts +12 -0
  108. package/dist/utils/slugify.d.ts.map +1 -0
  109. package/dist/utils/slugify.js +21 -0
  110. package/dist/utils/slugify.js.map +1 -0
  111. package/dist/utils/telemetry.d.ts +21 -0
  112. package/dist/utils/telemetry.d.ts.map +1 -0
  113. package/dist/utils/telemetry.js +32 -0
  114. package/dist/utils/telemetry.js.map +1 -0
  115. package/package.json +81 -0
  116. package/skills/whyspec-capture/SKILL.md +154 -0
  117. package/skills/whyspec-debug/SKILL.md +404 -0
  118. package/skills/whyspec-execute/SKILL.md +118 -0
  119. package/skills/whyspec-plan/SKILL.md +170 -0
  120. package/skills/whyspec-search/SKILL.md +69 -0
  121. package/skills/whyspec-show/SKILL.md +90 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAOD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG;IAC3C,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAgDA;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkDf"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * whyspec execute — Get execution context and track progress for a change.
3
+ *
4
+ * --json mode: returns plan file contents + task progress for agent consumption.
5
+ * Non-JSON mode: displays progress summary with task list.
6
+ */
7
+ import { existsSync, readFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import chalk from "chalk";
10
+ import { resolveChange } from "../utils/changes.js";
11
+ function readFileOrEmpty(filePath) {
12
+ if (!existsSync(filePath))
13
+ return "";
14
+ return readFileSync(filePath, "utf-8");
15
+ }
16
+ /**
17
+ * Parse tasks.md for checkbox items, scoped to the ## Tasks section only.
18
+ * Ignores checkboxes in ## Verification and other sections.
19
+ * Recognizes: - [x], - [X] (completed) and - [ ] (pending).
20
+ */
21
+ export function parseTasks(content) {
22
+ if (!content.trim()) {
23
+ return { progress: { total: 0, completed: 0, remaining: 0 }, pending: [] };
24
+ }
25
+ const lines = content.split("\n");
26
+ let total = 0;
27
+ let completed = 0;
28
+ const pending = [];
29
+ let inTasksSection = false;
30
+ for (let i = 0; i < lines.length; i++) {
31
+ const line = lines[i];
32
+ // Enter the ## Tasks section
33
+ if (/^##\s+Tasks\b/i.test(line)) {
34
+ inTasksSection = true;
35
+ continue;
36
+ }
37
+ // Exit on any other ## heading
38
+ if (inTasksSection && /^##\s/.test(line)) {
39
+ break;
40
+ }
41
+ // Only count checkboxes within ## Tasks
42
+ if (!inTasksSection)
43
+ continue;
44
+ // Match completed tasks: - [x] or - [X]
45
+ if (/^-\s+\[[xX]\]\s+/.test(line)) {
46
+ total++;
47
+ completed++;
48
+ continue;
49
+ }
50
+ // Match pending tasks: - [ ] with description
51
+ const pendingMatch = line.match(/^-\s+\[ \]\s+(.+)/);
52
+ if (pendingMatch) {
53
+ total++;
54
+ pending.push({
55
+ line: i + 1, // 1-indexed line number
56
+ description: pendingMatch[1].trim(),
57
+ });
58
+ }
59
+ }
60
+ return {
61
+ progress: { total, completed, remaining: total - completed },
62
+ pending,
63
+ };
64
+ }
65
+ export async function executeCommand(name, options) {
66
+ const gitwhyDir = join(process.cwd(), ".gitwhy");
67
+ const change = resolveChange(gitwhyDir, name);
68
+ // Read all three planning artifacts
69
+ const intentContent = readFileOrEmpty(join(change.path, "intent.md"));
70
+ const designContent = readFileOrEmpty(join(change.path, "design.md"));
71
+ const tasksContent = readFileOrEmpty(join(change.path, "tasks.md"));
72
+ // Parse task progress
73
+ const { progress, pending } = parseTasks(tasksContent);
74
+ if (options.json) {
75
+ const output = {
76
+ change_name: change.name,
77
+ intent_content: intentContent,
78
+ design_content: designContent,
79
+ tasks_content: tasksContent,
80
+ progress,
81
+ pending_tasks: pending,
82
+ };
83
+ console.log(JSON.stringify(output, null, 2));
84
+ return;
85
+ }
86
+ // Non-JSON mode: display progress summary
87
+ console.log(chalk.bold(`Change: ${change.name}`));
88
+ console.log();
89
+ if (progress.total === 0) {
90
+ console.log(chalk.yellow("No tasks found in tasks.md"));
91
+ return;
92
+ }
93
+ // Progress bar
94
+ const pct = Math.round((progress.completed / progress.total) * 100);
95
+ const barLen = 30;
96
+ const filled = Math.round((pct / 100) * barLen);
97
+ const bar = chalk.green("█".repeat(filled)) + chalk.dim("░".repeat(barLen - filled));
98
+ console.log(`Progress: ${bar} ${pct}% (${progress.completed}/${progress.total})`);
99
+ console.log();
100
+ if (pending.length > 0) {
101
+ console.log(chalk.bold("Pending tasks:"));
102
+ pending.forEach((t) => {
103
+ console.log(` ${chalk.dim(`L${t.line}`)} - [ ] ${t.description}`);
104
+ });
105
+ }
106
+ else {
107
+ console.log(chalk.green("All tasks completed!"));
108
+ }
109
+ }
110
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ConfigOptions {
2
+ projectName: string;
3
+ projectDescription: string;
4
+ tools: string[];
5
+ telemetry: boolean;
6
+ }
7
+ export declare function createGitwhyDir(root: string): void;
8
+ export declare function writeConfigYaml(root: string, opts: ConfigOptions): void;
9
+ export declare function addToGitignore(root: string): void;
10
+ export declare function installSkillFiles(root: string, tools: string[]): void;
11
+ export declare function generateAgentsMd(root: string, tools: string[]): void;
12
+ export declare function detectProjectName(root: string): string;
13
+ export declare function runInit(): Promise<void>;
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQlD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAwBvE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBjD;AAgCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAgBrE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIpE;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CActD;AAID,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD7C"}
@@ -0,0 +1,166 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import chalk from "chalk";
4
+ import YAML from "yaml";
5
+ import { renderWelcomeScreen, renderTelemetryNotice, renderSuccessMessage } from "../ui/welcome.js";
6
+ import { promptToolPicker, needsAgentsMd } from "../ui/tool-picker.js";
7
+ import { generateClaudeCodeSkills } from "../adapters/claude-code.js";
8
+ import { generateCursorCommands } from "../adapters/cursor.js";
9
+ import { generateAgentsMd as generateAgentsMdAdapter } from "../adapters/agents-md.js";
10
+ // ── Filesystem helpers (testable, accept root) ───────────────────────
11
+ export function createGitwhyDir(root) {
12
+ const gitwhyDir = path.join(root, ".gitwhy");
13
+ const changesDir = path.join(gitwhyDir, "changes");
14
+ const archiveDir = path.join(gitwhyDir, "archive");
15
+ const debugDir = path.join(gitwhyDir, "debug");
16
+ fs.mkdirSync(changesDir, { recursive: true });
17
+ fs.mkdirSync(archiveDir, { recursive: true });
18
+ fs.mkdirSync(debugDir, { recursive: true });
19
+ }
20
+ export function writeConfigYaml(root, opts) {
21
+ const config = {
22
+ version: "1.0",
23
+ project: {
24
+ name: opts.projectName,
25
+ description: opts.projectDescription || "",
26
+ },
27
+ context: "# Describe your tech stack and conventions here\n" +
28
+ "# Example: Next.js 15, Supabase, TypeScript strict mode\n",
29
+ rules: "# Add project-specific rules for AI agents here\n" +
30
+ "# Example: Always use server components by default\n",
31
+ telemetry: opts.telemetry,
32
+ tools: opts.tools,
33
+ };
34
+ const yamlStr = YAML.stringify(config, {
35
+ lineWidth: 0,
36
+ blockQuote: "literal",
37
+ });
38
+ const header = "# WhySpec project configuration\n";
39
+ fs.writeFileSync(path.join(root, ".gitwhy", "config.yaml"), header + yamlStr, "utf-8");
40
+ }
41
+ export function addToGitignore(root) {
42
+ const gitignorePath = path.join(root, ".gitignore");
43
+ const entry = ".gitwhy/";
44
+ if (fs.existsSync(gitignorePath)) {
45
+ const content = fs.readFileSync(gitignorePath, "utf-8");
46
+ // Check if already present (exact line match)
47
+ const lines = content.split("\n");
48
+ if (lines.some((line) => line.trim() === entry)) {
49
+ return; // Already present
50
+ }
51
+ // Append with newline safety
52
+ const separator = content.endsWith("\n") ? "" : "\n";
53
+ fs.writeFileSync(gitignorePath, content + separator + entry + "\n", "utf-8");
54
+ }
55
+ else {
56
+ fs.writeFileSync(gitignorePath, entry + "\n", "utf-8");
57
+ }
58
+ }
59
+ const WHYSPEC_COMMANDS = ["plan", "execute", "capture", "show", "search", "debug"];
60
+ /** Write GeneratedFile[] to disk, creating directories as needed. */
61
+ function writeGeneratedFiles(root, files) {
62
+ for (const file of files) {
63
+ const fullPath = path.join(root, file.path);
64
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
65
+ fs.writeFileSync(fullPath, file.content, "utf-8");
66
+ }
67
+ }
68
+ /**
69
+ * Install authored skill files from skills/ directory if they exist (Agent 5's work).
70
+ * Falls back to adapter-generated placeholders if authored files aren't available.
71
+ */
72
+ function installAuthoredSkills(root, skillsSourceDir) {
73
+ if (!fs.existsSync(skillsSourceDir))
74
+ return false;
75
+ let installed = false;
76
+ for (const cmd of WHYSPEC_COMMANDS) {
77
+ const src = path.join(skillsSourceDir, `whyspec-${cmd}`, "SKILL.md");
78
+ if (fs.existsSync(src)) {
79
+ const dest = path.join(root, ".claude", "skills", `whyspec-${cmd}`);
80
+ fs.mkdirSync(dest, { recursive: true });
81
+ fs.copyFileSync(src, path.join(dest, "SKILL.md"));
82
+ installed = true;
83
+ }
84
+ }
85
+ return installed;
86
+ }
87
+ export function installSkillFiles(root, tools) {
88
+ // Claude Code skills
89
+ if (tools.includes("claude-code")) {
90
+ // Try authored skill files first (production-quality from skills/ directory)
91
+ const skillsDir = path.join(path.dirname(path.dirname(__dirname)), "skills");
92
+ const authoredInstalled = installAuthoredSkills(root, skillsDir);
93
+ if (!authoredInstalled) {
94
+ // Fall back to adapter-generated placeholders
95
+ writeGeneratedFiles(root, generateClaudeCodeSkills());
96
+ }
97
+ }
98
+ // Cursor commands
99
+ if (tools.includes("cursor")) {
100
+ writeGeneratedFiles(root, generateCursorCommands());
101
+ }
102
+ }
103
+ export function generateAgentsMd(root, tools) {
104
+ if (!needsAgentsMd(tools))
105
+ return;
106
+ const files = generateAgentsMdAdapter();
107
+ writeGeneratedFiles(root, files);
108
+ }
109
+ // ── Project detection ────────────────────────────────────────────────
110
+ export function detectProjectName(root) {
111
+ const pkgPath = path.join(root, "package.json");
112
+ if (fs.existsSync(pkgPath)) {
113
+ try {
114
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
115
+ if (typeof pkg.name === "string" && pkg.name) {
116
+ // Strip npm scope prefix
117
+ return pkg.name.replace(/^@[^/]+\//, "");
118
+ }
119
+ }
120
+ catch {
121
+ // Fall through to directory name
122
+ }
123
+ }
124
+ return path.basename(root);
125
+ }
126
+ // ── Main init command ────────────────────────────────────────────────
127
+ export async function runInit() {
128
+ const root = process.cwd();
129
+ const gitwhyDir = path.join(root, ".gitwhy");
130
+ // Guard: already initialized
131
+ if (fs.existsSync(gitwhyDir)) {
132
+ console.log(chalk.yellow("\n WhySpec is already initialized in this directory."));
133
+ console.log(chalk.dim(" .gitwhy/ already exists.\n"));
134
+ return;
135
+ }
136
+ // 1. Telemetry notice
137
+ console.log(renderTelemetryNotice());
138
+ // 2. Welcome screen (includes logo, folder preview, quick start)
139
+ console.log(renderWelcomeScreen());
140
+ // 3. Tool picker
141
+ console.log(chalk.dim(" Press Enter to select tools...\n"));
142
+ const selectedTools = await promptToolPicker();
143
+ if (selectedTools.length === 0) {
144
+ console.log(chalk.yellow(" No tools selected. Using defaults (claude-code).\n"));
145
+ selectedTools.push("claude-code");
146
+ }
147
+ // 4. Create .gitwhy/ structure
148
+ createGitwhyDir(root);
149
+ // 5. Write config.yaml
150
+ const projectName = detectProjectName(root);
151
+ writeConfigYaml(root, {
152
+ projectName,
153
+ projectDescription: "",
154
+ tools: selectedTools,
155
+ telemetry: process.env.WHYSPEC_TELEMETRY !== "0",
156
+ });
157
+ // 6. Add to .gitignore
158
+ addToGitignore(root);
159
+ // 7. Install skill files
160
+ installSkillFiles(root, selectedTools);
161
+ // 8. Generate AGENTS.md
162
+ generateAgentsMd(root, selectedTools);
163
+ // 9. Success message
164
+ console.log(renderSuccessMessage(selectedTools));
165
+ }
166
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * whyspec list — List all active changes with status.
3
+ *
4
+ * --json mode: returns array of change summaries.
5
+ * Non-JSON mode: formatted table with progress bars.
6
+ */
7
+ export interface ChangeListItem {
8
+ name: string;
9
+ files_count: number;
10
+ context_count: number;
11
+ task_progress: {
12
+ completed: number;
13
+ total: number;
14
+ };
15
+ last_modified: string;
16
+ }
17
+ export interface ListJsonOutput {
18
+ changes: ChangeListItem[];
19
+ }
20
+ export declare function listCommand(options: {
21
+ json?: boolean;
22
+ }): Promise<void>;
23
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAsBD,wBAAsB,WAAW,CAC/B,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuEf"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * whyspec list — List all active changes with status.
3
+ *
4
+ * --json mode: returns array of change summaries.
5
+ * Non-JSON mode: formatted table with progress bars.
6
+ */
7
+ import { existsSync, readdirSync, statSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import chalk from "chalk";
10
+ import { listChanges } from "../utils/changes.js";
11
+ import { readMarkdown } from "../core/storage.js";
12
+ import { parseTasks } from "./execute.js";
13
+ /**
14
+ * Get the most recent modification time from all files in a directory.
15
+ */
16
+ function getLastModified(dirPath) {
17
+ let latest = new Date(0);
18
+ if (!existsSync(dirPath))
19
+ return latest;
20
+ const entries = readdirSync(dirPath);
21
+ for (const entry of entries) {
22
+ const fullPath = join(dirPath, entry);
23
+ try {
24
+ const stat = statSync(fullPath);
25
+ if (stat.mtime > latest)
26
+ latest = stat.mtime;
27
+ }
28
+ catch {
29
+ // Skip files we can't stat.
30
+ }
31
+ }
32
+ return latest;
33
+ }
34
+ export async function listCommand(options) {
35
+ const gitwhyDir = join(process.cwd(), ".gitwhy");
36
+ const changes = listChanges(gitwhyDir);
37
+ if (changes.length === 0) {
38
+ if (options.json) {
39
+ console.log(JSON.stringify({ changes: [] }, null, 2));
40
+ }
41
+ else {
42
+ console.log(chalk.yellow("No active changes. Run `whyspec plan <name>` to create one."));
43
+ }
44
+ return;
45
+ }
46
+ const items = [];
47
+ for (const name of changes) {
48
+ const changeDir = join(gitwhyDir, "changes", name);
49
+ // Count known files.
50
+ const knownFiles = ["intent.md", "design.md", "tasks.md", "debug.md"];
51
+ let filesCount = 0;
52
+ for (const f of knownFiles) {
53
+ if (existsSync(join(changeDir, f)))
54
+ filesCount++;
55
+ }
56
+ // Count ctx_*.md files.
57
+ const ctxFiles = existsSync(changeDir)
58
+ ? readdirSync(changeDir).filter((f) => f.startsWith("ctx_") && f.endsWith(".md"))
59
+ : [];
60
+ const contextCount = ctxFiles.length;
61
+ filesCount += contextCount;
62
+ // Parse task progress.
63
+ const tasksContent = readMarkdown(changeDir, "tasks.md");
64
+ const { progress } = parseTasks(tasksContent ?? "");
65
+ const lastModified = getLastModified(changeDir);
66
+ items.push({
67
+ name,
68
+ files_count: filesCount,
69
+ context_count: contextCount,
70
+ task_progress: { completed: progress.completed, total: progress.total },
71
+ last_modified: lastModified.toISOString(),
72
+ });
73
+ }
74
+ if (options.json) {
75
+ console.log(JSON.stringify({ changes: items }, null, 2));
76
+ return;
77
+ }
78
+ // Non-JSON mode: formatted table.
79
+ console.log(chalk.bold("Active changes:"));
80
+ console.log();
81
+ for (const item of items) {
82
+ const { completed, total } = item.task_progress;
83
+ const pct = total > 0 ? Math.round((completed / total) * 100) : 0;
84
+ const barLen = 15;
85
+ const filled = Math.round((pct / 100) * barLen);
86
+ const bar = total > 0
87
+ ? chalk.green("█".repeat(filled)) + chalk.dim("░".repeat(barLen - filled))
88
+ : chalk.dim("░".repeat(barLen));
89
+ const ctxBadge = item.context_count > 0 ? chalk.cyan(` [${item.context_count} ctx]`) : "";
90
+ const progressStr = total > 0 ? ` ${pct}% (${completed}/${total})` : "";
91
+ console.log(` ${chalk.bold(item.name)}${ctxBadge}`);
92
+ console.log(` ${bar}${progressStr} ${chalk.dim(`${item.files_count} files`)}`);
93
+ }
94
+ }
95
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * whyspec plan — Create a change plan with intent, design, and tasks.
3
+ *
4
+ * --json mode: returns templates + context/rules for agent consumption (no files created).
5
+ * Non-JSON mode: creates .gitwhy/changes/<name>/ with 3 template files.
6
+ */
7
+ export interface PlanJsonOutput {
8
+ path: string;
9
+ templates: {
10
+ intent: string;
11
+ design: string;
12
+ tasks: string;
13
+ };
14
+ context: string;
15
+ rules: string;
16
+ }
17
+ export declare function planCommand(name: string, options: {
18
+ json?: boolean;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * whyspec plan — Create a change plan with intent, design, and tasks.
3
+ *
4
+ * --json mode: returns templates + context/rules for agent consumption (no files created).
5
+ * Non-JSON mode: creates .gitwhy/changes/<name>/ with 3 template files.
6
+ */
7
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import chalk from "chalk";
10
+ import { slugify } from "../utils/slugify.js";
11
+ import { readConfig } from "../core/config.js";
12
+ import { intentTemplate, designTemplate, tasksTemplate, } from "../core/templates.js";
13
+ export async function planCommand(name, options) {
14
+ const slug = slugify(name);
15
+ const gitwhyDir = join(process.cwd(), ".gitwhy");
16
+ const changePath = join(gitwhyDir, "changes", slug);
17
+ // Duplicate detection
18
+ if (existsSync(changePath)) {
19
+ throw new Error(`Change "${slug}" already exists at ${changePath}`);
20
+ }
21
+ const config = readConfig(process.cwd());
22
+ if (options.json) {
23
+ // JSON mode: return structured data, don't create files
24
+ const output = {
25
+ path: `.gitwhy/changes/${slug}`,
26
+ templates: {
27
+ intent: intentTemplate(slug),
28
+ design: designTemplate(slug),
29
+ tasks: tasksTemplate(slug),
30
+ },
31
+ context: config.context ?? "",
32
+ rules: config.rules ?? "",
33
+ };
34
+ console.log(JSON.stringify(output, null, 2));
35
+ return;
36
+ }
37
+ // Non-JSON mode: create directory and files
38
+ mkdirSync(changePath, { recursive: true });
39
+ // Write start anchor for commit tracking (used by capture to scope commits)
40
+ writeFileSync(join(changePath, ".started"), new Date().toISOString());
41
+ writeFileSync(join(changePath, "intent.md"), intentTemplate(slug));
42
+ writeFileSync(join(changePath, "design.md"), designTemplate(slug));
43
+ writeFileSync(join(changePath, "tasks.md"), tasksTemplate(slug));
44
+ console.log(chalk.green("Created change plan:") + ` ${slug}`);
45
+ console.log(` ${chalk.dim("path:")} .gitwhy/changes/${slug}/`);
46
+ console.log(` ${chalk.dim("files:")} intent.md, design.md, tasks.md`);
47
+ }
48
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAC;AAa9B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,OAA2B;IAE3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAEpD,sBAAsB;IACtB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,uBAAuB,UAAU,EAAE,CACnD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEzC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,wDAAwD;QACxD,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,mBAAmB,IAAI,EAAE;YAC/B,SAAS,EAAE;gBACT,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC;gBAC5B,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC;aAC3B;YACD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SAC1B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,4CAA4C;IAC5C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACtE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * whyspec search — Search past decisions and reasoning across all changes.
3
+ *
4
+ * --json mode: returns scored results array.
5
+ * Non-JSON mode: formatted output with color-coded scores and snippets.
6
+ */
7
+ export declare function searchCommand(query: string, options: {
8
+ json?: boolean;
9
+ domain?: string;
10
+ limit?: number;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * whyspec search — Search past decisions and reasoning across all changes.
3
+ *
4
+ * --json mode: returns scored results array.
5
+ * Non-JSON mode: formatted output with color-coded scores and snippets.
6
+ */
7
+ import chalk from "chalk";
8
+ import { searchChanges } from "../core/search.js";
9
+ export async function searchCommand(query, options) {
10
+ const repoRoot = process.cwd();
11
+ const parsed = Number.parseInt(String(options.limit ?? ""), 10);
12
+ const limit = Number.isFinite(parsed) && parsed > 0 ? parsed : 10;
13
+ const results = searchChanges(repoRoot, query, {
14
+ domain: options.domain,
15
+ limit,
16
+ });
17
+ if (options.json) {
18
+ console.log(JSON.stringify(results, null, 2));
19
+ return;
20
+ }
21
+ if (results.length === 0) {
22
+ console.log(chalk.yellow(`No results found for "${query}"`));
23
+ return;
24
+ }
25
+ console.log(chalk.bold(`Search results for "${query}"`) + chalk.dim(` (${results.length} matches)`));
26
+ console.log();
27
+ for (const r of results) {
28
+ const scoreColor = r.score >= 100 ? chalk.green : r.score >= 30 ? chalk.yellow : chalk.dim;
29
+ const scoreStr = scoreColor(`[${r.score}]`);
30
+ const sections = chalk.dim(`(${r.matched_sections.join(", ")})`);
31
+ console.log(` ${scoreStr} ${chalk.bold(r.change_name)} ${chalk.dim("/")} ${r.title} ${sections}`);
32
+ console.log(` ${chalk.dim(r.snippet)}`);
33
+ console.log();
34
+ }
35
+ }
36
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,OAA4D;IAE5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE;QAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3F,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * whyspec show — Display the full story of a change with Decision Bridge delta.
3
+ *
4
+ * --json mode: returns all file contents + decision bridge delta.
5
+ * Non-JSON mode: formatted markdown output with sections and color-coded Decision Bridge.
6
+ */
7
+ export interface ShowJsonOutput {
8
+ change_name: string;
9
+ intent: string;
10
+ design: string;
11
+ tasks: string;
12
+ contexts: Array<{
13
+ id: string;
14
+ content: string;
15
+ }>;
16
+ decision_bridge_delta: {
17
+ planned: string[];
18
+ decided: string[];
19
+ surprises: string[];
20
+ };
21
+ }
22
+ export declare function showCommand(name: string, options: {
23
+ json?: boolean;
24
+ }): Promise<void>;
25
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,qBAAqB,EAAE;QACrB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAyCD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgHf"}