@phuetz/code-buddy 0.1.18 → 0.1.19
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/dist/agent/background-tasks.d.ts +49 -0
- package/dist/agent/background-tasks.js +153 -0
- package/dist/agent/background-tasks.js.map +1 -0
- package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
- package/dist/agent/definitions/agent-definition-loader.js +161 -0
- package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
- package/dist/agent/definitions/index.d.ts +1 -0
- package/dist/agent/definitions/index.js +2 -0
- package/dist/agent/definitions/index.js.map +1 -0
- package/dist/agent/extended-thinking.d.ts +64 -0
- package/dist/agent/extended-thinking.js +103 -0
- package/dist/agent/extended-thinking.js.map +1 -0
- package/dist/agent/prompt-suggestions.d.ts +55 -0
- package/dist/agent/prompt-suggestions.js +125 -0
- package/dist/agent/prompt-suggestions.js.map +1 -0
- package/dist/agent/rewind-manager.d.ts +59 -0
- package/dist/agent/rewind-manager.js +124 -0
- package/dist/agent/rewind-manager.js.map +1 -0
- package/dist/agent/teams/agent-team.d.ts +54 -0
- package/dist/agent/teams/agent-team.js +114 -0
- package/dist/agent/teams/agent-team.js.map +1 -0
- package/dist/agent/teams/index.d.ts +1 -0
- package/dist/agent/teams/index.js +2 -0
- package/dist/agent/teams/index.js.map +1 -0
- package/dist/agent/teams/team-v2.d.ts +166 -0
- package/dist/agent/teams/team-v2.js +376 -0
- package/dist/agent/teams/team-v2.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +40 -0
- package/dist/channels/imessage/index.js +69 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +36 -0
- package/dist/channels/line/index.js +71 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +34 -0
- package/dist/channels/mattermost/index.js +56 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +37 -0
- package/dist/channels/nextcloud-talk/index.js +67 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/niche-channels.d.ts +61 -0
- package/dist/channels/niche-channels.js +131 -0
- package/dist/channels/niche-channels.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +30 -0
- package/dist/channels/nostr/index.js +68 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/twilio-voice/index.d.ts +37 -0
- package/dist/channels/twilio-voice/index.js +76 -0
- package/dist/channels/twilio-voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.js +0 -1
- package/dist/channels/whatsapp/index.js.map +1 -1
- package/dist/channels/zalo/index.d.ts +28 -0
- package/dist/channels/zalo/index.js +53 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cloud/cloud-sessions.d.ts +56 -0
- package/dist/cloud/cloud-sessions.js +187 -0
- package/dist/cloud/cloud-sessions.js.map +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/commands/handlers/auth-handler.d.ts +32 -0
- package/dist/commands/handlers/auth-handler.js +137 -0
- package/dist/commands/handlers/auth-handler.js.map +1 -0
- package/dist/commands/handlers/context-handler.d.ts +46 -0
- package/dist/commands/handlers/context-handler.js +102 -0
- package/dist/commands/handlers/context-handler.js.map +1 -0
- package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
- package/dist/commands/handlers/keybindings-handler.js +124 -0
- package/dist/commands/handlers/keybindings-handler.js.map +1 -0
- package/dist/commands/handlers/session-commands.d.ts +17 -0
- package/dist/commands/handlers/session-commands.js +119 -0
- package/dist/commands/handlers/session-commands.js.map +1 -0
- package/dist/commands/slash/builtin-commands.js +1 -1
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/admin-config.d.ts +54 -0
- package/dist/config/admin-config.js +144 -0
- package/dist/config/admin-config.js.map +1 -0
- package/dist/config/advanced-config.d.ts +118 -0
- package/dist/config/advanced-config.js +364 -0
- package/dist/config/advanced-config.js.map +1 -0
- package/dist/config/managed-policies.d.ts +50 -0
- package/dist/config/managed-policies.js +120 -0
- package/dist/config/managed-policies.js.map +1 -0
- package/dist/config/settings-hierarchy.d.ts +59 -0
- package/dist/config/settings-hierarchy.js +188 -0
- package/dist/config/settings-hierarchy.js.map +1 -0
- package/dist/config/tool-profiles.d.ts +37 -0
- package/dist/config/tool-profiles.js +150 -0
- package/dist/config/tool-profiles.js.map +1 -0
- package/dist/config/user-settings.d.ts +31 -0
- package/dist/config/user-settings.js +66 -0
- package/dist/config/user-settings.js.map +1 -0
- package/dist/context/context-files.d.ts +1 -1
- package/dist/context/context-files.js +2 -2
- package/dist/context/context-files.js.map +1 -1
- package/dist/context/partial-summarizer.d.ts +32 -0
- package/dist/context/partial-summarizer.js +144 -0
- package/dist/context/partial-summarizer.js.map +1 -0
- package/dist/desktop/desktop-app.d.ts +44 -0
- package/dist/desktop/desktop-app.js +136 -0
- package/dist/desktop/desktop-app.js.map +1 -0
- package/dist/git/worktree-sessions.d.ts +24 -0
- package/dist/git/worktree-sessions.js +93 -0
- package/dist/git/worktree-sessions.js.map +1 -0
- package/dist/hooks/advanced-hooks.d.ts +110 -0
- package/dist/hooks/advanced-hooks.js +256 -0
- package/dist/hooks/advanced-hooks.js.map +1 -0
- package/dist/hooks/async-hooks.d.ts +73 -0
- package/dist/hooks/async-hooks.js +213 -0
- package/dist/hooks/async-hooks.js.map +1 -0
- package/dist/hooks/env-persistence.d.ts +58 -0
- package/dist/hooks/env-persistence.js +195 -0
- package/dist/hooks/env-persistence.js.map +1 -0
- package/dist/hooks/hook-events.d.ts +36 -0
- package/dist/hooks/hook-events.js +55 -0
- package/dist/hooks/hook-events.js.map +1 -0
- package/dist/hooks/smart-hooks.d.ts +85 -0
- package/dist/hooks/smart-hooks.js +199 -0
- package/dist/hooks/smart-hooks.js.map +1 -0
- package/dist/ide/jetbrains-plugin.d.ts +55 -0
- package/dist/ide/jetbrains-plugin.js +156 -0
- package/dist/ide/jetbrains-plugin.js.map +1 -0
- package/dist/ide/vscode-extension.d.ts +94 -0
- package/dist/ide/vscode-extension.js +229 -0
- package/dist/ide/vscode-extension.js.map +1 -0
- package/dist/index.js +77 -3
- package/dist/index.js.map +1 -1
- package/dist/input/file-autocomplete.d.ts +42 -0
- package/dist/input/file-autocomplete.js +154 -0
- package/dist/input/file-autocomplete.js.map +1 -0
- package/dist/integrations/chrome-bridge.d.ts +90 -0
- package/dist/integrations/chrome-bridge.js +151 -0
- package/dist/integrations/chrome-bridge.js.map +1 -0
- package/dist/integrations/github-action-runner.d.ts +40 -0
- package/dist/integrations/github-action-runner.js +163 -0
- package/dist/integrations/github-action-runner.js.map +1 -0
- package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
- package/dist/integrations/gitlab-ci-runner.js +104 -0
- package/dist/integrations/gitlab-ci-runner.js.map +1 -0
- package/dist/integrations/pr-session-linker.d.ts +44 -0
- package/dist/integrations/pr-session-linker.js +103 -0
- package/dist/integrations/pr-session-linker.js.map +1 -0
- package/dist/integrations/tailscale.d.ts +36 -0
- package/dist/integrations/tailscale.js +101 -0
- package/dist/integrations/tailscale.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +68 -0
- package/dist/lsp/lsp-client.js +182 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/mcp/connectors.d.ts +28 -0
- package/dist/mcp/connectors.js +148 -0
- package/dist/mcp/connectors.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -4
- package/dist/mcp/index.js +7 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
- package/dist/mcp/mcp-auto-discovery.js +104 -0
- package/dist/mcp/mcp-auto-discovery.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +70 -0
- package/dist/mcp/mcp-server.js +374 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/memory/auto-memory.d.ts +53 -0
- package/dist/memory/auto-memory.js +250 -0
- package/dist/memory/auto-memory.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +51 -0
- package/dist/memory/hybrid-search.js +199 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/memory-flush.d.ts +51 -0
- package/dist/memory/memory-flush.js +102 -0
- package/dist/memory/memory-flush.js.map +1 -0
- package/dist/memory/subagent-memory.d.ts +73 -0
- package/dist/memory/subagent-memory.js +172 -0
- package/dist/memory/subagent-memory.js.map +1 -0
- package/dist/nodes/device-node.d.ts +40 -0
- package/dist/nodes/device-node.js +117 -0
- package/dist/nodes/device-node.js.map +1 -0
- package/dist/output/json-schema-output.d.ts +67 -0
- package/dist/output/json-schema-output.js +273 -0
- package/dist/output/json-schema-output.js.map +1 -0
- package/dist/persistence/session-picker.d.ts +22 -0
- package/dist/persistence/session-picker.js +47 -0
- package/dist/persistence/session-picker.js.map +1 -0
- package/dist/persistence/session-store.d.ts +11 -0
- package/dist/persistence/session-store.js +17 -0
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
- package/dist/plugins/git-pinned-marketplace.js +152 -0
- package/dist/plugins/git-pinned-marketplace.js.map +1 -0
- package/dist/plugins/plugin-manifest.d.ts +116 -0
- package/dist/plugins/plugin-manifest.js +283 -0
- package/dist/plugins/plugin-manifest.js.map +1 -0
- package/dist/sandbox/os-sandbox.d.ts +49 -1
- package/dist/sandbox/os-sandbox.js +347 -6
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/sdk/agent-sdk.d.ts +61 -0
- package/dist/sdk/agent-sdk.js +90 -0
- package/dist/sdk/agent-sdk.js.map +1 -0
- package/dist/security/permission-modes.d.ts +76 -0
- package/dist/security/permission-modes.js +195 -0
- package/dist/security/permission-modes.js.map +1 -0
- package/dist/security/permission-patterns.d.ts +61 -0
- package/dist/security/permission-patterns.js +171 -0
- package/dist/security/permission-patterns.js.map +1 -0
- package/dist/security/safe-binaries.d.ts +23 -0
- package/dist/security/safe-binaries.js +96 -0
- package/dist/security/safe-binaries.js.map +1 -0
- package/dist/security/sender-policies.d.ts +46 -0
- package/dist/security/sender-policies.js +90 -0
- package/dist/security/sender-policies.js.map +1 -0
- package/dist/server/dashboard.d.ts +53 -0
- package/dist/server/dashboard.js +93 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/services/system-prompt-override.d.ts +34 -0
- package/dist/services/system-prompt-override.js +64 -0
- package/dist/services/system-prompt-override.js.map +1 -0
- package/dist/skills/skill-enhancements.d.ts +37 -0
- package/dist/skills/skill-enhancements.js +69 -0
- package/dist/skills/skill-enhancements.js.map +1 -0
- package/dist/telemetry/otel-tracer.d.ts +98 -0
- package/dist/telemetry/otel-tracer.js +245 -0
- package/dist/telemetry/otel-tracer.js.map +1 -0
- package/dist/tools/browser-stub.d.ts +61 -0
- package/dist/tools/browser-stub.js +184 -0
- package/dist/tools/browser-stub.js.map +1 -0
- package/dist/tools/gateway-tool.d.ts +43 -0
- package/dist/tools/gateway-tool.js +92 -0
- package/dist/tools/gateway-tool.js.map +1 -0
- package/dist/tools/image-stub.d.ts +32 -0
- package/dist/tools/image-stub.js +97 -0
- package/dist/tools/image-stub.js.map +1 -0
- package/dist/tools/js-repl.d.ts +78 -0
- package/dist/tools/js-repl.js +280 -0
- package/dist/tools/js-repl.js.map +1 -0
- package/dist/tools/message-tool.d.ts +42 -0
- package/dist/tools/message-tool.js +113 -0
- package/dist/tools/message-tool.js.map +1 -0
- package/dist/ui/cli-enhancements.d.ts +178 -0
- package/dist/ui/cli-enhancements.js +430 -0
- package/dist/ui/cli-enhancements.js.map +1 -0
- package/dist/ui/status-line.d.ts +90 -0
- package/dist/ui/status-line.js +160 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/terminal-enhancements.d.ts +34 -0
- package/dist/ui/terminal-enhancements.js +97 -0
- package/dist/ui/terminal-enhancements.js.map +1 -0
- package/dist/ui/ui-enhancements.d.ts +38 -0
- package/dist/ui/ui-enhancements.js +116 -0
- package/dist/ui/ui-enhancements.js.map +1 -0
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/init-project.d.ts +1 -1
- package/dist/utils/init-project.js +20 -20
- package/dist/utils/init-project.js.map +1 -1
- package/dist/utils/output-schema-validator.d.ts +40 -0
- package/dist/utils/output-schema-validator.js +137 -0
- package/dist/utils/output-schema-validator.js.map +1 -0
- package/dist/utils/safety-misc.d.ts +24 -0
- package/dist/utils/safety-misc.js +91 -0
- package/dist/utils/safety-misc.js.map +1 -0
- package/dist/utils/session-enhancements.d.ts +40 -0
- package/dist/utils/session-enhancements.js +118 -0
- package/dist/utils/session-enhancements.js.map +1 -0
- package/dist/utils/shell-snapshot.d.ts +38 -0
- package/dist/utils/shell-snapshot.js +323 -0
- package/dist/utils/shell-snapshot.js.map +1 -0
- package/dist/utils/stream-json-formatter.d.ts +77 -0
- package/dist/utils/stream-json-formatter.js +61 -0
- package/dist/utils/stream-json-formatter.js.map +1 -0
- package/dist/workflows/lobster-engine.d.ts +43 -0
- package/dist/workflows/lobster-engine.js +167 -0
- package/dist/workflows/lobster-engine.js.map +1 -0
- package/package.json +3 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
/**
|
|
4
|
-
* Initialize .
|
|
4
|
+
* Initialize .codebuddy directory with templates and configurations
|
|
5
5
|
* Similar to Claude Code's project initialization
|
|
6
6
|
*/
|
|
7
7
|
export function initCodeBuddyProject(workingDirectory = process.cwd(), options = {}) {
|
|
@@ -12,15 +12,15 @@ export function initCodeBuddyProject(workingDirectory = process.cwd(), options =
|
|
|
12
12
|
errors: []
|
|
13
13
|
};
|
|
14
14
|
const codebuddyDir = path.join(workingDirectory, '.codebuddy');
|
|
15
|
-
// Create .
|
|
15
|
+
// Create .codebuddy directory
|
|
16
16
|
if (!fs.existsSync(codebuddyDir)) {
|
|
17
17
|
fs.mkdirSync(codebuddyDir, { recursive: true });
|
|
18
18
|
result.created.push('.codebuddy/');
|
|
19
19
|
}
|
|
20
|
-
// Create
|
|
21
|
-
const codebuddyMdPath = path.join(codebuddyDir, '
|
|
20
|
+
// Create CODEBUDDY.md (custom instructions)
|
|
21
|
+
const codebuddyMdPath = path.join(codebuddyDir, 'CODEBUDDY.md');
|
|
22
22
|
if (!fs.existsSync(codebuddyMdPath) || options.force) {
|
|
23
|
-
const codebuddyMdContent = `# Custom Instructions for
|
|
23
|
+
const codebuddyMdContent = `# Custom Instructions for Code Buddy
|
|
24
24
|
|
|
25
25
|
## About This Project
|
|
26
26
|
<!-- Describe your project here -->
|
|
@@ -52,16 +52,16 @@ This project is...
|
|
|
52
52
|
- ...
|
|
53
53
|
|
|
54
54
|
## Forbidden Actions
|
|
55
|
-
<!-- List things
|
|
55
|
+
<!-- List things Code Buddy should never do -->
|
|
56
56
|
- Never commit .env files
|
|
57
57
|
- Never expose API keys
|
|
58
58
|
- Never delete production data
|
|
59
59
|
`;
|
|
60
60
|
fs.writeFileSync(codebuddyMdPath, codebuddyMdContent);
|
|
61
|
-
result.created.push('.codebuddy/
|
|
61
|
+
result.created.push('.codebuddy/CODEBUDDY.md');
|
|
62
62
|
}
|
|
63
63
|
else {
|
|
64
|
-
result.skipped.push('.codebuddy/
|
|
64
|
+
result.skipped.push('.codebuddy/CODEBUDDY.md (already exists)');
|
|
65
65
|
}
|
|
66
66
|
// Create hooks.json
|
|
67
67
|
if (options.includeHooks !== false) {
|
|
@@ -233,19 +233,19 @@ Safety checks:
|
|
|
233
233
|
if (options.includeGitignore !== false) {
|
|
234
234
|
const gitignorePath = path.join(workingDirectory, '.gitignore');
|
|
235
235
|
const codebuddyIgnoreEntries = `
|
|
236
|
-
#
|
|
236
|
+
# Code Buddy
|
|
237
237
|
.codebuddy/sessions/
|
|
238
238
|
.codebuddy/history/
|
|
239
239
|
.codebuddy/user-settings.json
|
|
240
240
|
`;
|
|
241
241
|
if (fs.existsSync(gitignorePath)) {
|
|
242
242
|
const currentContent = fs.readFileSync(gitignorePath, 'utf-8');
|
|
243
|
-
if (!currentContent.includes('# Grok CLI')) {
|
|
243
|
+
if (!currentContent.includes('# Code Buddy') && !currentContent.includes('# Grok CLI')) {
|
|
244
244
|
fs.appendFileSync(gitignorePath, codebuddyIgnoreEntries);
|
|
245
|
-
result.created.push('.gitignore (updated with
|
|
245
|
+
result.created.push('.gitignore (updated with Code Buddy entries)');
|
|
246
246
|
}
|
|
247
247
|
else {
|
|
248
|
-
result.skipped.push('.gitignore (already has
|
|
248
|
+
result.skipped.push('.gitignore (already has Code Buddy entries)');
|
|
249
249
|
}
|
|
250
250
|
}
|
|
251
251
|
else {
|
|
@@ -253,16 +253,16 @@ Safety checks:
|
|
|
253
253
|
result.created.push('.gitignore');
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
|
-
// Create README for .
|
|
256
|
+
// Create README for .codebuddy directory
|
|
257
257
|
const readmePath = path.join(codebuddyDir, 'README.md');
|
|
258
258
|
if (!fs.existsSync(readmePath) || options.force) {
|
|
259
|
-
const readmeContent = `# .
|
|
259
|
+
const readmeContent = `# .codebuddy Directory
|
|
260
260
|
|
|
261
|
-
This directory contains configuration and customization files for [
|
|
261
|
+
This directory contains configuration and customization files for [Code Buddy](https://github.com/phuetz/code-buddy).
|
|
262
262
|
|
|
263
263
|
## Files
|
|
264
264
|
|
|
265
|
-
- **
|
|
265
|
+
- **CODEBUDDY.md** - Custom instructions that Code Buddy follows when working in this project
|
|
266
266
|
- **settings.json** - Project-specific settings
|
|
267
267
|
- **hooks.json** - Automated hooks (pre-commit, post-edit, etc.)
|
|
268
268
|
- **mcp.json** - MCP server configurations (committable, shared with team)
|
|
@@ -295,7 +295,7 @@ Configure automated actions in \`hooks.json\`:
|
|
|
295
295
|
|
|
296
296
|
## MCP Servers
|
|
297
297
|
|
|
298
|
-
Configure MCP servers in \`mcp.json\` to extend
|
|
298
|
+
Configure MCP servers in \`mcp.json\` to extend Code Buddy's capabilities.
|
|
299
299
|
This file can be committed to share servers with your team.
|
|
300
300
|
|
|
301
301
|
## Security
|
|
@@ -307,7 +307,7 @@ Configure security modes in \`security.json\`:
|
|
|
307
307
|
|
|
308
308
|
## More Information
|
|
309
309
|
|
|
310
|
-
See the [
|
|
310
|
+
See the [Code Buddy documentation](https://github.com/phuetz/code-buddy) for more details.
|
|
311
311
|
`;
|
|
312
312
|
fs.writeFileSync(readmePath, readmeContent);
|
|
313
313
|
result.created.push('.codebuddy/README.md');
|
|
@@ -318,7 +318,7 @@ See the [Grok CLI documentation](https://github.com/phuetz/code-buddy) for more
|
|
|
318
318
|
* Format init result for display
|
|
319
319
|
*/
|
|
320
320
|
export function formatInitResult(result) {
|
|
321
|
-
let output = '🚀
|
|
321
|
+
let output = '🚀 Code Buddy Project Initialization\n' + '═'.repeat(50) + '\n\n';
|
|
322
322
|
if (result.created.length > 0) {
|
|
323
323
|
output += '✅ Created:\n';
|
|
324
324
|
for (const item of result.created) {
|
|
@@ -341,7 +341,7 @@ export function formatInitResult(result) {
|
|
|
341
341
|
output += '\n';
|
|
342
342
|
}
|
|
343
343
|
output += '─'.repeat(50) + '\n';
|
|
344
|
-
output += '💡 Edit .codebuddy/
|
|
344
|
+
output += '💡 Edit .codebuddy/CODEBUDDY.md to customize Code Buddy for this project\n';
|
|
345
345
|
output += '📚 See .codebuddy/README.md for documentation';
|
|
346
346
|
return output;
|
|
347
347
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../src/utils/init-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAkBxB;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,mBAA2B,OAAO,CAAC,GAAG,EAAE,EACxC,UAAuB,EAAE;IAEzB,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAE/D,
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../src/utils/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates headless mode JSON output against a JSON Schema file (draft-07 subset).
|
|
5
|
+
* Supports: type, properties, required, enum, pattern, minLength, maxLength,
|
|
6
|
+
* minimum, maximum, items, additionalProperties.
|
|
7
|
+
*
|
|
8
|
+
* No external dependencies - uses basic manual JSON Schema validation.
|
|
9
|
+
*/
|
|
10
|
+
export interface ValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors: string[];
|
|
13
|
+
}
|
|
14
|
+
interface JSONSchema {
|
|
15
|
+
type?: string | string[];
|
|
16
|
+
properties?: Record<string, JSONSchema>;
|
|
17
|
+
required?: string[];
|
|
18
|
+
enum?: unknown[];
|
|
19
|
+
pattern?: string;
|
|
20
|
+
minLength?: number;
|
|
21
|
+
maxLength?: number;
|
|
22
|
+
minimum?: number;
|
|
23
|
+
maximum?: number;
|
|
24
|
+
items?: JSONSchema;
|
|
25
|
+
additionalProperties?: boolean;
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load and parse a JSON Schema file from disk.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadSchema(schemaPath: string): JSONSchema;
|
|
32
|
+
/**
|
|
33
|
+
* Validate output against a JSON Schema file.
|
|
34
|
+
*
|
|
35
|
+
* @param output - The parsed output value to validate
|
|
36
|
+
* @param schemaPath - Path to the JSON Schema file
|
|
37
|
+
* @returns Validation result with errors array
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateOutputSchema(output: unknown, schemaPath: string): ValidationResult;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates headless mode JSON output against a JSON Schema file (draft-07 subset).
|
|
5
|
+
* Supports: type, properties, required, enum, pattern, minLength, maxLength,
|
|
6
|
+
* minimum, maximum, items, additionalProperties.
|
|
7
|
+
*
|
|
8
|
+
* No external dependencies - uses basic manual JSON Schema validation.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
/**
|
|
13
|
+
* Load and parse a JSON Schema file from disk.
|
|
14
|
+
*/
|
|
15
|
+
export function loadSchema(schemaPath) {
|
|
16
|
+
const resolved = path.resolve(schemaPath);
|
|
17
|
+
const content = fs.readFileSync(resolved, 'utf-8');
|
|
18
|
+
return JSON.parse(content);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a value against a JSON Schema (draft-07 subset).
|
|
22
|
+
*/
|
|
23
|
+
function validateValue(value, schema, path) {
|
|
24
|
+
const errors = [];
|
|
25
|
+
// Type check
|
|
26
|
+
if (schema.type !== undefined) {
|
|
27
|
+
const types = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
28
|
+
const actualType = getJSONType(value);
|
|
29
|
+
if (!types.includes(actualType)) {
|
|
30
|
+
errors.push(`${path}: expected type ${types.join(' | ')}, got ${actualType}`);
|
|
31
|
+
return errors; // No point checking further if type is wrong
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Enum check
|
|
35
|
+
if (schema.enum !== undefined) {
|
|
36
|
+
if (!schema.enum.some(e => JSON.stringify(e) === JSON.stringify(value))) {
|
|
37
|
+
errors.push(`${path}: value ${JSON.stringify(value)} not in enum [${schema.enum.map(e => JSON.stringify(e)).join(', ')}]`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// String-specific checks
|
|
41
|
+
if (typeof value === 'string') {
|
|
42
|
+
if (schema.pattern !== undefined) {
|
|
43
|
+
const regex = new RegExp(schema.pattern);
|
|
44
|
+
if (!regex.test(value)) {
|
|
45
|
+
errors.push(`${path}: string "${value}" does not match pattern "${schema.pattern}"`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (schema.minLength !== undefined && value.length < schema.minLength) {
|
|
49
|
+
errors.push(`${path}: string length ${value.length} is less than minLength ${schema.minLength}`);
|
|
50
|
+
}
|
|
51
|
+
if (schema.maxLength !== undefined && value.length > schema.maxLength) {
|
|
52
|
+
errors.push(`${path}: string length ${value.length} exceeds maxLength ${schema.maxLength}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Number-specific checks
|
|
56
|
+
if (typeof value === 'number') {
|
|
57
|
+
if (schema.minimum !== undefined && value < schema.minimum) {
|
|
58
|
+
errors.push(`${path}: value ${value} is less than minimum ${schema.minimum}`);
|
|
59
|
+
}
|
|
60
|
+
if (schema.maximum !== undefined && value > schema.maximum) {
|
|
61
|
+
errors.push(`${path}: value ${value} exceeds maximum ${schema.maximum}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Object-specific checks
|
|
65
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
66
|
+
const obj = value;
|
|
67
|
+
// Required properties
|
|
68
|
+
if (schema.required) {
|
|
69
|
+
for (const req of schema.required) {
|
|
70
|
+
if (!(req in obj)) {
|
|
71
|
+
errors.push(`${path}: missing required property "${req}"`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Validate properties
|
|
76
|
+
if (schema.properties) {
|
|
77
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
78
|
+
if (key in obj) {
|
|
79
|
+
errors.push(...validateValue(obj[key], propSchema, `${path}.${key}`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Additional properties check
|
|
84
|
+
if (schema.additionalProperties === false && schema.properties) {
|
|
85
|
+
const allowed = new Set(Object.keys(schema.properties));
|
|
86
|
+
for (const key of Object.keys(obj)) {
|
|
87
|
+
if (!allowed.has(key)) {
|
|
88
|
+
errors.push(`${path}: unexpected additional property "${key}"`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Array-specific checks
|
|
94
|
+
if (Array.isArray(value)) {
|
|
95
|
+
if (schema.items) {
|
|
96
|
+
for (let i = 0; i < value.length; i++) {
|
|
97
|
+
errors.push(...validateValue(value[i], schema.items, `${path}[${i}]`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return errors;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the JSON Schema type string for a value.
|
|
105
|
+
*/
|
|
106
|
+
function getJSONType(value) {
|
|
107
|
+
if (value === null)
|
|
108
|
+
return 'null';
|
|
109
|
+
if (Array.isArray(value))
|
|
110
|
+
return 'array';
|
|
111
|
+
return typeof value; // 'string' | 'number' | 'boolean' | 'object' | 'undefined'
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate output against a JSON Schema file.
|
|
115
|
+
*
|
|
116
|
+
* @param output - The parsed output value to validate
|
|
117
|
+
* @param schemaPath - Path to the JSON Schema file
|
|
118
|
+
* @returns Validation result with errors array
|
|
119
|
+
*/
|
|
120
|
+
export function validateOutputSchema(output, schemaPath) {
|
|
121
|
+
try {
|
|
122
|
+
const schema = loadSchema(schemaPath);
|
|
123
|
+
const errors = validateValue(output, schema, '$');
|
|
124
|
+
return {
|
|
125
|
+
valid: errors.length === 0,
|
|
126
|
+
errors,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
131
|
+
return {
|
|
132
|
+
valid: false,
|
|
133
|
+
errors: [`Failed to load or parse schema: ${message}`],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=output-schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-schema-validator.js","sourceRoot":"","sources":["../../src/utils/output-schema-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety & Misc Utilities
|
|
3
|
+
*
|
|
4
|
+
* NestedLaunchGuard: prevents recursive CLI launches
|
|
5
|
+
* ConfigBackupManager: timestamped config file backups with pruning
|
|
6
|
+
* FeedbackCommand: pre-filled GitHub issue URL generation
|
|
7
|
+
*/
|
|
8
|
+
export declare class NestedLaunchGuard {
|
|
9
|
+
private envKey;
|
|
10
|
+
isNestedLaunch(): boolean;
|
|
11
|
+
setSessionMarker(sessionId: string): void;
|
|
12
|
+
getWarning(): string;
|
|
13
|
+
}
|
|
14
|
+
export declare class ConfigBackupManager {
|
|
15
|
+
createBackup(filePath: string): string;
|
|
16
|
+
listBackups(filePath: string): string[];
|
|
17
|
+
pruneBackups(filePath: string, keep?: number): string[];
|
|
18
|
+
restoreBackup(backupPath: string, targetPath: string): void;
|
|
19
|
+
}
|
|
20
|
+
export declare class FeedbackCommand {
|
|
21
|
+
getRepoUrl(): string;
|
|
22
|
+
generateIssueUrl(title?: string, body?: string): string;
|
|
23
|
+
formatFeedbackMessage(): string;
|
|
24
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety & Misc Utilities
|
|
3
|
+
*
|
|
4
|
+
* NestedLaunchGuard: prevents recursive CLI launches
|
|
5
|
+
* ConfigBackupManager: timestamped config file backups with pruning
|
|
6
|
+
* FeedbackCommand: pre-filled GitHub issue URL generation
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// NestedLaunchGuard
|
|
13
|
+
// ============================================================================
|
|
14
|
+
export class NestedLaunchGuard {
|
|
15
|
+
envKey = 'CODEBUDDY_SESSION_ID';
|
|
16
|
+
isNestedLaunch() {
|
|
17
|
+
return !!process.env[this.envKey];
|
|
18
|
+
}
|
|
19
|
+
setSessionMarker(sessionId) {
|
|
20
|
+
process.env[this.envKey] = sessionId;
|
|
21
|
+
logger.debug(`Session marker set: ${sessionId}`);
|
|
22
|
+
}
|
|
23
|
+
getWarning() {
|
|
24
|
+
return 'Warning: You are launching Code Buddy inside an existing session. This may cause unexpected behavior. Use a separate terminal instead.';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// ConfigBackupManager
|
|
29
|
+
// ============================================================================
|
|
30
|
+
export class ConfigBackupManager {
|
|
31
|
+
createBackup(filePath) {
|
|
32
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
33
|
+
const backupPath = `${filePath}.${timestamp}.bak`;
|
|
34
|
+
fs.copyFileSync(filePath, backupPath);
|
|
35
|
+
logger.info(`Backup created: ${backupPath}`);
|
|
36
|
+
return backupPath;
|
|
37
|
+
}
|
|
38
|
+
listBackups(filePath) {
|
|
39
|
+
const dir = path.dirname(filePath);
|
|
40
|
+
const base = path.basename(filePath);
|
|
41
|
+
if (!fs.existsSync(dir))
|
|
42
|
+
return [];
|
|
43
|
+
const files = fs.readdirSync(dir);
|
|
44
|
+
return files
|
|
45
|
+
.filter(f => f.startsWith(base + '.') && f.endsWith('.bak'))
|
|
46
|
+
.map(f => path.join(dir, f))
|
|
47
|
+
.sort();
|
|
48
|
+
}
|
|
49
|
+
pruneBackups(filePath, keep = 5) {
|
|
50
|
+
const backups = this.listBackups(filePath);
|
|
51
|
+
const toRemove = backups.slice(0, Math.max(0, backups.length - keep));
|
|
52
|
+
for (const bp of toRemove) {
|
|
53
|
+
fs.unlinkSync(bp);
|
|
54
|
+
logger.debug(`Pruned backup: ${bp}`);
|
|
55
|
+
}
|
|
56
|
+
return toRemove;
|
|
57
|
+
}
|
|
58
|
+
restoreBackup(backupPath, targetPath) {
|
|
59
|
+
fs.copyFileSync(backupPath, targetPath);
|
|
60
|
+
logger.info(`Restored ${backupPath} -> ${targetPath}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// FeedbackCommand
|
|
65
|
+
// ============================================================================
|
|
66
|
+
export class FeedbackCommand {
|
|
67
|
+
getRepoUrl() {
|
|
68
|
+
return 'https://github.com/phuetz/code-buddy/issues/new';
|
|
69
|
+
}
|
|
70
|
+
generateIssueUrl(title, body) {
|
|
71
|
+
const base = this.getRepoUrl();
|
|
72
|
+
const params = new URLSearchParams();
|
|
73
|
+
if (title)
|
|
74
|
+
params.set('title', title);
|
|
75
|
+
if (body)
|
|
76
|
+
params.set('body', body);
|
|
77
|
+
const qs = params.toString();
|
|
78
|
+
return qs ? `${base}?${qs}` : base;
|
|
79
|
+
}
|
|
80
|
+
formatFeedbackMessage() {
|
|
81
|
+
return [
|
|
82
|
+
'We appreciate your feedback!',
|
|
83
|
+
'',
|
|
84
|
+
'To report a bug or request a feature, open a GitHub issue:',
|
|
85
|
+
` ${this.getRepoUrl()}`,
|
|
86
|
+
'',
|
|
87
|
+
'Please include steps to reproduce and your environment details.',
|
|
88
|
+
].join('\n');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=safety-misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-misc.js","sourceRoot":"","sources":["../../src/utils/safety-misc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session & Misc Enhancements
|
|
3
|
+
* Per-session settings, update channels, and elevated mode management.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SessionPersistentSettings {
|
|
6
|
+
private static instance;
|
|
7
|
+
private sessions;
|
|
8
|
+
static getInstance(): SessionPersistentSettings;
|
|
9
|
+
static resetInstance(): void;
|
|
10
|
+
set(sessionId: string, key: string, value: unknown): void;
|
|
11
|
+
get(sessionId: string, key: string): unknown;
|
|
12
|
+
getAll(sessionId: string): Record<string, unknown>;
|
|
13
|
+
clear(sessionId: string): void;
|
|
14
|
+
}
|
|
15
|
+
export declare class UpdateChannelManager {
|
|
16
|
+
private static instance;
|
|
17
|
+
readonly channels: readonly ["stable", "beta", "dev"];
|
|
18
|
+
private currentChannel;
|
|
19
|
+
static getInstance(): UpdateChannelManager;
|
|
20
|
+
static resetInstance(): void;
|
|
21
|
+
getCurrentChannel(): string;
|
|
22
|
+
setChannel(channel: string): void;
|
|
23
|
+
getLatestVersion(channel: string): {
|
|
24
|
+
version: string;
|
|
25
|
+
channel: string;
|
|
26
|
+
date: string;
|
|
27
|
+
};
|
|
28
|
+
isValidChannel(channel: string): boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class ElevatedModeManager {
|
|
31
|
+
private static instance;
|
|
32
|
+
private elevated;
|
|
33
|
+
static getInstance(): ElevatedModeManager;
|
|
34
|
+
static resetInstance(): void;
|
|
35
|
+
isElevated(): boolean;
|
|
36
|
+
enable(): void;
|
|
37
|
+
disable(): void;
|
|
38
|
+
toggle(): boolean;
|
|
39
|
+
getWarning(): string;
|
|
40
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session & Misc Enhancements
|
|
3
|
+
* Per-session settings, update channels, and elevated mode management.
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from './logger.js';
|
|
6
|
+
export class SessionPersistentSettings {
|
|
7
|
+
static instance = null;
|
|
8
|
+
sessions = new Map();
|
|
9
|
+
static getInstance() {
|
|
10
|
+
if (!SessionPersistentSettings.instance) {
|
|
11
|
+
SessionPersistentSettings.instance = new SessionPersistentSettings();
|
|
12
|
+
}
|
|
13
|
+
return SessionPersistentSettings.instance;
|
|
14
|
+
}
|
|
15
|
+
static resetInstance() {
|
|
16
|
+
SessionPersistentSettings.instance = null;
|
|
17
|
+
}
|
|
18
|
+
set(sessionId, key, value) {
|
|
19
|
+
if (!this.sessions.has(sessionId)) {
|
|
20
|
+
this.sessions.set(sessionId, new Map());
|
|
21
|
+
}
|
|
22
|
+
this.sessions.get(sessionId).set(key, value);
|
|
23
|
+
logger.debug(`Session ${sessionId}: set ${key}`);
|
|
24
|
+
}
|
|
25
|
+
get(sessionId, key) {
|
|
26
|
+
return this.sessions.get(sessionId)?.get(key);
|
|
27
|
+
}
|
|
28
|
+
getAll(sessionId) {
|
|
29
|
+
const map = this.sessions.get(sessionId);
|
|
30
|
+
if (!map)
|
|
31
|
+
return {};
|
|
32
|
+
const result = {};
|
|
33
|
+
for (const [k, v] of map) {
|
|
34
|
+
result[k] = v;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
clear(sessionId) {
|
|
39
|
+
this.sessions.delete(sessionId);
|
|
40
|
+
logger.debug(`Session ${sessionId}: cleared`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class UpdateChannelManager {
|
|
44
|
+
static instance = null;
|
|
45
|
+
channels = ['stable', 'beta', 'dev'];
|
|
46
|
+
currentChannel = 'stable';
|
|
47
|
+
static getInstance() {
|
|
48
|
+
if (!UpdateChannelManager.instance) {
|
|
49
|
+
UpdateChannelManager.instance = new UpdateChannelManager();
|
|
50
|
+
}
|
|
51
|
+
return UpdateChannelManager.instance;
|
|
52
|
+
}
|
|
53
|
+
static resetInstance() {
|
|
54
|
+
UpdateChannelManager.instance = null;
|
|
55
|
+
}
|
|
56
|
+
getCurrentChannel() {
|
|
57
|
+
return this.currentChannel;
|
|
58
|
+
}
|
|
59
|
+
setChannel(channel) {
|
|
60
|
+
if (!this.isValidChannel(channel)) {
|
|
61
|
+
throw new Error(`Invalid channel: ${channel}. Must be one of: ${this.channels.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
this.currentChannel = channel;
|
|
64
|
+
logger.debug(`Update channel set to: ${channel}`);
|
|
65
|
+
}
|
|
66
|
+
getLatestVersion(channel) {
|
|
67
|
+
if (!this.isValidChannel(channel)) {
|
|
68
|
+
throw new Error(`Invalid channel: ${channel}`);
|
|
69
|
+
}
|
|
70
|
+
// Stub implementation
|
|
71
|
+
const versions = {
|
|
72
|
+
stable: '1.0.0',
|
|
73
|
+
beta: '1.1.0-beta.1',
|
|
74
|
+
dev: '1.2.0-dev.1',
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
version: versions[channel] || '0.0.0',
|
|
78
|
+
channel,
|
|
79
|
+
date: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
isValidChannel(channel) {
|
|
83
|
+
return this.channels.includes(channel);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export class ElevatedModeManager {
|
|
87
|
+
static instance = null;
|
|
88
|
+
elevated = false;
|
|
89
|
+
static getInstance() {
|
|
90
|
+
if (!ElevatedModeManager.instance) {
|
|
91
|
+
ElevatedModeManager.instance = new ElevatedModeManager();
|
|
92
|
+
}
|
|
93
|
+
return ElevatedModeManager.instance;
|
|
94
|
+
}
|
|
95
|
+
static resetInstance() {
|
|
96
|
+
ElevatedModeManager.instance = null;
|
|
97
|
+
}
|
|
98
|
+
isElevated() {
|
|
99
|
+
return this.elevated;
|
|
100
|
+
}
|
|
101
|
+
enable() {
|
|
102
|
+
this.elevated = true;
|
|
103
|
+
logger.debug('Elevated mode enabled');
|
|
104
|
+
}
|
|
105
|
+
disable() {
|
|
106
|
+
this.elevated = false;
|
|
107
|
+
logger.debug('Elevated mode disabled');
|
|
108
|
+
}
|
|
109
|
+
toggle() {
|
|
110
|
+
this.elevated = !this.elevated;
|
|
111
|
+
logger.debug(`Elevated mode toggled to: ${this.elevated}`);
|
|
112
|
+
return this.elevated;
|
|
113
|
+
}
|
|
114
|
+
getWarning() {
|
|
115
|
+
return 'WARNING: Elevated mode bypasses safety confirmations. Use with caution.';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=session-enhancements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-enhancements.js","sourceRoot":"","sources":["../../src/utils/session-enhancements.ts"],"names":[],"mappings":"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"}
|