@gitwhy-cli/whyspec 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/capture.d.ts +4 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +37 -25
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/debug.d.ts.map +1 -1
- package/dist/commands/debug.js +5 -0
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +9 -4
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/ensure-gitwhy-dir.d.ts +2 -0
- package/dist/core/ensure-gitwhy-dir.d.ts.map +1 -0
- package/dist/core/ensure-gitwhy-dir.js +18 -0
- package/dist/core/ensure-gitwhy-dir.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* whyspec capture — Capture reasoning context for a change.
|
|
3
3
|
*
|
|
4
|
-
* --json mode: returns XML template + commits + files + Decision Bridge data
|
|
4
|
+
* --json mode: returns XML template + commits + files + Decision Bridge data
|
|
5
|
+
* and still writes ctx_<id>.md for agent workflows.
|
|
5
6
|
* Non-JSON mode: writes ctx_<id>.md with metadata header + XML template.
|
|
6
7
|
*/
|
|
7
8
|
export interface CaptureJsonOutput {
|
|
@@ -11,6 +12,8 @@ export interface CaptureJsonOutput {
|
|
|
11
12
|
decisions_to_make: string[];
|
|
12
13
|
change_name: string;
|
|
13
14
|
change_path: string;
|
|
15
|
+
context_id: string;
|
|
16
|
+
file_path: string;
|
|
14
17
|
}
|
|
15
18
|
export declare function captureCommand(name: string | undefined, options: {
|
|
16
19
|
json?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoCD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CA+Df"}
|
package/dist/commands/capture.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* whyspec capture — Capture reasoning context for a change.
|
|
3
3
|
*
|
|
4
|
-
* --json mode: returns XML template + commits + files + Decision Bridge data
|
|
4
|
+
* --json mode: returns XML template + commits + files + Decision Bridge data
|
|
5
|
+
* and still writes ctx_<id>.md for agent workflows.
|
|
5
6
|
* Non-JSON mode: writes ctx_<id>.md with metadata header + XML template.
|
|
6
7
|
*/
|
|
7
8
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
@@ -9,14 +10,38 @@ import { join } from "node:path";
|
|
|
9
10
|
import chalk from "chalk";
|
|
10
11
|
import { resolveChange } from "../utils/changes.js";
|
|
11
12
|
import { getCurrentBranch, getCommitsSince, getFilesChanged, getRemoteUrl } from "../utils/git.js";
|
|
13
|
+
import { ensureGitwhyDir } from "../core/ensure-gitwhy-dir.js";
|
|
12
14
|
import { generateContextId, renderContextXml, extractDecisions, getChangeFolderCreatedAt, } from "../core/context.js";
|
|
13
15
|
function readFileOrEmpty(filePath) {
|
|
14
16
|
if (!existsSync(filePath))
|
|
15
17
|
return "";
|
|
16
18
|
return readFileSync(filePath, "utf-8");
|
|
17
19
|
}
|
|
20
|
+
function buildContextFile(changeName, contextId, template, commits) {
|
|
21
|
+
const branch = getCurrentBranch();
|
|
22
|
+
const repository = getRemoteUrl();
|
|
23
|
+
const commitList = commits.length > 0 ? commits.map((c) => c.slice(0, 7)).join(", ") : "none";
|
|
24
|
+
const metadataHeader = [
|
|
25
|
+
`# ${changeName}`,
|
|
26
|
+
"",
|
|
27
|
+
`**Context ID:** ${contextId}`,
|
|
28
|
+
`**Agent:** whyspec`,
|
|
29
|
+
...(repository ? [`**Repository:** ${repository}`] : []),
|
|
30
|
+
`**Branch:** ${branch}`,
|
|
31
|
+
`**Date:** ${new Date().toISOString()}`,
|
|
32
|
+
`**Change:** ${changeName}`,
|
|
33
|
+
`**Intent:** .gitwhy/changes/${changeName}/intent.md`,
|
|
34
|
+
`**Commits:** ${commitList}`,
|
|
35
|
+
"",
|
|
36
|
+
"---",
|
|
37
|
+
"",
|
|
38
|
+
].join("\n");
|
|
39
|
+
return metadataHeader + template + "\n";
|
|
40
|
+
}
|
|
18
41
|
export async function captureCommand(name, options) {
|
|
19
|
-
const
|
|
42
|
+
const repoRoot = process.cwd();
|
|
43
|
+
const gitwhyDir = join(repoRoot, ".gitwhy");
|
|
44
|
+
ensureGitwhyDir(repoRoot);
|
|
20
45
|
const change = resolveChange(gitwhyDir, name);
|
|
21
46
|
// Read planning artifacts
|
|
22
47
|
const intentContent = readFileOrEmpty(join(change.path, "intent.md"));
|
|
@@ -37,42 +62,29 @@ export async function captureCommand(name, options) {
|
|
|
37
62
|
catch {
|
|
38
63
|
// Gracefully handle if git operations fail
|
|
39
64
|
}
|
|
65
|
+
const template = renderContextXml();
|
|
66
|
+
const contextId = generateContextId();
|
|
67
|
+
const fileName = `${contextId}.md`;
|
|
68
|
+
const filePath = join(change.path, fileName);
|
|
69
|
+
const content = buildContextFile(change.name, contextId, template, commits);
|
|
70
|
+
writeFileSync(filePath, content);
|
|
40
71
|
if (options.json) {
|
|
41
72
|
const output = {
|
|
42
|
-
template
|
|
73
|
+
template,
|
|
43
74
|
commits,
|
|
44
75
|
files_changed: filesChanged,
|
|
45
76
|
decisions_to_make: allDecisions,
|
|
46
77
|
change_name: change.name,
|
|
47
78
|
change_path: `.gitwhy/changes/${change.name}`,
|
|
79
|
+
context_id: contextId,
|
|
80
|
+
file_path: `.gitwhy/changes/${change.name}/${fileName}`,
|
|
48
81
|
};
|
|
49
82
|
console.log(JSON.stringify(output, null, 2));
|
|
50
83
|
return;
|
|
51
84
|
}
|
|
52
|
-
// Non-JSON mode:
|
|
53
|
-
const contextId = generateContextId();
|
|
85
|
+
// Non-JSON mode: ctx_<id>.md has already been written above.
|
|
54
86
|
const branch = getCurrentBranch();
|
|
55
|
-
const repository = getRemoteUrl();
|
|
56
87
|
const commitList = commits.length > 0 ? commits.map((c) => c.slice(0, 7)).join(", ") : "none";
|
|
57
|
-
const metadataHeader = [
|
|
58
|
-
`# ${change.name}`,
|
|
59
|
-
"",
|
|
60
|
-
`**Context ID:** ${contextId}`,
|
|
61
|
-
`**Agent:** whyspec`,
|
|
62
|
-
...(repository ? [`**Repository:** ${repository}`] : []),
|
|
63
|
-
`**Branch:** ${branch}`,
|
|
64
|
-
`**Date:** ${new Date().toISOString()}`,
|
|
65
|
-
`**Change:** ${change.name}`,
|
|
66
|
-
`**Intent:** .gitwhy/changes/${change.name}/intent.md`,
|
|
67
|
-
`**Commits:** ${commitList}`,
|
|
68
|
-
"",
|
|
69
|
-
"---",
|
|
70
|
-
"",
|
|
71
|
-
].join("\n");
|
|
72
|
-
const content = metadataHeader + renderContextXml() + "\n";
|
|
73
|
-
const fileName = `${contextId}.md`;
|
|
74
|
-
const filePath = join(change.path, fileName);
|
|
75
|
-
writeFileSync(filePath, content);
|
|
76
88
|
if (allDecisions.length > 0) {
|
|
77
89
|
console.log(chalk.green("\n Decision Bridge resolved:"));
|
|
78
90
|
allDecisions.forEach((d) => console.log(` ${chalk.green("✓")} ${d}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwEf"}
|
package/dist/commands/debug.js
CHANGED
|
@@ -10,6 +10,7 @@ import chalk from "chalk";
|
|
|
10
10
|
import { slugify } from "../utils/slugify.js";
|
|
11
11
|
import { debugTemplate } from "../core/templates.js";
|
|
12
12
|
import { searchChanges } from "../core/search.js";
|
|
13
|
+
import { ensureGitwhyDir } from "../core/ensure-gitwhy-dir.js";
|
|
13
14
|
export async function debugCommand(name, options) {
|
|
14
15
|
if (!name) {
|
|
15
16
|
throw new Error("Bug description is required. Usage: whyspec debug \"description of the bug\"");
|
|
@@ -18,6 +19,7 @@ export async function debugCommand(name, options) {
|
|
|
18
19
|
const slug = slugify(name);
|
|
19
20
|
const gitwhyDir = join(repoRoot, ".gitwhy");
|
|
20
21
|
const changePath = join(gitwhyDir, "changes", slug);
|
|
22
|
+
ensureGitwhyDir(repoRoot);
|
|
21
23
|
// Quick search for related contexts using first few words of the bug name.
|
|
22
24
|
const searchQuery = name.split(/\s+/).slice(0, 3).join(" ");
|
|
23
25
|
let relatedContexts = [];
|
|
@@ -40,6 +42,9 @@ export async function debugCommand(name, options) {
|
|
|
40
42
|
}
|
|
41
43
|
}
|
|
42
44
|
if (options.json) {
|
|
45
|
+
mkdirSync(changePath, { recursive: true });
|
|
46
|
+
writeFileSync(join(changePath, ".started"), new Date().toISOString());
|
|
47
|
+
writeFileSync(join(changePath, "debug.md"), fullTemplate);
|
|
43
48
|
const output = {
|
|
44
49
|
path: `.gitwhy/changes/${slug}`,
|
|
45
50
|
template: fullTemplate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAqB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/plan.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* whyspec plan — Create a change plan with intent, design, and tasks.
|
|
3
3
|
*
|
|
4
|
-
* --json mode: returns templates + context/rules for agent consumption
|
|
4
|
+
* --json mode: returns templates + context/rules for agent consumption and
|
|
5
|
+
* creates the change directory anchor for agent workflows.
|
|
5
6
|
* Non-JSON mode: creates .gitwhy/changes/<name>/ with 3 template files.
|
|
6
7
|
*/
|
|
7
8
|
export interface PlanJsonOutput {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,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,CAuDf"}
|
package/dist/commands/plan.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* whyspec plan — Create a change plan with intent, design, and tasks.
|
|
3
3
|
*
|
|
4
|
-
* --json mode: returns templates + context/rules for agent consumption
|
|
4
|
+
* --json mode: returns templates + context/rules for agent consumption and
|
|
5
|
+
* creates the change directory anchor for agent workflows.
|
|
5
6
|
* Non-JSON mode: creates .gitwhy/changes/<name>/ with 3 template files.
|
|
6
7
|
*/
|
|
7
8
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
@@ -9,18 +10,22 @@ import { join } from "node:path";
|
|
|
9
10
|
import chalk from "chalk";
|
|
10
11
|
import { slugify } from "../utils/slugify.js";
|
|
11
12
|
import { readConfig } from "../core/config.js";
|
|
13
|
+
import { ensureGitwhyDir } from "../core/ensure-gitwhy-dir.js";
|
|
12
14
|
import { intentTemplate, designTemplate, tasksTemplate, } from "../core/templates.js";
|
|
13
15
|
export async function planCommand(name, options) {
|
|
16
|
+
const repoRoot = process.cwd();
|
|
14
17
|
const slug = slugify(name);
|
|
15
|
-
const gitwhyDir = join(
|
|
18
|
+
const gitwhyDir = join(repoRoot, ".gitwhy");
|
|
16
19
|
const changePath = join(gitwhyDir, "changes", slug);
|
|
20
|
+
ensureGitwhyDir(repoRoot);
|
|
17
21
|
// Duplicate detection
|
|
18
22
|
if (existsSync(changePath)) {
|
|
19
23
|
throw new Error(`Change "${slug}" already exists at ${changePath}`);
|
|
20
24
|
}
|
|
21
|
-
const config = readConfig(
|
|
25
|
+
const config = readConfig(repoRoot);
|
|
22
26
|
if (options.json) {
|
|
23
|
-
|
|
27
|
+
mkdirSync(changePath, { recursive: true });
|
|
28
|
+
writeFileSync(join(changePath, ".started"), new Date().toISOString());
|
|
24
29
|
const output = {
|
|
25
30
|
path: `.gitwhy/changes/${slug}`,
|
|
26
31
|
templates: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-gitwhy-dir.d.ts","sourceRoot":"","sources":["../../src/core/ensure-gitwhy-dir.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAclD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createGitwhyDir, detectProjectName, writeConfigYaml, } from "../commands/init.js";
|
|
4
|
+
export function ensureGitwhyDir(root) {
|
|
5
|
+
const gitwhyDir = join(root, ".gitwhy");
|
|
6
|
+
if (existsSync(gitwhyDir)) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
createGitwhyDir(root);
|
|
10
|
+
writeConfigYaml(root, {
|
|
11
|
+
projectName: detectProjectName(root),
|
|
12
|
+
projectDescription: "",
|
|
13
|
+
tools: ["claude-code"],
|
|
14
|
+
telemetry: process.env.WHYSPEC_TELEMETRY !== "0",
|
|
15
|
+
});
|
|
16
|
+
process.stderr.write("Auto-initialized .gitwhy/\n");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ensure-gitwhy-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-gitwhy-dir.js","sourceRoot":"","sources":["../../src/core/ensure-gitwhy-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,eAAe,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,iBAAiB,CAAC,IAAI,CAAC;QACpC,kBAAkB,EAAE,EAAE;QACtB,KAAK,EAAE,CAAC,aAAa,CAAC;QACtB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG;KACjD,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACtD,CAAC"}
|
package/package.json
CHANGED