@hongmaple0820/scale-engine 0.40.1 → 0.43.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/README.md +30 -2
- package/dist/api/cli.js +286 -7
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.js +1 -1
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +11 -0
- package/dist/api/quickstart.js +98 -1
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/fsmDefinitions.js +15 -2
- package/dist/artifact/fsmDefinitions.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/bootstrap/DependencyBootstrap.d.ts +1 -0
- package/dist/bootstrap/DependencyBootstrap.js +137 -25
- package/dist/bootstrap/DependencyBootstrap.js.map +1 -1
- package/dist/cache/ScanCache.d.ts +41 -0
- package/dist/cache/ScanCache.js +120 -0
- package/dist/cache/ScanCache.js.map +1 -0
- package/dist/capabilities/BrowserQACapability.d.ts +14 -0
- package/dist/capabilities/BrowserQACapability.js +94 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -1
- package/dist/capabilities/InstalledSkillsIntegration.js +29 -9
- package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
- package/dist/cli/autofixCommands.d.ts +22 -0
- package/dist/cli/autofixCommands.js +32 -0
- package/dist/cli/autofixCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +71 -0
- package/dist/cli/cortexCommands.js +335 -0
- package/dist/cli/cortexCommands.js.map +1 -0
- package/dist/cli/costCommands.d.ts +13 -0
- package/dist/cli/costCommands.js +48 -0
- package/dist/cli/costCommands.js.map +1 -0
- package/dist/cli/orchCommands.d.ts +43 -0
- package/dist/cli/orchCommands.js +135 -0
- package/dist/cli/orchCommands.js.map +1 -0
- package/dist/cli/phaseCommands.js +1 -2
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/qaCommands.d.ts +22 -0
- package/dist/cli/qaCommands.js +84 -0
- package/dist/cli/qaCommands.js.map +1 -0
- package/dist/cli/quickstartCommands.d.ts +17 -0
- package/dist/cli/quickstartCommands.js +47 -0
- package/dist/cli/quickstartCommands.js.map +1 -0
- package/dist/cli/shieldCommands.d.ts +30 -0
- package/dist/cli/shieldCommands.js +212 -0
- package/dist/cli/shieldCommands.js.map +1 -0
- package/dist/cli/tuiCommands.d.ts +7 -0
- package/dist/cli/tuiCommands.js +33 -0
- package/dist/cli/tuiCommands.js.map +1 -0
- package/dist/config/profiles.js +26 -0
- package/dist/config/profiles.js.map +1 -1
- package/dist/context/ContextBudget.js +2 -2
- package/dist/core/GbrainRuntime.d.ts +25 -0
- package/dist/core/GbrainRuntime.js +270 -0
- package/dist/core/GbrainRuntime.js.map +1 -0
- package/dist/cortex/GovernanceMetrics.d.ts +66 -0
- package/dist/cortex/GovernanceMetrics.js +230 -0
- package/dist/cortex/GovernanceMetrics.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +61 -0
- package/dist/cortex/InstinctExtractor.js +184 -0
- package/dist/cortex/InstinctExtractor.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +54 -0
- package/dist/cortex/InstinctStore.js +266 -0
- package/dist/cortex/InstinctStore.js.map +1 -0
- package/dist/cortex/ReflexionEngine.d.ts +34 -0
- package/dist/cortex/ReflexionEngine.js +157 -0
- package/dist/cortex/ReflexionEngine.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +44 -0
- package/dist/cortex/SessionInjector.js +127 -0
- package/dist/cortex/SessionInjector.js.map +1 -0
- package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
- package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
- package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
- package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CodexAdapter.js +52 -0
- package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
- package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CursorAdapter.js +46 -0
- package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
- package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
- package/dist/cortex/adapters/GeminiAdapter.js +48 -0
- package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
- package/dist/env/EnvironmentDoctor.js +221 -5
- package/dist/env/EnvironmentDoctor.js.map +1 -1
- package/dist/eval/BenchmarkPublisher.d.ts +25 -0
- package/dist/eval/BenchmarkPublisher.js +27 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -0
- package/dist/guardrails/DependencyAuditor.js +10 -1
- package/dist/guardrails/DependencyAuditor.js.map +1 -1
- package/dist/memory/MemoryProviders.js +38 -91
- package/dist/memory/MemoryProviders.js.map +1 -1
- package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
- package/dist/orchestrator/OrchestratorDaemon.js +150 -0
- package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
- package/dist/orchestrator/PolicyLoader.d.ts +80 -0
- package/dist/orchestrator/PolicyLoader.js +229 -0
- package/dist/orchestrator/PolicyLoader.js.map +1 -0
- package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
- package/dist/orchestrator/ReconciliationLoop.js +266 -0
- package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
- package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
- package/dist/orchestrator/TrackerAdapter.js +147 -0
- package/dist/orchestrator/TrackerAdapter.js.map +1 -0
- package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
- package/dist/orchestrator/WorkspaceManager.js +257 -0
- package/dist/orchestrator/WorkspaceManager.js.map +1 -0
- package/dist/qa/BrowserDaemon.d.ts +23 -0
- package/dist/qa/BrowserDaemon.js +79 -0
- package/dist/qa/BrowserDaemon.js.map +1 -0
- package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
- package/dist/qa/E2ETestOrchestrator.js +19 -0
- package/dist/qa/E2ETestOrchestrator.js.map +1 -0
- package/dist/review/CrossModelReviewer.d.ts +35 -0
- package/dist/review/CrossModelReviewer.js +75 -0
- package/dist/review/CrossModelReviewer.js.map +1 -0
- package/dist/review/ReviewAggregator.d.ts +13 -0
- package/dist/review/ReviewAggregator.js +28 -0
- package/dist/review/ReviewAggregator.js.map +1 -0
- package/dist/review/reviewCommands.d.ts +15 -0
- package/dist/review/reviewCommands.js +24 -0
- package/dist/review/reviewCommands.js.map +1 -0
- package/dist/routing/LocalModelProvider.d.ts +11 -0
- package/dist/routing/LocalModelProvider.js +21 -0
- package/dist/routing/LocalModelProvider.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +12 -0
- package/dist/routing/ModelRouter.js +31 -4
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/runtime/AiOsRuntime.d.ts +1 -0
- package/dist/runtime/AiOsRuntime.js +15 -0
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/CostAnalyzer.d.ts +53 -0
- package/dist/runtime/CostAnalyzer.js +160 -0
- package/dist/runtime/CostAnalyzer.js.map +1 -0
- package/dist/runtime/CostOptimizer.d.ts +11 -0
- package/dist/runtime/CostOptimizer.js +21 -0
- package/dist/runtime/CostOptimizer.js.map +1 -0
- package/dist/runtime/ModelUsageLedger.d.ts +53 -2
- package/dist/runtime/ModelUsageLedger.js +243 -39
- package/dist/runtime/ModelUsageLedger.js.map +1 -1
- package/dist/setup/SetupVerification.d.ts +42 -0
- package/dist/setup/SetupVerification.js +180 -0
- package/dist/setup/SetupVerification.js.map +1 -0
- package/dist/shield/PolicyCompiler.d.ts +70 -0
- package/dist/shield/PolicyCompiler.js +540 -0
- package/dist/shield/PolicyCompiler.js.map +1 -0
- package/dist/shield/ProtectedPaths.d.ts +39 -0
- package/dist/shield/ProtectedPaths.js +179 -0
- package/dist/shield/ProtectedPaths.js.map +1 -0
- package/dist/shield/ShieldProtocol.d.ts +50 -0
- package/dist/shield/ShieldProtocol.js +103 -0
- package/dist/shield/ShieldProtocol.js.map +1 -0
- package/dist/skills/SkillMdStandard.d.ts +33 -0
- package/dist/skills/SkillMdStandard.js +88 -0
- package/dist/skills/SkillMdStandard.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +9 -1
- package/dist/skills/SkillRegistry.js +20 -0
- package/dist/skills/SkillRegistry.js.map +1 -1
- package/dist/skills/interop/GStackInterop.d.ts +15 -0
- package/dist/skills/interop/GStackInterop.js +34 -0
- package/dist/skills/interop/GStackInterop.js.map +1 -0
- package/dist/skills/interop/OMCInterop.d.ts +15 -0
- package/dist/skills/interop/OMCInterop.js +34 -0
- package/dist/skills/interop/OMCInterop.js.map +1 -0
- package/dist/tools/ToolCapabilityRegistry.js +10 -0
- package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
- package/dist/tui/TuiDashboard.d.ts +3 -0
- package/dist/tui/TuiDashboard.js +120 -0
- package/dist/tui/TuiDashboard.js.map +1 -0
- package/dist/workflow/GateCatalog.d.ts +2 -0
- package/dist/workflow/GateCatalog.js +59 -3
- package/dist/workflow/GateCatalog.js.map +1 -1
- package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
- package/dist/workflow/GovernanceTemplatePacks.js +15 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
- package/dist/workflow/TddLoop.d.ts +2 -0
- package/dist/workflow/TddLoop.js +2 -0
- package/dist/workflow/TddLoop.js.map +1 -1
- package/dist/workflow/UpgradeManager.d.ts +10 -1
- package/dist/workflow/UpgradeManager.js +55 -0
- package/dist/workflow/UpgradeManager.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +8 -0
- package/dist/workflow/VerificationProfile.js +62 -1
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/VerificationSchema.d.ts +46 -0
- package/dist/workflow/VerificationSchema.js +97 -0
- package/dist/workflow/VerificationSchema.js.map +1 -0
- package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
- package/dist/workflow/autofix/AutoFixEngine.js +169 -0
- package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +18 -0
- package/dist/workflow/execution/RalphEngine.js +22 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -1
- package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
- package/dist/workflow/gates/EnhancedGates.js +653 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +3 -0
- package/dist/workflow/gates/GateSystem.js +94 -1
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/types.d.ts +1 -1
- package/docs/README.md +3 -0
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
- package/docs/guides/GETTING_STARTED.md +19 -0
- package/docs/guides/MIGRATION.md +119 -0
- package/docs/start/quickstart.md +1 -0
- package/docs/workflow/GATES_AND_SCORE.md +34 -1
- package/docs/workflow/README.md +58 -10
- package/package.json +7 -18
- package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
- package/scripts/workflow/lib/report-output.mjs +107 -0
- package/scripts/workflow/provider-rehearsal.mjs +129 -48
- package/scripts/workflow/setup-smoke.mjs +142 -8
- package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
- package/docs/BACKGROUND_HUNTER.md +0 -62
- package/docs/CODE_INTELLIGENCE.md +0 -180
- package/docs/CONTEXT_BUDGET.md +0 -155
- package/docs/DEPENDENCY_AUDIT.md +0 -118
- package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
- package/docs/GITLAB_FLOW.md +0 -125
- package/docs/GOVERNANCE_DASHBOARD.md +0 -85
- package/docs/MEMORY_BRAIN.md +0 -104
- package/docs/MEMORY_FABRIC.md +0 -161
- package/docs/RESOURCE_GOVERNANCE.md +0 -92
- package/docs/RUNTIME_EVIDENCE.md +0 -101
- package/docs/WORKFLOW_EVAL.md +0 -151
- package/image/wechat-public.jpg +0 -0
- package/image/wxPay.jpg +0 -0
- package/image/zfb.jpg +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SCALE Cortex — Reflexion Engine
|
|
2
|
+
// 对齐 ECC: local LLM (Qwen/GLM/DeepSeek) reflection on failure evidence
|
|
3
|
+
// Output: root cause analysis + improvement suggestions + actionable instincts
|
|
4
|
+
// Cost: $0 API fees (local model)
|
|
5
|
+
import { logger } from '../core/logger.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// ReflexionEngine
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export class ReflexionEngine {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.modelEndpoint = options?.endpoint ?? process.env.SCALE_LOCAL_BASE_URL ?? 'http://localhost:11434';
|
|
12
|
+
this.modelName = options?.model ?? process.env.SCALE_LOCAL_MODEL ?? 'qwen-2.5';
|
|
13
|
+
this.enabled = !!process.env.SCALE_LOCAL_MODEL || !!options?.model;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reflect on a set of failed observations to produce root cause analysis.
|
|
17
|
+
*/
|
|
18
|
+
async reflect(observations) {
|
|
19
|
+
if (observations.length === 0) {
|
|
20
|
+
return {
|
|
21
|
+
rootCause: 'No observations to reflect on',
|
|
22
|
+
confidence: 0,
|
|
23
|
+
suggestedAction: 'Collect more data',
|
|
24
|
+
relatedFailures: [],
|
|
25
|
+
instinct: null,
|
|
26
|
+
modelUsed: 'none',
|
|
27
|
+
tokensUsed: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!this.enabled) {
|
|
31
|
+
return this.heuristicReflect(observations);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return await this.llmReflect(observations);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
logger.warn({ err }, 'LLM reflection failed, falling back to heuristic');
|
|
38
|
+
return this.heuristicReflect(observations);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reflect on gate failure patterns and generate improvement instincts.
|
|
43
|
+
*/
|
|
44
|
+
async reflectOnGate(gateName, failures) {
|
|
45
|
+
const gateFailures = failures.filter(o => o.gateName === gateName && o.gateStatus === 'FAIL');
|
|
46
|
+
return this.reflect(gateFailures);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Batch reflect across all failing gates and merge results.
|
|
50
|
+
*/
|
|
51
|
+
async reflectAll(observations) {
|
|
52
|
+
const failures = observations.filter(o => o.gateStatus === 'FAIL');
|
|
53
|
+
const byGate = new Map();
|
|
54
|
+
for (const obs of failures) {
|
|
55
|
+
if (!byGate.has(obs.gateName))
|
|
56
|
+
byGate.set(obs.gateName, []);
|
|
57
|
+
byGate.get(obs.gateName).push(obs);
|
|
58
|
+
}
|
|
59
|
+
const results = [];
|
|
60
|
+
for (const [gate, obs] of byGate) {
|
|
61
|
+
results.push(await this.reflectOnGate(gate, obs));
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
// -----------------------------------------------------------------------
|
|
66
|
+
// Internal
|
|
67
|
+
// -----------------------------------------------------------------------
|
|
68
|
+
async llmReflect(observations) {
|
|
69
|
+
const prompt = this.buildReflectionPrompt(observations);
|
|
70
|
+
const response = await fetch(`${this.modelEndpoint}/v1/chat/completions`, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: { 'Content-Type': 'application/json' },
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
model: this.modelName,
|
|
75
|
+
messages: [
|
|
76
|
+
{ role: 'system', content: 'You are a root cause analysis engine. Analyze the following gate failures and output structured JSON only.' },
|
|
77
|
+
{ role: 'user', content: prompt },
|
|
78
|
+
],
|
|
79
|
+
temperature: 0.3,
|
|
80
|
+
max_tokens: 500,
|
|
81
|
+
}),
|
|
82
|
+
signal: AbortSignal.timeout(15000),
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok)
|
|
85
|
+
throw new Error(`LLM endpoint returned ${response.status}`);
|
|
86
|
+
const data = await response.json();
|
|
87
|
+
const content = data.choices?.[0]?.message?.content ?? '';
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(content);
|
|
90
|
+
return {
|
|
91
|
+
rootCause: parsed.rootCause ?? 'Unknown',
|
|
92
|
+
confidence: parsed.confidence ?? 0.5,
|
|
93
|
+
suggestedAction: parsed.suggestedAction ?? 'Manual investigation recommended',
|
|
94
|
+
relatedFailures: parsed.relatedFailures ?? [],
|
|
95
|
+
instinct: null, // Caller should create instinct from this
|
|
96
|
+
modelUsed: this.modelName,
|
|
97
|
+
tokensUsed: data.usage?.total_tokens ?? 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// If LLM didn't return valid JSON, use heuristic
|
|
102
|
+
return this.heuristicReflect(observations);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
heuristicReflect(observations) {
|
|
106
|
+
const gateName = observations[0]?.gateName ?? 'unknown';
|
|
107
|
+
const errorPatterns = observations
|
|
108
|
+
.map(o => o.errorPattern)
|
|
109
|
+
.filter(Boolean);
|
|
110
|
+
// Most common error pattern
|
|
111
|
+
const patternCounts = new Map();
|
|
112
|
+
for (const p of errorPatterns) {
|
|
113
|
+
patternCounts.set(p, (patternCounts.get(p) ?? 0) + 1);
|
|
114
|
+
}
|
|
115
|
+
let dominantPattern = '';
|
|
116
|
+
let maxCount = 0;
|
|
117
|
+
for (const [p, c] of patternCounts) {
|
|
118
|
+
if (c > maxCount) {
|
|
119
|
+
maxCount = c;
|
|
120
|
+
dominantPattern = p;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const rootCause = dominantPattern
|
|
124
|
+
? `Gate "${gateName}" recurring failure: "${dominantPattern}" (${maxCount}/${observations.length} occurrences)`
|
|
125
|
+
: `Gate "${gateName}" failed ${observations.length} time(s) — investigate patterns`;
|
|
126
|
+
return {
|
|
127
|
+
rootCause,
|
|
128
|
+
confidence: maxCount > 2 ? 0.7 : 0.4,
|
|
129
|
+
suggestedAction: dominantPattern
|
|
130
|
+
? `Run 'scale auto-fix' targeting ${gateName} failures. Check the most recent evidence for resolution clues.`
|
|
131
|
+
: `Collect more failure data for gate "${gateName}" to identify patterns.`,
|
|
132
|
+
relatedFailures: errorPatterns.slice(0, 5),
|
|
133
|
+
instinct: null,
|
|
134
|
+
modelUsed: 'heuristic',
|
|
135
|
+
tokensUsed: 0,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
buildReflectionPrompt(observations) {
|
|
139
|
+
const failures = observations
|
|
140
|
+
.map(o => `[${o.timestamp}] Gate: ${o.gateName} | Pattern: ${o.errorPattern ?? 'unknown'} | RC: ${o.rootCause ?? 'unknown'}`)
|
|
141
|
+
.join('\n');
|
|
142
|
+
return [
|
|
143
|
+
'Analyze these gate failures and output JSON:',
|
|
144
|
+
'',
|
|
145
|
+
failures,
|
|
146
|
+
'',
|
|
147
|
+
'Output format:',
|
|
148
|
+
'{',
|
|
149
|
+
' "rootCause": "primary root cause",',
|
|
150
|
+
' "confidence": 0.0-1.0,',
|
|
151
|
+
' "suggestedAction": "concrete actionable step",',
|
|
152
|
+
' "relatedFailures": ["pattern1", "pattern2"]',
|
|
153
|
+
'}',
|
|
154
|
+
].join('\n');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ReflexionEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReflexionEngine.js","sourceRoot":"","sources":["../../src/cortex/ReflexionEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { InstinctStore } from './InstinctStore.js';
|
|
2
|
+
export interface SessionInjection {
|
|
3
|
+
/** Rendered text injected into session start */
|
|
4
|
+
content: string;
|
|
5
|
+
/** Number of instincts injected */
|
|
6
|
+
instinctCount: number;
|
|
7
|
+
/** Metadata for metrics */
|
|
8
|
+
metadata: {
|
|
9
|
+
projectId?: string;
|
|
10
|
+
projectType?: string;
|
|
11
|
+
packageManager?: string;
|
|
12
|
+
instinctsApplied: string[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface PriorSessionBrief {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
taskCompleted: string;
|
|
20
|
+
filesChanged: string[];
|
|
21
|
+
gatesPassed: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class SessionInjector {
|
|
24
|
+
private instinctStore;
|
|
25
|
+
constructor(instinctStore: InstinctStore);
|
|
26
|
+
/**
|
|
27
|
+
* Build the full SessionStart injection payload.
|
|
28
|
+
*/
|
|
29
|
+
build(projectId?: string, priorSessions?: PriorSessionBrief[]): SessionInjection;
|
|
30
|
+
/**
|
|
31
|
+
* Build a minimal injection suitable for constrained context budgets.
|
|
32
|
+
*/
|
|
33
|
+
buildMinimal(projectId?: string): SessionInjection;
|
|
34
|
+
/**
|
|
35
|
+
* Detect project type from filesystem.
|
|
36
|
+
*/
|
|
37
|
+
detectProject(projectDir?: string): {
|
|
38
|
+
projectType: string;
|
|
39
|
+
packageManager: string;
|
|
40
|
+
hasGit: boolean;
|
|
41
|
+
};
|
|
42
|
+
private renderInstinctBlock;
|
|
43
|
+
private renderPriorSession;
|
|
44
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// SCALE Cortex — Session Injector
|
|
2
|
+
// 对齐 ECC: SessionStart injection of high-confidence instincts
|
|
3
|
+
// Historical context wrapped in narrative sentinels (anti-replay protection)
|
|
4
|
+
// Injects: instincts + prior session summary + learned skills + project detection
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// SessionInjector
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const HISTORICAL_SENTINEL_START = '<!-- HISTORICAL CONTEXT — DO NOT RE-EXECUTE COMMANDS BELOW -->';
|
|
9
|
+
const HISTORICAL_SENTINEL_END = '<!-- END HISTORICAL CONTEXT -->';
|
|
10
|
+
export class SessionInjector {
|
|
11
|
+
constructor(instinctStore) {
|
|
12
|
+
this.instinctStore = instinctStore;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build the full SessionStart injection payload.
|
|
16
|
+
*/
|
|
17
|
+
build(projectId, priorSessions = []) {
|
|
18
|
+
const instincts = this.instinctStore.getInjectionInstincts(projectId);
|
|
19
|
+
const sections = [];
|
|
20
|
+
// 1. High-confidence instincts (main payload)
|
|
21
|
+
if (instincts.length > 0) {
|
|
22
|
+
sections.push('## SCALE Cortex — Learned Instincts\n');
|
|
23
|
+
sections.push('The following patterns have been learned from prior sessions. Use them to avoid repeating mistakes.\n');
|
|
24
|
+
for (const instinct of instincts) {
|
|
25
|
+
sections.push(this.renderInstinctBlock(instinct));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 2. Prior session summaries (with stale replay protection)
|
|
29
|
+
if (priorSessions.length > 0) {
|
|
30
|
+
sections.push('## Recent Session History\n');
|
|
31
|
+
sections.push(HISTORICAL_SENTINEL_START);
|
|
32
|
+
sections.push('The following is historical context only. Do NOT re-execute any commands mentioned.\n');
|
|
33
|
+
for (const session of priorSessions.slice(0, 3)) {
|
|
34
|
+
sections.push(this.renderPriorSession(session));
|
|
35
|
+
}
|
|
36
|
+
sections.push(HISTORICAL_SENTINEL_END);
|
|
37
|
+
}
|
|
38
|
+
// 3. Cortex usage hint
|
|
39
|
+
sections.push('---');
|
|
40
|
+
sections.push('_SCALE Cortex is active. Run `scale cortex metrics` for ROI dashboard._');
|
|
41
|
+
const content = sections.join('\n');
|
|
42
|
+
const instinctIds = instincts.map(i => i.id);
|
|
43
|
+
return {
|
|
44
|
+
content,
|
|
45
|
+
instinctCount: instincts.length,
|
|
46
|
+
metadata: {
|
|
47
|
+
projectId,
|
|
48
|
+
instinctsApplied: instinctIds,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build a minimal injection suitable for constrained context budgets.
|
|
54
|
+
*/
|
|
55
|
+
buildMinimal(projectId) {
|
|
56
|
+
const instincts = this.instinctStore.getInjectionInstincts(projectId);
|
|
57
|
+
if (instincts.length === 0) {
|
|
58
|
+
return {
|
|
59
|
+
content: '',
|
|
60
|
+
instinctCount: 0,
|
|
61
|
+
metadata: { projectId, instinctsApplied: [] },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// One-liner format for minimal context consumption
|
|
65
|
+
const lines = instincts.map(i => `[Cortex ${i.confidence}] ${i.domain}: ${i.action.split('\n')[0]?.replace(/^##\s*/, '')?.slice(0, 120)}`);
|
|
66
|
+
return {
|
|
67
|
+
content: `SCALE Cortex Instincts (${instincts.length}):\n${lines.join('\n')}`,
|
|
68
|
+
instinctCount: instincts.length,
|
|
69
|
+
metadata: { projectId, instinctsApplied: instincts.map(i => i.id) },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Detect project type from filesystem.
|
|
74
|
+
*/
|
|
75
|
+
detectProject(projectDir = process.cwd()) {
|
|
76
|
+
const { existsSync } = require('fs');
|
|
77
|
+
const { join } = require('path');
|
|
78
|
+
let projectType = 'generic';
|
|
79
|
+
let packageManager = 'none';
|
|
80
|
+
if (existsSync(join(projectDir, 'package.json'))) {
|
|
81
|
+
projectType = 'node';
|
|
82
|
+
if (existsSync(join(projectDir, 'pnpm-lock.yaml')))
|
|
83
|
+
packageManager = 'pnpm';
|
|
84
|
+
else if (existsSync(join(projectDir, 'yarn.lock')))
|
|
85
|
+
packageManager = 'yarn';
|
|
86
|
+
else
|
|
87
|
+
packageManager = 'npm';
|
|
88
|
+
}
|
|
89
|
+
else if (existsSync(join(projectDir, 'go.mod'))) {
|
|
90
|
+
projectType = 'go';
|
|
91
|
+
packageManager = 'go modules';
|
|
92
|
+
}
|
|
93
|
+
else if (existsSync(join(projectDir, 'pyproject.toml'))) {
|
|
94
|
+
projectType = 'python';
|
|
95
|
+
packageManager = 'pip/poetry';
|
|
96
|
+
}
|
|
97
|
+
else if (existsSync(join(projectDir, 'Cargo.toml'))) {
|
|
98
|
+
projectType = 'rust';
|
|
99
|
+
packageManager = 'cargo';
|
|
100
|
+
}
|
|
101
|
+
const hasGit = existsSync(join(projectDir, '.git'));
|
|
102
|
+
return { projectType, packageManager, hasGit };
|
|
103
|
+
}
|
|
104
|
+
// -----------------------------------------------------------------------
|
|
105
|
+
// Internal
|
|
106
|
+
// -----------------------------------------------------------------------
|
|
107
|
+
renderInstinctBlock(instinct) {
|
|
108
|
+
const confidenceLabel = instinct.confidence >= 0.9 ? 'NEAR-CERTAIN' :
|
|
109
|
+
instinct.confidence >= 0.7 ? 'STRONG' :
|
|
110
|
+
instinct.confidence >= 0.5 ? 'MODERATE' : 'TENTATIVE';
|
|
111
|
+
return [
|
|
112
|
+
`### [${confidenceLabel}] ${instinct.domain}/${instinct.id}`,
|
|
113
|
+
`**Confidence:** ${(instinct.confidence * 100).toFixed(0)}% | **Observed:** ${instinct.observations} times | **Hit Rate:** ${(instinct.hitRate * 100).toFixed(0)}%`,
|
|
114
|
+
'',
|
|
115
|
+
instinct.action,
|
|
116
|
+
'',
|
|
117
|
+
].join('\n');
|
|
118
|
+
}
|
|
119
|
+
renderPriorSession(session) {
|
|
120
|
+
return [
|
|
121
|
+
`- **${session.timestamp.slice(0, 10)}**: ${session.summary}`,
|
|
122
|
+
` Files: ${session.filesChanged.slice(0, 5).join(', ')}${session.filesChanged.length > 5 ? '...' : ''}`,
|
|
123
|
+
` Gates: ${session.gatesPassed ? 'PASS' : 'FAIL'} | Task: ${session.taskCompleted}`,
|
|
124
|
+
].join('\n');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=SessionInjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInjector.js","sourceRoot":"","sources":["../../src/cortex/SessionInjector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface UnifiedHookInput {
|
|
2
|
+
harness: 'claude' | 'codex' | 'cursor' | 'gemini';
|
|
3
|
+
sessionId: string;
|
|
4
|
+
cwd: string;
|
|
5
|
+
toolName: string;
|
|
6
|
+
toolInput: Record<string, unknown>;
|
|
7
|
+
event: 'PreToolUse' | 'PostToolUse' | 'Stop' | 'SessionStart';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse Claude Code hook stdin JSON into unified format.
|
|
11
|
+
* Claude Code format: { session_id, cwd, tool_name, tool_input }
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseClaudeInput(raw: string): UnifiedHookInput;
|
|
14
|
+
/**
|
|
15
|
+
* Generate Claude Code settings.json hook entry for Cortex.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateClaudeHookConfig(scriptPath: string): object;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SCALE Cortex — Claude Code Adapter
|
|
2
|
+
// 对齐 ECC: DRY adapter pattern — same hook logic, different stdin format
|
|
3
|
+
// Converts Claude Code hook stdin JSON to unified Cortex format
|
|
4
|
+
/**
|
|
5
|
+
* Parse Claude Code hook stdin JSON into unified format.
|
|
6
|
+
* Claude Code format: { session_id, cwd, tool_name, tool_input }
|
|
7
|
+
*/
|
|
8
|
+
export function parseClaudeInput(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const input = JSON.parse(raw);
|
|
11
|
+
return {
|
|
12
|
+
harness: 'claude',
|
|
13
|
+
sessionId: input.session_id ?? 'unknown',
|
|
14
|
+
cwd: input.cwd ?? process.cwd(),
|
|
15
|
+
toolName: input.tool_name ?? '',
|
|
16
|
+
toolInput: input.tool_input ?? {},
|
|
17
|
+
event: input.hook_event ?? 'PreToolUse',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {
|
|
22
|
+
harness: 'claude',
|
|
23
|
+
sessionId: 'unknown',
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
toolName: '',
|
|
26
|
+
toolInput: {},
|
|
27
|
+
event: 'PreToolUse',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate Claude Code settings.json hook entry for Cortex.
|
|
33
|
+
*/
|
|
34
|
+
export function generateClaudeHookConfig(scriptPath) {
|
|
35
|
+
return {
|
|
36
|
+
hooks: {
|
|
37
|
+
PreToolUse: [
|
|
38
|
+
{
|
|
39
|
+
type: 'command',
|
|
40
|
+
command: `node ${scriptPath}`,
|
|
41
|
+
timeout: 5000,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
SessionStart: [
|
|
45
|
+
{
|
|
46
|
+
type: 'command',
|
|
47
|
+
command: `node ${scriptPath} --event SessionStart`,
|
|
48
|
+
timeout: 10000,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
Stop: [
|
|
52
|
+
{
|
|
53
|
+
type: 'command',
|
|
54
|
+
command: `node ${scriptPath} --event Stop`,
|
|
55
|
+
timeout: 10000,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ClaudeAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeAdapter.js","sourceRoot":"","sources":["../../../src/cortex/adapters/ClaudeAdapter.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,wEAAwE;AACxE,gEAAgE;AAWhE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;YACxC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;YAC/B,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YACjC,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,YAAY;SACxC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,UAAU,EAAE;oBAC7B,OAAO,EAAE,IAAI;iBACd;aACF;YACD,YAAY,EAAE;gBACZ;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,UAAU,uBAAuB;oBAClD,OAAO,EAAE,KAAK;iBACf;aACF;YACD,IAAI,EAAE;gBACJ;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,UAAU,eAAe;oBAC1C,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UnifiedHookInput } from './ClaudeAdapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse Codex hook stdin JSON into unified format.
|
|
4
|
+
* Codex format: { session, workspace, tool, input }
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseCodexInput(raw: string): UnifiedHookInput;
|
|
7
|
+
/**
|
|
8
|
+
* Generate Codex hooks.json config entry for Cortex.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateCodexHookConfig(scriptPath: string): object;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SCALE Cortex — Codex Adapter
|
|
2
|
+
// 对齐 ECC: DRY adapter pattern — converts Codex hook format to unified Cortex format
|
|
3
|
+
// Codex uses .codex/hooks.json with slightly different stdin shape
|
|
4
|
+
/**
|
|
5
|
+
* Parse Codex hook stdin JSON into unified format.
|
|
6
|
+
* Codex format: { session, workspace, tool, input }
|
|
7
|
+
*/
|
|
8
|
+
export function parseCodexInput(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const input = JSON.parse(raw);
|
|
11
|
+
return {
|
|
12
|
+
harness: 'codex',
|
|
13
|
+
sessionId: input.session?.id ?? input.sessionId ?? 'unknown',
|
|
14
|
+
cwd: input.workspace ?? input.cwd ?? process.cwd(),
|
|
15
|
+
toolName: input.tool ?? input.toolName ?? '',
|
|
16
|
+
toolInput: input.input ?? input.toolInput ?? {},
|
|
17
|
+
event: input.event ?? 'PreToolUse',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {
|
|
22
|
+
harness: 'codex',
|
|
23
|
+
sessionId: 'unknown',
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
toolName: '',
|
|
26
|
+
toolInput: {},
|
|
27
|
+
event: 'PreToolUse',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate Codex hooks.json config entry for Cortex.
|
|
33
|
+
*/
|
|
34
|
+
export function generateCodexHookConfig(scriptPath) {
|
|
35
|
+
return {
|
|
36
|
+
hooks: {
|
|
37
|
+
PreToolUse: [
|
|
38
|
+
{
|
|
39
|
+
command: `node ${scriptPath}`,
|
|
40
|
+
timeout: 5000,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
SessionStart: [
|
|
44
|
+
{
|
|
45
|
+
command: `node ${scriptPath} --event SessionStart`,
|
|
46
|
+
timeout: 10000,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=CodexAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexAdapter.js","sourceRoot":"","sources":["../../../src/cortex/adapters/CodexAdapter.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,oFAAoF;AACpF,mEAAmE;AAInE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS;YAC5D,GAAG,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAClD,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE;YAC5C,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE;YAC/C,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,YAAY;SACnC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,OAAO,EAAE,QAAQ,UAAU,EAAE;oBAC7B,OAAO,EAAE,IAAI;iBACd;aACF;YACD,YAAY,EAAE;gBACZ;oBACE,OAAO,EAAE,QAAQ,UAAU,uBAAuB;oBAClD,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UnifiedHookInput } from './ClaudeAdapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse Cursor hook stdin JSON into unified format.
|
|
4
|
+
* Cursor format: { session_id, working_dir, action, args }
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseCursorInput(raw: string): UnifiedHookInput;
|
|
7
|
+
/**
|
|
8
|
+
* Generate Cursor hooks.json config entry for Cortex.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateCursorHookConfig(scriptPath: string): object;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// SCALE Cortex — Cursor Adapter
|
|
2
|
+
// 对齐 ECC: DRY adapter pattern — converts Cursor hook format to unified Cortex format
|
|
3
|
+
// Cursor uses .cursor/hooks.json with a slightly different stdin schema
|
|
4
|
+
/**
|
|
5
|
+
* Parse Cursor hook stdin JSON into unified format.
|
|
6
|
+
* Cursor format: { session_id, working_dir, action, args }
|
|
7
|
+
*/
|
|
8
|
+
export function parseCursorInput(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const input = JSON.parse(raw);
|
|
11
|
+
return {
|
|
12
|
+
harness: 'cursor',
|
|
13
|
+
sessionId: input.session_id ?? input.sessionId ?? 'unknown',
|
|
14
|
+
cwd: input.working_dir ?? input.cwd ?? process.cwd(),
|
|
15
|
+
toolName: input.action ?? input.tool ?? '',
|
|
16
|
+
toolInput: input.args ?? input.input ?? {},
|
|
17
|
+
event: input.hook_event ?? input.event ?? 'PreToolUse',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {
|
|
22
|
+
harness: 'cursor',
|
|
23
|
+
sessionId: 'unknown',
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
toolName: '',
|
|
26
|
+
toolInput: {},
|
|
27
|
+
event: 'PreToolUse',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate Cursor hooks.json config entry for Cortex.
|
|
33
|
+
*/
|
|
34
|
+
export function generateCursorHookConfig(scriptPath) {
|
|
35
|
+
return {
|
|
36
|
+
hooks: {
|
|
37
|
+
PreToolUse: [
|
|
38
|
+
{
|
|
39
|
+
type: 'command',
|
|
40
|
+
command: `node ${scriptPath}`,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=CursorAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorAdapter.js","sourceRoot":"","sources":["../../../src/cortex/adapters/CursorAdapter.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,qFAAqF;AACrF,wEAAwE;AAIxE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS;YAC3D,GAAG,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YACpD,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;YAC1C,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE;YAC1C,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,IAAI,YAAY;SACvD,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,UAAU,EAAE;iBAC9B;aACF;SACF;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UnifiedHookInput } from './ClaudeAdapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse Gemini CLI hook stdin JSON into unified format.
|
|
4
|
+
* Gemini format varies per tool, this normalizes across known shapes.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseGeminiInput(raw: string): UnifiedHookInput;
|
|
7
|
+
/**
|
|
8
|
+
* Generate Gemini CLI hook config entry for Cortex.
|
|
9
|
+
* Gemini CLI uses GEMINI.md with hooks section.
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateGeminiHookConfig(scriptPath: string): object;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// SCALE Cortex — Gemini CLI Adapter
|
|
2
|
+
// 对齐 ECC: DRY adapter pattern — converts Gemini CLI hook format to unified Cortex format
|
|
3
|
+
// Gemini CLI uses GEMINI.md hooks with its own stdin format
|
|
4
|
+
/**
|
|
5
|
+
* Parse Gemini CLI hook stdin JSON into unified format.
|
|
6
|
+
* Gemini format varies per tool, this normalizes across known shapes.
|
|
7
|
+
*/
|
|
8
|
+
export function parseGeminiInput(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const input = JSON.parse(raw);
|
|
11
|
+
return {
|
|
12
|
+
harness: 'gemini',
|
|
13
|
+
sessionId: input.session_id ?? input.sessionId ?? input.sid ?? 'unknown',
|
|
14
|
+
cwd: input.cwd ?? input.working_directory ?? process.cwd(),
|
|
15
|
+
toolName: input.tool_name ?? input.toolName ?? input.action ?? '',
|
|
16
|
+
toolInput: input.input ?? input.tool_input ?? input.args ?? {},
|
|
17
|
+
event: input.event ?? input.hook_event ?? 'PreToolUse',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {
|
|
22
|
+
harness: 'gemini',
|
|
23
|
+
sessionId: 'unknown',
|
|
24
|
+
cwd: process.cwd(),
|
|
25
|
+
toolName: '',
|
|
26
|
+
toolInput: {},
|
|
27
|
+
event: 'PreToolUse',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate Gemini CLI hook config entry for Cortex.
|
|
33
|
+
* Gemini CLI uses GEMINI.md with hooks section.
|
|
34
|
+
*/
|
|
35
|
+
export function generateGeminiHookConfig(scriptPath) {
|
|
36
|
+
return {
|
|
37
|
+
hooks: {
|
|
38
|
+
PreToolUse: [
|
|
39
|
+
{
|
|
40
|
+
type: 'command',
|
|
41
|
+
command: `node ${scriptPath}`,
|
|
42
|
+
timeout: 5000,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=GeminiAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiAdapter.js","sourceRoot":"","sources":["../../../src/cortex/adapters/GeminiAdapter.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,yFAAyF;AACzF,4DAA4D;AAI5D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7B,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,IAAI,SAAS;YACxE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,EAAE;YAC1D,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;YACjE,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;YAC9D,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,YAAY;SACvD,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,YAAY;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO;QACL,KAAK,EAAE;YACL,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,UAAU,EAAE;oBAC7B,OAAO,EAAE,IAAI;iBACd;aACF;SACF;KACF,CAAA;AACH,CAAC"}
|