@kiwidata/grimoire 0.1.1

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 (215) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/AGENTS.md +217 -0
  3. package/README.md +748 -0
  4. package/bin/grimoire.js +2 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +42 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/commands/archive.d.ts +3 -0
  10. package/dist/commands/archive.d.ts.map +1 -0
  11. package/dist/commands/archive.js +22 -0
  12. package/dist/commands/archive.js.map +1 -0
  13. package/dist/commands/branch-check.d.ts +3 -0
  14. package/dist/commands/branch-check.d.ts.map +1 -0
  15. package/dist/commands/branch-check.js +16 -0
  16. package/dist/commands/branch-check.js.map +1 -0
  17. package/dist/commands/check.d.ts +3 -0
  18. package/dist/commands/check.d.ts.map +1 -0
  19. package/dist/commands/check.js +22 -0
  20. package/dist/commands/check.js.map +1 -0
  21. package/dist/commands/ci.d.ts +3 -0
  22. package/dist/commands/ci.d.ts.map +1 -0
  23. package/dist/commands/ci.js +18 -0
  24. package/dist/commands/ci.js.map +1 -0
  25. package/dist/commands/diff.d.ts +3 -0
  26. package/dist/commands/diff.d.ts.map +1 -0
  27. package/dist/commands/diff.js +10 -0
  28. package/dist/commands/diff.js.map +1 -0
  29. package/dist/commands/docs.d.ts +3 -0
  30. package/dist/commands/docs.d.ts.map +1 -0
  31. package/dist/commands/docs.js +11 -0
  32. package/dist/commands/docs.js.map +1 -0
  33. package/dist/commands/health.d.ts +3 -0
  34. package/dist/commands/health.d.ts.map +1 -0
  35. package/dist/commands/health.js +13 -0
  36. package/dist/commands/health.js.map +1 -0
  37. package/dist/commands/init.d.ts +3 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +21 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/list.d.ts +3 -0
  42. package/dist/commands/list.d.ts.map +1 -0
  43. package/dist/commands/list.js +22 -0
  44. package/dist/commands/list.js.map +1 -0
  45. package/dist/commands/log.d.ts +3 -0
  46. package/dist/commands/log.d.ts.map +1 -0
  47. package/dist/commands/log.js +15 -0
  48. package/dist/commands/log.js.map +1 -0
  49. package/dist/commands/map.d.ts +3 -0
  50. package/dist/commands/map.d.ts.map +1 -0
  51. package/dist/commands/map.js +17 -0
  52. package/dist/commands/map.js.map +1 -0
  53. package/dist/commands/pr.d.ts +3 -0
  54. package/dist/commands/pr.d.ts.map +1 -0
  55. package/dist/commands/pr.js +17 -0
  56. package/dist/commands/pr.js.map +1 -0
  57. package/dist/commands/status.d.ts +3 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +12 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/test-quality.d.ts +3 -0
  62. package/dist/commands/test-quality.d.ts.map +1 -0
  63. package/dist/commands/test-quality.js +37 -0
  64. package/dist/commands/test-quality.js.map +1 -0
  65. package/dist/commands/trace.d.ts +3 -0
  66. package/dist/commands/trace.d.ts.map +1 -0
  67. package/dist/commands/trace.js +12 -0
  68. package/dist/commands/trace.js.map +1 -0
  69. package/dist/commands/update.d.ts +3 -0
  70. package/dist/commands/update.d.ts.map +1 -0
  71. package/dist/commands/update.js +22 -0
  72. package/dist/commands/update.js.map +1 -0
  73. package/dist/commands/validate.d.ts +3 -0
  74. package/dist/commands/validate.d.ts.map +1 -0
  75. package/dist/commands/validate.js +17 -0
  76. package/dist/commands/validate.js.map +1 -0
  77. package/dist/core/archive.d.ts +9 -0
  78. package/dist/core/archive.d.ts.map +1 -0
  79. package/dist/core/archive.js +92 -0
  80. package/dist/core/archive.js.map +1 -0
  81. package/dist/core/branch-check.d.ts +27 -0
  82. package/dist/core/branch-check.d.ts.map +1 -0
  83. package/dist/core/branch-check.js +205 -0
  84. package/dist/core/branch-check.js.map +1 -0
  85. package/dist/core/check.d.ts +24 -0
  86. package/dist/core/check.d.ts.map +1 -0
  87. package/dist/core/check.js +372 -0
  88. package/dist/core/check.js.map +1 -0
  89. package/dist/core/ci.d.ts +24 -0
  90. package/dist/core/ci.d.ts.map +1 -0
  91. package/dist/core/ci.js +162 -0
  92. package/dist/core/ci.js.map +1 -0
  93. package/dist/core/detect.d.ts +10 -0
  94. package/dist/core/detect.d.ts.map +1 -0
  95. package/dist/core/detect.js +368 -0
  96. package/dist/core/detect.js.map +1 -0
  97. package/dist/core/diff.d.ts +29 -0
  98. package/dist/core/diff.d.ts.map +1 -0
  99. package/dist/core/diff.js +197 -0
  100. package/dist/core/diff.js.map +1 -0
  101. package/dist/core/doc-style.d.ts +16 -0
  102. package/dist/core/doc-style.d.ts.map +1 -0
  103. package/dist/core/doc-style.js +192 -0
  104. package/dist/core/doc-style.js.map +1 -0
  105. package/dist/core/docs.d.ts +6 -0
  106. package/dist/core/docs.d.ts.map +1 -0
  107. package/dist/core/docs.js +478 -0
  108. package/dist/core/docs.js.map +1 -0
  109. package/dist/core/health.d.ts +7 -0
  110. package/dist/core/health.d.ts.map +1 -0
  111. package/dist/core/health.js +489 -0
  112. package/dist/core/health.js.map +1 -0
  113. package/dist/core/hooks.d.ts +5 -0
  114. package/dist/core/hooks.d.ts.map +1 -0
  115. package/dist/core/hooks.js +168 -0
  116. package/dist/core/hooks.js.map +1 -0
  117. package/dist/core/init.d.ts +9 -0
  118. package/dist/core/init.d.ts.map +1 -0
  119. package/dist/core/init.js +563 -0
  120. package/dist/core/init.js.map +1 -0
  121. package/dist/core/list.d.ts +4 -0
  122. package/dist/core/list.d.ts.map +1 -0
  123. package/dist/core/list.js +170 -0
  124. package/dist/core/list.js.map +1 -0
  125. package/dist/core/log.d.ts +8 -0
  126. package/dist/core/log.d.ts.map +1 -0
  127. package/dist/core/log.js +150 -0
  128. package/dist/core/log.js.map +1 -0
  129. package/dist/core/map.d.ts +9 -0
  130. package/dist/core/map.d.ts.map +1 -0
  131. package/dist/core/map.js +302 -0
  132. package/dist/core/map.js.map +1 -0
  133. package/dist/core/pr.d.ts +9 -0
  134. package/dist/core/pr.d.ts.map +1 -0
  135. package/dist/core/pr.js +273 -0
  136. package/dist/core/pr.js.map +1 -0
  137. package/dist/core/shared-setup.d.ts +52 -0
  138. package/dist/core/shared-setup.d.ts.map +1 -0
  139. package/dist/core/shared-setup.js +221 -0
  140. package/dist/core/shared-setup.js.map +1 -0
  141. package/dist/core/status.d.ts +6 -0
  142. package/dist/core/status.d.ts.map +1 -0
  143. package/dist/core/status.js +114 -0
  144. package/dist/core/status.js.map +1 -0
  145. package/dist/core/test-quality.d.ts +33 -0
  146. package/dist/core/test-quality.d.ts.map +1 -0
  147. package/dist/core/test-quality.js +378 -0
  148. package/dist/core/test-quality.js.map +1 -0
  149. package/dist/core/trace.d.ts +6 -0
  150. package/dist/core/trace.d.ts.map +1 -0
  151. package/dist/core/trace.js +211 -0
  152. package/dist/core/trace.js.map +1 -0
  153. package/dist/core/update.d.ts +10 -0
  154. package/dist/core/update.d.ts.map +1 -0
  155. package/dist/core/update.js +149 -0
  156. package/dist/core/update.js.map +1 -0
  157. package/dist/core/validate.d.ts +20 -0
  158. package/dist/core/validate.d.ts.map +1 -0
  159. package/dist/core/validate.js +275 -0
  160. package/dist/core/validate.js.map +1 -0
  161. package/dist/index.d.ts +19 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +20 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/utils/config.d.ts +61 -0
  166. package/dist/utils/config.d.ts.map +1 -0
  167. package/dist/utils/config.js +172 -0
  168. package/dist/utils/config.js.map +1 -0
  169. package/dist/utils/fs.d.ts +17 -0
  170. package/dist/utils/fs.d.ts.map +1 -0
  171. package/dist/utils/fs.js +38 -0
  172. package/dist/utils/fs.js.map +1 -0
  173. package/dist/utils/paths.d.ts +10 -0
  174. package/dist/utils/paths.d.ts.map +1 -0
  175. package/dist/utils/paths.js +35 -0
  176. package/dist/utils/paths.js.map +1 -0
  177. package/dist/utils/spawn.d.ts +5 -0
  178. package/dist/utils/spawn.d.ts.map +1 -0
  179. package/dist/utils/spawn.js +34 -0
  180. package/dist/utils/spawn.js.map +1 -0
  181. package/package.json +68 -0
  182. package/skills/grimoire-apply/SKILL.md +274 -0
  183. package/skills/grimoire-audit/SKILL.md +129 -0
  184. package/skills/grimoire-branch-guard/SKILL.md +111 -0
  185. package/skills/grimoire-bug/SKILL.md +160 -0
  186. package/skills/grimoire-bug-explore/SKILL.md +242 -0
  187. package/skills/grimoire-bug-report/SKILL.md +237 -0
  188. package/skills/grimoire-bug-session/SKILL.md +222 -0
  189. package/skills/grimoire-bug-triage/SKILL.md +274 -0
  190. package/skills/grimoire-commit/SKILL.md +150 -0
  191. package/skills/grimoire-discover/SKILL.md +297 -0
  192. package/skills/grimoire-draft/SKILL.md +202 -0
  193. package/skills/grimoire-plan/SKILL.md +329 -0
  194. package/skills/grimoire-pr/SKILL.md +134 -0
  195. package/skills/grimoire-pr-review/SKILL.md +240 -0
  196. package/skills/grimoire-refactor/SKILL.md +251 -0
  197. package/skills/grimoire-remove/SKILL.md +112 -0
  198. package/skills/grimoire-review/SKILL.md +247 -0
  199. package/skills/grimoire-verify/SKILL.md +223 -0
  200. package/skills/references/bug-classification.md +154 -0
  201. package/skills/references/build-vs-buy.md +77 -0
  202. package/skills/references/elicitation-personas.md +118 -0
  203. package/skills/references/refactor-register-format.md +88 -0
  204. package/skills/references/refactor-scan-categories.md +102 -0
  205. package/skills/references/schema-format.md +68 -0
  206. package/skills/references/security-compliance.md +110 -0
  207. package/skills/references/testing-contracts.md +93 -0
  208. package/templates/context.yml +110 -0
  209. package/templates/debt-exceptions.yml +61 -0
  210. package/templates/decision.md +50 -0
  211. package/templates/dupignore +93 -0
  212. package/templates/example.feature +24 -0
  213. package/templates/manifest.md +29 -0
  214. package/templates/mapignore +58 -0
  215. package/templates/mapkeys +65 -0
@@ -0,0 +1,17 @@
1
+ import { Command } from "commander";
2
+ import { validateChange } from "../core/validate.js";
3
+ export const validateCommand = new Command("validate")
4
+ .description("Validate features and decisions in a change")
5
+ .argument("[change-id]", "Change to validate (validates all if omitted)")
6
+ .option("--strict", "Enable strict validation")
7
+ .option("--json", "Output as JSON")
8
+ .action(async (changeId, options) => {
9
+ const { errorCount } = await validateChange(changeId, {
10
+ strict: options.strict ?? false,
11
+ json: options.json ?? false,
12
+ });
13
+ if (errorCount > 0) {
14
+ process.exit(1);
15
+ }
16
+ });
17
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,6CAA6C,CAAC;KAC1D,QAAQ,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACxE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,QAA4B,EAAE,OAAO,EAAE,EAAE;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE;QACpD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;KAC5B,CAAC,CAAC;IACH,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface ArchiveOptions {
2
+ yes: boolean;
3
+ }
4
+ export declare class ArchiveError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare function archiveChange(changeId: string, options: ArchiveOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAgHf"}
@@ -0,0 +1,92 @@
1
+ import { readFile, mkdir, cp, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import chalk from "chalk";
4
+ import { findProjectRoot, resolveChangePath } from "../utils/paths.js";
5
+ export class ArchiveError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = "ArchiveError";
9
+ }
10
+ }
11
+ export async function archiveChange(changeId, options) {
12
+ const root = await findProjectRoot();
13
+ const changePath = resolveChangePath(root, changeId);
14
+ // Check change exists
15
+ try {
16
+ await readFile(join(changePath, "manifest.md"), "utf-8");
17
+ }
18
+ catch {
19
+ throw new ArchiveError(`Change "${changeId}" not found or missing manifest.`);
20
+ }
21
+ // Check tasks are complete
22
+ try {
23
+ const tasksContent = await readFile(join(changePath, "tasks.md"), "utf-8");
24
+ const pending = tasksContent.match(/^- \[ \] .+$/gm) || [];
25
+ if (pending.length > 0) {
26
+ console.log(chalk.yellow(`Warning: ${pending.length} task(s) still pending.`));
27
+ if (!options.yes) {
28
+ throw new ArchiveError("Use --yes to archive anyway, or complete tasks first.");
29
+ }
30
+ }
31
+ }
32
+ catch (err) {
33
+ if (err instanceof ArchiveError)
34
+ throw err;
35
+ // No tasks file — that's ok for archiving
36
+ }
37
+ // Confirmation
38
+ if (!options.yes) {
39
+ const readline = await import("node:readline/promises");
40
+ const rl = readline.createInterface({
41
+ input: process.stdin,
42
+ output: process.stdout,
43
+ });
44
+ const answer = await rl.question(`Archive change "${changeId}"? (y/N) `);
45
+ rl.close();
46
+ if (answer.toLowerCase() !== "y") {
47
+ console.log("Cancelled.");
48
+ return;
49
+ }
50
+ }
51
+ // Copy proposed features to baseline
52
+ const proposedFeatures = join(changePath, "features");
53
+ try {
54
+ await cp(proposedFeatures, join(root, "features"), {
55
+ recursive: true,
56
+ force: true,
57
+ });
58
+ console.log(` ${chalk.green("synced")} features to baseline`);
59
+ }
60
+ catch {
61
+ // No proposed features
62
+ }
63
+ // Copy proposed decisions to baseline
64
+ const proposedDecisions = join(changePath, "decisions");
65
+ try {
66
+ // TODO: handle sequential numbering for new decisions
67
+ await cp(proposedDecisions, join(root, ".grimoire", "decisions"), {
68
+ recursive: true,
69
+ force: true,
70
+ });
71
+ console.log(` ${chalk.green("synced")} decisions to baseline`);
72
+ }
73
+ catch {
74
+ // No proposed decisions
75
+ }
76
+ // Move manifest to archive
77
+ const date = new Date().toISOString().split("T")[0];
78
+ const archiveDir = join(root, ".grimoire", "archive", `${date}-${changeId}`);
79
+ await mkdir(archiveDir, { recursive: true });
80
+ await cp(join(changePath, "manifest.md"), join(archiveDir, "manifest.md"));
81
+ // Copy tasks.md to archive if it exists
82
+ try {
83
+ await cp(join(changePath, "tasks.md"), join(archiveDir, "tasks.md"));
84
+ }
85
+ catch {
86
+ // no tasks
87
+ }
88
+ // Remove change directory
89
+ await rm(changePath, { recursive: true });
90
+ console.log(`\n${chalk.green("Archived")} ${changeId} → .grimoire/archive/${date}-${changeId}/`);
91
+ }
92
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ interface ActiveChange {
2
+ id: string;
3
+ branch: string | null;
4
+ status: string;
5
+ }
6
+ export interface BranchCheckResult {
7
+ triggered: boolean;
8
+ reason?: string;
9
+ suggestion?: string;
10
+ state?: {
11
+ branch: string | null;
12
+ dirty: boolean;
13
+ activeChange: ActiveChange | null;
14
+ protected: boolean;
15
+ };
16
+ }
17
+ export declare function detectNewFeatureIntent(prompt: string): boolean;
18
+ export declare function suggestBranchName(prompt: string): string;
19
+ export declare function evaluateBranchCheck(prompt: string, cwd: string): Promise<BranchCheckResult>;
20
+ interface BranchCheckOptions {
21
+ hook: boolean;
22
+ prompt?: string;
23
+ json: boolean;
24
+ }
25
+ export declare function runBranchCheck(options: BranchCheckOptions): Promise<number>;
26
+ export {};
27
+ //# sourceMappingURL=branch-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-check.d.ts","sourceRoot":"","sources":["../../src/core/branch-check.ts"],"names":[],"mappings":"AA6CA,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,EAAE,OAAO,CAAC;QACf,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;QAClC,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI9D;AAmED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUxD;AAwBD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AAiCD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAcD,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjF"}
@@ -0,0 +1,205 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { readdir, readFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import matter from "gray-matter";
6
+ import { findProjectRoot } from "../utils/paths.js";
7
+ import { fileExists } from "../utils/fs.js";
8
+ const execFileAsync = promisify(execFile);
9
+ const FEATURE_WORD = "(?:feature|capability|functionality)(?![-\\w])";
10
+ const NEW_FEATURE_PATTERNS = [
11
+ new RegExp(`\\b(?:new|add|build|implement|create|start|draft)\\s+(?:a\\s+|an\\s+|another\\s+|the\\s+)?(?:new\\s+)?${FEATURE_WORD}`, "i"),
12
+ new RegExp(`\\b${FEATURE_WORD}\\s+(?:request|idea|proposal)\\b`, "i"),
13
+ /\bi\s+(?:want|need|would\s+like)\s+(?:to\s+)?(?:add|build|implement|create)\b/i,
14
+ new RegExp(`\\blet'?s\\s+(?:add|build|implement|create|start)\\s+(?:a\\s+)?(?:new\\s+)?${FEATURE_WORD}`, "i"),
15
+ new RegExp(`\\b(?:spec|draft)\\s+(?:out\\s+)?(?:a\\s+)?(?:new\\s+)?${FEATURE_WORD}`, "i"),
16
+ ];
17
+ const PROTECTED_BRANCHES = new Set([
18
+ "main",
19
+ "master",
20
+ "develop",
21
+ "trunk",
22
+ ]);
23
+ export function detectNewFeatureIntent(prompt) {
24
+ const trimmed = prompt.trim();
25
+ if (!trimmed)
26
+ return false;
27
+ return NEW_FEATURE_PATTERNS.some((re) => re.test(trimmed));
28
+ }
29
+ async function getBranchState(cwd) {
30
+ let current = null;
31
+ try {
32
+ const { stdout } = await execFileAsync("git", ["branch", "--show-current"], { cwd });
33
+ current = stdout.trim() || null;
34
+ }
35
+ catch {
36
+ current = null;
37
+ }
38
+ let dirty = false;
39
+ try {
40
+ const { stdout } = await execFileAsync("git", ["status", "--porcelain"], { cwd });
41
+ dirty = stdout.split("\n").some((l) => l.trim().length > 0);
42
+ }
43
+ catch {
44
+ dirty = false;
45
+ }
46
+ return { current, dirty };
47
+ }
48
+ async function listActiveChanges(root) {
49
+ const changesDir = join(root, ".grimoire", "changes");
50
+ if (!(await fileExists(changesDir)))
51
+ return [];
52
+ const entries = await readdir(changesDir, { withFileTypes: true });
53
+ const results = [];
54
+ for (const entry of entries) {
55
+ if (!entry.isDirectory())
56
+ continue;
57
+ const manifestPath = join(changesDir, entry.name, "manifest.md");
58
+ if (!(await fileExists(manifestPath)))
59
+ continue;
60
+ try {
61
+ const raw = await readFile(manifestPath, "utf-8");
62
+ const parsed = matter(raw);
63
+ const data = parsed.data;
64
+ results.push({
65
+ id: entry.name,
66
+ branch: data.branch ?? null,
67
+ status: data.status ?? "draft",
68
+ });
69
+ }
70
+ catch {
71
+ // Skip malformed manifests
72
+ }
73
+ }
74
+ return results;
75
+ }
76
+ function findChangeForBranch(changes, branch) {
77
+ if (!branch)
78
+ return null;
79
+ return changes.find((c) => c.branch === branch) ?? null;
80
+ }
81
+ const STOP_WORDS = new Set([
82
+ "a", "an", "the", "to", "for", "of", "in", "on", "with", "and", "or",
83
+ "i", "we", "us", "you", "it", "is", "be", "do", "does", "please", "can",
84
+ "could", "would", "should", "want", "need", "like", "add", "new",
85
+ "build", "implement", "create", "start", "draft", "feature", "let",
86
+ "lets", "make", "have", "has", "that", "this",
87
+ ]);
88
+ export function suggestBranchName(prompt) {
89
+ const words = prompt
90
+ .toLowerCase()
91
+ .replace(/['']/g, "")
92
+ .replace(/[^a-z0-9\s-]/g, " ")
93
+ .split(/\s+/)
94
+ .filter((w) => w.length > 1 && !STOP_WORDS.has(w))
95
+ .slice(0, 4);
96
+ const slug = words.join("-").slice(0, 40) || "new-feature";
97
+ return `feat/${slug}`;
98
+ }
99
+ function collectConcerns(state, activeChange, isProtected, totalChanges) {
100
+ const concerns = [];
101
+ if (state.dirty) {
102
+ concerns.push(`uncommitted changes on '${state.current ?? "(unknown)"}'`);
103
+ }
104
+ if (activeChange) {
105
+ concerns.push(`branch '${state.current}' is tied to active grimoire change '${activeChange.id}' (status: ${activeChange.status})`);
106
+ }
107
+ else if (state.current && !isProtected && totalChanges > 0) {
108
+ concerns.push(`currently on feature branch '${state.current}' but no active grimoire change matches it`);
109
+ }
110
+ return concerns;
111
+ }
112
+ export async function evaluateBranchCheck(prompt, cwd) {
113
+ if (!detectNewFeatureIntent(prompt))
114
+ return { triggered: false };
115
+ let root;
116
+ try {
117
+ root = await findProjectRoot();
118
+ }
119
+ catch {
120
+ root = cwd;
121
+ }
122
+ const [state, changes] = await Promise.all([
123
+ getBranchState(cwd),
124
+ listActiveChanges(root),
125
+ ]);
126
+ const isProtected = state.current ? PROTECTED_BRANCHES.has(state.current) : false;
127
+ const activeChange = findChangeForBranch(changes, state.current);
128
+ const concerns = collectConcerns(state, activeChange, isProtected, changes.length);
129
+ const stateSummary = {
130
+ branch: state.current,
131
+ dirty: state.dirty,
132
+ activeChange,
133
+ protected: isProtected,
134
+ };
135
+ if (concerns.length === 0) {
136
+ return { triggered: false, state: stateSummary };
137
+ }
138
+ return {
139
+ triggered: true,
140
+ reason: `New feature request detected while ${concerns.join(" AND ")}.`,
141
+ suggestion: suggestBranchName(prompt),
142
+ state: stateSummary,
143
+ };
144
+ }
145
+ function readStdin() {
146
+ return new Promise((resolve) => {
147
+ let data = "";
148
+ if (process.stdin.isTTY) {
149
+ resolve("");
150
+ return;
151
+ }
152
+ process.stdin.setEncoding("utf-8");
153
+ process.stdin.on("data", (chunk) => {
154
+ data += chunk;
155
+ });
156
+ process.stdin.on("end", () => resolve(data));
157
+ process.stdin.on("error", () => resolve(data));
158
+ });
159
+ }
160
+ function formatHookMessage(result) {
161
+ const lines = [
162
+ "[grimoire-branch-guard] Branch hygiene warning for new-feature request:",
163
+ ` ${result.reason}`,
164
+ "",
165
+ "Before drafting, invoke the grimoire-branch-guard skill to:",
166
+ " 1. Commit or stash in-progress work on the current branch",
167
+ " 2. Create a new branch for this request",
168
+ ` Suggested: git switch -c ${result.suggestion}`,
169
+ "",
170
+ "Do not piggy-back new features onto an in-progress branch.",
171
+ ];
172
+ return lines.join("\n");
173
+ }
174
+ async function resolveHookInput() {
175
+ const raw = await readStdin();
176
+ const cwd = process.cwd();
177
+ if (!raw)
178
+ return { prompt: "", cwd };
179
+ try {
180
+ const payload = JSON.parse(raw);
181
+ return { prompt: payload.prompt ?? "", cwd: payload.cwd ?? cwd };
182
+ }
183
+ catch {
184
+ return { prompt: raw, cwd };
185
+ }
186
+ }
187
+ export async function runBranchCheck(options) {
188
+ const source = options.hook
189
+ ? await resolveHookInput()
190
+ : { prompt: options.prompt ?? "", cwd: process.cwd() };
191
+ if (!source.prompt.trim()) {
192
+ if (options.json)
193
+ process.stdout.write(JSON.stringify({ triggered: false }) + "\n");
194
+ return 0;
195
+ }
196
+ const result = await evaluateBranchCheck(source.prompt, source.cwd);
197
+ if (options.json) {
198
+ process.stdout.write(JSON.stringify(result) + "\n");
199
+ return 0;
200
+ }
201
+ if (result.triggered)
202
+ process.stdout.write(formatHookMessage(result) + "\n");
203
+ return 0;
204
+ }
205
+ //# sourceMappingURL=branch-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-check.js","sourceRoot":"","sources":["../../src/core/branch-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface CheckOptions {
2
+ steps?: string[];
3
+ continueOnFail: boolean;
4
+ changed: boolean;
5
+ skip?: string[];
6
+ json: boolean;
7
+ }
8
+ interface StepResult {
9
+ step: string;
10
+ status: "pass" | "fail" | "skip" | "error";
11
+ duration: number;
12
+ output: string;
13
+ reason?: string;
14
+ }
15
+ export interface CheckResult {
16
+ results: StepResult[];
17
+ passed: number;
18
+ failed: number;
19
+ skipped: number;
20
+ errored: number;
21
+ }
22
+ export declare function runCheck(options: CheckOptions): Promise<CheckResult>;
23
+ export {};
24
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/core/check.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAgD1E"}