sqlew 5.1.0 → 5.2.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 (83) hide show
  1. package/CHANGELOG.md +2140 -2081
  2. package/LICENSE +190 -190
  3. package/NOTICE +24 -24
  4. package/README.md +204 -190
  5. package/dist/adapters/mysql-adapter.js +3 -3
  6. package/dist/adapters/postgresql-adapter.js +3 -3
  7. package/dist/cli/db-export.js +32 -32
  8. package/dist/cli/db-import.js +30 -30
  9. package/dist/cli/hooks/codex-transcript.d.ts +23 -0
  10. package/dist/cli/hooks/codex-transcript.d.ts.map +1 -0
  11. package/dist/cli/hooks/codex-transcript.js +134 -0
  12. package/dist/cli/hooks/codex-transcript.js.map +1 -0
  13. package/dist/cli/hooks/on-exit-plan.d.ts.map +1 -1
  14. package/dist/cli/hooks/on-exit-plan.js +72 -4
  15. package/dist/cli/hooks/on-exit-plan.js.map +1 -1
  16. package/dist/cli/hooks/on-prompt.d.ts.map +1 -1
  17. package/dist/cli/hooks/on-prompt.js +38 -16
  18. package/dist/cli/hooks/on-prompt.js.map +1 -1
  19. package/dist/cli/hooks/plan-processor.d.ts.map +1 -1
  20. package/dist/cli/hooks/plan-processor.js +16 -2
  21. package/dist/cli/hooks/plan-processor.js.map +1 -1
  22. package/dist/cli/hooks/pr-adr.js +5 -5
  23. package/dist/cli/hooks/stdin-parser.d.ts +43 -0
  24. package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
  25. package/dist/cli/hooks/stdin-parser.js +212 -6
  26. package/dist/cli/hooks/stdin-parser.js.map +1 -1
  27. package/dist/cli/hooks/track-plan.d.ts +13 -0
  28. package/dist/cli/hooks/track-plan.d.ts.map +1 -1
  29. package/dist/cli/hooks/track-plan.js +73 -18
  30. package/dist/cli/hooks/track-plan.js.map +1 -1
  31. package/dist/cli.js +48 -48
  32. package/dist/config/global-config.d.ts +7 -1
  33. package/dist/config/global-config.d.ts.map +1 -1
  34. package/dist/config/global-config.js +5 -26
  35. package/dist/config/global-config.js.map +1 -1
  36. package/dist/database/migrations/v4/20251126000000_v4_bootstrap.js +32 -32
  37. package/dist/database/migrations/v4/20251126000001_v4_migrate_data.d.ts.map +1 -1
  38. package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js +2 -1
  39. package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js.map +1 -1
  40. package/dist/database/migrations/v4/20260102204000_v4_fix_decision_set_example.js +3 -3
  41. package/dist/help-data/constraint.toml +259 -259
  42. package/dist/help-data/decision.toml +845 -845
  43. package/dist/help-data/queue.toml +134 -134
  44. package/dist/server/tool-schemas.js +30 -30
  45. package/dist/tests/docker/native/db-init.js +9 -9
  46. package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts +7 -0
  47. package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts.map +1 -0
  48. package/dist/tests/unit/hooks/codex-hook-normalization.test.js +112 -0
  49. package/dist/tests/unit/hooks/codex-hook-normalization.test.js.map +1 -0
  50. package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts +9 -0
  51. package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts.map +1 -0
  52. package/dist/tests/unit/hooks/grok-hook-normalization.test.js +136 -0
  53. package/dist/tests/unit/hooks/grok-hook-normalization.test.js.map +1 -0
  54. package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts +7 -0
  55. package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts.map +1 -0
  56. package/dist/tests/unit/hooks/grok-plan-template-injection.test.js +55 -0
  57. package/dist/tests/unit/hooks/grok-plan-template-injection.test.js.map +1 -0
  58. package/dist/tests/utils/db-schema.js +48 -48
  59. package/dist/tests/utils/test-helpers.js +48 -48
  60. package/dist/tools/constraints/actions/get.js +5 -5
  61. package/dist/utils/path-normalize.d.ts +23 -0
  62. package/dist/utils/path-normalize.d.ts.map +1 -0
  63. package/dist/utils/path-normalize.js +38 -0
  64. package/dist/utils/path-normalize.js.map +1 -0
  65. package/dist/utils/project-root.d.ts +7 -3
  66. package/dist/utils/project-root.d.ts.map +1 -1
  67. package/dist/utils/project-root.js +17 -3
  68. package/dist/utils/project-root.js.map +1 -1
  69. package/dist/watcher/base-watcher.d.ts +0 -4
  70. package/dist/watcher/base-watcher.d.ts.map +1 -1
  71. package/dist/watcher/base-watcher.js +11 -22
  72. package/dist/watcher/base-watcher.js.map +1 -1
  73. package/docs/ADR_CONCEPTS.md +152 -152
  74. package/docs/CLI_USAGE.md +392 -392
  75. package/docs/CONFIGURATION.md +157 -157
  76. package/docs/CROSS_DATABASE.md +66 -66
  77. package/docs/DATABASE_AUTH.md +135 -135
  78. package/docs/HOOKS_GUIDE.md +116 -67
  79. package/docs/MIGRATION_TO_SAAS.md +176 -176
  80. package/docs/SHARED_DATABASE.md +108 -108
  81. package/package.json +88 -88
  82. package/scripts/copy-help-data.js +19 -19
  83. package/scripts/filter-test-output.js +78 -78
@@ -6,6 +6,172 @@
6
6
  *
7
7
  * @since v4.1.0
8
8
  */
9
+ import { existsSync } from 'fs';
10
+ import { homedir } from 'os';
11
+ import { join } from 'path';
12
+ import { loadCurrentPlan } from '../../config/global-config.js';
13
+ import { resolvePlanPath } from './plan-pattern-extractor.js';
14
+ // ============================================================================
15
+ // Cross-agent normalization (Claude / Grok Build / future)
16
+ // ============================================================================
17
+ /**
18
+ * Grok Build event names (snake_case) → Claude canonical event names (PascalCase).
19
+ * Grok sends e.g. "pre_tool_use"; Claude sends "PreToolUse".
20
+ */
21
+ const GROK_EVENT_MAP = {
22
+ pre_tool_use: 'PreToolUse',
23
+ post_tool_use: 'PostToolUse',
24
+ post_tool_use_failure: 'PostToolUse',
25
+ user_prompt_submit: 'UserPromptSubmit',
26
+ session_start: 'SessionStart',
27
+ session_end: 'SessionEnd',
28
+ stop: 'Stop',
29
+ notification: 'Notification',
30
+ pre_compact: 'PreCompact',
31
+ };
32
+ /**
33
+ * Grok Build tool names → Claude canonical tool names.
34
+ * Only the names sqlew's hook handlers branch on need mapping; unknown names pass through.
35
+ */
36
+ const GROK_TOOL_MAP = {
37
+ enter_plan_mode: 'EnterPlanMode',
38
+ exit_plan_mode: 'ExitPlanMode',
39
+ search_replace: 'Edit',
40
+ run_terminal_cmd: 'Bash',
41
+ read_file: 'Read',
42
+ };
43
+ /** Codex CLI tool names mapped to Claude-shaped names used by sqlew hook handlers. */
44
+ const CODEX_TOOL_MAP = {
45
+ shell_command: 'Bash',
46
+ shell: 'Bash',
47
+ exec_command: 'Bash',
48
+ apply_patch: 'Edit',
49
+ enter_plan_mode: 'EnterPlanMode',
50
+ exit_plan_mode: 'ExitPlanMode',
51
+ };
52
+ const CODEX_NATIVE_TOOLS = new Set(Object.keys(CODEX_TOOL_MAP));
53
+ function extractCollaborationMode(raw) {
54
+ const direct = raw.collaboration_mode ?? raw.collaborationMode;
55
+ if (typeof direct === 'string') {
56
+ return direct;
57
+ }
58
+ if (direct && typeof direct === 'object') {
59
+ const record = direct;
60
+ if (typeof record.mode === 'string') {
61
+ return record.mode;
62
+ }
63
+ if (typeof record.kind === 'string') {
64
+ return record.kind;
65
+ }
66
+ }
67
+ const kind = raw.collaboration_mode_kind ?? raw.collaborationModeKind;
68
+ return typeof kind === 'string' ? kind : undefined;
69
+ }
70
+ function isCodexPayload(raw) {
71
+ const tool = (raw.tool_name || raw.toolName);
72
+ if (tool && CODEX_NATIVE_TOOLS.has(tool)) {
73
+ return true;
74
+ }
75
+ if (extractCollaborationMode(raw)) {
76
+ return true;
77
+ }
78
+ if (process.env.CODEX_SESSION_ID || process.env.CODEX_CWD || process.env.CODEX_HOME) {
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ function normalizeCodexPayload(raw) {
84
+ const rawTool = (raw.tool_name || raw.toolName);
85
+ const collaborationMode = extractCollaborationMode(raw);
86
+ return {
87
+ ...raw,
88
+ client: 'codex',
89
+ tool_name: rawTool ? CODEX_TOOL_MAP[rawTool] || rawTool : raw.tool_name,
90
+ tool_input: (raw.tool_input || raw.toolInput),
91
+ session_id: (raw.session_id || raw.sessionId || process.env.CODEX_SESSION_ID),
92
+ cwd: (raw.cwd || process.env.CODEX_CWD || process.env.CLAUDE_PROJECT_DIR),
93
+ transcript_path: (raw.transcript_path || raw.transcriptPath),
94
+ collaboration_mode: collaborationMode,
95
+ permission_mode: raw.permission_mode ||
96
+ (collaborationMode?.toLowerCase() === 'plan' ? 'plan' : raw.permission_mode),
97
+ };
98
+ }
99
+ /**
100
+ * Normalize a raw hook payload into the canonical (Claude-shaped) HookInput.
101
+ *
102
+ * Claude Code payloads already use snake_case keys + PascalCase event/tool names,
103
+ * so they pass through unchanged (backward compatible). Grok Build payloads use
104
+ * camelCase keys (`hookEventName`/`toolName`/`toolInput`/`sessionId`) and snake_case
105
+ * event/tool values, which are translated here so every downstream handler keeps
106
+ * working without modification.
107
+ *
108
+ * @param raw - Parsed JSON from stdin (any shape)
109
+ * @returns Canonical HookInput
110
+ */
111
+ export function normalizeHookInput(raw) {
112
+ if (!raw || typeof raw !== 'object') {
113
+ raw = {};
114
+ }
115
+ const r = raw;
116
+ const isGrok = !!(r.hookEventName ||
117
+ r.toolName ||
118
+ r.toolInput ||
119
+ r.workspaceRoot ||
120
+ r.sessionId ||
121
+ process.env.GROK_HOOK_EVENT ||
122
+ process.env.GROK_WORKSPACE_ROOT);
123
+ if (isGrok) {
124
+ // Grok branch below
125
+ }
126
+ else if (isCodexPayload(r)) {
127
+ return normalizeCodexPayload(r);
128
+ }
129
+ else {
130
+ // Claude / native: pass through unchanged
131
+ return r;
132
+ }
133
+ const rawEvent = (r.hookEventName || r.hook_event_name || process.env.GROK_HOOK_EVENT);
134
+ const rawTool = (r.toolName || r.tool_name);
135
+ return {
136
+ ...r,
137
+ client: 'grok',
138
+ hook_event_name: rawEvent
139
+ ? GROK_EVENT_MAP[rawEvent] || rawEvent
140
+ : r.hook_event_name,
141
+ tool_name: rawTool ? GROK_TOOL_MAP[rawTool] || rawTool : r.tool_name,
142
+ tool_input: (r.toolInput || r.tool_input),
143
+ session_id: (r.sessionId || r.session_id || process.env.GROK_SESSION_ID),
144
+ // Grok provides cwd + workspaceRoot (equal); fall back to env for empty-stdin events.
145
+ cwd: (r.cwd || r.workspaceRoot || process.env.GROK_WORKSPACE_ROOT),
146
+ };
147
+ }
148
+ /**
149
+ * Build the absolute path to a Grok Build session plan file.
150
+ *
151
+ * Grok stores per-session plans at:
152
+ * ~/.grok/sessions/<encodeURIComponent(workspaceRoot)>/<sessionId>/plan.md
153
+ *
154
+ * IMPORTANT: encodeURIComponent is applied to the RAW workspace path string
155
+ * (backslashes included on Windows → `C:\...` becomes `C%3A%5C...`), matching
156
+ * the directory names Grok actually creates. Do not slash-normalize beforehand.
157
+ *
158
+ * @param workspaceRoot - Grok workspace root (cwd / workspaceRoot)
159
+ * @param sessionId - Grok session id (UUID-like; sanitized to prevent path traversal)
160
+ * @returns Absolute path to the session's plan.md, or null if sessionId is invalid
161
+ */
162
+ export function computeGrokPlanPath(workspaceRoot, sessionId) {
163
+ // Sanitize sessionId: it is interpolated into a filesystem path, so restrict it to
164
+ // the characters a real Grok session id uses (UUID: hex + hyphen). This blocks any
165
+ // path-traversal payload (`..`, separators) from escaping ~/.grok/sessions/.
166
+ if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) {
167
+ return null;
168
+ }
169
+ // encodeURIComponent encodes every path separator in workspaceRoot, so it collapses
170
+ // to a single safe path segment (no traversal possible from the workspace part), and
171
+ // sessionId is allowlisted above — both inputs are validated before this join.
172
+ // nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal
173
+ return join(homedir(), '.grok', 'sessions', encodeURIComponent(workspaceRoot), sessionId, 'plan.md');
174
+ }
9
175
  // ============================================================================
10
176
  // Parsing
11
177
  // ============================================================================
@@ -30,13 +196,13 @@ export async function readStdinJson() {
30
196
  // Parse when stdin closes
31
197
  process.stdin.on('end', () => {
32
198
  if (!data.trim()) {
33
- // Empty stdin - return empty object
34
- resolve({});
199
+ // Empty stdin - still normalize so env-based context (Grok GROK_* vars) is picked up
200
+ resolve(normalizeHookInput({}));
35
201
  return;
36
202
  }
37
203
  try {
38
204
  const parsed = JSON.parse(data);
39
- resolve(parsed);
205
+ resolve(normalizeHookInput(parsed));
40
206
  }
41
207
  catch (error) {
42
208
  reject(new Error(`Invalid JSON input: ${error instanceof Error ? error.message : String(error)}`));
@@ -98,6 +264,10 @@ export function sendPostToolUseContext(additionalContext) {
98
264
  * @param reason - Reason for blocking
99
265
  */
100
266
  export function sendBlock(reason) {
267
+ // Grok Build: PreToolUse hooks deliver reason via stdout deny JSON (stderr is not shown).
268
+ if (process.env.GROK_HOOK_EVENT || process.env.GROK_WORKSPACE_ROOT) {
269
+ console.log(JSON.stringify({ decision: 'deny', reason }));
270
+ }
101
271
  console.error(reason);
102
272
  process.exit(2);
103
273
  }
@@ -136,10 +306,23 @@ export function sendUpdatedInput(originalInput, modifications) {
136
306
  * @returns true if the current session is in plan mode
137
307
  */
138
308
  export function isPlanMode(input) {
139
- // Claude Code
309
+ // Claude Code / Codex collaboration Plan mode
140
310
  if (input.permission_mode === 'plan')
141
311
  return true;
142
- // Future: Codex, Cursor, etc.
312
+ if (input.collaboration_mode?.toLowerCase() === 'plan')
313
+ return true;
314
+ // Grok Build: plan mode is signaled via the enter_plan_mode / exit_plan_mode tools
315
+ // (no permission_mode field). normalizeHookInput() maps these to the Claude-shaped
316
+ // EnterPlanMode / ExitPlanMode before any detection runs, so match the normalized
317
+ // names. Raw snake_case names are also accepted defensively for callers that
318
+ // bypass normalization.
319
+ const tool = input.tool_name;
320
+ if (tool === 'EnterPlanMode' ||
321
+ tool === 'ExitPlanMode' ||
322
+ tool === 'enter_plan_mode' ||
323
+ tool === 'exit_plan_mode') {
324
+ return true;
325
+ }
143
326
  return false;
144
327
  }
145
328
  // ============================================================================
@@ -188,7 +371,30 @@ export function areAllTodosCompleted(input) {
188
371
  * @returns Project path or undefined
189
372
  */
190
373
  export function getProjectPath(input) {
191
- return input.cwd || process.env.CLAUDE_PROJECT_DIR;
374
+ return (input.cwd ||
375
+ process.env.CLAUDE_PROJECT_DIR ||
376
+ process.env.CODEX_CWD ||
377
+ process.env.GROK_WORKSPACE_ROOT);
378
+ }
379
+ /**
380
+ * Returns the best available absolute path to the currently tracked plan file.
381
+ *
382
+ * Priority:
383
+ * 1. Explicit plan_path stored in CurrentPlanInfo (Grok Build, future envs)
384
+ * 2. Resolved via legacy plan_file + environment-specific resolver (Claude)
385
+ *
386
+ * This is the function external adapters (sqlew-grok etc.) should prefer over
387
+ * manually calling resolvePlanPath.
388
+ */
389
+ export function getActivePlanFilePath(projectPath) {
390
+ const info = loadCurrentPlan(projectPath);
391
+ if (!info)
392
+ return null;
393
+ if (info.plan_path && existsSync(info.plan_path)) {
394
+ return info.plan_path;
395
+ }
396
+ // Fallback to legacy resolution (Claude global plans dir)
397
+ return resolvePlanPath(info.plan_file);
192
398
  }
193
399
  /**
194
400
  * Check if the hook input is for a Plan agent
@@ -1 +1 @@
1
- {"version":3,"file":"stdin-parser.js","sourceRoot":"","sources":["../../../src/cli/hooks/stdin-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdin-parser.js","sourceRoot":"","sources":["../../../src/cli/hooks/stdin-parser.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,19 @@
17
17
  * @modified v4.2.3 - Added template injection on new plan creation
18
18
  */
19
19
  import { type CurrentPlanInfo } from '../../config/global-config.js';
20
+ /** Marker heading written with PLAN_TEMPLATE; used to avoid duplicate injection. */
21
+ export declare const PLAN_TEMPLATE_MARKER = "## \uD83D\uDCDD Decision/Constraint Recording";
22
+ /**
23
+ * Append Decision/Constraint template to a Grok Build plan.md (file side-effect).
24
+ *
25
+ * Grok ignores passive/PreToolUse stdout context injection, so we write directly
26
+ * to plan.md on enter_plan_mode. Skips when the template marker or real patterns
27
+ * are already present.
28
+ *
29
+ * @param planPath - Absolute path to ~/.grok/sessions/.../plan.md
30
+ * @returns true if template was written or appended
31
+ */
32
+ export declare function injectGrokPlanTemplate(planPath: string): boolean;
20
33
  /**
21
34
  * Main track-plan command entry point
22
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"track-plan.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/track-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAiCvC;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2FtD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjE"}
1
+ {"version":3,"file":"track-plan.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/track-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AA+BvC,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,kDAAwC,CAAC;AAE1E;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAyBhE;AAMD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6GtD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjE"}
@@ -16,12 +16,15 @@
16
16
  * @modified v4.2.2 - Removed LLM extraction, simplified to plan tracking only
17
17
  * @modified v4.2.3 - Added template injection on new plan creation
18
18
  */
19
- import { readStdinJson, sendContinue, isPlanFile, getProjectPath } from './stdin-parser.js';
19
+ import { randomUUID } from 'crypto';
20
+ import { readStdinJson, sendContinue, isPlanFile, getProjectPath, computeGrokPlanPath } from './stdin-parser.js';
20
21
  import { PLAN_MODE_ENFORCEMENT } from './on-prompt.js';
21
22
  import { extractPlanFileName, parseFrontmatter, generatePlanId, getPlanId } from './plan-id-utils.js';
22
23
  import { saveCurrentPlan, loadCurrentPlan, clearPlanCache, clearCurrentPlan, } from '../../config/global-config.js';
23
- import { existsSync, readFileSync } from 'fs';
24
- import { resolve } from 'path';
24
+ import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync } from 'fs';
25
+ import { dirname, resolve } from 'path';
26
+ import { hasPatterns } from './plan-pattern-extractor.js';
27
+ import { debugLog } from '../../utils/debug-logger.js';
25
28
  // ============================================================================
26
29
  // Template Constants
27
30
  // ============================================================================
@@ -29,22 +32,57 @@ import { resolve } from 'path';
29
32
  * Decision/Constraint template to inject on new plan creation
30
33
  * Compact format for context window efficiency
31
34
  */
32
- const PLAN_TEMPLATE = `
33
- ---
34
- ## 📝 Decision/Constraint Recording (auto-detected on ExitPlanMode)
35
-
36
- ### 📌 Decision: [key/path]
37
- - **Value**: Description
38
- - **Layer**: presentation | business | data | infrastructure | cross-cutting
39
- - **Rationale**: Why this decision was made
40
-
41
- ### 🚫 Constraint: [category]
42
- - **Rule**: Description (category: architecture | security | code-style | performance)
43
- - **Priority**: critical | high | medium | low
44
- - **Tags**: comma-separated tags
45
-
46
- ---
35
+ const PLAN_TEMPLATE = `
36
+ ---
37
+ ## 📝 Decision/Constraint Recording (auto-detected on ExitPlanMode)
38
+
39
+ ### 📌 Decision: [key/path]
40
+ - **Value**: Description
41
+ - **Layer**: presentation | business | data | infrastructure | cross-cutting
42
+ - **Rationale**: Why this decision was made
43
+
44
+ ### 🚫 Constraint: [category]
45
+ - **Rule**: Description (category: architecture | security | code-style | performance)
46
+ - **Priority**: critical | high | medium | low
47
+ - **Tags**: comma-separated tags
48
+
49
+ ---
47
50
  `.trim();
51
+ /** Marker heading written with PLAN_TEMPLATE; used to avoid duplicate injection. */
52
+ export const PLAN_TEMPLATE_MARKER = '## 📝 Decision/Constraint Recording';
53
+ /**
54
+ * Append Decision/Constraint template to a Grok Build plan.md (file side-effect).
55
+ *
56
+ * Grok ignores passive/PreToolUse stdout context injection, so we write directly
57
+ * to plan.md on enter_plan_mode. Skips when the template marker or real patterns
58
+ * are already present.
59
+ *
60
+ * @param planPath - Absolute path to ~/.grok/sessions/.../plan.md
61
+ * @returns true if template was written or appended
62
+ */
63
+ export function injectGrokPlanTemplate(planPath) {
64
+ const planDir = dirname(planPath);
65
+ if (!existsSync(planDir)) {
66
+ mkdirSync(planDir, { recursive: true });
67
+ }
68
+ if (!existsSync(planPath)) {
69
+ writeFileSync(planPath, `${PLAN_TEMPLATE}\n`, 'utf-8');
70
+ debugLog('DEBUG', '[track-plan] Created Grok plan.md with template', { planPath });
71
+ return true;
72
+ }
73
+ const content = readFileSync(planPath, 'utf-8');
74
+ if (content.includes(PLAN_TEMPLATE_MARKER) || hasPatterns(content)) {
75
+ debugLog('DEBUG', '[track-plan] Skipped Grok template injection', {
76
+ planPath,
77
+ hasMarker: content.includes(PLAN_TEMPLATE_MARKER),
78
+ hasPatterns: hasPatterns(content),
79
+ });
80
+ return false;
81
+ }
82
+ appendFileSync(planPath, `\n\n${PLAN_TEMPLATE}\n`, 'utf-8');
83
+ debugLog('DEBUG', '[track-plan] Appended template to Grok plan.md', { planPath });
84
+ return true;
85
+ }
48
86
  // ============================================================================
49
87
  // Main Entry Point
50
88
  // ============================================================================
@@ -66,6 +104,23 @@ export async function trackPlanCommand() {
66
104
  // Clear old plan cache to prevent stale data on "clear context" approval
67
105
  clearPlanCache(projectPath);
68
106
  clearCurrentPlan(projectPath);
107
+ // Grok Build: pre-record the per-session plan.md path now (we have the sessionId).
108
+ // This keeps the cache warm; on-exit-plan also recomputes defensively if this is missed.
109
+ if (input.client === 'grok' && input.session_id) {
110
+ const planPath = computeGrokPlanPath(projectPath, input.session_id);
111
+ if (planPath) {
112
+ const planInfo = {
113
+ plan_id: randomUUID(),
114
+ plan_file: 'plan.md',
115
+ plan_path: planPath,
116
+ plan_updated_at: new Date().toISOString(),
117
+ recorded: false,
118
+ decision_pending: true,
119
+ };
120
+ saveCurrentPlan(projectPath, planInfo);
121
+ injectGrokPlanTemplate(planPath);
122
+ }
123
+ }
69
124
  }
70
125
  sendContinue(PLAN_MODE_ENFORCEMENT);
71
126
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"track-plan.js","sourceRoot":"","sources":["../../../src/cli/hooks/track-plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"track-plan.js","sourceRoot":"","sources":["../../../src/cli/hooks/track-plan.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -111,54 +111,54 @@ function formatTable(data, headers) {
111
111
  * Show help message
112
112
  */
113
113
  function showHelp() {
114
- console.log(`
115
- sqlew CLI - Query and database migration tool for mcp-sqlew
116
-
117
- USAGE:
118
- sqlew <command> [options]
119
-
120
- RECOMMENDED SETUP (v5.0.0+):
121
- The sqlew-plugin is now the recommended way to install Skills, Hooks, and Agents.
122
-
123
- /plugin marketplace add sqlew-io/sqlew-plugin
124
- /plugin add sqlew
125
-
126
- For more info: https://github.com/sqlew-io/sqlew-plugin
127
-
128
- LEGACY COMMANDS:
129
- Setup (deprecated - use sqlew-plugin instead):
130
- --init Legacy initialization (global rules + gitignore)
131
-
132
- Database:
133
- db:export Export project data to JSON format (data-only, for append-import)
134
- db:import Import project data from JSON export (append to existing database)
135
-
136
- Claude Code Hooks (internal use):
137
- suggest Find related decisions (PreToolUse hook for Task)
138
- track-plan Track plan files (PreToolUse hook for Write)
139
- save Save decisions on code edit (PostToolUse hook for Edit|Write)
140
- check-completion Check task completion (PostToolUse hook for TodoWrite)
141
- mark-done Mark decisions as implemented (Git hooks or manual)
142
-
143
- Plan Mode Hooks (internal use):
144
- on-enter-plan Inject TOML template (PostToolUse hook for EnterPlanMode)
145
- on-exit-plan Prompt TOML documentation (PostToolUse hook for ExitPlanMode)
146
- on-subagent-stop Process Plan agent completion (SubagentStop hook)
147
- on-stop Process main agent stop (Stop hook)
148
- on-prompt Plan mode enforcement (UserPromptSubmit hook)
149
- pr-adr PR ADR enforcement (PreToolUse hook for Bash)
150
-
151
- OPTIONS:
152
- --init Legacy initialization
153
- --help Show this help message
154
-
155
- EXAMPLES:
156
- # Legacy initialization (prefer sqlew-plugin instead)
157
- sqlew --init
158
-
159
- For more information on commands, run:
160
- npm run db:export -- --help
161
- npm run db:import -- --help
114
+ console.log(`
115
+ sqlew CLI - Query and database migration tool for mcp-sqlew
116
+
117
+ USAGE:
118
+ sqlew <command> [options]
119
+
120
+ RECOMMENDED SETUP (v5.0.0+):
121
+ The sqlew-plugin is now the recommended way to install Skills, Hooks, and Agents.
122
+
123
+ /plugin marketplace add sqlew-io/sqlew-plugin
124
+ /plugin add sqlew
125
+
126
+ For more info: https://github.com/sqlew-io/sqlew-plugin
127
+
128
+ LEGACY COMMANDS:
129
+ Setup (deprecated - use sqlew-plugin instead):
130
+ --init Legacy initialization (global rules + gitignore)
131
+
132
+ Database:
133
+ db:export Export project data to JSON format (data-only, for append-import)
134
+ db:import Import project data from JSON export (append to existing database)
135
+
136
+ Claude Code Hooks (internal use):
137
+ suggest Find related decisions (PreToolUse hook for Task)
138
+ track-plan Track plan files (PreToolUse hook for Write)
139
+ save Save decisions on code edit (PostToolUse hook for Edit|Write)
140
+ check-completion Check task completion (PostToolUse hook for TodoWrite)
141
+ mark-done Mark decisions as implemented (Git hooks or manual)
142
+
143
+ Plan Mode Hooks (internal use):
144
+ on-enter-plan Inject TOML template (PostToolUse hook for EnterPlanMode)
145
+ on-exit-plan Prompt TOML documentation (PostToolUse hook for ExitPlanMode)
146
+ on-subagent-stop Process Plan agent completion (SubagentStop hook)
147
+ on-stop Process main agent stop (Stop hook)
148
+ on-prompt Plan mode enforcement (UserPromptSubmit hook)
149
+ pr-adr PR ADR enforcement (PreToolUse hook for Bash)
150
+
151
+ OPTIONS:
152
+ --init Legacy initialization
153
+ --help Show this help message
154
+
155
+ EXAMPLES:
156
+ # Legacy initialization (prefer sqlew-plugin instead)
157
+ sqlew --init
158
+
159
+ For more information on commands, run:
160
+ npm run db:export -- --help
161
+ npm run db:import -- --help
162
162
  `);
163
163
  }
164
164
  // ============================================================================
@@ -120,8 +120,14 @@ export declare function saveGlobalConfig(config: GlobalConfig): void;
120
120
  export interface CurrentPlanInfo {
121
121
  /** Unique plan ID (UUID) */
122
122
  plan_id: string;
123
- /** Plan file name (e.g., "rippling-spinning-eagle.md") */
123
+ /** Plan file name (e.g., "rippling-spinning-eagle.md") — legacy, for Claude global plans */
124
124
  plan_file: string;
125
+ /**
126
+ * Absolute path to the actual plan file (preferred when set).
127
+ * Used by Grok Build (per-session plan.md) and future environments.
128
+ * When present, extraction logic should use this instead of resolving via plan_file + GLOBAL_PLANS_DIR.
129
+ */
130
+ plan_path?: string;
125
131
  /** Plan file last updated timestamp (ISO 8601) */
126
132
  plan_updated_at: string;
127
133
  /** Whether decision has been recorded for this plan */
@@ -1 +1 @@
1
- {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync, readdir
8
8
  import { join, resolve } from 'path';
9
9
  import { homedir } from 'os';
10
10
  import { parse as parseTOML, stringify as stringifyTOML } from 'smol-toml';
11
+ import { normalizeWindowsPath } from '../utils/path-normalize.js';
11
12
  /**
12
13
  * Default global configuration values
13
14
  */
@@ -278,22 +279,8 @@ export function getSessionCachePath(projectPath) {
278
279
  if (!existsSync(cacheDir)) {
279
280
  mkdirSync(cacheDir, { recursive: true });
280
281
  }
281
- // Normalize path for cross-platform consistency
282
- // - Handle Git Bash/MSYS2 paths (/c/Users → C:\Users) on Windows
283
- // - Lowercase drive letter ensures consistent cache filename
284
- // - On macOS/Linux, resolve() is sufficient (no drive letters)
285
- let normalizedPath = projectPath;
286
- // Convert Git Bash/MSYS2 paths (/c/Users/...) to Windows paths (C:\Users\...)
287
- if (process.platform === 'win32' && /^\/[a-zA-Z]\//.test(normalizedPath)) {
288
- const driveLetter = normalizedPath[1].toUpperCase();
289
- normalizedPath = driveLetter + ':' + normalizedPath.slice(2).replace(/\//g, '\\');
290
- }
291
- // Resolve to absolute path
292
- normalizedPath = resolve(normalizedPath);
293
- // Lowercase drive letter for consistency
294
- if (process.platform === 'win32' && /^[A-Z]:/.test(normalizedPath)) {
295
- normalizedPath = normalizedPath[0].toLowerCase() + normalizedPath.slice(1);
296
- }
282
+ // Normalize path for cross-platform consistency (Git Bash/MSYS2 conversion, drive letter)
283
+ const normalizedPath = normalizeWindowsPath(projectPath);
297
284
  // Create a safe filename from project path
298
285
  const safeName = normalizedPath
299
286
  .replace(/[^a-zA-Z0-9]/g, '_')
@@ -371,16 +358,8 @@ export function getPlanCachePath(projectPath) {
371
358
  if (!existsSync(cacheDir)) {
372
359
  mkdirSync(cacheDir, { recursive: true });
373
360
  }
374
- // Use same normalization as getSessionCachePath
375
- let normalizedPath = projectPath;
376
- if (process.platform === 'win32' && /^\/[a-zA-Z]\//.test(normalizedPath)) {
377
- const driveLetter = normalizedPath[1].toUpperCase();
378
- normalizedPath = driveLetter + ':' + normalizedPath.slice(2).replace(/\//g, '\\');
379
- }
380
- normalizedPath = resolve(normalizedPath);
381
- if (process.platform === 'win32' && /^[A-Z]:/.test(normalizedPath)) {
382
- normalizedPath = normalizedPath[0].toLowerCase() + normalizedPath.slice(1);
383
- }
361
+ // Normalize path for cross-platform consistency (Git Bash/MSYS2 conversion, drive letter)
362
+ const normalizedPath = normalizeWindowsPath(projectPath);
384
363
  const safeName = normalizedPath
385
364
  .replace(/[^a-zA-Z0-9]/g, '_')
386
365
  .replace(/_+/g, '_')