aiwcli 0.12.6 → 0.12.8
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/bin/dev.cmd +3 -3
- package/bin/dev.js +16 -16
- package/bin/run.cmd +3 -3
- package/bin/run.js +21 -21
- package/dist/commands/branch.js +7 -2
- package/dist/lib/bmad-installer.js +37 -37
- package/dist/lib/terminal.d.ts +2 -0
- package/dist/lib/terminal.js +57 -7
- package/dist/templates/CLAUDE.md +232 -205
- package/dist/templates/_shared/.claude/settings.json +65 -65
- package/dist/templates/_shared/.claude/{commands/handoff.md → skills/handoff/SKILL.md} +13 -12
- package/dist/templates/_shared/.claude/{commands/handoff-resume.md → skills/handoff-resume/SKILL.md} +13 -12
- package/dist/templates/_shared/.codex/workflows/handoff.md +226 -226
- package/dist/templates/_shared/.windsurf/workflows/handoff.md +226 -226
- package/dist/templates/_shared/handoff-system/CLAUDE.md +15 -3
- package/dist/templates/_shared/handoff-system/lib/document-generator.ts +215 -215
- package/dist/templates/_shared/handoff-system/lib/handoff-reader.ts +158 -158
- package/dist/templates/_shared/handoff-system/scripts/resume_handoff.ts +373 -373
- package/dist/templates/_shared/handoff-system/scripts/save_handoff.ts +469 -469
- package/dist/templates/_shared/handoff-system/workflows/handoff-resume.md +66 -66
- package/dist/templates/_shared/handoff-system/workflows/handoff.md +254 -254
- package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +2 -2
- package/dist/templates/_shared/hooks-ts/archive_plan.ts +159 -159
- package/dist/templates/_shared/hooks-ts/context_monitor.ts +147 -147
- package/dist/templates/_shared/hooks-ts/file-suggestion.ts +128 -128
- package/dist/templates/_shared/hooks-ts/pre_compact.ts +49 -49
- package/dist/templates/_shared/hooks-ts/session_end.ts +196 -196
- package/dist/templates/_shared/hooks-ts/session_start.ts +163 -163
- package/dist/templates/_shared/hooks-ts/task_create_capture.ts +48 -48
- package/dist/templates/_shared/hooks-ts/task_update_capture.ts +74 -74
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +93 -93
- package/dist/templates/_shared/lib-ts/CLAUDE.md +367 -367
- package/dist/templates/_shared/lib-ts/base/atomic-write.ts +138 -138
- package/dist/templates/_shared/lib-ts/base/constants.ts +24 -6
- package/dist/templates/_shared/lib-ts/base/git-state.ts +58 -58
- package/dist/templates/_shared/lib-ts/base/hook-utils.ts +582 -582
- package/dist/templates/_shared/lib-ts/base/inference.ts +301 -301
- package/dist/templates/_shared/lib-ts/base/logger.ts +247 -247
- package/dist/templates/_shared/lib-ts/base/state-io.ts +202 -202
- package/dist/templates/_shared/lib-ts/base/stop-words.ts +184 -184
- package/dist/templates/_shared/lib-ts/base/utils.ts +184 -184
- package/dist/templates/_shared/lib-ts/context/CLAUDE.md +134 -0
- package/dist/templates/_shared/lib-ts/context/context-formatter.ts +566 -566
- package/dist/templates/_shared/lib-ts/context/context-selector.ts +524 -524
- package/dist/templates/_shared/lib-ts/context/context-store.ts +712 -712
- package/dist/templates/_shared/lib-ts/context/plan-manager.ts +312 -312
- package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -185
- package/dist/templates/_shared/lib-ts/package.json +20 -20
- package/dist/templates/_shared/lib-ts/templates/formatters.ts +102 -102
- package/dist/templates/_shared/lib-ts/templates/plan-context.ts +58 -58
- package/dist/templates/_shared/lib-ts/tsconfig.json +13 -13
- package/dist/templates/_shared/lib-ts/types.ts +186 -186
- package/dist/templates/_shared/scripts/resolve_context.ts +33 -33
- package/dist/templates/_shared/scripts/status_line.ts +687 -690
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/ask.md +136 -136
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/index.md +21 -21
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/overview.md +56 -56
- package/dist/templates/cc-native/.claude/commands/cc-native/specdev.md +10 -10
- package/dist/templates/cc-native/.claude/settings.json +3 -2
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/fix.md +8 -8
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/implement.md +8 -8
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/research.md +8 -8
- package/dist/templates/cc-native/CC-NATIVE-README.md +189 -189
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +304 -304
- package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +143 -143
- package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +213 -213
- package/dist/templates/cc-native/_cc-native/agents/plan-questions/PLAN-QUESTIONER.md +70 -70
- package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +64 -0
- package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/format.ts +1 -1
- package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/write.ts +2 -2
- package/dist/templates/cc-native/_cc-native/cc-native.config.json +96 -96
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +14 -24
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +1 -1
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +54 -54
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +51 -51
- package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +53 -53
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -61
- package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +76 -0
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +9 -2
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +319 -319
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +144 -144
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +57 -57
- package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +83 -83
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +79 -79
- package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +4 -4
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +168 -168
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +80 -80
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +41 -41
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/CLAUDE.md +480 -480
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +287 -287
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +148 -148
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +54 -54
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +58 -58
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +208 -208
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +460 -460
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +446 -446
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +280 -280
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +274 -274
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +201 -201
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +278 -278
- package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +184 -184
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +275 -275
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -18
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +1 -1
- package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +149 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +143 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +213 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +70 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +62 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +61 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +62 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +56 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +53 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +66 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +70 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +62 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +72 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +61 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +64 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +56 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +86 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +59 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +58 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +66 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +62 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +66 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +71 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +74 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +77 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +62 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +68 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +61 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +71 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +61 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +61 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +67 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +65 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +74 -0
- package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +69 -0
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/agent-selection.ts +3 -3
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/corroboration.ts +1 -1
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/graduation.ts +1 -1
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/orchestrator.ts +2 -2
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/output-builder.ts +3 -3
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/plan-questions.ts +6 -6
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/review-pipeline.ts +15 -15
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/agent.ts +5 -5
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/base/base-agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/claude-agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/codex-agent.ts +6 -6
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/gemini-agent.ts +1 -1
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/orchestrator-claude-agent.ts +4 -4
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/types.ts +3 -3
- package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/verdict.ts +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +108 -108
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +0 -21
- package/dist/templates/cc-native/_cc-native/lib-ts/nul +0 -3
- /package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/index.ts +0 -0
- /package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/tracker.ts +0 -0
- /package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/index.ts +0 -0
- /package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/schemas.ts +0 -0
- /package/dist/templates/cc-native/_cc-native/{workflows → plan-review/workflows}/specdev.md +0 -0
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* fileSuggestion hook: Suggest context-relevant files for Claude's file inclusion.
|
|
4
|
-
* Outputs a plain JSON array (NOT hookSpecificOutput).
|
|
5
|
-
*/
|
|
6
|
-
import * as fs from "node:fs";
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* fileSuggestion hook: Suggest context-relevant files for Claude's file inclusion.
|
|
4
|
+
* Outputs a plain JSON array (NOT hookSpecificOutput).
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
7
|
import * as path from "node:path";
|
|
8
|
-
|
|
9
|
-
import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/base/constants.js";
|
|
10
|
-
import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/base/hook-utils.js";
|
|
11
|
-
import { getAllContexts, getContextBySessionId } from "../lib-ts/context/context-store.js";
|
|
12
|
-
import type { ContextState } from "../lib-ts/types.js";
|
|
13
|
-
|
|
14
|
-
/** Get .md files sorted by mtime descending */
|
|
15
|
-
function getMdFilesByMtime(dir: string): string[] {
|
|
16
|
-
try {
|
|
17
|
-
if (!fs.existsSync(dir)) return [];
|
|
18
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
19
|
-
const mdFiles = entries
|
|
20
|
-
.filter(e => e.isFile() && e.name.endsWith(".md"))
|
|
21
|
-
.map(e => {
|
|
22
|
-
const fullPath = path.join(dir, e.name);
|
|
23
|
-
const stat = fs.statSync(fullPath);
|
|
24
|
-
return { path: fullPath, mtime: stat.mtimeMs };
|
|
25
|
-
})
|
|
26
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
27
|
-
return mdFiles.map(f => f.path);
|
|
28
|
-
} catch {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Find latest folder-based document (subdirectory with index.md) */
|
|
34
|
-
function getLatestFolderDoc(dir: string): null | string {
|
|
35
|
-
try {
|
|
36
|
-
if (!fs.existsSync(dir)) return null;
|
|
37
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
38
|
-
const subdirs = entries
|
|
39
|
-
.filter(e => e.isDirectory())
|
|
40
|
-
.map(e => {
|
|
41
|
-
const indexPath = path.join(dir, e.name, "index.md");
|
|
42
|
-
if (fs.existsSync(indexPath)) {
|
|
43
|
-
const stat = fs.statSync(indexPath);
|
|
44
|
-
return { path: indexPath, mtime: stat.mtimeMs };
|
|
8
|
+
|
|
9
|
+
import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/base/constants.js";
|
|
10
|
+
import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/base/hook-utils.js";
|
|
11
|
+
import { getAllContexts, getContextBySessionId } from "../lib-ts/context/context-store.js";
|
|
12
|
+
import type { ContextState } from "../lib-ts/types.js";
|
|
13
|
+
|
|
14
|
+
/** Get .md files sorted by mtime descending */
|
|
15
|
+
function getMdFilesByMtime(dir: string): string[] {
|
|
16
|
+
try {
|
|
17
|
+
if (!fs.existsSync(dir)) return [];
|
|
18
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
19
|
+
const mdFiles = entries
|
|
20
|
+
.filter(e => e.isFile() && e.name.endsWith(".md"))
|
|
21
|
+
.map(e => {
|
|
22
|
+
const fullPath = path.join(dir, e.name);
|
|
23
|
+
const stat = fs.statSync(fullPath);
|
|
24
|
+
return { path: fullPath, mtime: stat.mtimeMs };
|
|
25
|
+
})
|
|
26
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
27
|
+
return mdFiles.map(f => f.path);
|
|
28
|
+
} catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Find latest folder-based document (subdirectory with index.md) */
|
|
34
|
+
function getLatestFolderDoc(dir: string): null | string {
|
|
35
|
+
try {
|
|
36
|
+
if (!fs.existsSync(dir)) return null;
|
|
37
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
38
|
+
const subdirs = entries
|
|
39
|
+
.filter(e => e.isDirectory())
|
|
40
|
+
.map(e => {
|
|
41
|
+
const indexPath = path.join(dir, e.name, "index.md");
|
|
42
|
+
if (fs.existsSync(indexPath)) {
|
|
43
|
+
const stat = fs.statSync(indexPath);
|
|
44
|
+
return { path: indexPath, mtime: stat.mtimeMs };
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
return null;
|
|
48
|
-
})
|
|
49
|
-
.filter((x): x is NonNullable<typeof x> => x !== null)
|
|
50
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
51
|
-
return subdirs.length > 0 ? subdirs[0].path : null;
|
|
52
|
-
} catch {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function main(): void {
|
|
58
|
-
const payload = loadHookInput();
|
|
59
|
-
if (!payload) {
|
|
60
|
-
console.log("[]");
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const projectRoot = getProjectRoot(payload.cwd);
|
|
66
|
-
const sessionId = payload.session_id;
|
|
67
|
-
|
|
68
|
-
// Find active context
|
|
69
|
-
let ctx: ContextState | null = null;
|
|
70
|
-
|
|
71
|
-
if (sessionId) {
|
|
72
|
-
ctx = getContextBySessionId(sessionId, projectRoot);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Fallback: single active (non-idle) context
|
|
76
|
-
if (!ctx) {
|
|
77
|
-
const all = getAllContexts("active", projectRoot);
|
|
78
|
-
const active = all.filter(c => c.status === "active" && c.mode !== "idle");
|
|
79
|
-
if (active.length === 1) {
|
|
80
|
-
ctx = active[0];
|
|
81
|
-
} else {
|
|
82
|
-
logDebug("file-suggestion", `Ambiguous: ${active.length} active non-idle contexts`);
|
|
83
|
-
console.log("[]");
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const suggestions: string[] = [];
|
|
89
|
-
|
|
90
|
-
// Context file
|
|
91
|
-
const ctxFile = getContextFilePath(ctx.id, projectRoot);
|
|
92
|
-
if (fs.existsSync(ctxFile)) suggestions.push(ctxFile);
|
|
93
|
-
|
|
94
|
-
// Plan files (most recent first)
|
|
95
|
-
const plansDir = getContextPlansDir(ctx.id, projectRoot);
|
|
96
|
-
suggestions.push(...getMdFilesByMtime(plansDir));
|
|
97
|
-
|
|
98
|
-
// Handoff files (prefer folder-based)
|
|
99
|
-
const handoffsDir = getContextHandoffsDir(ctx.id, projectRoot);
|
|
100
|
-
const latestHandoff = getLatestFolderDoc(handoffsDir);
|
|
101
|
-
if (latestHandoff) {
|
|
102
|
-
suggestions.push(latestHandoff);
|
|
103
|
-
} else {
|
|
104
|
-
// Legacy: only most recent flat .md file
|
|
105
|
-
const legacyHandoffs = getMdFilesByMtime(handoffsDir);
|
|
106
|
-
if (legacyHandoffs.length > 0) suggestions.push(legacyHandoffs[0]);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Review files (prefer folder-based under cc-native/)
|
|
110
|
-
const reviewsDir = getContextReviewsDir(ctx.id, projectRoot);
|
|
111
|
-
const ccNativeReviews = path.join(reviewsDir, "cc-native");
|
|
112
|
-
const latestReview = getLatestFolderDoc(ccNativeReviews);
|
|
113
|
-
if (latestReview) {
|
|
114
|
-
suggestions.push(latestReview);
|
|
115
|
-
} else {
|
|
116
|
-
// Fallback to flat review.md files
|
|
117
|
-
suggestions.push(...getMdFilesByMtime(reviewsDir));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Limit to 10
|
|
121
|
-
const limited = suggestions.slice(0, 10);
|
|
122
|
-
console.log(JSON.stringify(limited));
|
|
123
|
-
} catch (error) {
|
|
124
|
-
// Must output valid JSON array even on error — Claude Code expects it
|
|
125
|
-
logError("file-suggestion", `Error: ${error}`);
|
|
126
|
-
console.log("[]");
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
runHook(main, "file-suggestion");
|
|
46
|
+
|
|
47
|
+
return null;
|
|
48
|
+
})
|
|
49
|
+
.filter((x): x is NonNullable<typeof x> => x !== null)
|
|
50
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
51
|
+
return subdirs.length > 0 ? subdirs[0].path : null;
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function main(): void {
|
|
58
|
+
const payload = loadHookInput();
|
|
59
|
+
if (!payload) {
|
|
60
|
+
console.log("[]");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const projectRoot = getProjectRoot(payload.cwd);
|
|
66
|
+
const sessionId = payload.session_id;
|
|
67
|
+
|
|
68
|
+
// Find active context
|
|
69
|
+
let ctx: ContextState | null = null;
|
|
70
|
+
|
|
71
|
+
if (sessionId) {
|
|
72
|
+
ctx = getContextBySessionId(sessionId, projectRoot);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Fallback: single active (non-idle) context
|
|
76
|
+
if (!ctx) {
|
|
77
|
+
const all = getAllContexts("active", projectRoot);
|
|
78
|
+
const active = all.filter(c => c.status === "active" && c.mode !== "idle");
|
|
79
|
+
if (active.length === 1) {
|
|
80
|
+
ctx = active[0];
|
|
81
|
+
} else {
|
|
82
|
+
logDebug("file-suggestion", `Ambiguous: ${active.length} active non-idle contexts`);
|
|
83
|
+
console.log("[]");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const suggestions: string[] = [];
|
|
89
|
+
|
|
90
|
+
// Context file
|
|
91
|
+
const ctxFile = getContextFilePath(ctx.id, projectRoot);
|
|
92
|
+
if (fs.existsSync(ctxFile)) suggestions.push(ctxFile);
|
|
93
|
+
|
|
94
|
+
// Plan files (most recent first)
|
|
95
|
+
const plansDir = getContextPlansDir(ctx.id, projectRoot);
|
|
96
|
+
suggestions.push(...getMdFilesByMtime(plansDir));
|
|
97
|
+
|
|
98
|
+
// Handoff files (prefer folder-based)
|
|
99
|
+
const handoffsDir = getContextHandoffsDir(ctx.id, projectRoot);
|
|
100
|
+
const latestHandoff = getLatestFolderDoc(handoffsDir);
|
|
101
|
+
if (latestHandoff) {
|
|
102
|
+
suggestions.push(latestHandoff);
|
|
103
|
+
} else {
|
|
104
|
+
// Legacy: only most recent flat .md file
|
|
105
|
+
const legacyHandoffs = getMdFilesByMtime(handoffsDir);
|
|
106
|
+
if (legacyHandoffs.length > 0) suggestions.push(legacyHandoffs[0]);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Review files (prefer folder-based under cc-native/)
|
|
110
|
+
const reviewsDir = getContextReviewsDir(ctx.id, projectRoot);
|
|
111
|
+
const ccNativeReviews = path.join(reviewsDir, "cc-native");
|
|
112
|
+
const latestReview = getLatestFolderDoc(ccNativeReviews);
|
|
113
|
+
if (latestReview) {
|
|
114
|
+
suggestions.push(latestReview);
|
|
115
|
+
} else {
|
|
116
|
+
// Fallback to flat review.md files
|
|
117
|
+
suggestions.push(...getMdFilesByMtime(reviewsDir));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Limit to 10
|
|
121
|
+
const limited = suggestions.slice(0, 10);
|
|
122
|
+
console.log(JSON.stringify(limited));
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// Must output valid JSON array even on error — Claude Code expects it
|
|
125
|
+
logError("file-suggestion", `Error: ${error}`);
|
|
126
|
+
console.log("[]");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
runHook(main, "file-suggestion");
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* PreCompact hook: Save state.json snapshot before context compaction.
|
|
4
|
-
* Captures git state and session metadata for recovery.
|
|
5
|
-
*/
|
|
6
|
-
import { getProjectRoot } from "../lib-ts/base/constants.js";
|
|
7
|
-
import { getGitState } from "../lib-ts/base/git-state.js";
|
|
8
|
-
import {
|
|
9
|
-
loadHookInput, logDebug, logError, logInfo, runHook,
|
|
10
|
-
} from "../lib-ts/base/hook-utils.js";
|
|
11
|
-
import { nowIso } from "../lib-ts/base/utils.js";
|
|
12
|
-
import { getContextBySessionId, saveState } from "../lib-ts/context/context-store.js";
|
|
13
|
-
|
|
14
|
-
function main(): void {
|
|
15
|
-
const payload = loadHookInput();
|
|
16
|
-
if (!payload) return;
|
|
17
|
-
|
|
18
|
-
const sessionId = payload.session_id;
|
|
19
|
-
if (!sessionId) {
|
|
20
|
-
logDebug("pre_compact", "No session_id, skipping");
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const projectRoot = getProjectRoot(payload.cwd);
|
|
25
|
-
const state = getContextBySessionId(sessionId, projectRoot);
|
|
26
|
-
if (!state) {
|
|
27
|
-
logDebug("pre_compact", `No context bound to session ${sessionId}`);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const gitState = getGitState(projectRoot);
|
|
32
|
-
|
|
33
|
-
state.last_session = {
|
|
34
|
-
...state.last_session,
|
|
35
|
-
session_id: sessionId,
|
|
36
|
-
saved_at: nowIso(),
|
|
37
|
-
save_reason: "pre_compact",
|
|
38
|
-
git_state: gitState,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const [ok, err] = saveState(state.id, state, projectRoot);
|
|
42
|
-
if (ok) {
|
|
43
|
-
logInfo("pre_compact", `Saved pre-compact snapshot for ${state.id}`);
|
|
44
|
-
} else {
|
|
45
|
-
logError("pre_compact", `Failed to save state: ${err}`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
runHook(main, "pre_compact");
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* PreCompact hook: Save state.json snapshot before context compaction.
|
|
4
|
+
* Captures git state and session metadata for recovery.
|
|
5
|
+
*/
|
|
6
|
+
import { getProjectRoot } from "../lib-ts/base/constants.js";
|
|
7
|
+
import { getGitState } from "../lib-ts/base/git-state.js";
|
|
8
|
+
import {
|
|
9
|
+
loadHookInput, logDebug, logError, logInfo, runHook,
|
|
10
|
+
} from "../lib-ts/base/hook-utils.js";
|
|
11
|
+
import { nowIso } from "../lib-ts/base/utils.js";
|
|
12
|
+
import { getContextBySessionId, saveState } from "../lib-ts/context/context-store.js";
|
|
13
|
+
|
|
14
|
+
function main(): void {
|
|
15
|
+
const payload = loadHookInput();
|
|
16
|
+
if (!payload) return;
|
|
17
|
+
|
|
18
|
+
const sessionId = payload.session_id;
|
|
19
|
+
if (!sessionId) {
|
|
20
|
+
logDebug("pre_compact", "No session_id, skipping");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const projectRoot = getProjectRoot(payload.cwd);
|
|
25
|
+
const state = getContextBySessionId(sessionId, projectRoot);
|
|
26
|
+
if (!state) {
|
|
27
|
+
logDebug("pre_compact", `No context bound to session ${sessionId}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const gitState = getGitState(projectRoot);
|
|
32
|
+
|
|
33
|
+
state.last_session = {
|
|
34
|
+
...state.last_session,
|
|
35
|
+
session_id: sessionId,
|
|
36
|
+
saved_at: nowIso(),
|
|
37
|
+
save_reason: "pre_compact",
|
|
38
|
+
git_state: gitState,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const [ok, err] = saveState(state.id, state, projectRoot);
|
|
42
|
+
if (ok) {
|
|
43
|
+
logInfo("pre_compact", `Saved pre-compact snapshot for ${state.id}`);
|
|
44
|
+
} else {
|
|
45
|
+
logError("pre_compact", `Failed to save state: ${err}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
runHook(main, "pre_compact");
|