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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex transcript helpers for Plan-to-ADR extraction.
|
|
3
|
+
*
|
|
4
|
+
* Codex stores session rollouts as JSONL under ~/.codex/sessions/ rather than
|
|
5
|
+
* a dedicated plan.md file. These helpers locate the transcript and extract
|
|
6
|
+
* assistant plan text written during collaboration Plan mode.
|
|
7
|
+
*
|
|
8
|
+
* @since v5.2.1
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
const SESSION_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
14
|
+
/**
|
|
15
|
+
* Recursively search ~/.codex/sessions for a rollout JSONL ending with sessionId.
|
|
16
|
+
*/
|
|
17
|
+
export function findCodexTranscriptPath(sessionId) {
|
|
18
|
+
if (!sessionId || !SESSION_ID_PATTERN.test(sessionId)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const suffix = `${sessionId}.jsonl`;
|
|
22
|
+
const root = join(homedir(), '.codex', 'sessions');
|
|
23
|
+
if (!existsSync(root)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return searchJsonlBySuffix(root, suffix);
|
|
27
|
+
}
|
|
28
|
+
function searchJsonlBySuffix(dir, suffix) {
|
|
29
|
+
for (const entry of readdirSync(dir)) {
|
|
30
|
+
const fullPath = join(dir, entry);
|
|
31
|
+
const stat = statSync(fullPath);
|
|
32
|
+
if (stat.isDirectory()) {
|
|
33
|
+
const found = searchJsonlBySuffix(fullPath, suffix);
|
|
34
|
+
if (found) {
|
|
35
|
+
return found;
|
|
36
|
+
}
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (entry.endsWith(suffix)) {
|
|
40
|
+
return fullPath;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function isPlanCollaborationMode(mode) {
|
|
46
|
+
if (typeof mode === 'string') {
|
|
47
|
+
return mode.toLowerCase() === 'plan';
|
|
48
|
+
}
|
|
49
|
+
if (mode && typeof mode === 'object') {
|
|
50
|
+
const record = mode;
|
|
51
|
+
if (typeof record.mode === 'string') {
|
|
52
|
+
return record.mode.toLowerCase() === 'plan';
|
|
53
|
+
}
|
|
54
|
+
if (typeof record.kind === 'string') {
|
|
55
|
+
return record.kind.toLowerCase() === 'plan';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract assistant plan text from a Codex rollout JSONL transcript.
|
|
62
|
+
* Returns concatenated assistant output from turns that ran in Plan mode.
|
|
63
|
+
*/
|
|
64
|
+
export function extractPlanMarkdownFromCodexTranscript(transcriptPath) {
|
|
65
|
+
if (!existsSync(transcriptPath)) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const lines = readFileSync(transcriptPath, 'utf-8').split('\n').filter((line) => line.trim());
|
|
69
|
+
const chunks = [];
|
|
70
|
+
let inPlanMode = false;
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
let entry;
|
|
73
|
+
try {
|
|
74
|
+
entry = JSON.parse(line);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const type = entry.type;
|
|
80
|
+
const payload = entry.payload;
|
|
81
|
+
if (!payload) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (type === 'turn_context') {
|
|
85
|
+
inPlanMode = isPlanCollaborationMode(payload.collaboration_mode);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (type === 'event_msg') {
|
|
89
|
+
if (isPlanCollaborationMode(payload.collaboration_mode_kind)) {
|
|
90
|
+
inPlanMode = true;
|
|
91
|
+
}
|
|
92
|
+
if (payload.type === 'task_complete' || payload.type === 'turn_complete') {
|
|
93
|
+
// Keep plan mode sticky until an explicit default-mode turn_context arrives.
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!inPlanMode || type !== 'response_item') {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const item = payload;
|
|
101
|
+
if (item.type !== 'message' || item.role !== 'assistant') {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const content = item.content;
|
|
105
|
+
if (!Array.isArray(content)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
for (const part of content) {
|
|
109
|
+
if (!part || typeof part !== 'object') {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const block = part;
|
|
113
|
+
if (block.type === 'output_text' && typeof block.text === 'string' && block.text.trim()) {
|
|
114
|
+
chunks.push(block.text.trim());
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (chunks.length === 0) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return chunks.join('\n\n');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Write extracted Codex plan text to a project-local temp markdown file.
|
|
125
|
+
*/
|
|
126
|
+
export function materializeCodexPlanFile(projectPath, sessionId, content) {
|
|
127
|
+
const dir = join(projectPath, '.sqlew', 'tmp');
|
|
128
|
+
mkdirSync(dir, { recursive: true });
|
|
129
|
+
const safeId = sessionId.replace(/[^A-Za-z0-9_-]/g, '').slice(0, 32) || 'codex';
|
|
130
|
+
const planPath = join(dir, `codex-plan-${safeId}.md`);
|
|
131
|
+
writeFileSync(planPath, content, 'utf-8');
|
|
132
|
+
return planPath;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=codex-transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-transcript.js","sourceRoot":"","sources":["../../../src/cli/hooks/codex-transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAiBH;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuHvD"}
|
|
@@ -10,8 +10,12 @@
|
|
|
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 { extractPlanMarkdownFromCodexTranscript, findCodexTranscriptPath, materializeCodexPlanFile, } from './codex-transcript.js';
|
|
18
|
+
import { debugLog } from '../../utils/debug-logger.js';
|
|
15
19
|
// ============================================================================
|
|
16
20
|
// Main Entry Point
|
|
17
21
|
// ============================================================================
|
|
@@ -24,18 +28,82 @@ import { processPlanPatterns } from './plan-processor.js';
|
|
|
24
28
|
export async function onExitPlanCommand() {
|
|
25
29
|
try {
|
|
26
30
|
const input = await readStdinJson();
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
const projectPath = getProjectPath(input);
|
|
32
|
+
const isExitPlanTool = input.tool_name === 'ExitPlanMode';
|
|
33
|
+
const isCodexStopWithPendingPlan = input.client === 'codex' &&
|
|
34
|
+
input.hook_event_name === 'Stop' &&
|
|
35
|
+
!!projectPath &&
|
|
36
|
+
!!loadCurrentPlan(projectPath)?.decision_pending;
|
|
37
|
+
if (!isExitPlanTool && !isCodexStopWithPendingPlan) {
|
|
29
38
|
sendContinue();
|
|
30
39
|
return;
|
|
31
40
|
}
|
|
32
|
-
const projectPath = getProjectPath(input);
|
|
33
41
|
if (!projectPath) {
|
|
42
|
+
debugLog('WARN', '[on-exit-plan] No project path', {
|
|
43
|
+
client: input.client,
|
|
44
|
+
session_id: input.session_id,
|
|
45
|
+
cwd: input.cwd,
|
|
46
|
+
});
|
|
34
47
|
sendContinue();
|
|
35
48
|
return;
|
|
36
49
|
}
|
|
50
|
+
debugLog('DEBUG', '[on-exit-plan] Processing exit', {
|
|
51
|
+
client: input.client,
|
|
52
|
+
session_id: input.session_id,
|
|
53
|
+
projectPath,
|
|
54
|
+
});
|
|
55
|
+
// Grok Build: the per-session plan lives at ~/.grok/sessions/<enc(cwd)>/<sessionId>/plan.md.
|
|
56
|
+
// The exit hook's session_id is authoritative (each Grok session has its own plan.md), so
|
|
57
|
+
// ALWAYS resolve the path from it here — never trust a stored plan_path, which may be stale
|
|
58
|
+
// from a previous session and would make processPlanPatterns read the wrong/missing file.
|
|
59
|
+
// When the stored info belongs to a different session we reset it as a new plan; when it's
|
|
60
|
+
// the same session we preserve plan_id/recorded so dedup still works.
|
|
61
|
+
if (input.client === 'grok' && input.session_id) {
|
|
62
|
+
const planPath = computeGrokPlanPath(projectPath, input.session_id);
|
|
63
|
+
if (planPath) {
|
|
64
|
+
const existing = loadCurrentPlan(projectPath);
|
|
65
|
+
const sameSession = existing?.plan_path === planPath;
|
|
66
|
+
const planInfo = {
|
|
67
|
+
plan_id: sameSession && existing ? existing.plan_id : randomUUID(),
|
|
68
|
+
plan_file: 'plan.md',
|
|
69
|
+
plan_path: planPath,
|
|
70
|
+
plan_updated_at: new Date().toISOString(),
|
|
71
|
+
recorded: sameSession ? (existing?.recorded ?? false) : false,
|
|
72
|
+
decision_pending: sameSession ? (existing?.decision_pending ?? true) : true,
|
|
73
|
+
enforcement_shown_at: sameSession ? existing?.enforcement_shown_at : undefined,
|
|
74
|
+
};
|
|
75
|
+
saveCurrentPlan(projectPath, planInfo);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (input.client === 'codex') {
|
|
79
|
+
const existing = loadCurrentPlan(projectPath);
|
|
80
|
+
const transcriptPath = input.transcript_path ||
|
|
81
|
+
existing?.plan_path ||
|
|
82
|
+
(input.session_id ? findCodexTranscriptPath(input.session_id) : null);
|
|
83
|
+
if (transcriptPath) {
|
|
84
|
+
const extracted = extractPlanMarkdownFromCodexTranscript(transcriptPath);
|
|
85
|
+
if (extracted) {
|
|
86
|
+
const materializedPath = materializeCodexPlanFile(projectPath, input.session_id || existing?.plan_id || 'codex', extracted);
|
|
87
|
+
const planInfo = {
|
|
88
|
+
plan_id: existing?.plan_id || randomUUID(),
|
|
89
|
+
plan_file: 'codex-plan.md',
|
|
90
|
+
plan_path: materializedPath,
|
|
91
|
+
plan_updated_at: new Date().toISOString(),
|
|
92
|
+
recorded: existing?.recorded ?? false,
|
|
93
|
+
decision_pending: existing?.decision_pending ?? true,
|
|
94
|
+
enforcement_shown_at: existing?.enforcement_shown_at,
|
|
95
|
+
};
|
|
96
|
+
saveCurrentPlan(projectPath, planInfo);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
37
100
|
// Delegate to shared processor
|
|
38
101
|
const result = processPlanPatterns(projectPath);
|
|
102
|
+
debugLog('DEBUG', '[on-exit-plan] Result', {
|
|
103
|
+
processed: result.processed,
|
|
104
|
+
skipReason: result.skipReason,
|
|
105
|
+
projectPath,
|
|
106
|
+
});
|
|
39
107
|
if (!result.processed) {
|
|
40
108
|
// Map skip reasons to user-friendly messages
|
|
41
109
|
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;
|
|
1
|
+
{"version":3,"file":"on-prompt.d.ts","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH;;;;;;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,CA0DrD"}
|
|
@@ -18,8 +18,10 @@
|
|
|
18
18
|
* @since v5.0.6
|
|
19
19
|
* @modified v5.0.7 - First/repeat message split, inline template, isPlanMode()
|
|
20
20
|
*/
|
|
21
|
+
import { randomUUID } from 'crypto';
|
|
21
22
|
import { readStdinJson, isPlanMode, getProjectPath } from './stdin-parser.js';
|
|
22
23
|
import { loadCurrentPlan, saveCurrentPlan } from '../../config/global-config.js';
|
|
24
|
+
import { findCodexTranscriptPath } from './codex-transcript.js';
|
|
23
25
|
// ============================================================================
|
|
24
26
|
// Plan Mode Enforcement Context
|
|
25
27
|
// ============================================================================
|
|
@@ -30,21 +32,21 @@ import { loadCurrentPlan, saveCurrentPlan } from '../../config/global-config.js'
|
|
|
30
32
|
* Includes the exact 📌/🚫 format so the AI doesn't need to
|
|
31
33
|
* invoke a separate skill — direct embedding improves compliance.
|
|
32
34
|
*/
|
|
33
|
-
export const ENFORCEMENT_FULL = `[sqlew] Plan mode active. REQUIRED:
|
|
34
|
-
1. suggest { action: "by_context", key: "<keyword>" } BEFORE planning
|
|
35
|
-
2. Include "Related Context (from sqlew)" section
|
|
36
|
-
3. Format decisions/constraints EXACTLY like this:
|
|
37
|
-
|
|
38
|
-
### 📌 Decision: key-name
|
|
39
|
-
- **Value**: description
|
|
40
|
-
- **Layer**: business
|
|
41
|
-
- **Rationale**: why
|
|
42
|
-
|
|
43
|
-
### 🚫 Constraint: category
|
|
44
|
-
- **Rule**: description
|
|
45
|
-
- **Priority**: high
|
|
46
|
-
- **Tags**: comma-separated
|
|
47
|
-
|
|
35
|
+
export const ENFORCEMENT_FULL = `[sqlew] Plan mode active. REQUIRED:
|
|
36
|
+
1. suggest { action: "by_context", key: "<keyword>" } BEFORE planning
|
|
37
|
+
2. Include "Related Context (from sqlew)" section
|
|
38
|
+
3. Format decisions/constraints EXACTLY like this:
|
|
39
|
+
|
|
40
|
+
### 📌 Decision: key-name
|
|
41
|
+
- **Value**: description
|
|
42
|
+
- **Layer**: business
|
|
43
|
+
- **Rationale**: why
|
|
44
|
+
|
|
45
|
+
### 🚫 Constraint: category
|
|
46
|
+
- **Rule**: description
|
|
47
|
+
- **Priority**: high
|
|
48
|
+
- **Tags**: comma-separated
|
|
49
|
+
|
|
48
50
|
4. Check queue: queue { action: "list" }`;
|
|
49
51
|
/**
|
|
50
52
|
* Short reminder for subsequent prompts in the same plan session.
|
|
@@ -71,6 +73,11 @@ export const PLAN_MODE_ENFORCEMENT = ENFORCEMENT_FULL;
|
|
|
71
73
|
export async function onPromptCommand() {
|
|
72
74
|
try {
|
|
73
75
|
const input = await readStdinJson();
|
|
76
|
+
// Grok Build: UserPromptSubmit is a passive hook — stdout is ignored.
|
|
77
|
+
// Plan mode guidance is delivered via plugin skills instead.
|
|
78
|
+
if (input.client === 'grok') {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
74
81
|
if (!isPlanMode(input)) {
|
|
75
82
|
// Non-plan mode: output nothing (exit 0 = allow, no context injection)
|
|
76
83
|
return;
|
|
@@ -82,7 +89,22 @@ export async function onPromptCommand() {
|
|
|
82
89
|
process.stdout.write(ENFORCEMENT_FULL);
|
|
83
90
|
return;
|
|
84
91
|
}
|
|
85
|
-
|
|
92
|
+
let planInfo = loadCurrentPlan(projectPath);
|
|
93
|
+
if (input.client === 'codex' && !planInfo) {
|
|
94
|
+
const transcriptPath = input.transcript_path ||
|
|
95
|
+
(input.session_id ? findCodexTranscriptPath(input.session_id) : undefined) ||
|
|
96
|
+
undefined;
|
|
97
|
+
const codexPlanInfo = {
|
|
98
|
+
plan_id: randomUUID(),
|
|
99
|
+
plan_file: 'codex-plan.md',
|
|
100
|
+
plan_path: transcriptPath,
|
|
101
|
+
plan_updated_at: new Date().toISOString(),
|
|
102
|
+
recorded: false,
|
|
103
|
+
decision_pending: true,
|
|
104
|
+
};
|
|
105
|
+
saveCurrentPlan(projectPath, codexPlanInfo);
|
|
106
|
+
planInfo = codexPlanInfo;
|
|
107
|
+
}
|
|
86
108
|
if (!planInfo || !planInfo.enforcement_shown_at) {
|
|
87
109
|
// First prompt in this plan session → full message with inline template
|
|
88
110
|
process.stdout.write(ENFORCEMENT_FULL);
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"on-prompt.js","sourceRoot":"","sources":["../../../src/cli/hooks/on-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAwB,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,+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,IAAI,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE5C,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,cAAc,GAClB,KAAK,CAAC,eAAe;gBACrB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1E,SAAS,CAAC;YACZ,MAAM,aAAa,GAAoB;gBACrC,OAAO,EAAE,UAAU,EAAE;gBACrB,SAAS,EAAE,eAAe;gBAC1B,SAAS,EAAE,cAAc;gBACzB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACzC,QAAQ,EAAE,KAAK;gBACf,gBAAgB,EAAE,IAAI;aACvB,CAAC;YACF,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAC5C,QAAQ,GAAG,aAAa,CAAC;QAC3B,CAAC;QAED,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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"}
|
package/dist/cli/hooks/pr-adr.js
CHANGED
|
@@ -16,11 +16,11 @@ import { readStdinJson, sendContinue, sendBlock } from './stdin-parser.js';
|
|
|
16
16
|
// ============================================================================
|
|
17
17
|
// Constants
|
|
18
18
|
// ============================================================================
|
|
19
|
-
const BLOCK_MESSAGE = `[sqlew] PR requires ADR context. Before creating:
|
|
20
|
-
1. git diff <base>...HEAD --stat
|
|
21
|
-
2. suggest { action: "by_context", key: "<keyword>" } for each changed area
|
|
22
|
-
3. decision { action: "get", key: "<key>", include_context: true } for matches (score >= 35)
|
|
23
|
-
4. Format PR body with "## Architecture Decisions" or "## Other Changes"
|
|
19
|
+
const BLOCK_MESSAGE = `[sqlew] PR requires ADR context. Before creating:
|
|
20
|
+
1. git diff <base>...HEAD --stat
|
|
21
|
+
2. suggest { action: "by_context", key: "<keyword>" } for each changed area
|
|
22
|
+
3. decision { action: "get", key: "<key>", include_context: true } for matches (score >= 35)
|
|
23
|
+
4. Format PR body with "## Architecture Decisions" or "## Other Changes"
|
|
24
24
|
5. Re-run gh pr create`;
|
|
25
25
|
// ============================================================================
|
|
26
26
|
// Helpers
|
|
@@ -75,6 +75,10 @@ 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
|
+
/** Codex collaboration mode (e.g. plan, default). */
|
|
79
|
+
collaboration_mode?: string;
|
|
80
|
+
/** Originating client, set by normalizeHookInput() (e.g., 'grok', 'codex'). undefined = Claude/native. */
|
|
81
|
+
client?: 'grok' | 'codex' | 'claude';
|
|
78
82
|
}
|
|
79
83
|
/**
|
|
80
84
|
* Hook-specific output for PreToolUse (v4.2.0+)
|
|
@@ -119,6 +123,34 @@ export interface HookOutput {
|
|
|
119
123
|
/** @deprecated Use hookSpecificOutput.updatedInput instead */
|
|
120
124
|
updatedInput?: ToolInput;
|
|
121
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Normalize a raw hook payload into the canonical (Claude-shaped) HookInput.
|
|
128
|
+
*
|
|
129
|
+
* Claude Code payloads already use snake_case keys + PascalCase event/tool names,
|
|
130
|
+
* so they pass through unchanged (backward compatible). Grok Build payloads use
|
|
131
|
+
* camelCase keys (`hookEventName`/`toolName`/`toolInput`/`sessionId`) and snake_case
|
|
132
|
+
* event/tool values, which are translated here so every downstream handler keeps
|
|
133
|
+
* working without modification.
|
|
134
|
+
*
|
|
135
|
+
* @param raw - Parsed JSON from stdin (any shape)
|
|
136
|
+
* @returns Canonical HookInput
|
|
137
|
+
*/
|
|
138
|
+
export declare function normalizeHookInput(raw: unknown): HookInput;
|
|
139
|
+
/**
|
|
140
|
+
* Build the absolute path to a Grok Build session plan file.
|
|
141
|
+
*
|
|
142
|
+
* Grok stores per-session plans at:
|
|
143
|
+
* ~/.grok/sessions/<encodeURIComponent(workspaceRoot)>/<sessionId>/plan.md
|
|
144
|
+
*
|
|
145
|
+
* IMPORTANT: encodeURIComponent is applied to the RAW workspace path string
|
|
146
|
+
* (backslashes included on Windows → `C:\...` becomes `C%3A%5C...`), matching
|
|
147
|
+
* the directory names Grok actually creates. Do not slash-normalize beforehand.
|
|
148
|
+
*
|
|
149
|
+
* @param workspaceRoot - Grok workspace root (cwd / workspaceRoot)
|
|
150
|
+
* @param sessionId - Grok session id (UUID-like; sanitized to prevent path traversal)
|
|
151
|
+
* @returns Absolute path to the session's plan.md, or null if sessionId is invalid
|
|
152
|
+
*/
|
|
153
|
+
export declare function computeGrokPlanPath(workspaceRoot: string, sessionId: string): string | null;
|
|
122
154
|
/**
|
|
123
155
|
* Read and parse JSON from stdin
|
|
124
156
|
*
|
|
@@ -208,6 +240,17 @@ export declare function areAllTodosCompleted(input: HookInput): boolean;
|
|
|
208
240
|
* @returns Project path or undefined
|
|
209
241
|
*/
|
|
210
242
|
export declare function getProjectPath(input: HookInput): string | undefined;
|
|
243
|
+
/**
|
|
244
|
+
* Returns the best available absolute path to the currently tracked plan file.
|
|
245
|
+
*
|
|
246
|
+
* Priority:
|
|
247
|
+
* 1. Explicit plan_path stored in CurrentPlanInfo (Grok Build, future envs)
|
|
248
|
+
* 2. Resolved via legacy plan_file + environment-specific resolver (Claude)
|
|
249
|
+
*
|
|
250
|
+
* This is the function external adapters (sqlew-grok etc.) should prefer over
|
|
251
|
+
* manually calling resolvePlanPath.
|
|
252
|
+
*/
|
|
253
|
+
export declare function getActivePlanFilePath(projectPath: string): string | null;
|
|
211
254
|
/**
|
|
212
255
|
* Check if the hook input is for a Plan agent
|
|
213
256
|
*
|
|
@@ -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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"}
|