sqlew 5.1.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +17 -8
- package/dist/cli/hooks/on-exit-plan.d.ts.map +1 -1
- package/dist/cli/hooks/on-exit-plan.js +42 -1
- 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 +5 -0
- 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/stdin-parser.d.ts +41 -0
- package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
- package/dist/cli/hooks/stdin-parser.js +140 -4
- 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 +58 -3
- package/dist/cli/hooks/track-plan.js.map +1 -1
- 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 +24 -45
- package/dist/config/global-config.js.map +1 -1
- 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/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 +98 -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/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 +6 -3
- package/dist/utils/project-root.d.ts.map +1 -1
- package/dist/utils/project-root.js +11 -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/HOOKS_GUIDE.md +40 -6
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [5.2.0] - 2026-06-11
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
**Grok Build support (sqlew-plugin v5.2.0)**
|
|
15
|
+
|
|
16
|
+
Unified Plan-to-ADR support for Grok Build alongside Claude Code via a single sqlew-plugin install. No separate sqlew-grok adapter required.
|
|
17
|
+
|
|
18
|
+
- **`normalizeHookInput()`** — Translates Grok hook payloads (`hookEventName`, `toolName`, `sessionId`, `workspaceRoot`) to canonical Claude-shaped `HookInput`. Claude payloads pass through unchanged.
|
|
19
|
+
- **`computeGrokPlanPath()`** — Resolves per-session plan file at `~/.grok/sessions/<encodeURIComponent(cwd)>/<sessionId>/plan.md`.
|
|
20
|
+
- **`injectGrokPlanTemplate()`** — Appends Decision/Constraint template to `plan.md` on `enter_plan_mode` (file side-effect). Grok ignores passive hook stdout; skills auto-invocation is unreliable.
|
|
21
|
+
- **`GROK_WORKSPACE_ROOT`** — Added to `determineProjectRoot()` for MCP server project root resolution.
|
|
22
|
+
- **Grok `sendBlock()` compat** — PreToolUse deny hooks emit `{"decision":"deny","reason":"..."}` on stdout for Grok (in addition to exit 2 + stderr for Claude Code).
|
|
23
|
+
- **Unit tests** — `grok-hook-normalization.test.ts`, `grok-plan-template-injection.test.ts`.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`on-prompt`** — Early return for Grok client (`UserPromptSubmit` stdout is ignored on Grok).
|
|
28
|
+
- **`on-exit-plan` / `track-plan`** — Record `CurrentPlanInfo.plan_path` for Grok; always re-resolve from `session_id` on exit.
|
|
29
|
+
- **`plan-processor`** — Prefer explicit `plan_path` over legacy Claude global plans resolver.
|
|
30
|
+
- **`docs/HOOKS_GUIDE.md`** — Replaced sqlew-grok adapter instructions with `grok plugin install sqlew-io/sqlew-plugin --trust` workflow.
|
|
31
|
+
|
|
32
|
+
### Plugin Changes (sqlew-plugin v5.2.0)
|
|
33
|
+
|
|
34
|
+
- Hook matchers: `enter_plan_mode` / `exit_plan_mode` alongside Claude tool names
|
|
35
|
+
- Skills: Grok-specific plan mode guidance (`sqlew-plan-guidance`, `sqlew-decision-format`)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
10
39
|
## [5.1.0] - 2026-03-07
|
|
11
40
|
|
|
12
41
|
### Changed
|
package/README.md
CHANGED
|
@@ -58,6 +58,16 @@ The plugin automatically configures MCP server, Skills (Plan Mode guidance), and
|
|
|
58
58
|
|
|
59
59
|
See [sqlew-codex](https://github.com/sqlew-io/sqlew-codex) for Codex CLI integration.
|
|
60
60
|
|
|
61
|
+
#### Grok Build (Plugin)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npm install -g sqlew
|
|
65
|
+
grok plugin install sqlew-io/sqlew-plugin --trust
|
|
66
|
+
grok plugin update
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The plugin configures MCP server, Skills (plan mode guidance), and Hooks (automatic decision capture on `exit_plan_mode`). See [Hooks Guide](docs/HOOKS_GUIDE.md) for setup details and caveats (do not duplicate hooks in `~/.grok/hooks/` or `config.toml`).
|
|
70
|
+
|
|
61
71
|
#### Manual
|
|
62
72
|
|
|
63
73
|
Add to `.mcp.json` in your project root:
|
|
@@ -86,7 +96,7 @@ No special commands needed — just plan your work normally, and sqlew captures
|
|
|
86
96
|
- **Fast Queries** — 2-50ms retrieval via SQL, even with thousands of decisions
|
|
87
97
|
- **Duplicate Detection** — Three-tier similarity scoring (0-100) prevents redundant decisions
|
|
88
98
|
- **Constraint Tracking** — Architectural rules and principles as first-class entities
|
|
89
|
-
- **Auto-Capture** — Hooks automatically record decisions from Plan Mode (Claude Code plugin)
|
|
99
|
+
- **Auto-Capture** — Hooks automatically record decisions from Plan Mode (Claude Code and Grok Build via sqlew-plugin)
|
|
90
100
|
- **Multi-Database** — SQLite (default), PostgreSQL, MySQL/MariaDB, or Cloud
|
|
91
101
|
- **Git Worktree Ready** — Each worktree shares the same context database
|
|
92
102
|
|
|
@@ -142,7 +152,7 @@ name = "your-project-name"
|
|
|
142
152
|
|-------|-------------|
|
|
143
153
|
| [ADR Concepts](docs/ADR_CONCEPTS.md) | Architecture Decision Records explained |
|
|
144
154
|
| [Configuration](docs/CONFIGURATION.md) | Config file setup, database options |
|
|
145
|
-
| [Hooks Guide](docs/HOOKS_GUIDE.md) | Claude Code
|
|
155
|
+
| [Hooks Guide](docs/HOOKS_GUIDE.md) | Claude Code, Codex, and Grok Build integration |
|
|
146
156
|
| [Cross Database](docs/CROSS_DATABASE.md) | Multi-database support |
|
|
147
157
|
| [CLI Usage](docs/CLI_USAGE.md) | Database migration, export/import |
|
|
148
158
|
|
|
@@ -163,16 +173,15 @@ Support development via [GitHub Sponsors](https://github.com/sponsors/sqlew-io).
|
|
|
163
173
|
|
|
164
174
|
## Version
|
|
165
175
|
|
|
166
|
-
Current version: **5.0
|
|
176
|
+
Current version: **5.2.0**
|
|
167
177
|
|
|
168
178
|
See [CHANGELOG.md](CHANGELOG.md) for release history.
|
|
169
179
|
|
|
170
|
-
**What's New in v5.0
|
|
180
|
+
**What's New in v5.2.0:**
|
|
171
181
|
|
|
172
|
-
- **
|
|
173
|
-
- **
|
|
174
|
-
- **
|
|
175
|
-
- **Cloud backend** — Connect to [sqlew.io](https://sqlew.io) for team-shared decisions
|
|
182
|
+
- **Grok Build support** — Plan-to-ADR via [sqlew-plugin](https://github.com/sqlew-io/sqlew-plugin) (`grok plugin install sqlew-io/sqlew-plugin --trust`)
|
|
183
|
+
- **Grok plan.md injection** — Decision/Constraint template appended on `enter_plan_mode`
|
|
184
|
+
- **Hook normalization** — Single CLI hook handlers work under both Claude Code and Grok Build
|
|
176
185
|
|
|
177
186
|
## License
|
|
178
187
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-exit-plan.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/on-exit-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"on-exit-plan.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/on-exit-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqFvD"}
|
|
@@ -10,8 +10,11 @@
|
|
|
10
10
|
* @since v4.2.0
|
|
11
11
|
* @modified v4.2.5 - Refactored to use plan-processor.ts (DRY)
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { randomUUID } from 'crypto';
|
|
14
|
+
import { readStdinJson, sendContinue, sendPostToolUseContext, getProjectPath, computeGrokPlanPath } from './stdin-parser.js';
|
|
15
|
+
import { loadCurrentPlan, saveCurrentPlan } from '../../config/global-config.js';
|
|
14
16
|
import { processPlanPatterns } from './plan-processor.js';
|
|
17
|
+
import { debugLog } from '../../utils/debug-logger.js';
|
|
15
18
|
// ============================================================================
|
|
16
19
|
// Main Entry Point
|
|
17
20
|
// ============================================================================
|
|
@@ -31,11 +34,49 @@ export async function onExitPlanCommand() {
|
|
|
31
34
|
}
|
|
32
35
|
const projectPath = getProjectPath(input);
|
|
33
36
|
if (!projectPath) {
|
|
37
|
+
debugLog('WARN', '[on-exit-plan] No project path', {
|
|
38
|
+
client: input.client,
|
|
39
|
+
session_id: input.session_id,
|
|
40
|
+
cwd: input.cwd,
|
|
41
|
+
});
|
|
34
42
|
sendContinue();
|
|
35
43
|
return;
|
|
36
44
|
}
|
|
45
|
+
debugLog('DEBUG', '[on-exit-plan] Processing exit', {
|
|
46
|
+
client: input.client,
|
|
47
|
+
session_id: input.session_id,
|
|
48
|
+
projectPath,
|
|
49
|
+
});
|
|
50
|
+
// Grok Build: the per-session plan lives at ~/.grok/sessions/<enc(cwd)>/<sessionId>/plan.md.
|
|
51
|
+
// The exit hook's session_id is authoritative (each Grok session has its own plan.md), so
|
|
52
|
+
// ALWAYS resolve the path from it here — never trust a stored plan_path, which may be stale
|
|
53
|
+
// from a previous session and would make processPlanPatterns read the wrong/missing file.
|
|
54
|
+
// When the stored info belongs to a different session we reset it as a new plan; when it's
|
|
55
|
+
// the same session we preserve plan_id/recorded so dedup still works.
|
|
56
|
+
if (input.client === 'grok' && input.session_id) {
|
|
57
|
+
const planPath = computeGrokPlanPath(projectPath, input.session_id);
|
|
58
|
+
if (planPath) {
|
|
59
|
+
const existing = loadCurrentPlan(projectPath);
|
|
60
|
+
const sameSession = existing?.plan_path === planPath;
|
|
61
|
+
const planInfo = {
|
|
62
|
+
plan_id: sameSession && existing ? existing.plan_id : randomUUID(),
|
|
63
|
+
plan_file: 'plan.md',
|
|
64
|
+
plan_path: planPath,
|
|
65
|
+
plan_updated_at: new Date().toISOString(),
|
|
66
|
+
recorded: sameSession ? (existing?.recorded ?? false) : false,
|
|
67
|
+
decision_pending: sameSession ? (existing?.decision_pending ?? true) : true,
|
|
68
|
+
enforcement_shown_at: sameSession ? existing?.enforcement_shown_at : undefined,
|
|
69
|
+
};
|
|
70
|
+
saveCurrentPlan(projectPath, planInfo);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
37
73
|
// Delegate to shared processor
|
|
38
74
|
const result = processPlanPatterns(projectPath);
|
|
75
|
+
debugLog('DEBUG', '[on-exit-plan] Result', {
|
|
76
|
+
processed: result.processed,
|
|
77
|
+
skipReason: result.skipReason,
|
|
78
|
+
projectPath,
|
|
79
|
+
});
|
|
39
80
|
if (!result.processed) {
|
|
40
81
|
// Map skip reasons to user-friendly messages
|
|
41
82
|
const messages = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-exit-plan.js","sourceRoot":"","sources":["../../../src/cli/hooks/on-exit-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"on-exit-plan.js","sourceRoot":"","sources":["../../../src/cli/hooks/on-exit-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-prompt.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,6eAeY,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oDAAoD,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6eAAmB,CAAC;AAMtD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"on-prompt.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,6eAeY,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oDAAoD,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6eAAmB,CAAC;AAMtD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAyCrD"}
|
|
@@ -71,6 +71,11 @@ export const PLAN_MODE_ENFORCEMENT = ENFORCEMENT_FULL;
|
|
|
71
71
|
export async function onPromptCommand() {
|
|
72
72
|
try {
|
|
73
73
|
const input = await readStdinJson();
|
|
74
|
+
// Grok Build: UserPromptSubmit is a passive hook — stdout is ignored.
|
|
75
|
+
// Plan mode guidance is delivered via plugin skills instead.
|
|
76
|
+
if (input.client === 'grok') {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
74
79
|
if (!isPlanMode(input)) {
|
|
75
80
|
// Non-plan mode: output nothing (exit 0 = allow, no context injection)
|
|
76
81
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-prompt.js","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEjF,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;yCAeS,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,iDAAiD,CAAC;AAEnF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,uEAAuE;YACvE,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,6DAA6D;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE9C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAChD,wEAAwE;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAEvC,4BAA4B;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,oBAAoB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACzD,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"on-prompt.js","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEjF,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;yCAeS,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,iDAAiD,CAAC;AAEnF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpC,sEAAsE;QACtE,6DAA6D;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,uEAAuE;YACvE,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,6DAA6D;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE9C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAChD,wEAAwE;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAEvC,4BAA4B;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,oBAAoB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACzD,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-processor.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/plan-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"plan-processor.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/plan-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,6BAA6B,CAAC;AAMrC,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAgH1E"}
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @since v4.2.5
|
|
11
11
|
*/
|
|
12
|
-
import { readFileSync } from 'fs';
|
|
12
|
+
import { readFileSync, existsSync } from 'fs';
|
|
13
13
|
import { loadCurrentPlan, saveCurrentPlan } from '../../config/global-config.js';
|
|
14
14
|
import { enqueueDecisionCreate, enqueueConstraintCreate, enqueueDecisionContextCreate } from '../../utils/hook-queue.js';
|
|
15
|
+
import { debugLog } from '../../utils/debug-logger.js';
|
|
15
16
|
import { extractPatternsFromPlan, hasPatterns, resolvePlanPath, buildConfirmationMessage, } from './plan-pattern-extractor.js';
|
|
16
17
|
// ============================================================================
|
|
17
18
|
// Main Processing Function
|
|
@@ -38,6 +39,7 @@ export function processPlanPatterns(projectPath) {
|
|
|
38
39
|
// Load current plan info
|
|
39
40
|
const planInfo = loadCurrentPlan(projectPath);
|
|
40
41
|
if (!planInfo?.plan_file) {
|
|
42
|
+
debugLog('DEBUG', '[plan-processor] Skip: no_active_plan', { projectPath });
|
|
41
43
|
return { processed: false, skipReason: 'no_active_plan' };
|
|
42
44
|
}
|
|
43
45
|
// DUPLICATE PREVENTION: Skip if already processed
|
|
@@ -45,8 +47,20 @@ export function processPlanPatterns(projectPath) {
|
|
|
45
47
|
return { processed: false, skipReason: 'already_recorded' };
|
|
46
48
|
}
|
|
47
49
|
// Resolve plan file path
|
|
48
|
-
|
|
50
|
+
// Prefer explicit plan_path (Grok Build + future envs) over legacy plan_file + GLOBAL_PLANS_DIR resolution (Claude)
|
|
51
|
+
let planPath = null;
|
|
52
|
+
if (planInfo.plan_path && existsSync(planInfo.plan_path)) {
|
|
53
|
+
planPath = planInfo.plan_path;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
planPath = resolvePlanPath(planInfo.plan_file);
|
|
57
|
+
}
|
|
49
58
|
if (!planPath) {
|
|
59
|
+
debugLog('DEBUG', '[plan-processor] Skip: plan_file_not_found', {
|
|
60
|
+
projectPath,
|
|
61
|
+
plan_path: planInfo.plan_path,
|
|
62
|
+
plan_file: planInfo.plan_file,
|
|
63
|
+
});
|
|
50
64
|
return { processed: false, skipReason: 'plan_file_not_found' };
|
|
51
65
|
}
|
|
52
66
|
// Read plan content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-processor.js","sourceRoot":"","sources":["../../../src/cli/hooks/plan-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-processor.js","sourceRoot":"","sources":["../../../src/cli/hooks/plan-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,6 +75,8 @@ export interface HookInput {
|
|
|
75
75
|
source?: 'startup' | 'resume' | 'clear' | 'compact';
|
|
76
76
|
/** SessionEnd reason: clear | logout | prompt_input_exit | other */
|
|
77
77
|
reason?: 'clear' | 'logout' | 'prompt_input_exit' | 'other';
|
|
78
|
+
/** Originating client, set by normalizeHookInput() (e.g., 'grok'). undefined = Claude/native. */
|
|
79
|
+
client?: 'grok' | 'claude';
|
|
78
80
|
}
|
|
79
81
|
/**
|
|
80
82
|
* Hook-specific output for PreToolUse (v4.2.0+)
|
|
@@ -119,6 +121,34 @@ export interface HookOutput {
|
|
|
119
121
|
/** @deprecated Use hookSpecificOutput.updatedInput instead */
|
|
120
122
|
updatedInput?: ToolInput;
|
|
121
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Normalize a raw hook payload into the canonical (Claude-shaped) HookInput.
|
|
126
|
+
*
|
|
127
|
+
* Claude Code payloads already use snake_case keys + PascalCase event/tool names,
|
|
128
|
+
* so they pass through unchanged (backward compatible). Grok Build payloads use
|
|
129
|
+
* camelCase keys (`hookEventName`/`toolName`/`toolInput`/`sessionId`) and snake_case
|
|
130
|
+
* event/tool values, which are translated here so every downstream handler keeps
|
|
131
|
+
* working without modification.
|
|
132
|
+
*
|
|
133
|
+
* @param raw - Parsed JSON from stdin (any shape)
|
|
134
|
+
* @returns Canonical HookInput
|
|
135
|
+
*/
|
|
136
|
+
export declare function normalizeHookInput(raw: unknown): HookInput;
|
|
137
|
+
/**
|
|
138
|
+
* Build the absolute path to a Grok Build session plan file.
|
|
139
|
+
*
|
|
140
|
+
* Grok stores per-session plans at:
|
|
141
|
+
* ~/.grok/sessions/<encodeURIComponent(workspaceRoot)>/<sessionId>/plan.md
|
|
142
|
+
*
|
|
143
|
+
* IMPORTANT: encodeURIComponent is applied to the RAW workspace path string
|
|
144
|
+
* (backslashes included on Windows → `C:\...` becomes `C%3A%5C...`), matching
|
|
145
|
+
* the directory names Grok actually creates. Do not slash-normalize beforehand.
|
|
146
|
+
*
|
|
147
|
+
* @param workspaceRoot - Grok workspace root (cwd / workspaceRoot)
|
|
148
|
+
* @param sessionId - Grok session id (UUID-like; sanitized to prevent path traversal)
|
|
149
|
+
* @returns Absolute path to the session's plan.md, or null if sessionId is invalid
|
|
150
|
+
*/
|
|
151
|
+
export declare function computeGrokPlanPath(workspaceRoot: string, sessionId: string): string | null;
|
|
122
152
|
/**
|
|
123
153
|
* Read and parse JSON from stdin
|
|
124
154
|
*
|
|
@@ -208,6 +238,17 @@ export declare function areAllTodosCompleted(input: HookInput): boolean;
|
|
|
208
238
|
* @returns Project path or undefined
|
|
209
239
|
*/
|
|
210
240
|
export declare function getProjectPath(input: HookInput): string | undefined;
|
|
241
|
+
/**
|
|
242
|
+
* Returns the best available absolute path to the currently tracked plan file.
|
|
243
|
+
*
|
|
244
|
+
* Priority:
|
|
245
|
+
* 1. Explicit plan_path stored in CurrentPlanInfo (Grok Build, future envs)
|
|
246
|
+
* 2. Resolved via legacy plan_file + environment-specific resolver (Claude)
|
|
247
|
+
*
|
|
248
|
+
* This is the function external adapters (sqlew-grok etc.) should prefer over
|
|
249
|
+
* manually calling resolvePlanPath.
|
|
250
|
+
*/
|
|
251
|
+
export declare function getActivePlanFilePath(projectPath: string): string | null;
|
|
211
252
|
/**
|
|
212
253
|
* Check if the hook input is for a Plan agent
|
|
213
254
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdin-parser.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/stdin-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"stdin-parser.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/stdin-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,110 @@
|
|
|
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
|
+
/**
|
|
44
|
+
* Normalize a raw hook payload into the canonical (Claude-shaped) HookInput.
|
|
45
|
+
*
|
|
46
|
+
* Claude Code payloads already use snake_case keys + PascalCase event/tool names,
|
|
47
|
+
* so they pass through unchanged (backward compatible). Grok Build payloads use
|
|
48
|
+
* camelCase keys (`hookEventName`/`toolName`/`toolInput`/`sessionId`) and snake_case
|
|
49
|
+
* event/tool values, which are translated here so every downstream handler keeps
|
|
50
|
+
* working without modification.
|
|
51
|
+
*
|
|
52
|
+
* @param raw - Parsed JSON from stdin (any shape)
|
|
53
|
+
* @returns Canonical HookInput
|
|
54
|
+
*/
|
|
55
|
+
export function normalizeHookInput(raw) {
|
|
56
|
+
if (!raw || typeof raw !== 'object') {
|
|
57
|
+
raw = {};
|
|
58
|
+
}
|
|
59
|
+
const r = raw;
|
|
60
|
+
const isGrok = !!(r.hookEventName ||
|
|
61
|
+
r.toolName ||
|
|
62
|
+
r.toolInput ||
|
|
63
|
+
r.workspaceRoot ||
|
|
64
|
+
r.sessionId ||
|
|
65
|
+
process.env.GROK_HOOK_EVENT ||
|
|
66
|
+
process.env.GROK_WORKSPACE_ROOT);
|
|
67
|
+
// Claude / native: pass through unchanged
|
|
68
|
+
if (!isGrok) {
|
|
69
|
+
return r;
|
|
70
|
+
}
|
|
71
|
+
const rawEvent = (r.hookEventName || r.hook_event_name || process.env.GROK_HOOK_EVENT);
|
|
72
|
+
const rawTool = (r.toolName || r.tool_name);
|
|
73
|
+
return {
|
|
74
|
+
...r,
|
|
75
|
+
client: 'grok',
|
|
76
|
+
hook_event_name: rawEvent
|
|
77
|
+
? GROK_EVENT_MAP[rawEvent] || rawEvent
|
|
78
|
+
: r.hook_event_name,
|
|
79
|
+
tool_name: rawTool ? GROK_TOOL_MAP[rawTool] || rawTool : r.tool_name,
|
|
80
|
+
tool_input: (r.toolInput || r.tool_input),
|
|
81
|
+
session_id: (r.sessionId || r.session_id || process.env.GROK_SESSION_ID),
|
|
82
|
+
// Grok provides cwd + workspaceRoot (equal); fall back to env for empty-stdin events.
|
|
83
|
+
cwd: (r.cwd || r.workspaceRoot || process.env.GROK_WORKSPACE_ROOT),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build the absolute path to a Grok Build session plan file.
|
|
88
|
+
*
|
|
89
|
+
* Grok stores per-session plans at:
|
|
90
|
+
* ~/.grok/sessions/<encodeURIComponent(workspaceRoot)>/<sessionId>/plan.md
|
|
91
|
+
*
|
|
92
|
+
* IMPORTANT: encodeURIComponent is applied to the RAW workspace path string
|
|
93
|
+
* (backslashes included on Windows → `C:\...` becomes `C%3A%5C...`), matching
|
|
94
|
+
* the directory names Grok actually creates. Do not slash-normalize beforehand.
|
|
95
|
+
*
|
|
96
|
+
* @param workspaceRoot - Grok workspace root (cwd / workspaceRoot)
|
|
97
|
+
* @param sessionId - Grok session id (UUID-like; sanitized to prevent path traversal)
|
|
98
|
+
* @returns Absolute path to the session's plan.md, or null if sessionId is invalid
|
|
99
|
+
*/
|
|
100
|
+
export function computeGrokPlanPath(workspaceRoot, sessionId) {
|
|
101
|
+
// Sanitize sessionId: it is interpolated into a filesystem path, so restrict it to
|
|
102
|
+
// the characters a real Grok session id uses (UUID: hex + hyphen). This blocks any
|
|
103
|
+
// path-traversal payload (`..`, separators) from escaping ~/.grok/sessions/.
|
|
104
|
+
if (!sessionId || !/^[A-Za-z0-9_-]+$/.test(sessionId)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
// encodeURIComponent encodes every path separator in workspaceRoot, so it collapses
|
|
108
|
+
// to a single safe path segment (no traversal possible from the workspace part), and
|
|
109
|
+
// sessionId is allowlisted above — both inputs are validated before this join.
|
|
110
|
+
// nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal
|
|
111
|
+
return join(homedir(), '.grok', 'sessions', encodeURIComponent(workspaceRoot), sessionId, 'plan.md');
|
|
112
|
+
}
|
|
9
113
|
// ============================================================================
|
|
10
114
|
// Parsing
|
|
11
115
|
// ============================================================================
|
|
@@ -30,13 +134,13 @@ export async function readStdinJson() {
|
|
|
30
134
|
// Parse when stdin closes
|
|
31
135
|
process.stdin.on('end', () => {
|
|
32
136
|
if (!data.trim()) {
|
|
33
|
-
// Empty stdin -
|
|
34
|
-
resolve({});
|
|
137
|
+
// Empty stdin - still normalize so env-based context (Grok GROK_* vars) is picked up
|
|
138
|
+
resolve(normalizeHookInput({}));
|
|
35
139
|
return;
|
|
36
140
|
}
|
|
37
141
|
try {
|
|
38
142
|
const parsed = JSON.parse(data);
|
|
39
|
-
resolve(parsed);
|
|
143
|
+
resolve(normalizeHookInput(parsed));
|
|
40
144
|
}
|
|
41
145
|
catch (error) {
|
|
42
146
|
reject(new Error(`Invalid JSON input: ${error instanceof Error ? error.message : String(error)}`));
|
|
@@ -98,6 +202,10 @@ export function sendPostToolUseContext(additionalContext) {
|
|
|
98
202
|
* @param reason - Reason for blocking
|
|
99
203
|
*/
|
|
100
204
|
export function sendBlock(reason) {
|
|
205
|
+
// Grok Build: PreToolUse hooks deliver reason via stdout deny JSON (stderr is not shown).
|
|
206
|
+
if (process.env.GROK_HOOK_EVENT || process.env.GROK_WORKSPACE_ROOT) {
|
|
207
|
+
console.log(JSON.stringify({ decision: 'deny', reason }));
|
|
208
|
+
}
|
|
101
209
|
console.error(reason);
|
|
102
210
|
process.exit(2);
|
|
103
211
|
}
|
|
@@ -139,6 +247,14 @@ export function isPlanMode(input) {
|
|
|
139
247
|
// Claude Code
|
|
140
248
|
if (input.permission_mode === 'plan')
|
|
141
249
|
return true;
|
|
250
|
+
// Grok Build: plan mode is signaled via the enter_plan_mode / exit_plan_mode tools
|
|
251
|
+
// (no permission_mode field). The actual "active" state is best detected by the
|
|
252
|
+
// presence of a tracked plan for the project + tool context, but for simple
|
|
253
|
+
// enforcement we also accept explicit tool names in the current hook payload.
|
|
254
|
+
const tool = input.tool_name;
|
|
255
|
+
if (tool === 'enter_plan_mode' || tool === 'exit_plan_mode') {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
142
258
|
// Future: Codex, Cursor, etc.
|
|
143
259
|
return false;
|
|
144
260
|
}
|
|
@@ -188,7 +304,27 @@ export function areAllTodosCompleted(input) {
|
|
|
188
304
|
* @returns Project path or undefined
|
|
189
305
|
*/
|
|
190
306
|
export function getProjectPath(input) {
|
|
191
|
-
return input.cwd || process.env.CLAUDE_PROJECT_DIR;
|
|
307
|
+
return input.cwd || process.env.CLAUDE_PROJECT_DIR || process.env.GROK_WORKSPACE_ROOT;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Returns the best available absolute path to the currently tracked plan file.
|
|
311
|
+
*
|
|
312
|
+
* Priority:
|
|
313
|
+
* 1. Explicit plan_path stored in CurrentPlanInfo (Grok Build, future envs)
|
|
314
|
+
* 2. Resolved via legacy plan_file + environment-specific resolver (Claude)
|
|
315
|
+
*
|
|
316
|
+
* This is the function external adapters (sqlew-grok etc.) should prefer over
|
|
317
|
+
* manually calling resolvePlanPath.
|
|
318
|
+
*/
|
|
319
|
+
export function getActivePlanFilePath(projectPath) {
|
|
320
|
+
const info = loadCurrentPlan(projectPath);
|
|
321
|
+
if (!info)
|
|
322
|
+
return null;
|
|
323
|
+
if (info.plan_path && existsSync(info.plan_path)) {
|
|
324
|
+
return info.plan_path;
|
|
325
|
+
}
|
|
326
|
+
// Fallback to legacy resolution (Claude global plans dir)
|
|
327
|
+
return resolvePlanPath(info.plan_file);
|
|
192
328
|
}
|
|
193
329
|
/**
|
|
194
330
|
* 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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAgI9D,+EAA+E;AAC/E,2DAA2D;AAC3D,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,cAAc,GAAiD;IACnE,YAAY,EAAE,YAAY;IAC1B,aAAa,EAAE,aAAa;IAC5B,qBAAqB,EAAE,aAAa;IACpC,kBAAkB,EAAE,kBAAkB;IACtC,aAAa,EAAE,cAAc;IAC7B,WAAW,EAAE,YAAY;IACzB,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,YAAY;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC5C,eAAe,EAAE,eAAe;IAChC,cAAc,EAAE,cAAc;IAC9B,cAAc,EAAE,MAAM;IACtB,gBAAgB,EAAE,MAAM;IACxB,SAAS,EAAE,MAAM;CAClB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAC;IAEzC,MAAM,MAAM,GAAG,CAAC,CAAC,CACf,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS;QACX,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAChC,CAAC;IAEF,0CAA0C;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAc,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAExE,CAAC;IACd,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAuB,CAAC;IAElE,OAAO;QACL,GAAI,CAAe;QACnB,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,QAAQ;YACvB,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAK,QAAyC;YACxE,CAAC,CAAE,CAAC,CAAC,eAAgD;QACvD,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,SAAgC;QAC5F,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,CAA0B;QAClE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAuB;QAC9F,sFAAsF;QACtF,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAuB;KACzF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAqB,EAAE,SAAiB;IAC1E,mFAAmF;IACnF,mFAAmF;IACnF,6EAA6E;IAC7E,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,oFAAoF;IACpF,qFAAqF;IACrF,+EAA+E;IAC/E,mHAAmH;IACnH,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvG,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,8BAA8B;QAC9B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAElC,2BAA2B;QAC3B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,qFAAqF;gBACrF,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACrG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,iBAA0B,EAAE,aAAsB;IAC7E,MAAM,MAAM,GAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IACD,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,iBAAyB;IAC9D,MAAM,MAAM,GAAe;QACzB,QAAQ,EAAE,IAAI;QACd,kBAAkB,EAAE;YAClB,aAAa,EAAE,aAAa;YAC5B,iBAAiB;SAClB;KACF,CAAC;IACF,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,0FAA0F;IAC1F,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,aAAwB,EAAE,aAAiC;IAC1F,MAAM,YAAY,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,aAAa,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAe;QACzB,QAAQ,EAAE,IAAI;QACd,YAAY;KACb,CAAC;IACF,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,cAAc;IACd,IAAI,KAAK,CAAC,eAAe,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,mFAAmF;IACnF,gFAAgF;IAChF,4EAA4E;IAC5E,8EAA8E;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uDAAuD;IACvD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpD,kDAAkD;IAClD,+EAA+E;IAC/E,kCAAkC;IAClC,OAAO,mCAAmC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAgB;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgB;IAC7C,OAAO,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACxF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,0DAA0D;IAC1D,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,OAAO,KAAK,CAAC,UAAU,EAAE,aAAa,KAAK,MAAM,CAAC;AACpD,CAAC"}
|
|
@@ -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"}
|