codebuff 1.0.306 → 1.0.308
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/background-process-manager.js +5 -0
- package/dist/background-process-manager.js.map +1 -1
- package/dist/browser-runner.js +12 -3
- package/dist/browser-runner.js.map +1 -1
- package/dist/chat-storage.js +11 -0
- package/dist/chat-storage.js.map +1 -1
- package/dist/checkpoints/checkpoint-manager.js +6 -0
- package/dist/checkpoints/checkpoint-manager.js.map +1 -1
- package/dist/checkpoints/file-manager.js +52 -8
- package/dist/checkpoints/file-manager.js.map +1 -1
- package/dist/cli-handlers/checkpoint.js +25 -0
- package/dist/cli-handlers/checkpoint.js.map +1 -1
- package/dist/cli.js +24 -3
- package/dist/cli.js.map +1 -1
- package/dist/client.js +87 -3
- package/dist/client.js.map +1 -1
- package/dist/code-map/tsconfig.tsbuildinfo +1 -1
- package/dist/common/actions.d.ts +15 -0
- package/dist/common/constants.d.ts +5 -0
- package/dist/common/constants.js +11 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/json-config/constants.d.ts +55 -0
- package/dist/common/json-config/constants.js +31 -2
- package/dist/common/json-config/constants.js.map +1 -1
- package/dist/common/types/agent-state.d.ts +3 -0
- package/dist/common/types/agent-state.js +2 -0
- package/dist/common/types/agent-state.js.map +1 -1
- package/dist/common/util/__tests__/saxy.test.js +89 -2
- package/dist/common/util/__tests__/saxy.test.js.map +1 -1
- package/dist/common/util/saxy.d.ts +2 -1
- package/dist/common/util/saxy.js +15 -5
- package/dist/common/util/saxy.js.map +1 -1
- package/dist/common/websockets/websocket-schema.d.ts +28 -0
- package/dist/create-template-project.js +24 -0
- package/dist/create-template-project.js.map +1 -1
- package/dist/credentials.js +8 -2
- package/dist/credentials.js.map +1 -1
- package/dist/dev-process-manager.js +2 -1
- package/dist/dev-process-manager.js.map +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/json-config/hooks.d.ts +6 -0
- package/dist/json-config/hooks.js +58 -0
- package/dist/json-config/hooks.js.map +1 -0
- package/dist/json-config/parser.d.ts +7 -0
- package/dist/json-config/parser.js +53 -0
- package/dist/json-config/parser.js.map +1 -0
- package/dist/json-config-parser.d.ts +7 -0
- package/dist/json-config-parser.js +53 -0
- package/dist/json-config-parser.js.map +1 -0
- package/dist/menu.js +36 -37
- package/dist/menu.js.map +1 -1
- package/dist/project-files.js +51 -5
- package/dist/project-files.js.map +1 -1
- package/dist/startup-process-handler.d.ts +1 -2
- package/dist/startup-process-handler.js +5 -1
- package/dist/startup-process-handler.js.map +1 -1
- package/dist/tool-handlers.js +17 -0
- package/dist/tool-handlers.js.map +1 -1
- package/dist/utils/analytics.js +8 -2
- package/dist/utils/analytics.js.map +1 -1
- package/dist/utils/detect-shell.js +7 -2
- package/dist/utils/detect-shell.js.map +1 -1
- package/dist/utils/git.js +5 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/terminal.d.ts +1 -0
- package/dist/utils/terminal.js.map +1 -1
- package/dist/web-scraper.js +6 -4
- package/dist/web-scraper.js.map +1 -1
- package/dist/workers/checkpoint-worker.js +1 -0
- package/dist/workers/checkpoint-worker.js.map +1 -1
- package/package.json +2 -1
- package/dist/code-map/__mocks__/tree-sitter-typescript.d.ts +0 -12
- package/dist/code-map/__mocks__/tree-sitter-typescript.d.ts.map +0 -1
- package/dist/code-map/__mocks__/tree-sitter-typescript.js +0 -14
- package/dist/code-map/__mocks__/tree-sitter-typescript.js.map +0 -1
- package/dist/code-map/jest.config.d.ts +0 -4
- package/dist/code-map/jest.config.d.ts.map +0 -1
- package/dist/code-map/jest.config.js +0 -18
- package/dist/code-map/jest.config.js.map +0 -1
- package/dist/code-map/scripts/tree-sitter-test.cjs +0 -27
- package/dist/code-map/scripts/tree-sitter-test.cjs.map +0 -1
- package/dist/code-map/scripts/tree-sitter-test.d.cts +0 -2
- package/dist/code-map/scripts/tree-sitter-test.d.cts.map +0 -1
- package/dist/code-map/scripts/tree-sitter-test.d.ts +0 -2
- package/dist/code-map/scripts/tree-sitter-test.d.ts.map +0 -1
- package/dist/code-map/scripts/tree-sitter-test.js +0 -54
- package/dist/code-map/scripts/tree-sitter-test.js.map +0 -1
|
@@ -29,22 +29,35 @@ const path_1 = require("path");
|
|
|
29
29
|
const fs = __importStar(require("fs"));
|
|
30
30
|
const os = __importStar(require("os"));
|
|
31
31
|
const picocolors_1 = require("picocolors");
|
|
32
|
+
const logger_1 = require("./utils/logger");
|
|
32
33
|
async function createTemplateProject(template, projectDir, projectName = template) {
|
|
33
34
|
console.log(`Creating project from ${template} template in ${projectDir}/${projectName}`);
|
|
34
35
|
// Validate template name contains only alphanumeric chars, dash and underscore
|
|
35
36
|
if (!/^[a-zA-Z0-9-_]+$/.test(template)) {
|
|
36
37
|
console.error('Template name can only contain letters, numbers, dash and underscore');
|
|
38
|
+
logger_1.logger.error({
|
|
39
|
+
errorMessage: 'Template name can only contain letters, numbers, dash and underscore',
|
|
40
|
+
template,
|
|
41
|
+
}, 'Invalid template name');
|
|
37
42
|
process.exit(1);
|
|
38
43
|
}
|
|
39
44
|
// Validate project name
|
|
40
45
|
if (!/^[a-zA-Z0-9-_]+$/.test(projectName)) {
|
|
41
46
|
console.error('Project name can only contain letters, numbers, dash and underscore');
|
|
47
|
+
logger_1.logger.error({
|
|
48
|
+
errorMessage: 'Project name can only contain letters, numbers, dash and underscore',
|
|
49
|
+
projectName,
|
|
50
|
+
}, 'Invalid project name');
|
|
42
51
|
process.exit(1);
|
|
43
52
|
}
|
|
44
53
|
const projectPath = (0, path_1.join)(projectDir, projectName);
|
|
45
54
|
// Check if directory already exists
|
|
46
55
|
if (fs.existsSync(projectPath)) {
|
|
47
56
|
console.error(`Directory ${projectPath} already exists`);
|
|
57
|
+
logger_1.logger.error({
|
|
58
|
+
errorMessage: `Directory ${projectPath} already exists`,
|
|
59
|
+
projectPath,
|
|
60
|
+
}, 'Directory already exists');
|
|
48
61
|
process.exit(1);
|
|
49
62
|
}
|
|
50
63
|
try {
|
|
@@ -67,6 +80,10 @@ async function createTemplateProject(template, projectDir, projectName = templat
|
|
|
67
80
|
}
|
|
68
81
|
else {
|
|
69
82
|
console.error(`Template ${template} not found in starter-templates/ or showcase/`);
|
|
83
|
+
logger_1.logger.error({
|
|
84
|
+
errorMessage: `Template ${template} not found in starter-templates/ or showcase/`,
|
|
85
|
+
template,
|
|
86
|
+
}, 'Template not found');
|
|
70
87
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
71
88
|
process.exit(1);
|
|
72
89
|
}
|
|
@@ -100,6 +117,13 @@ async function createTemplateProject(template, projectDir, projectName = templat
|
|
|
100
117
|
(0, child_process_1.execSync)('codebuff', { stdio: 'inherit' });
|
|
101
118
|
}
|
|
102
119
|
catch (error) {
|
|
120
|
+
logger_1.logger.error({
|
|
121
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
122
|
+
errorStack: error instanceof Error ? error.stack : undefined,
|
|
123
|
+
template,
|
|
124
|
+
projectDir,
|
|
125
|
+
projectName,
|
|
126
|
+
}, 'Failed to initialize project');
|
|
103
127
|
console.error('Failed to initialize project:', error);
|
|
104
128
|
process.exit(1);
|
|
105
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-template-project.js","sourceRoot":"","sources":["../src/create-template-project.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"create-template-project.js","sourceRoot":"","sources":["../src/create-template-project.ts"],"names":[],"mappings":"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"}
|
package/dist/credentials.js
CHANGED
|
@@ -5,9 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.CREDENTIALS_PATH = exports.CONFIG_DIR = exports.userFromJson = void 0;
|
|
7
7
|
const credentials_1 = require("./common/util/credentials");
|
|
8
|
-
const zod_1 = require("zod");
|
|
9
|
-
const os_1 = __importDefault(require("os"));
|
|
10
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const logger_1 = require("./utils/logger");
|
|
11
12
|
const credentialsSchema = zod_1.z
|
|
12
13
|
.object({
|
|
13
14
|
default: credentials_1.userSchema,
|
|
@@ -21,6 +22,11 @@ const userFromJson = (json, profileName = 'default') => {
|
|
|
21
22
|
}
|
|
22
23
|
catch (error) {
|
|
23
24
|
console.error('Error parsing user JSON:', error);
|
|
25
|
+
logger_1.logger.error({
|
|
26
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
27
|
+
errorStack: error instanceof Error ? error.stack : undefined,
|
|
28
|
+
profileName,
|
|
29
|
+
}, 'Error parsing user JSON');
|
|
24
30
|
return;
|
|
25
31
|
}
|
|
26
32
|
};
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA0D;AAC1D,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA0D;AAC1D,0DAA4B;AAC5B,4CAAmB;AACnB,6BAAuB;AACvB,2CAAuC;AAEvC,MAAM,iBAAiB,GAAG,OAAC;KACxB,MAAM,CAAC;IACN,OAAO,EAAE,wBAAU;CACpB,CAAC;KACD,QAAQ,CAAC,wBAAU,CAAC,CAAA;AAEhB,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,cAAsB,SAAS,EACb,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;QAC3C,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAChD,eAAM,CAAC,KAAK,CACV;YACE,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YACpE,UAAU,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC5D,WAAW;SACZ,EACD,yBAAyB,CAC1B,CAAA;QACD,OAAM;IACR,CAAC;AACH,CAAC,CAAA;AApBY,QAAA,YAAY,gBAoBxB;AAED,2CAAwD;AAE3C,QAAA,UAAU,GAAG,mBAAI,CAAC,IAAI,CACjC,YAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,UAAU;IACR,0BAA0B;IAC1B,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACvC,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,YAAY;QACrD,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE;QAC9C,CAAC,CAAC,EAAE,CAAC,CACV,CAAA;AAED,iCAAiC;AACjC,IAAA,4BAAqB,EAAC,kBAAU,CAAC,CAAA;AACpB,QAAA,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,kBAAU,EAAE,kBAAkB,CAAC,CAAA"}
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.startDevProcesses = startDevProcesses;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const constants_1 = require("./common/json-config/constants");
|
|
8
9
|
const string_1 = require("./common/util/string");
|
|
9
10
|
const picocolors_1 = require("picocolors");
|
|
10
11
|
const terminal_1 = require("./utils/terminal");
|
|
@@ -21,7 +22,7 @@ function startDevProcesses(processes, projectPath) {
|
|
|
21
22
|
if (!toStart.length) {
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
|
-
console.log((0, picocolors_1.yellow)(
|
|
25
|
+
console.log((0, picocolors_1.yellow)(`Starting ${constants_1.codebuffConfigFile} processes:`));
|
|
25
26
|
for (const { name, command, cwd, enabled, stderrFile, stdoutFile, } of processes) {
|
|
26
27
|
if (!enabled) {
|
|
27
28
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-process-manager.js","sourceRoot":"","sources":["../src/dev-process-manager.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dev-process-manager.js","sourceRoot":"","sources":["../src/dev-process-manager.ts"],"names":[],"mappings":";;;;;AAmBA,8CAqDC;AAxED,gDAAuB;AAEvB,4DAGqC;AACrC,+CAAsD;AACtD,2CAAmC;AAEnC,+CAAuD;AAEvD;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC/B,SAA2B,EAC3B,WAAmB;IAEnB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE9D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAM,EAAC,YAAY,8BAAkB,aAAa,CAAC,CAAC,CAAA;IAEhE,KAAK,MAAM,EACT,IAAI,EACJ,OAAO,EACP,GAAG,EACH,OAAO,EACP,UAAU,EACV,UAAU,GACX,IAAI,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAQ;QACV,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAG,GAAG;YACrB,CAAC,CAAC,cAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;YAClC,CAAC,CAAC,WAAW,CAAA;QAEf,oBAAoB;QACpB,IAAA,+BAAoB,EAClB;YACE,UAAU,EAAE,IAAA,0BAAiB,GAAE;YAC/B,OAAO;YACP,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,WAAW;YAChB,UAAU;YACV,UAAU;SACX,EACD,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACzD,IAAI,CAAC,EAAE,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAM,EAAC,KAAK,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAM,EAAC,KAAK,IAAI,KAAK,OAAO,oBAAoB,CAAC,CAAC,CAAA;YAChE,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
process.env.NEXT_PUBLIC_CB_ENVIRONMENT = 'production';
|
|
3
3
|
process.env.NEXT_PUBLIC_BACKEND_URL = 'manicode-backend.onrender.com';
|
|
4
|
-
process.env.NEXT_PUBLIC_APP_URL = 'https://codebuff.com';
|
|
4
|
+
process.env.NEXT_PUBLIC_APP_URL = 'https://www.codebuff.com';
|
|
5
5
|
process.env.NEXT_PUBLIC_SUPPORT_EMAIL = 'support@codebuff.com';
|
|
6
6
|
process.env.NEXT_PUBLIC_POSTHOG_API_KEY = 'phc_tug7g8yc10qNestK14QV8WyKwjfEl6vwzIbJkBdqeHS';
|
|
7
|
-
process.env.NEXT_PUBLIC_POSTHOG_HOST_URL = 'https://us.i.posthog.com
|
|
7
|
+
process.env.NEXT_PUBLIC_POSTHOG_HOST_URL = 'https://us.i.posthog.com';
|
|
8
8
|
"use strict";
|
|
9
9
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
const commander_1 = require("commander");
|
|
14
|
-
const parser_1 = require("./common/json-config/parser");
|
|
15
14
|
const picocolors_1 = require("picocolors");
|
|
16
15
|
const package_json_1 = __importDefault(require("../package.json"));
|
|
17
16
|
const cli_1 = require("./cli");
|
|
@@ -23,6 +22,7 @@ const startup_process_handler_1 = require("./startup-process-handler");
|
|
|
23
22
|
const update_codebuff_1 = require("./update-codebuff");
|
|
24
23
|
const analytics_1 = require("./utils/analytics");
|
|
25
24
|
const git_1 = require("./utils/git");
|
|
25
|
+
const logger_1 = require("./utils/logger");
|
|
26
26
|
const terminal_1 = require("./utils/terminal");
|
|
27
27
|
async function codebuff(projectDir, { initialInput, git, costMode, runInitFlow, model }) {
|
|
28
28
|
(0, display_1.enableSquashNewlines)();
|
|
@@ -32,10 +32,8 @@ async function codebuff(projectDir, { initialInput, git, costMode, runInitFlow,
|
|
|
32
32
|
const projectRoot = (0, project_files_1.setProjectRoot)(gitRoot);
|
|
33
33
|
(0, project_files_1.setWorkingDirectory)(cwd);
|
|
34
34
|
(0, terminal_1.recreateShell)(cwd);
|
|
35
|
-
// Load config file if it exists
|
|
36
|
-
const config = (0, parser_1.loadCodebuffConfig)(projectRoot);
|
|
37
35
|
// Kill all processes we failed to kill before
|
|
38
|
-
const processCleanupPromise = (0, startup_process_handler_1.logAndHandleStartup)(
|
|
36
|
+
const processCleanupPromise = (0, startup_process_handler_1.logAndHandleStartup)();
|
|
39
37
|
(0, analytics_1.initAnalytics)();
|
|
40
38
|
const updatePromise = (0, update_codebuff_1.updateCodebuff)();
|
|
41
39
|
const initFileContextPromise = (0, project_files_1.initProjectFileContextWithWorker)(projectRoot);
|
|
@@ -89,6 +87,9 @@ For all commands and options, run 'codebuff' and then type 'help'.
|
|
|
89
87
|
// Handle deprecated --pro flag
|
|
90
88
|
if (options.pro) {
|
|
91
89
|
console.error((0, picocolors_1.red)('Warning: The --pro flag is deprecated. Please restart codebuff and use the --max option instead.'));
|
|
90
|
+
logger_1.logger.error({
|
|
91
|
+
errorMessage: 'The --pro flag is deprecated. Please restart codebuff and use the --max option instead.',
|
|
92
|
+
}, 'Deprecated --pro flag used');
|
|
92
93
|
process.exit(1);
|
|
93
94
|
}
|
|
94
95
|
// Determine cost mode
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ToolResult } from '../common/types/agent-state';
|
|
2
|
+
/**
|
|
3
|
+
* Runs file change hooks defined in the codebuff.json configuration.
|
|
4
|
+
* Returns an array of tool results for any hooks that fail.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runFileChangeHooks(filesChanged: string[]): Promise<ToolResult[]>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runFileChangeHooks = runFileChangeHooks;
|
|
7
|
+
const string_1 = require("../common/util/string");
|
|
8
|
+
const micromatch_1 = __importDefault(require("micromatch"));
|
|
9
|
+
const project_files_1 = require("../project-files");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const terminal_1 = require("../utils/terminal");
|
|
12
|
+
const parser_1 = require("./parser");
|
|
13
|
+
/**
|
|
14
|
+
* Runs file change hooks defined in the codebuff.json configuration.
|
|
15
|
+
* Returns an array of tool results for any hooks that fail.
|
|
16
|
+
*/
|
|
17
|
+
async function runFileChangeHooks(filesChanged) {
|
|
18
|
+
const config = (0, parser_1.loadCodebuffConfig)();
|
|
19
|
+
const toolResults = [];
|
|
20
|
+
if (!config?.fileChangeHooks) {
|
|
21
|
+
return toolResults;
|
|
22
|
+
}
|
|
23
|
+
for (const hook of config.fileChangeHooks) {
|
|
24
|
+
if (!hook.enabled) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// If a filePattern is specified, check if any of the changed files match
|
|
28
|
+
if (hook.filePattern && filesChanged.length > 0) {
|
|
29
|
+
const matchingFiles = (0, micromatch_1.default)(filesChanged, hook.filePattern);
|
|
30
|
+
if (matchingFiles.length === 0) {
|
|
31
|
+
// No files match the pattern, skip this hook
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const hookName = `file-change-hook-${hook.name}`;
|
|
37
|
+
const hookId = (0, string_1.generateCompactId)(`${hookName}-`);
|
|
38
|
+
const result = await (0, terminal_1.runTerminalCommand)(hookId, hook.command, 'assistant', 'SYNC', -1, hook.cwd || (0, project_files_1.getProjectRoot)(), undefined, undefined);
|
|
39
|
+
if (result.exitCode !== 0) {
|
|
40
|
+
toolResults.push({
|
|
41
|
+
name: hookName,
|
|
42
|
+
id: hookId,
|
|
43
|
+
result: result.result,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger_1.logger.error({
|
|
49
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
50
|
+
errorStack: error instanceof Error ? error.stack : undefined,
|
|
51
|
+
hookName: hook.name,
|
|
52
|
+
hookCommand: hook.command,
|
|
53
|
+
}, 'Error running file change hook');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return toolResults;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/json-config/hooks.ts"],"names":[],"mappings":";;;;;AAaA,gDA0DC;AAtED,+CAAsD;AACtD,4DAAmC;AAEnC,oDAAiD;AACjD,4CAAwC;AACxC,gDAAsD;AACtD,qCAA6C;AAE7C;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,YAAsB;IAEtB,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAA;IACnC,MAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,SAAQ;QACV,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,IAAA,oBAAU,EAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YAChE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,6CAA6C;gBAC7C,SAAQ;YACV,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAA;YAChD,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,GAAG,QAAQ,GAAG,CAAC,CAAA;YAChD,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAkB,EACrC,MAAM,EACN,IAAI,CAAC,OAAO,EACZ,WAAW,EACX,MAAM,EACN,CAAC,CAAC,EACF,IAAI,CAAC,GAAG,IAAI,IAAA,8BAAc,GAAE,EAC5B,SAAS,EACT,SAAS,CACV,CAAA;YACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,MAAM;oBACV,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CACV;gBACE,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACpE,UAAU,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC5D,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,WAAW,EAAE,IAAI,CAAC,OAAO;aAC1B,EACD,gCAAgC,CACjC,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CodebuffConfig } from '../common/json-config/constants';
|
|
2
|
+
/**
|
|
3
|
+
* Loads and validates the configuration file from the project directory.
|
|
4
|
+
* @param projectPath - The root directory of the project
|
|
5
|
+
* @returns The parsed and validated configuration, or null if no valid config exists
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadCodebuffConfig(): CodebuffConfig | null;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadCodebuffConfig = loadCodebuffConfig;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const jsonc_parser_1 = require("jsonc-parser");
|
|
10
|
+
const picocolors_1 = require("picocolors");
|
|
11
|
+
const constants_1 = require("../common/json-config/constants");
|
|
12
|
+
const project_files_1 = require("../project-files");
|
|
13
|
+
/**
|
|
14
|
+
* Loads and validates the configuration file from the project directory.
|
|
15
|
+
* @param projectPath - The root directory of the project
|
|
16
|
+
* @returns The parsed and validated configuration, or null if no valid config exists
|
|
17
|
+
*/
|
|
18
|
+
function loadCodebuffConfig() {
|
|
19
|
+
const projectPath = (0, project_files_1.getProjectRoot)();
|
|
20
|
+
const configPathPrimary = path_1.default.join(projectPath, constants_1.codebuffConfigFile);
|
|
21
|
+
const configPathBackup = path_1.default.join(projectPath, constants_1.codebuffConfigFileBackup);
|
|
22
|
+
const configPath = (0, fs_1.existsSync)(configPathBackup)
|
|
23
|
+
? configPathBackup
|
|
24
|
+
: (0, fs_1.existsSync)(configPathPrimary)
|
|
25
|
+
? configPathPrimary
|
|
26
|
+
: null;
|
|
27
|
+
if (configPath === null) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const jsoncContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
32
|
+
const parsedConfig = (0, jsonc_parser_1.parse)(jsoncContent);
|
|
33
|
+
const result = constants_1.CodebuffConfigSchema.safeParse(parsedConfig);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Invalid ${constants_1.codebuffConfigFile} configuration. Please check the schema:\n` +
|
|
36
|
+
result.error.errors
|
|
37
|
+
.map((err) => `- ${err.path.join('.')}: ${err.message}`)
|
|
38
|
+
.join('\n')));
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return result.data;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof SyntaxError) {
|
|
45
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Invalid JSON in ${constants_1.codebuffConfigFile}. Please check the syntax.`));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Error reading ${constants_1.codebuffConfigFile} configuration file.`));
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/json-config/parser.ts"],"names":[],"mappings":";;;;;AAmBA,gDAiDC;AApED,2BAA6C;AAC7C,gDAAuB;AAEvB,+CAAkD;AAClD,2CAAmC;AAEnC,4DAKqC;AACrC,oDAAiD;AAEjD;;;;GAIG;AACH,SAAgB,kBAAkB;IAChC,MAAM,WAAW,GAAG,IAAA,8BAAc,GAAE,CAAA;IACpC,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAAkB,CAAC,CAAA;IACpE,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oCAAwB,CAAC,CAAA;IACzE,MAAM,UAAU,GAAG,IAAA,eAAU,EAAC,gBAAgB,CAAC;QAC7C,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,IAAA,eAAU,EAAC,iBAAiB,CAAC;YAC7B,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,IAAI,CAAA;IAEV,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACtD,MAAM,YAAY,GAAG,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,gCAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAE3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,oBAAoB,8BAAkB,4CAA4C;gBAChF,MAAM,CAAC,KAAK,CAAC,MAAM;qBAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;qBACvD,IAAI,CAAC,IAAI,CAAC,CAChB,CACF,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,4BAA4B,8BAAkB,4BAA4B,CAC3E,CACF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,0BAA0B,8BAAkB,sBAAsB,CACnE,CACF,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CodebuffConfig } from './common/json-config/constants';
|
|
2
|
+
/**
|
|
3
|
+
* Loads and validates the configuration file from the project directory.
|
|
4
|
+
* @param projectPath - The root directory of the project
|
|
5
|
+
* @returns The parsed and validated configuration, or null if no valid config exists
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadCodebuffConfig(): CodebuffConfig | null;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadCodebuffConfig = loadCodebuffConfig;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const jsonc_parser_1 = require("jsonc-parser");
|
|
10
|
+
const picocolors_1 = require("picocolors");
|
|
11
|
+
const constants_1 = require("./common/json-config/constants");
|
|
12
|
+
const project_files_1 = require("./project-files");
|
|
13
|
+
/**
|
|
14
|
+
* Loads and validates the configuration file from the project directory.
|
|
15
|
+
* @param projectPath - The root directory of the project
|
|
16
|
+
* @returns The parsed and validated configuration, or null if no valid config exists
|
|
17
|
+
*/
|
|
18
|
+
function loadCodebuffConfig() {
|
|
19
|
+
const projectPath = (0, project_files_1.getProjectRoot)();
|
|
20
|
+
const configPathPrimary = path_1.default.join(projectPath, constants_1.codebuffConfigFile);
|
|
21
|
+
const configPathBackup = path_1.default.join(projectPath, constants_1.codebuffConfigFileBackup);
|
|
22
|
+
const configPath = (0, fs_1.existsSync)(configPathBackup)
|
|
23
|
+
? configPathBackup
|
|
24
|
+
: (0, fs_1.existsSync)(configPathPrimary)
|
|
25
|
+
? configPathPrimary
|
|
26
|
+
: null;
|
|
27
|
+
if (configPath === null) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const jsoncContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
32
|
+
const parsedConfig = (0, jsonc_parser_1.parse)(jsoncContent);
|
|
33
|
+
const result = constants_1.CodebuffConfigSchema.safeParse(parsedConfig);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Invalid ${constants_1.codebuffConfigFile} configuration. Please check the schema:\n` +
|
|
36
|
+
result.error.errors
|
|
37
|
+
.map((err) => `- ${err.path.join('.')}: ${err.message}`)
|
|
38
|
+
.join('\n')));
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return result.data;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof SyntaxError) {
|
|
45
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Invalid JSON in ${constants_1.codebuffConfigFile}. Please check the syntax.`));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.warn((0, picocolors_1.yellow)(`Warning: Error reading ${constants_1.codebuffConfigFile} configuration file.`));
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=json-config-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-config-parser.js","sourceRoot":"","sources":["../src/json-config-parser.ts"],"names":[],"mappings":";;;;;AAmBA,gDAiDC;AApED,2BAA6C;AAC7C,gDAAuB;AAEvB,+CAAkD;AAClD,2CAAmC;AAEnC,4DAKqC;AACrC,mDAAgD;AAEhD;;;;GAIG;AACH,SAAgB,kBAAkB;IAChC,MAAM,WAAW,GAAG,IAAA,8BAAc,GAAE,CAAA;IACpC,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAAkB,CAAC,CAAA;IACpE,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oCAAwB,CAAC,CAAA;IACzE,MAAM,UAAU,GAAG,IAAA,eAAU,EAAC,gBAAgB,CAAC;QAC7C,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,IAAA,eAAU,EAAC,iBAAiB,CAAC;YAC7B,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,IAAI,CAAA;IAEV,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACtD,MAAM,YAAY,GAAG,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,gCAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAE3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,oBAAoB,8BAAkB,4CAA4C;gBAChF,MAAM,CAAC,KAAK,CAAC,MAAM;qBAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;qBACvD,IAAI,CAAC,IAAI,CAAC,CAChB,CACF,CAAA;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,4BAA4B,8BAAkB,4BAA4B,CAC3E,CACF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,IAAA,mBAAM,EACJ,0BAA0B,8BAAkB,sBAAsB,CACnE,CACF,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
package/dist/menu.js
CHANGED
|
@@ -35,6 +35,7 @@ const fs = __importStar(require("fs"));
|
|
|
35
35
|
const os_1 = __importDefault(require("os"));
|
|
36
36
|
const path_1 = __importDefault(require("path"));
|
|
37
37
|
const picocolors_1 = require("picocolors");
|
|
38
|
+
const constants_1 = require("./common/json-config/constants");
|
|
38
39
|
const project_files_1 = require("./project-files");
|
|
39
40
|
exports.interactiveCommandDetails = [
|
|
40
41
|
{
|
|
@@ -44,18 +45,18 @@ exports.interactiveCommandDetails = [
|
|
|
44
45
|
commandText: '', // Empty commandText ensures it's not shown in the main interactive list
|
|
45
46
|
aliases: ['h'], // Optional: if you want /h to also work for tab completion
|
|
46
47
|
},
|
|
47
|
-
{
|
|
48
|
-
commandText: '"login"',
|
|
49
|
-
baseCommand: 'login',
|
|
50
|
-
description: 'Authenticate your session',
|
|
51
|
-
isSlashCommand: false,
|
|
52
|
-
},
|
|
53
48
|
{
|
|
54
49
|
commandText: '"init"',
|
|
55
50
|
baseCommand: 'init',
|
|
56
51
|
description: 'Configure project for better results',
|
|
57
52
|
isSlashCommand: true,
|
|
58
53
|
},
|
|
54
|
+
{
|
|
55
|
+
commandText: '"login"',
|
|
56
|
+
baseCommand: 'login',
|
|
57
|
+
description: 'Authenticate your session',
|
|
58
|
+
isSlashCommand: false,
|
|
59
|
+
},
|
|
59
60
|
{
|
|
60
61
|
commandText: '"diff" or "d"',
|
|
61
62
|
baseCommand: 'diff',
|
|
@@ -90,9 +91,21 @@ exports.interactiveCommandDetails = [
|
|
|
90
91
|
{
|
|
91
92
|
commandText: '"reset"',
|
|
92
93
|
baseCommand: 'reset',
|
|
93
|
-
description: 'Reset the conversation
|
|
94
|
+
description: 'Reset the conversation history, as if you just started a new Codebuff session',
|
|
94
95
|
isSlashCommand: true,
|
|
95
96
|
},
|
|
97
|
+
{
|
|
98
|
+
baseCommand: 'compact',
|
|
99
|
+
description: 'Replace the conversation history with a summary and free up context',
|
|
100
|
+
isSlashCommand: true,
|
|
101
|
+
commandText: '"compact"',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
baseCommand: 'export',
|
|
105
|
+
description: 'Export conversation summary to file',
|
|
106
|
+
isSlashCommand: true,
|
|
107
|
+
commandText: '"export"',
|
|
108
|
+
},
|
|
96
109
|
{
|
|
97
110
|
commandText: 'ESC key or Ctrl-C',
|
|
98
111
|
description: 'Cancel generation',
|
|
@@ -122,6 +135,12 @@ exports.interactiveCommandDetails = [
|
|
|
122
135
|
isSlashCommand: false,
|
|
123
136
|
commandText: '',
|
|
124
137
|
},
|
|
138
|
+
{
|
|
139
|
+
baseCommand: 'ask',
|
|
140
|
+
description: "Switch to ask mode (won't modify code)",
|
|
141
|
+
isSlashCommand: true,
|
|
142
|
+
commandText: '',
|
|
143
|
+
},
|
|
125
144
|
{
|
|
126
145
|
baseCommand: 'lite',
|
|
127
146
|
description: 'Switch to lite mode (faster, cheaper)',
|
|
@@ -146,24 +165,6 @@ exports.interactiveCommandDetails = [
|
|
|
146
165
|
isSlashCommand: false,
|
|
147
166
|
commandText: '',
|
|
148
167
|
},
|
|
149
|
-
{
|
|
150
|
-
baseCommand: 'ask',
|
|
151
|
-
description: "Switch to ask mode (won't modify code)",
|
|
152
|
-
isSlashCommand: true,
|
|
153
|
-
commandText: '',
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
baseCommand: 'compact',
|
|
157
|
-
description: 'Summarize conversation so far, for greater efficiency',
|
|
158
|
-
isSlashCommand: true,
|
|
159
|
-
commandText: '"compact"',
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
baseCommand: 'export',
|
|
163
|
-
description: 'Export conversation summary to file',
|
|
164
|
-
isSlashCommand: true,
|
|
165
|
-
commandText: '"export"',
|
|
166
|
-
},
|
|
167
168
|
{
|
|
168
169
|
commandText: '"exit" or Ctrl-C x2',
|
|
169
170
|
baseCommand: 'exit',
|
|
@@ -172,9 +173,7 @@ exports.interactiveCommandDetails = [
|
|
|
172
173
|
},
|
|
173
174
|
];
|
|
174
175
|
function getSlashCommands() {
|
|
175
|
-
return exports.interactiveCommandDetails
|
|
176
|
-
.filter((cmd) => cmd.isSlashCommand && cmd.baseCommand)
|
|
177
|
-
.sort((a, b) => a.baseCommand.localeCompare(b.baseCommand));
|
|
176
|
+
return exports.interactiveCommandDetails.filter((cmd) => cmd.isSlashCommand && cmd.baseCommand);
|
|
178
177
|
}
|
|
179
178
|
function displaySlashCommandHelperMenu() {
|
|
180
179
|
const commands = getSlashCommands();
|
|
@@ -268,42 +267,42 @@ ${colorizeRandom(' ╚═════╝')}${colorizeRandom(' ╚═════
|
|
|
268
267
|
const hasGitRepo = fs.existsSync(path_1.default.join((0, project_files_1.getProjectRoot)(), '.git'));
|
|
269
268
|
const hasGitIgnore = fs.existsSync(path_1.default.join((0, project_files_1.getProjectRoot)(), '.gitignore'));
|
|
270
269
|
const hasKnowledgeMd = fs.existsSync(path_1.default.join((0, project_files_1.getProjectRoot)(), 'knowledge.md'));
|
|
271
|
-
const hasCodebuffJson = fs.existsSync(path_1.default.join((0, project_files_1.getProjectRoot)(),
|
|
270
|
+
const hasCodebuffJson = fs.existsSync(path_1.default.join((0, project_files_1.getProjectRoot)(), constants_1.codebuffConfigFile));
|
|
272
271
|
const gitignoreNote = ' (Codebuff never reads files in your .gitignore/.codebuffignore)';
|
|
273
272
|
// Condition 1: Git repo found, all files present
|
|
274
273
|
if (hasGitRepo && hasGitIgnore && hasKnowledgeMd && hasCodebuffJson) {
|
|
275
274
|
return `${currentDirectoryLine}\n${(0, picocolors_1.green)('✅ Git repo: detected')}
|
|
276
275
|
${(0, picocolors_1.green)('✅ .gitignore: detected')}${gitignoreNote}
|
|
277
276
|
${(0, picocolors_1.green)('✅ knowledge.md: detected')}
|
|
278
|
-
${(0, picocolors_1.green)(
|
|
277
|
+
${(0, picocolors_1.green)(`✅ ${constants_1.codebuffConfigFile}: detected`)}`;
|
|
279
278
|
}
|
|
280
279
|
// Condition 2: Git repo not found
|
|
281
280
|
if (!hasGitRepo) {
|
|
282
281
|
return `${currentDirectoryLine}\n${(0, picocolors_1.yellow)('❌ Git repo: not found')}${' - navigate to a working directory!'}
|
|
283
282
|
${hasGitIgnore ? (0, picocolors_1.green)('✅ .gitignore: detected') : (0, picocolors_1.yellow)('❌ .gitignore: missing')}${gitignoreNote}
|
|
284
283
|
${hasKnowledgeMd ? (0, picocolors_1.green)('✅ knowledge.md: detected') : (0, picocolors_1.yellow)('❌ knowledge.md: missing')}${' — run "init" to fix'}
|
|
285
|
-
${hasCodebuffJson ? (0, picocolors_1.green)(
|
|
284
|
+
${hasCodebuffJson ? (0, picocolors_1.green)(`✅ ${constants_1.codebuffConfigFile}: detected`) : (0, picocolors_1.yellow)(`❌ ${constants_1.codebuffConfigFile}: missing`)}${' — run "init" to fix'}`;
|
|
286
285
|
}
|
|
287
286
|
// Condition 3: Missing .gitignore
|
|
288
287
|
if (!hasGitIgnore) {
|
|
289
288
|
return `${currentDirectoryLine}\n${(0, picocolors_1.green)('✅ Git repo: detected')}
|
|
290
289
|
${(0, picocolors_1.yellow)('❌ .gitignore: missing - type "generate a reasonable .gitignore"')}${gitignoreNote}
|
|
291
290
|
${hasKnowledgeMd ? (0, picocolors_1.green)('✅ knowledge.md: detected') : (0, picocolors_1.yellow)('❌ knowledge.md: missing')}
|
|
292
|
-
${hasCodebuffJson ? (0, picocolors_1.green)(
|
|
291
|
+
${hasCodebuffJson ? (0, picocolors_1.green)(`✅ ${constants_1.codebuffConfigFile}: detected`) : (0, picocolors_1.yellow)(`❌ ${constants_1.codebuffConfigFile}: missing`)}`;
|
|
293
292
|
}
|
|
294
293
|
// Condition 4: Missing knowledge files
|
|
295
294
|
return `${currentDirectoryLine}\n${(0, picocolors_1.green)('✅ Git repo: detected')}
|
|
296
295
|
${(0, picocolors_1.green)('✅ .gitignore: detected')}${gitignoreNote}
|
|
297
296
|
${!hasKnowledgeMd && !hasCodebuffJson
|
|
298
|
-
? (0, picocolors_1.yellow)(
|
|
297
|
+
? (0, picocolors_1.yellow)(`❌ knowledge.md & ${constants_1.codebuffConfigFile}: missing - type "init"`)
|
|
299
298
|
: !hasKnowledgeMd
|
|
300
299
|
? (0, picocolors_1.yellow)('❌ knowledge.md: missing - type "init"')
|
|
301
300
|
: !hasCodebuffJson
|
|
302
|
-
? (0, picocolors_1.yellow)(
|
|
303
|
-
: (0, picocolors_1.green)(
|
|
304
|
-
${hasKnowledgeMd && !hasCodebuffJson ? `\n${(0, picocolors_1.yellow)(
|
|
301
|
+
? (0, picocolors_1.yellow)(`❌ ${constants_1.codebuffConfigFile}: missing - type "init"`)
|
|
302
|
+
: (0, picocolors_1.green)(`✅ knowledge.md & ${constants_1.codebuffConfigFile}: detected`)}
|
|
303
|
+
${hasKnowledgeMd && !hasCodebuffJson ? `\n${(0, picocolors_1.yellow)(`${constants_1.codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}
|
|
305
304
|
${!hasKnowledgeMd && hasCodebuffJson ? `\n${(0, picocolors_1.yellow)('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}` : ''}
|
|
306
|
-
${!hasKnowledgeMd && !hasCodebuffJson ? `\n${(0, picocolors_1.yellow)('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\n${(0, picocolors_1.yellow)(
|
|
305
|
+
${!hasKnowledgeMd && !hasCodebuffJson ? `\n${(0, picocolors_1.yellow)('knowledge.md helps Codebuff understand your project structure and codebase better for better results.')}\n${(0, picocolors_1.yellow)(`${constants_1.codebuffConfigFile} runs deployment scripts for you to test your code and runs configured checks for you by running your dev server.`)}` : ''}`;
|
|
307
306
|
})());
|
|
308
307
|
// COMMUNITY & FEEDBACK SECTION
|
|
309
308
|
console.log(`\n${(0, picocolors_1.bold)((0, picocolors_1.underline)('COMMUNITY & FEEDBACK'))}`);
|