@neurcode-ai/cli 0.12.0 → 0.15.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 +60 -8
- package/dist/api-client.d.ts +284 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +111 -0
- package/dist/api-client.js.map +1 -1
- package/dist/commands/activate.d.ts +82 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +551 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/admission.d.ts +67 -0
- package/dist/commands/admission.d.ts.map +1 -0
- package/dist/commands/admission.js +350 -0
- package/dist/commands/admission.js.map +1 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +2045 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/demo.d.ts +3 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +102 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/governance.d.ts.map +1 -1
- package/dist/commands/governance.js +12 -0
- package/dist/commands/governance.js.map +1 -1
- package/dist/commands/home.d.ts +21 -0
- package/dist/commands/home.d.ts.map +1 -0
- package/dist/commands/home.js +253 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +58 -44
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +44 -22
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/profile.d.ts +14 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +118 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/quickstart.d.ts +2 -2
- package/dist/commands/quickstart.d.ts.map +1 -1
- package/dist/commands/quickstart.js +33 -30
- package/dist/commands/quickstart.js.map +1 -1
- package/dist/commands/remediate-export.d.ts +6 -1
- package/dist/commands/remediate-export.d.ts.map +1 -1
- package/dist/commands/remediate-export.js +375 -8
- package/dist/commands/remediate-export.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +84 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +98 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/runtime-adapter.d.ts +8 -0
- package/dist/commands/runtime-adapter.d.ts.map +1 -0
- package/dist/commands/runtime-adapter.js +375 -0
- package/dist/commands/runtime-adapter.js.map +1 -0
- package/dist/commands/runtime-doctor.d.ts +6 -0
- package/dist/commands/runtime-doctor.d.ts.map +1 -0
- package/dist/commands/runtime-doctor.js +478 -0
- package/dist/commands/runtime-doctor.js.map +1 -0
- package/dist/commands/runtime-report.d.ts +13 -0
- package/dist/commands/runtime-report.d.ts.map +1 -0
- package/dist/commands/runtime-report.js +81 -0
- package/dist/commands/runtime-report.js.map +1 -0
- package/dist/commands/runtime-sync.d.ts +17 -0
- package/dist/commands/runtime-sync.d.ts.map +1 -0
- package/dist/commands/runtime-sync.js +656 -0
- package/dist/commands/runtime-sync.js.map +1 -0
- package/dist/commands/runtime.d.ts +16 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +380 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/session-hook.d.ts +35 -0
- package/dist/commands/session-hook.d.ts.map +1 -0
- package/dist/commands/session-hook.js +1297 -0
- package/dist/commands/session-hook.js.map +1 -0
- package/dist/commands/session.d.ts +91 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +1226 -0
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/verify-output.d.ts.map +1 -1
- package/dist/commands/verify-output.js +22 -0
- package/dist/commands/verify-output.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +21 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.d.ts +7 -4
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +59 -34
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -5
- package/dist/config.js.map +1 -1
- package/dist/daemon/routes.d.ts.map +1 -1
- package/dist/daemon/routes.js +8 -0
- package/dist/daemon/routes.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +88 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/governance/canonical-pipeline.d.ts.map +1 -1
- package/dist/governance/canonical-pipeline.js +29 -3
- package/dist/governance/canonical-pipeline.js.map +1 -1
- package/dist/governance/impact-analysis.d.ts +27 -0
- package/dist/governance/impact-analysis.d.ts.map +1 -0
- package/dist/governance/impact-analysis.js +274 -0
- package/dist/governance/impact-analysis.js.map +1 -0
- package/dist/index.js +484 -29
- package/dist/index.js.map +1 -1
- package/dist/intent-engine/matcher.d.ts.map +1 -1
- package/dist/intent-engine/matcher.js +3 -12
- package/dist/intent-engine/matcher.js.map +1 -1
- package/dist/utils/admission-artifact.d.ts +59 -0
- package/dist/utils/admission-artifact.d.ts.map +1 -0
- package/dist/utils/admission-artifact.js +410 -0
- package/dist/utils/admission-artifact.js.map +1 -0
- package/dist/utils/agent-adapter-setup.d.ts +80 -0
- package/dist/utils/agent-adapter-setup.d.ts.map +1 -0
- package/dist/utils/agent-adapter-setup.js +577 -0
- package/dist/utils/agent-adapter-setup.js.map +1 -0
- package/dist/utils/agent-guard-supervisor.d.ts +75 -0
- package/dist/utils/agent-guard-supervisor.d.ts.map +1 -0
- package/dist/utils/agent-guard-supervisor.js +388 -0
- package/dist/utils/agent-guard-supervisor.js.map +1 -0
- package/dist/utils/agent-guard.d.ts +92 -0
- package/dist/utils/agent-guard.d.ts.map +1 -0
- package/dist/utils/agent-guard.js +326 -0
- package/dist/utils/agent-guard.js.map +1 -0
- package/dist/utils/agent-session-launcher.d.ts +89 -0
- package/dist/utils/agent-session-launcher.d.ts.map +1 -0
- package/dist/utils/agent-session-launcher.js +308 -0
- package/dist/utils/agent-session-launcher.js.map +1 -0
- package/dist/utils/bash-command-analysis.d.ts +19 -0
- package/dist/utils/bash-command-analysis.d.ts.map +1 -0
- package/dist/utils/bash-command-analysis.js +295 -0
- package/dist/utils/bash-command-analysis.js.map +1 -0
- package/dist/utils/consequence-nudges.d.ts +30 -0
- package/dist/utils/consequence-nudges.d.ts.map +1 -0
- package/dist/utils/consequence-nudges.js +313 -0
- package/dist/utils/consequence-nudges.js.map +1 -0
- package/dist/utils/drift-intelligence.d.ts.map +1 -1
- package/dist/utils/drift-intelligence.js +29 -7
- package/dist/utils/drift-intelligence.js.map +1 -1
- package/dist/utils/git-coverage.d.ts +57 -0
- package/dist/utils/git-coverage.d.ts.map +1 -0
- package/dist/utils/git-coverage.js +302 -0
- package/dist/utils/git-coverage.js.map +1 -0
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +2 -1
- package/dist/utils/gitignore.js.map +1 -1
- package/dist/utils/governed-intent.d.ts +10 -0
- package/dist/utils/governed-intent.d.ts.map +1 -0
- package/dist/utils/governed-intent.js +108 -0
- package/dist/utils/governed-intent.js.map +1 -0
- package/dist/utils/hook-heartbeat.d.ts +55 -0
- package/dist/utils/hook-heartbeat.d.ts.map +1 -0
- package/dist/utils/hook-heartbeat.js +116 -0
- package/dist/utils/hook-heartbeat.js.map +1 -0
- package/dist/utils/intent-continuity.d.ts +21 -0
- package/dist/utils/intent-continuity.d.ts.map +1 -0
- package/dist/utils/intent-continuity.js +192 -0
- package/dist/utils/intent-continuity.js.map +1 -0
- package/dist/utils/messages.d.ts +1 -1
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +35 -23
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/runtime-companion.d.ts +137 -0
- package/dist/utils/runtime-companion.d.ts.map +1 -0
- package/dist/utils/runtime-companion.js +231 -0
- package/dist/utils/runtime-companion.js.map +1 -0
- package/dist/utils/runtime-connection.d.ts +46 -0
- package/dist/utils/runtime-connection.d.ts.map +1 -0
- package/dist/utils/runtime-connection.js +148 -0
- package/dist/utils/runtime-connection.js.map +1 -0
- package/dist/utils/runtime-evidence.d.ts +68 -0
- package/dist/utils/runtime-evidence.d.ts.map +1 -0
- package/dist/utils/runtime-evidence.js +248 -0
- package/dist/utils/runtime-evidence.js.map +1 -0
- package/dist/utils/runtime-live.d.ts +33 -0
- package/dist/utils/runtime-live.d.ts.map +1 -0
- package/dist/utils/runtime-live.js +361 -0
- package/dist/utils/runtime-live.js.map +1 -0
- package/dist/utils/runtime-outbox.d.ts +76 -0
- package/dist/utils/runtime-outbox.d.ts.map +1 -0
- package/dist/utils/runtime-outbox.js +410 -0
- package/dist/utils/runtime-outbox.js.map +1 -0
- package/dist/utils/runtime-receipt.d.ts +50 -0
- package/dist/utils/runtime-receipt.d.ts.map +1 -0
- package/dist/utils/runtime-receipt.js +223 -0
- package/dist/utils/runtime-receipt.js.map +1 -0
- package/dist/utils/runtime-state.d.ts +44 -0
- package/dist/utils/runtime-state.d.ts.map +1 -0
- package/dist/utils/runtime-state.js +151 -0
- package/dist/utils/runtime-state.js.map +1 -0
- package/dist/utils/state.d.ts +21 -0
- package/dist/utils/state.d.ts.map +1 -1
- package/dist/utils/state.js +30 -0
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/structural-understanding.d.ts +334 -0
- package/dist/utils/structural-understanding.d.ts.map +1 -0
- package/dist/utils/structural-understanding.js +2316 -0
- package/dist/utils/structural-understanding.js.map +1 -0
- package/dist/utils/v0-governance.d.ts +197 -0
- package/dist/utils/v0-governance.d.ts.map +1 -0
- package/dist/utils/v0-governance.js +904 -0
- package/dist/utils/v0-governance.js.map +1 -0
- package/package.json +6 -6
- package/dist/utils/box.d.ts +0 -16
- package/dist/utils/box.d.ts.map +0 -1
- package/dist/utils/box.js +0 -85
- package/dist/utils/box.js.map +0 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AGENT_SESSION_HANDSHAKE_SCHEMA_VERSION = exports.AGENT_SESSION_LAUNCH_SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.adapterForLauncherAgent = adapterForLauncherAgent;
|
|
5
|
+
exports.latestAgentLauncherState = latestAgentLauncherState;
|
|
6
|
+
exports.launchAgentSession = launchAgentSession;
|
|
7
|
+
exports.recordLauncherHandshake = recordLauncherHandshake;
|
|
8
|
+
const governance_runtime_1 = require("@neurcode-ai/governance-runtime");
|
|
9
|
+
const v0_governance_1 = require("./v0-governance");
|
|
10
|
+
const runtime_live_1 = require("./runtime-live");
|
|
11
|
+
exports.AGENT_SESSION_LAUNCH_SCHEMA_VERSION = 'neurcode.agent-session-launch.v1';
|
|
12
|
+
exports.AGENT_SESSION_HANDSHAKE_SCHEMA_VERSION = 'neurcode.agent-session-handshake.v1';
|
|
13
|
+
function normalizeAgent(input) {
|
|
14
|
+
const raw = (input || 'claude').trim().toLowerCase();
|
|
15
|
+
if (['claude', 'claude-code', 'claude_code', 'claude-code-hooks'].includes(raw))
|
|
16
|
+
return 'claude';
|
|
17
|
+
if (['copilot', 'github-copilot', 'copilot-hooks'].includes(raw))
|
|
18
|
+
return 'copilot';
|
|
19
|
+
if (['codex', 'codex-mcp'].includes(raw))
|
|
20
|
+
return 'codex';
|
|
21
|
+
if (['cursor', 'cursor-mcp'].includes(raw))
|
|
22
|
+
return 'cursor';
|
|
23
|
+
if (['gemini', 'gemini-cli', 'generic', 'generic-mcp', 'mcp'].includes(raw))
|
|
24
|
+
return raw === 'gemini' || raw === 'gemini-cli' ? 'gemini' : 'generic-mcp';
|
|
25
|
+
if (['vscode', 'vs-code', 'vscode-extension'].includes(raw))
|
|
26
|
+
return 'vscode';
|
|
27
|
+
throw new Error(`Unsupported agent "${input}". Supported agents: claude, copilot, codex, cursor, gemini, generic-mcp, vscode.`);
|
|
28
|
+
}
|
|
29
|
+
function adapterForLauncherAgent(agent) {
|
|
30
|
+
if (agent === 'claude')
|
|
31
|
+
return 'claude-code-hooks';
|
|
32
|
+
if (agent === 'copilot')
|
|
33
|
+
return 'copilot-hooks';
|
|
34
|
+
if (agent === 'codex')
|
|
35
|
+
return 'codex-mcp';
|
|
36
|
+
if (agent === 'cursor')
|
|
37
|
+
return 'cursor-mcp';
|
|
38
|
+
if (agent === 'vscode')
|
|
39
|
+
return 'vscode-extension';
|
|
40
|
+
return 'generic-mcp';
|
|
41
|
+
}
|
|
42
|
+
function handshakeStatusFor(adapter) {
|
|
43
|
+
if (adapter === 'claude-code-hooks')
|
|
44
|
+
return 'awaiting_agent_prompt';
|
|
45
|
+
if (adapter === 'copilot-hooks')
|
|
46
|
+
return 'awaiting_agent_prompt';
|
|
47
|
+
if (adapter === 'vscode-extension')
|
|
48
|
+
return 'observe_only';
|
|
49
|
+
return 'awaiting_plan_capture';
|
|
50
|
+
}
|
|
51
|
+
function eventId(prefix) {
|
|
52
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
53
|
+
}
|
|
54
|
+
function shellSingleQuote(value) {
|
|
55
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
56
|
+
}
|
|
57
|
+
function starterPrompt(input) {
|
|
58
|
+
const base = [
|
|
59
|
+
`Neurcode session: ${input.sessionId}`,
|
|
60
|
+
`Goal: ${input.goal}`,
|
|
61
|
+
'',
|
|
62
|
+
'Before editing, state a short implementation plan with expected files.',
|
|
63
|
+
'Stay inside the active Neurcode session and use exact approval paths for approval-required boundaries.',
|
|
64
|
+
];
|
|
65
|
+
if (input.adapter === 'claude-code-hooks') {
|
|
66
|
+
base.push('Claude Code hooks are installed; Neurcode will check Edit/Write/MultiEdit before the write lands.');
|
|
67
|
+
}
|
|
68
|
+
else if (input.adapter === 'copilot-hooks') {
|
|
69
|
+
base.push('GitHub Copilot hooks are installed; Neurcode will check agent tool use before writes when Copilot hook discovery is active.');
|
|
70
|
+
}
|
|
71
|
+
else if (input.adapter === 'vscode-extension') {
|
|
72
|
+
base.push('VS Code is observe-only; use the CLI/MCP runtime adapter before edits when the agent host supports it.');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
base.push('Use Neurcode MCP tools before proposed edits: neurcode_agent_session_handshake, neurcode_agent_plan_capture, then neurcode_agent_edit_before for each write.');
|
|
76
|
+
}
|
|
77
|
+
return base.join('\n');
|
|
78
|
+
}
|
|
79
|
+
function instructionsFor(input) {
|
|
80
|
+
if (input.adapter === 'claude-code-hooks') {
|
|
81
|
+
return [
|
|
82
|
+
'Open Claude Code in this repository.',
|
|
83
|
+
'Paste the starter prompt shown by this command.',
|
|
84
|
+
'Claude Code UserPromptSubmit will handshake into the existing session instead of creating a duplicate.',
|
|
85
|
+
'PreToolUse hooks will hard-deny approval-required writes before they land.',
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
if (input.adapter === 'copilot-hooks') {
|
|
89
|
+
return [
|
|
90
|
+
'Open VS Code in this repository and use GitHub Copilot Agent Mode.',
|
|
91
|
+
'Ensure .github/hooks/neurcode.json is present from `neurcode activate copilot`.',
|
|
92
|
+
'Paste the starter prompt shown by this command.',
|
|
93
|
+
'Copilot hooks will run UserPromptSubmit, PreToolUse, and Stop through the local runtime where hook discovery is active.',
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
if (input.adapter === 'vscode-extension') {
|
|
97
|
+
return [
|
|
98
|
+
'Open the Neurcode Runtime Companion sidebar in VS Code.',
|
|
99
|
+
'Use Refresh Live Runtime to inspect this active session.',
|
|
100
|
+
'Use MCP/CLI runtime adapter calls for actual agent edit checks; VS Code itself is observe-only.',
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
return [
|
|
104
|
+
'Give the agent the starter prompt shown by this command.',
|
|
105
|
+
'The agent should call neurcode_agent_session_handshake, then neurcode_agent_plan_capture with its implementation plan.',
|
|
106
|
+
'Before every proposed write, the agent should call neurcode_agent_edit_before with the repo-relative file path.',
|
|
107
|
+
'Cooperative governance is only as strong as the agent host calling the runtime before edits.',
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
function commandForPlanCapture(adapter, goal) {
|
|
111
|
+
const event = {
|
|
112
|
+
schemaVersion: 'neurcode.agent-runtime-event.v1',
|
|
113
|
+
adapter,
|
|
114
|
+
eventType: 'plan.capture',
|
|
115
|
+
payload: {
|
|
116
|
+
plan: {
|
|
117
|
+
summary: `Plan for: ${goal}`,
|
|
118
|
+
steps: ['Replace this with the agent plan before editing.'],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
return `neurcode runtime-adapter event --event-json ${shellSingleQuote(JSON.stringify(event))} --json`;
|
|
123
|
+
}
|
|
124
|
+
function appendLaunchEvent(repoRoot, session, result, launchEventId) {
|
|
125
|
+
const event = {
|
|
126
|
+
type: 'agent_session_launched',
|
|
127
|
+
ts: result.generatedAt,
|
|
128
|
+
message: `Agent session launched for ${result.agent.normalized} (${result.agent.enforcementLevel}).`,
|
|
129
|
+
detail: {
|
|
130
|
+
schemaVersion: exports.AGENT_SESSION_LAUNCH_SCHEMA_VERSION,
|
|
131
|
+
eventId: launchEventId,
|
|
132
|
+
agent: result.agent,
|
|
133
|
+
handshakeStatus: result.handshake.status,
|
|
134
|
+
requiredNextEvent: result.handshake.nextEvent,
|
|
135
|
+
activation: result.activation,
|
|
136
|
+
privacy: result.privacy,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const updated = (0, governance_runtime_1.appendEvent)(repoRoot, session.sessionId, event);
|
|
140
|
+
return updated ?? session;
|
|
141
|
+
}
|
|
142
|
+
function maybeCaptureInitialPlan(repoRoot, session, planText) {
|
|
143
|
+
if (!planText?.trim())
|
|
144
|
+
return session;
|
|
145
|
+
const plan = (0, governance_runtime_1.extractAgentPlan)({
|
|
146
|
+
plan: planText,
|
|
147
|
+
prompt: session.contract.goal,
|
|
148
|
+
});
|
|
149
|
+
if (!plan)
|
|
150
|
+
return session;
|
|
151
|
+
const result = (0, governance_runtime_1.captureAgentPlan)(repoRoot, session.sessionId, plan);
|
|
152
|
+
return result?.session ?? (0, governance_runtime_1.loadSession)(repoRoot, session.sessionId) ?? session;
|
|
153
|
+
}
|
|
154
|
+
function latestAgentLauncherState(session) {
|
|
155
|
+
const launch = [...session.events].reverse().find((event) => event.type === 'agent_session_launched');
|
|
156
|
+
if (!launch?.detail || typeof launch.detail !== 'object')
|
|
157
|
+
return null;
|
|
158
|
+
const detail = launch.detail;
|
|
159
|
+
const agent = detail.agent && typeof detail.agent === 'object'
|
|
160
|
+
? detail.agent
|
|
161
|
+
: null;
|
|
162
|
+
if (!agent?.adapter)
|
|
163
|
+
return null;
|
|
164
|
+
const latestHandshake = [...session.events].reverse().find((event) => event.type === 'agent_handshake');
|
|
165
|
+
const handshakeDetail = latestHandshake?.detail && typeof latestHandshake.detail === 'object'
|
|
166
|
+
? latestHandshake.detail
|
|
167
|
+
: null;
|
|
168
|
+
return {
|
|
169
|
+
agent,
|
|
170
|
+
handshakeStatus: (typeof handshakeDetail?.handshakeStatus === 'string'
|
|
171
|
+
? handshakeDetail.handshakeStatus
|
|
172
|
+
: detail.handshakeStatus),
|
|
173
|
+
launchedAt: launch.ts,
|
|
174
|
+
promptSeenAt: latestHandshake?.ts,
|
|
175
|
+
launchEventId: typeof detail.eventId === 'string' ? detail.eventId : undefined,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async function launchAgentSession(options) {
|
|
179
|
+
const goal = options.goal.trim();
|
|
180
|
+
if (!goal)
|
|
181
|
+
throw new Error('--goal is required');
|
|
182
|
+
const repoRoot = (0, v0_governance_1.resolveRepoRoot)(options.dir || process.cwd());
|
|
183
|
+
const normalized = normalizeAgent(options.agent);
|
|
184
|
+
const adapter = adapterForLauncherAgent(normalized);
|
|
185
|
+
const capability = (0, governance_runtime_1.getAgentRuntimeAdapterCapability)(adapter);
|
|
186
|
+
const generatedAt = new Date().toISOString();
|
|
187
|
+
const profileResult = (0, v0_governance_1.ensureFreshGovernanceProfile)(repoRoot, { force: options.forceProfile === true });
|
|
188
|
+
const profileFreshness = (0, v0_governance_1.buildProfileFreshnessSignal)(profileResult, profileResult.refreshed ? 'auto_refreshed' : 'none');
|
|
189
|
+
let activation = {
|
|
190
|
+
attempted: false,
|
|
191
|
+
};
|
|
192
|
+
if (normalized === 'claude' && options.activate !== false) {
|
|
193
|
+
(0, v0_governance_1.installClaudeGovernanceHooks)(repoRoot, { force: options.forceProfile === true });
|
|
194
|
+
(0, v0_governance_1.installClaudeMcpConfig)({ force: options.forceProfile === true });
|
|
195
|
+
activation = {
|
|
196
|
+
attempted: true,
|
|
197
|
+
hooksInstalled: true,
|
|
198
|
+
mcpConfigured: true,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (normalized === 'copilot' && options.activate !== false) {
|
|
202
|
+
(0, v0_governance_1.installCopilotGovernanceHooks)(repoRoot, { force: options.forceProfile === true });
|
|
203
|
+
activation = {
|
|
204
|
+
attempted: true,
|
|
205
|
+
hooksInstalled: true,
|
|
206
|
+
mcpConfigured: false,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
let session = (0, governance_runtime_1.createSession)(repoRoot, profileResult.profile, goal);
|
|
210
|
+
session = maybeCaptureInitialPlan(repoRoot, session, options.plan);
|
|
211
|
+
const status = handshakeStatusFor(adapter);
|
|
212
|
+
const sessionId = session.sessionId;
|
|
213
|
+
const launchEventId = eventId('launch');
|
|
214
|
+
const agent = {
|
|
215
|
+
requested: options.agent || 'claude',
|
|
216
|
+
normalized,
|
|
217
|
+
adapter,
|
|
218
|
+
enforcementLevel: capability.enforcementLevel,
|
|
219
|
+
compatibilityMode: capability.compatibilityMode,
|
|
220
|
+
automatic: capability.automatic,
|
|
221
|
+
hardDeny: capability.enforcementLevel === 'hard_deny',
|
|
222
|
+
enforceable: capability.enforceable,
|
|
223
|
+
advisoryOnly: capability.advisoryOnly,
|
|
224
|
+
supervisorSupported: capability.supervisorSupported,
|
|
225
|
+
description: capability.description,
|
|
226
|
+
};
|
|
227
|
+
const handoffPrompt = starterPrompt({ sessionId, goal, adapter });
|
|
228
|
+
const resultWithoutSession = {
|
|
229
|
+
schemaVersion: exports.AGENT_SESSION_LAUNCH_SCHEMA_VERSION,
|
|
230
|
+
ok: true,
|
|
231
|
+
generatedAt,
|
|
232
|
+
repoRoot,
|
|
233
|
+
privacy: {
|
|
234
|
+
metadataOnly: true,
|
|
235
|
+
sourceUploaded: false,
|
|
236
|
+
sourceIncluded: false,
|
|
237
|
+
},
|
|
238
|
+
profile: {
|
|
239
|
+
status: profileResult.status,
|
|
240
|
+
refreshed: profileResult.refreshed,
|
|
241
|
+
profileHash: profileResult.profile.profileHash,
|
|
242
|
+
topologyHash: profileResult.profile.topology.hash,
|
|
243
|
+
trackedFileCount: profileResult.profile.topology.trackedFileCount,
|
|
244
|
+
reasons: [...profileResult.reasons],
|
|
245
|
+
},
|
|
246
|
+
agent,
|
|
247
|
+
activation,
|
|
248
|
+
handshake: {
|
|
249
|
+
status,
|
|
250
|
+
required: status !== 'observe_only',
|
|
251
|
+
nextEvent: status === 'awaiting_agent_prompt'
|
|
252
|
+
? (adapter === 'copilot-hooks' ? 'Copilot UserPromptSubmit' : 'Claude Code UserPromptSubmit')
|
|
253
|
+
: status === 'awaiting_plan_capture'
|
|
254
|
+
? 'plan.capture'
|
|
255
|
+
: null,
|
|
256
|
+
starterPrompt: handoffPrompt,
|
|
257
|
+
instructions: instructionsFor({ agent: normalized, adapter, sessionId, goal }),
|
|
258
|
+
},
|
|
259
|
+
commands: {
|
|
260
|
+
status: `neurcode session status --local --session-id ${sessionId}`,
|
|
261
|
+
approve: `neurcode session approve --session-id ${sessionId} --path <exact-path> --reason "<reason>"`,
|
|
262
|
+
finish: `neurcode session end --session-id ${sessionId}`,
|
|
263
|
+
capturePlan: commandForPlanCapture(adapter, goal),
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
session = appendLaunchEvent(repoRoot, session, resultWithoutSession, launchEventId);
|
|
267
|
+
await (0, runtime_live_1.publishRuntimeLiveStatus)(repoRoot, session, { profileFreshness });
|
|
268
|
+
return {
|
|
269
|
+
...resultWithoutSession,
|
|
270
|
+
session: {
|
|
271
|
+
sessionId,
|
|
272
|
+
goal,
|
|
273
|
+
scopeMode: session.contract.scopeMode,
|
|
274
|
+
allowedGlobs: [...session.contract.allowedGlobs],
|
|
275
|
+
approvalRequiredGlobs: [...session.contract.approvalRequiredGlobs],
|
|
276
|
+
planRevision: typeof session.contract.agentPlanRevision === 'number'
|
|
277
|
+
? session.contract.agentPlanRevision
|
|
278
|
+
: session.contract.agentPlan
|
|
279
|
+
? 1
|
|
280
|
+
: null,
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function recordLauncherHandshake(repoRoot, session, input) {
|
|
285
|
+
const state = latestAgentLauncherState(session);
|
|
286
|
+
const now = new Date().toISOString();
|
|
287
|
+
const updated = (0, governance_runtime_1.appendEvent)(repoRoot, session.sessionId, {
|
|
288
|
+
type: 'agent_handshake',
|
|
289
|
+
ts: now,
|
|
290
|
+
message: input.message || `Agent handshake recorded (${input.handshakeStatus}).`,
|
|
291
|
+
detail: {
|
|
292
|
+
schemaVersion: exports.AGENT_SESSION_HANDSHAKE_SCHEMA_VERSION,
|
|
293
|
+
eventId: eventId('handshake'),
|
|
294
|
+
agent: state?.agent ?? null,
|
|
295
|
+
launchEventId: state?.launchEventId ?? null,
|
|
296
|
+
handshakeStatus: input.handshakeStatus,
|
|
297
|
+
promptMatched: input.promptMatched || 'manual',
|
|
298
|
+
source: input.source || 'local_cli',
|
|
299
|
+
privacy: {
|
|
300
|
+
metadataOnly: true,
|
|
301
|
+
sourceUploaded: false,
|
|
302
|
+
sourceIncluded: false,
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
return updated ?? session;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=agent-session-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session-launcher.js","sourceRoot":"","sources":["../../src/utils/agent-session-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type BashMutationOperation = 'redirect' | 'rm' | 'mv' | 'cp' | 'touch' | 'mkdir' | 'tee' | 'sed_in_place' | 'git_restore' | 'git_checkout_path' | 'runtime_write' | 'unknown_mutation';
|
|
2
|
+
export interface BashCommandAnalysis {
|
|
3
|
+
mutates: boolean;
|
|
4
|
+
suspicious: boolean;
|
|
5
|
+
readOnly: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* True when the command is an operator diagnostic/readback command and should
|
|
8
|
+
* not be counted as a governed code edit in session evidence. This includes
|
|
9
|
+
* plain read-only commands and read-only commands whose stdout/stderr is
|
|
10
|
+
* redirected outside the repository for inspection.
|
|
11
|
+
*/
|
|
12
|
+
operatorDiagnostic: boolean;
|
|
13
|
+
operation: BashMutationOperation | 'read_only' | 'unclassified';
|
|
14
|
+
targetPaths: string[];
|
|
15
|
+
commandFingerprint: string;
|
|
16
|
+
commandPreview: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function analyzeBashCommand(command: string): BashCommandAnalysis;
|
|
19
|
+
//# sourceMappingURL=bash-command-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-command-analysis.d.ts","sourceRoot":"","sources":["../../src/utils/bash-command-analysis.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAC7B,UAAU,GACV,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,OAAO,GACP,OAAO,GACP,KAAK,GACL,cAAc,GACd,aAAa,GACb,mBAAmB,GACnB,eAAe,GACf,kBAAkB,CAAC;AAEvB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,qBAAqB,GAAG,WAAW,GAAG,cAAc,CAAC;IAChE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAoQD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAmCvE"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeBashCommand = analyzeBashCommand;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const PATH_ROOTS = new Set([
|
|
6
|
+
'app',
|
|
7
|
+
'apps',
|
|
8
|
+
'bin',
|
|
9
|
+
'cmd',
|
|
10
|
+
'config',
|
|
11
|
+
'docs',
|
|
12
|
+
'fixtures',
|
|
13
|
+
'lib',
|
|
14
|
+
'migrations',
|
|
15
|
+
'packages',
|
|
16
|
+
'scripts',
|
|
17
|
+
'services',
|
|
18
|
+
'src',
|
|
19
|
+
'test',
|
|
20
|
+
'tests',
|
|
21
|
+
'web',
|
|
22
|
+
'.github',
|
|
23
|
+
]);
|
|
24
|
+
const READ_ONLY_PREFIX = /^\s*(?:ls|cat|grep|rg|find|pwd|git\s+(?:status|diff|log|show|branch|rev-parse|ls-files)|sed(?!\s+-i\b)|awk|head|tail|wc|sort|uniq|jq)\b/;
|
|
25
|
+
const NEURCODE_DIAGNOSTIC_RE = /^\s*(?:node\s+)?(?:packages\/cli\/dist\/index\.js|neurcode)\s+(?:(?:--version|-v)|doctor\b|status\b|session\s+(?:status|obligations)\b|runtime-sync\s+status\b|admission\b|session-hook\b[^;&|]*\b(?:start|check|finish)\b)/;
|
|
26
|
+
function unique(values) {
|
|
27
|
+
return Array.from(new Set(values.filter(Boolean)));
|
|
28
|
+
}
|
|
29
|
+
function stripQuotes(value) {
|
|
30
|
+
return value
|
|
31
|
+
.replace(/^[`"'(<\[]+/, '')
|
|
32
|
+
.replace(/[`"')>\].,;:]+$/, '')
|
|
33
|
+
.trim();
|
|
34
|
+
}
|
|
35
|
+
function normalizeCandidate(raw) {
|
|
36
|
+
const value = stripQuotes(raw).replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\//, '');
|
|
37
|
+
if (!value || value.includes('://') || /\s/.test(value))
|
|
38
|
+
return null;
|
|
39
|
+
const parts = value.split('/').filter(Boolean);
|
|
40
|
+
if (parts.length < 2)
|
|
41
|
+
return null;
|
|
42
|
+
if (!PATH_ROOTS.has(parts[0]))
|
|
43
|
+
return null;
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function pathCandidates(text) {
|
|
47
|
+
const out = [];
|
|
48
|
+
const tokenRe = /(?:"([^"]+)"|'([^']+)'|`([^`]+)`|([A-Za-z0-9_.@~/-]+\/[A-Za-z0-9_.@~/-]+))/g;
|
|
49
|
+
let match;
|
|
50
|
+
while ((match = tokenRe.exec(text)) !== null) {
|
|
51
|
+
const candidate = normalizeCandidate(match[1] || match[2] || match[3] || match[4] || '');
|
|
52
|
+
if (candidate)
|
|
53
|
+
out.push(candidate);
|
|
54
|
+
}
|
|
55
|
+
return unique(out);
|
|
56
|
+
}
|
|
57
|
+
function stripQuotedContent(command) {
|
|
58
|
+
let out = '';
|
|
59
|
+
let quote = null;
|
|
60
|
+
for (let i = 0; i < command.length; i += 1) {
|
|
61
|
+
const ch = command[i];
|
|
62
|
+
if (quote) {
|
|
63
|
+
if (ch === '\\' && quote !== "'" && i + 1 < command.length) {
|
|
64
|
+
out += ' ';
|
|
65
|
+
i += 1;
|
|
66
|
+
out += ' ';
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (ch === quote) {
|
|
70
|
+
quote = null;
|
|
71
|
+
out += ch;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
out += ' ';
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
79
|
+
quote = ch;
|
|
80
|
+
out += ch;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
out += ch;
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
function splitCommandSegments(command) {
|
|
88
|
+
const segments = [];
|
|
89
|
+
let current = '';
|
|
90
|
+
let quote = null;
|
|
91
|
+
for (let i = 0; i < command.length; i += 1) {
|
|
92
|
+
const ch = command[i];
|
|
93
|
+
if (quote) {
|
|
94
|
+
current += ch;
|
|
95
|
+
if (ch === '\\' && quote !== "'" && i + 1 < command.length) {
|
|
96
|
+
i += 1;
|
|
97
|
+
current += command[i];
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (ch === quote)
|
|
101
|
+
quote = null;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
105
|
+
quote = ch;
|
|
106
|
+
current += ch;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (ch === ';' || ch === '\n' || ch === '|') {
|
|
110
|
+
if (current.trim())
|
|
111
|
+
segments.push(current.trim());
|
|
112
|
+
current = '';
|
|
113
|
+
if ((ch === '|' && command[i + 1] === '|'))
|
|
114
|
+
i += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (ch === '&') {
|
|
118
|
+
if (current.trim())
|
|
119
|
+
segments.push(current.trim());
|
|
120
|
+
current = '';
|
|
121
|
+
while (command[i + 1] === '&')
|
|
122
|
+
i += 1;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
current += ch;
|
|
126
|
+
}
|
|
127
|
+
if (current.trim())
|
|
128
|
+
segments.push(current.trim());
|
|
129
|
+
return segments;
|
|
130
|
+
}
|
|
131
|
+
function shellWords(segment) {
|
|
132
|
+
const words = [];
|
|
133
|
+
const tokenRe = /"([^"]*)"|'([^']*)'|`([^`]*)`|([^\s]+)/g;
|
|
134
|
+
let match;
|
|
135
|
+
while ((match = tokenRe.exec(segment)) !== null) {
|
|
136
|
+
words.push(match[1] || match[2] || match[3] || match[4] || '');
|
|
137
|
+
}
|
|
138
|
+
return words;
|
|
139
|
+
}
|
|
140
|
+
function commandFingerprint(command) {
|
|
141
|
+
return (0, crypto_1.createHash)('sha256').update(command).digest('hex').slice(0, 16);
|
|
142
|
+
}
|
|
143
|
+
function commandPreview(command) {
|
|
144
|
+
return command
|
|
145
|
+
.replace(/(['"]?)(?:[A-Za-z_][A-Za-z0-9_]*=)?(?:sk|pk|nk)_(?:live|test)_[A-Za-z0-9_-]+/g, '$1[redacted-key]')
|
|
146
|
+
.replace(/(password|secret|token|api[_-]?key)=\S+/gi, '$1=[redacted]')
|
|
147
|
+
.replace(/\s+/g, ' ')
|
|
148
|
+
.trim()
|
|
149
|
+
.slice(0, 160);
|
|
150
|
+
}
|
|
151
|
+
function operationFor(command) {
|
|
152
|
+
const trimmed = command.trim();
|
|
153
|
+
if (/\b(open|writeFile|writeFileSync|appendFile|appendFileSync|unlink|rmSync|renameSync)\s*\(/.test(trimmed)) {
|
|
154
|
+
return 'runtime_write';
|
|
155
|
+
}
|
|
156
|
+
const syntax = stripQuotedContent(trimmed);
|
|
157
|
+
if (/(?:^|[\s;&|])rm\s+/.test(syntax))
|
|
158
|
+
return 'rm';
|
|
159
|
+
if (/(?:^|[\s;&|])mv\s+/.test(syntax))
|
|
160
|
+
return 'mv';
|
|
161
|
+
if (/(?:^|[\s;&|])cp\s+/.test(syntax))
|
|
162
|
+
return 'cp';
|
|
163
|
+
if (/(?:^|[\s;&|])touch\s+/.test(syntax))
|
|
164
|
+
return 'touch';
|
|
165
|
+
if (/(?:^|[\s;&|])mkdir\s+/.test(syntax))
|
|
166
|
+
return 'mkdir';
|
|
167
|
+
if (/(?:^|[\s;&|])tee\s+/.test(syntax))
|
|
168
|
+
return 'tee';
|
|
169
|
+
if (/(?:^|[\s;&|])sed\s+[^;&|]*\s-i\b|\bsed\s+-i\b/.test(syntax))
|
|
170
|
+
return 'sed_in_place';
|
|
171
|
+
if (/(?:^|[\s;&|])git\s+restore(?:\s+|$)/.test(syntax))
|
|
172
|
+
return 'git_restore';
|
|
173
|
+
if (/(?:^|[\s;&|])git\s+checkout\s+[^;&|]*--\s+/.test(syntax))
|
|
174
|
+
return 'git_checkout_path';
|
|
175
|
+
if (/>|>>|2>|&>/.test(syntax))
|
|
176
|
+
return 'redirect';
|
|
177
|
+
return 'unknown_mutation';
|
|
178
|
+
}
|
|
179
|
+
function isReadOnlyDiagnosticCommand(command) {
|
|
180
|
+
const syntax = stripQuotedContent(command).trim();
|
|
181
|
+
if (!syntax)
|
|
182
|
+
return true;
|
|
183
|
+
if (READ_ONLY_PREFIX.test(syntax))
|
|
184
|
+
return true;
|
|
185
|
+
if (NEURCODE_DIAGNOSTIC_RE.test(syntax))
|
|
186
|
+
return true;
|
|
187
|
+
if (/^\s*node\s+-e\s+/.test(syntax) && /console\.log|require\.resolve|process\.versions|process\.cwd/.test(command)) {
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
function isOperatorDiagnosticCapture(command, operation, targets) {
|
|
193
|
+
if (targets.length > 0)
|
|
194
|
+
return false;
|
|
195
|
+
if (operation !== 'redirect' && operation !== 'tee')
|
|
196
|
+
return false;
|
|
197
|
+
return splitCommandSegments(command).some(isReadOnlyDiagnosticCommand);
|
|
198
|
+
}
|
|
199
|
+
function redirectionTargets(command) {
|
|
200
|
+
const out = [];
|
|
201
|
+
const re = /(?:^|[^0-9])(?:>|>>|2>|&>)\s*("?[^"\s;&|]+"?|'[^'\s;&|]+')/g;
|
|
202
|
+
let match;
|
|
203
|
+
while ((match = re.exec(command)) !== null) {
|
|
204
|
+
const candidate = normalizeCandidate(match[1]);
|
|
205
|
+
if (candidate)
|
|
206
|
+
out.push(candidate);
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
function runtimeWriteTargets(command) {
|
|
211
|
+
const out = [];
|
|
212
|
+
const writeApi = /\b(?:open|writeFile|writeFileSync|appendFile|appendFileSync|unlink|rmSync|renameSync)\s*\(\s*("([^"]+)"|'([^']+)'|`([^`]+)`)/g;
|
|
213
|
+
let match;
|
|
214
|
+
while ((match = writeApi.exec(command)) !== null) {
|
|
215
|
+
const candidate = normalizeCandidate(match[2] || match[3] || match[4] || '');
|
|
216
|
+
if (candidate)
|
|
217
|
+
out.push(candidate);
|
|
218
|
+
}
|
|
219
|
+
return unique(out);
|
|
220
|
+
}
|
|
221
|
+
function segmentForOperation(command, operation) {
|
|
222
|
+
for (const segment of splitCommandSegments(command)) {
|
|
223
|
+
if (operationFor(segment) === operation)
|
|
224
|
+
return segment;
|
|
225
|
+
}
|
|
226
|
+
return command;
|
|
227
|
+
}
|
|
228
|
+
function commandArgumentTargets(command, operation) {
|
|
229
|
+
const segment = segmentForOperation(command, operation);
|
|
230
|
+
const words = shellWords(segment);
|
|
231
|
+
const commandIndex = words.findIndex((word) => word === operation || (operation === 'sed_in_place' && word === 'sed') || ((operation === 'git_restore' || operation === 'git_checkout_path') && word === 'git'));
|
|
232
|
+
if (commandIndex < 0)
|
|
233
|
+
return pathCandidates(segment);
|
|
234
|
+
if (operation === 'git_restore' || operation === 'git_checkout_path') {
|
|
235
|
+
const marker = words.lastIndexOf('--');
|
|
236
|
+
const args = marker >= 0 ? words.slice(marker + 1) : words.slice(commandIndex + 2);
|
|
237
|
+
return unique(args.map((arg) => normalizeCandidate(arg)).filter((value) => Boolean(value)));
|
|
238
|
+
}
|
|
239
|
+
const args = words
|
|
240
|
+
.slice(commandIndex + 1)
|
|
241
|
+
.filter((arg) => arg !== '--' && !arg.startsWith('-'));
|
|
242
|
+
return unique(args.map((arg) => normalizeCandidate(arg)).filter((value) => Boolean(value)));
|
|
243
|
+
}
|
|
244
|
+
function targetPathsForOperation(command, operation) {
|
|
245
|
+
if (operation === 'redirect')
|
|
246
|
+
return redirectionTargets(command);
|
|
247
|
+
if (operation === 'runtime_write')
|
|
248
|
+
return runtimeWriteTargets(command);
|
|
249
|
+
if (operation === 'rm' ||
|
|
250
|
+
operation === 'mv' ||
|
|
251
|
+
operation === 'cp' ||
|
|
252
|
+
operation === 'touch' ||
|
|
253
|
+
operation === 'mkdir' ||
|
|
254
|
+
operation === 'tee' ||
|
|
255
|
+
operation === 'sed_in_place' ||
|
|
256
|
+
operation === 'git_restore' ||
|
|
257
|
+
operation === 'git_checkout_path') {
|
|
258
|
+
return commandArgumentTargets(command, operation);
|
|
259
|
+
}
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
function analyzeBashCommand(command) {
|
|
263
|
+
const trimmed = command.trim();
|
|
264
|
+
const fingerprint = commandFingerprint(command);
|
|
265
|
+
const preview = commandPreview(command);
|
|
266
|
+
if (!trimmed) {
|
|
267
|
+
return {
|
|
268
|
+
mutates: false,
|
|
269
|
+
suspicious: false,
|
|
270
|
+
readOnly: true,
|
|
271
|
+
operatorDiagnostic: true,
|
|
272
|
+
operation: 'read_only',
|
|
273
|
+
targetPaths: [],
|
|
274
|
+
commandFingerprint: fingerprint,
|
|
275
|
+
commandPreview: preview,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const operation = operationFor(trimmed);
|
|
279
|
+
const mutates = operation !== 'unknown_mutation';
|
|
280
|
+
const targets = mutates ? targetPathsForOperation(trimmed, operation) : [];
|
|
281
|
+
const readOnly = !mutates && isReadOnlyDiagnosticCommand(trimmed);
|
|
282
|
+
const operatorDiagnostic = (!mutates && (readOnly || targets.length === 0)) ||
|
|
283
|
+
isOperatorDiagnosticCapture(trimmed, operation, targets);
|
|
284
|
+
return {
|
|
285
|
+
mutates,
|
|
286
|
+
suspicious: mutates && targets.length === 0 && !operatorDiagnostic,
|
|
287
|
+
readOnly: readOnly || (!mutates && targets.length === 0),
|
|
288
|
+
operatorDiagnostic,
|
|
289
|
+
operation: mutates ? operation : 'read_only',
|
|
290
|
+
targetPaths: targets,
|
|
291
|
+
commandFingerprint: fingerprint,
|
|
292
|
+
commandPreview: preview,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=bash-command-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-command-analysis.js","sourceRoot":"","sources":["../../src/utils/bash-command-analysis.ts"],"names":[],"mappings":"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"}
|