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.
- package/CHANGELOG.md +2140 -2081
- package/LICENSE +190 -190
- package/NOTICE +24 -24
- package/README.md +204 -190
- package/dist/adapters/mysql-adapter.js +3 -3
- package/dist/adapters/postgresql-adapter.js +3 -3
- package/dist/cli/db-export.js +32 -32
- package/dist/cli/db-import.js +30 -30
- package/dist/cli/hooks/codex-transcript.d.ts +23 -0
- package/dist/cli/hooks/codex-transcript.d.ts.map +1 -0
- package/dist/cli/hooks/codex-transcript.js +134 -0
- package/dist/cli/hooks/codex-transcript.js.map +1 -0
- package/dist/cli/hooks/on-exit-plan.d.ts.map +1 -1
- package/dist/cli/hooks/on-exit-plan.js +72 -4
- package/dist/cli/hooks/on-exit-plan.js.map +1 -1
- package/dist/cli/hooks/on-prompt.d.ts.map +1 -1
- package/dist/cli/hooks/on-prompt.js +38 -16
- package/dist/cli/hooks/on-prompt.js.map +1 -1
- package/dist/cli/hooks/plan-processor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-processor.js +16 -2
- package/dist/cli/hooks/plan-processor.js.map +1 -1
- package/dist/cli/hooks/pr-adr.js +5 -5
- package/dist/cli/hooks/stdin-parser.d.ts +43 -0
- package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
- package/dist/cli/hooks/stdin-parser.js +212 -6
- package/dist/cli/hooks/stdin-parser.js.map +1 -1
- package/dist/cli/hooks/track-plan.d.ts +13 -0
- package/dist/cli/hooks/track-plan.d.ts.map +1 -1
- package/dist/cli/hooks/track-plan.js +73 -18
- package/dist/cli/hooks/track-plan.js.map +1 -1
- package/dist/cli.js +48 -48
- package/dist/config/global-config.d.ts +7 -1
- package/dist/config/global-config.d.ts.map +1 -1
- package/dist/config/global-config.js +5 -26
- package/dist/config/global-config.js.map +1 -1
- package/dist/database/migrations/v4/20251126000000_v4_bootstrap.js +32 -32
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.d.ts.map +1 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js +2 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js.map +1 -1
- package/dist/database/migrations/v4/20260102204000_v4_fix_decision_set_example.js +3 -3
- package/dist/help-data/constraint.toml +259 -259
- package/dist/help-data/decision.toml +845 -845
- package/dist/help-data/queue.toml +134 -134
- package/dist/server/tool-schemas.js +30 -30
- package/dist/tests/docker/native/db-init.js +9 -9
- package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts +7 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.js +112 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.js.map +1 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts +9 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js +136 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts +7 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js +55 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js.map +1 -0
- package/dist/tests/utils/db-schema.js +48 -48
- package/dist/tests/utils/test-helpers.js +48 -48
- package/dist/tools/constraints/actions/get.js +5 -5
- package/dist/utils/path-normalize.d.ts +23 -0
- package/dist/utils/path-normalize.d.ts.map +1 -0
- package/dist/utils/path-normalize.js +38 -0
- package/dist/utils/path-normalize.js.map +1 -0
- package/dist/utils/project-root.d.ts +7 -3
- package/dist/utils/project-root.d.ts.map +1 -1
- package/dist/utils/project-root.js +17 -3
- package/dist/utils/project-root.js.map +1 -1
- package/dist/watcher/base-watcher.d.ts +0 -4
- package/dist/watcher/base-watcher.d.ts.map +1 -1
- package/dist/watcher/base-watcher.js +11 -22
- package/dist/watcher/base-watcher.js.map +1 -1
- package/docs/ADR_CONCEPTS.md +152 -152
- package/docs/CLI_USAGE.md +392 -392
- package/docs/CONFIGURATION.md +157 -157
- package/docs/CROSS_DATABASE.md +66 -66
- package/docs/DATABASE_AUTH.md +135 -135
- package/docs/HOOKS_GUIDE.md +116 -67
- package/docs/MIGRATION_TO_SAAS.md +176 -176
- package/docs/SHARED_DATABASE.md +108 -108
- package/package.json +88 -88
- package/scripts/copy-help-data.js +19 -19
- 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 -
|
|
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
|
-
|
|
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 ||
|
|
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":"AAAA;;;;;;;GAOG;
|
|
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;
|
|
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 {
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
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":"AAAA;;;;;GAKG;
|
|
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
|
-
|
|
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
|
-
//
|
|
375
|
-
|
|
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, '_')
|