@phuetz/code-buddy 0.1.18 → 0.1.20
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/analytics/dashboard.js +1 -1
- package/dist/analytics/dashboard.js.map +1 -1
- 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/delegate.js +2 -2
- package/dist/commands/delegate.js.map +1 -1
- package/dist/commands/features.d.ts +1 -1
- package/dist/commands/features.js +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/core-handlers.js +1 -1
- package/dist/commands/handlers/core-handlers.js.map +1 -1
- 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/missing-handlers.js +15 -14
- package/dist/commands/handlers/missing-handlers.js.map +1 -1
- 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/handlers/worktree-handlers.d.ts +1 -1
- package/dist/commands/handlers/worktree-handlers.js +2 -2
- package/dist/commands/slash/builtin-commands.js +2 -2
- 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/constants.d.ts +2 -2
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- 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/toml-config.js +1 -1
- package/dist/config/toml-config.js.map +1 -1
- 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 +3 -3
- 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/features/index.d.ts +1 -1
- package/dist/features/index.js +2 -2
- package/dist/features/index.js.map +1 -1
- 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/hook-system.js +1 -1
- package/dist/hooks/hook-system.js.map +1 -1
- 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/github-actions.js +1 -1
- package/dist/integrations/github-actions.js.map +1 -1
- 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/lsp/server.js +3 -3
- package/dist/lsp/server.js.map +1 -1
- 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/observability/dashboard.d.ts +1 -1
- package/dist/observability/dashboard.js +2 -2
- package/dist/observability/dashboard.js.map +1 -1
- package/dist/offline/offline-mode.d.ts +1 -1
- package/dist/offline/offline-mode.js +1 -1
- 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/marketplace.d.ts +1 -1
- package/dist/plugins/marketplace.js +1 -1
- 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/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +1 -1
- package/dist/providers/local-llm-provider.d.ts +1 -1
- package/dist/providers/local-llm-provider.js +1 -1
- 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/scripting/codebuddy-bindings.js +1 -1
- package/dist/scripting/codebuddy-bindings.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/index.d.ts +1 -1
- package/dist/security/index.js +1 -1
- 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/templates/export/html.template.js +2 -2
- package/dist/templates/export/markdown.template.js +1 -1
- package/dist/templates/export/markdown.template.js.map +1 -1
- package/dist/themes/default-themes.d.ts +1 -1
- package/dist/themes/default-themes.js +1 -1
- package/dist/themes/index.d.ts +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/theme-manager.d.ts +1 -1
- package/dist/themes/theme-manager.js +1 -1
- package/dist/themes/theme.d.ts +1 -1
- package/dist/themes/theme.js +1 -1
- 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/types/errors.d.ts +1 -1
- package/dist/types/errors.js +1 -1
- package/dist/ui/app.js +1 -1
- package/dist/ui/app.js.map +1 -1
- 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/components/HelpSystem.d.ts +1 -1
- package/dist/ui/components/HelpSystem.js +1 -1
- package/dist/ui/context/theme-context.d.ts +1 -1
- package/dist/ui/context/theme-context.js +1 -1
- package/dist/ui/dashboard/dashboard.js +1 -1
- package/dist/ui/dashboard/dashboard.js.map +1 -1
- 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/undo/checkpoint-manager.d.ts +1 -1
- package/dist/undo/checkpoint-manager.js +1 -1
- package/dist/utils/codebuddy-home.d.ts +1 -1
- package/dist/utils/codebuddy-home.js +1 -1
- package/dist/utils/conversation-export.js +3 -3
- package/dist/utils/conversation-export.js.map +1 -1
- package/dist/utils/custom-commands.js +1 -1
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/debug-logger.d.ts +1 -1
- package/dist/utils/debug-logger.js +1 -1
- package/dist/utils/errors.d.ts +2 -2
- package/dist/utils/errors.js +2 -2
- package/dist/utils/export-manager.js +3 -3
- package/dist/utils/export-manager.js.map +1 -1
- package/dist/utils/headless-output.js +1 -1
- package/dist/utils/headless-output.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/logger.d.ts +1 -1
- package/dist/utils/logger.js +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-completions.js +6 -6
- 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/utils/terminal-notifications.js +1 -1
- package/dist/utils/terminal-notifications.js.map +1 -1
- 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
|
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,yBAAyB;IAC5B,MAAM,CAAC,QAAQ,GAAqC,IAAI,CAAC;IACzD,QAAQ,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEhE,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,CAAC;YACxC,yBAAyB,CAAC,QAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,yBAAyB,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,yBAAyB,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,KAAc;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,SAAS,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,GAAG,CAAC,SAAiB,EAAE,GAAW;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,WAAW,CAAC,CAAC;IAChD,CAAC;;AAGH,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAC,QAAQ,GAAgC,IAAI,CAAC;IACnD,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;IAC/C,cAAc,GAAW,QAAQ,CAAC;IAE1C,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACnC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,oBAAoB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,qBAAqB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,OAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,sBAAsB;QACtB,MAAM,QAAQ,GAA2B;YACvC,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,aAAa;SACnB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO;YACrC,OAAO;YACP,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,OAAQ,IAAI,CAAC,QAA8B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;;AAGH,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAC,QAAQ,GAA+B,IAAI,CAAC;IACnD,QAAQ,GAAY,KAAK,CAAC;IAElC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YAClC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,mBAAmB,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,UAAU;QACR,OAAO,yEAAyE,CAAC;IACnF,CAAC"}
|
|
@@ -72,7 +72,7 @@ function generateBashCompletion() {
|
|
|
72
72
|
const modes = APPROVAL_MODES.join(' ');
|
|
73
73
|
const themes = THEMES.join(' ');
|
|
74
74
|
return `#!/bin/bash
|
|
75
|
-
#
|
|
75
|
+
# Code Buddy Bash Completion
|
|
76
76
|
# Source this file or add to ~/.bashrc
|
|
77
77
|
|
|
78
78
|
_codebuddy_completions() {
|
|
@@ -140,7 +140,7 @@ _codebuddy_theme_completions() {
|
|
|
140
140
|
COMPREPLY=( $(compgen -W "\${themes}" -- "\${COMP_WORDS[COMP_CWORD]}") )
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
echo "
|
|
143
|
+
echo "Code Buddy bash completions loaded"
|
|
144
144
|
`;
|
|
145
145
|
}
|
|
146
146
|
// ============================================================================
|
|
@@ -162,7 +162,7 @@ function generateZshCompletion() {
|
|
|
162
162
|
const modes = APPROVAL_MODES.join(' ');
|
|
163
163
|
const themes = THEMES.join(' ');
|
|
164
164
|
return `#compdef grok code-buddy
|
|
165
|
-
#
|
|
165
|
+
# Code Buddy Zsh Completion
|
|
166
166
|
# Save to ~/.zsh/completions/_codebuddy or /usr/local/share/zsh/site-functions/_codebuddy
|
|
167
167
|
|
|
168
168
|
_codebuddy() {
|
|
@@ -245,7 +245,7 @@ function generateFishCompletion() {
|
|
|
245
245
|
const desc = c.description.replace(/'/g, "\\'");
|
|
246
246
|
return `complete -c grok -n '__fish_codebuddy_in_prompt' -a '${c.name}' -d '${desc}'`;
|
|
247
247
|
}).join('\n');
|
|
248
|
-
return `#
|
|
248
|
+
return `# Code Buddy Fish Completion
|
|
249
249
|
# Save to ~/.config/fish/completions/grok.fish
|
|
250
250
|
|
|
251
251
|
# Helper function to detect if we're in the prompt context
|
|
@@ -293,7 +293,7 @@ function generatePowerShellCompletion() {
|
|
|
293
293
|
const models = MODELS.map(m => `'${m}'`).join(', ');
|
|
294
294
|
const modes = APPROVAL_MODES.map(m => `'${m}'`).join(', ');
|
|
295
295
|
const themes = THEMES.map(t => `'${t}'`).join(', ');
|
|
296
|
-
return `#
|
|
296
|
+
return `# Code Buddy PowerShell Completion
|
|
297
297
|
# Save to $PROFILE or run: grok --completions powershell | Out-File -Append $PROFILE
|
|
298
298
|
|
|
299
299
|
$_codebuddyOptions = @(${CLI_OPTIONS.map(o => `'${o.name}'`).join(', ')})
|
|
@@ -375,7 +375,7 @@ Register-ArgumentCompleter -Native -CommandName grok, code-buddy -ScriptBlock {
|
|
|
375
375
|
}
|
|
376
376
|
}
|
|
377
377
|
|
|
378
|
-
Write-Host "
|
|
378
|
+
Write-Host "Code Buddy PowerShell completions loaded" -ForegroundColor Green
|
|
379
379
|
`;
|
|
380
380
|
}
|
|
381
381
|
// ============================================================================
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Environment Snapshots
|
|
3
|
+
*
|
|
4
|
+
* Captures the user's shell environment for better context awareness.
|
|
5
|
+
* Includes shell type, env vars (filtered for safety), aliases, rc files,
|
|
6
|
+
* and common tool versions.
|
|
7
|
+
*
|
|
8
|
+
* Can be injected into the system prompt to help the agent understand
|
|
9
|
+
* the user's development environment.
|
|
10
|
+
*/
|
|
11
|
+
export interface ShellSnapshot {
|
|
12
|
+
/** Detected shell (bash, zsh, fish, sh) */
|
|
13
|
+
shell: string;
|
|
14
|
+
/** Filtered environment variables (safe ones only) */
|
|
15
|
+
env: Record<string, string>;
|
|
16
|
+
/** Parsed aliases from rc files */
|
|
17
|
+
aliases: string[];
|
|
18
|
+
/** Shell function names */
|
|
19
|
+
functions: string[];
|
|
20
|
+
/** Which rc files exist */
|
|
21
|
+
rcFiles: string[];
|
|
22
|
+
/** Node.js version */
|
|
23
|
+
nodeVersion?: string;
|
|
24
|
+
/** npm version */
|
|
25
|
+
npmVersion?: string;
|
|
26
|
+
/** Git version */
|
|
27
|
+
gitVersion?: string;
|
|
28
|
+
/** Python version */
|
|
29
|
+
pythonVersion?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Capture a snapshot of the current shell environment.
|
|
33
|
+
*/
|
|
34
|
+
export declare function captureShellSnapshot(): Promise<ShellSnapshot>;
|
|
35
|
+
/**
|
|
36
|
+
* Format a shell snapshot as a concise prompt string for system prompt injection.
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatSnapshotForPrompt(snapshot: ShellSnapshot): string;
|