fusion-agent 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +467 -0
- package/REQUIREMENTS.md +158 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +500 -0
- package/dist/cli.js.map +1 -0
- package/dist/cluster-monitor/cluster-monitor.d.ts +49 -0
- package/dist/cluster-monitor/cluster-monitor.d.ts.map +1 -0
- package/dist/cluster-monitor/cluster-monitor.js +374 -0
- package/dist/cluster-monitor/cluster-monitor.js.map +1 -0
- package/dist/cluster-monitor/index.d.ts +9 -0
- package/dist/cluster-monitor/index.d.ts.map +1 -0
- package/dist/cluster-monitor/index.js +19 -0
- package/dist/cluster-monitor/index.js.map +1 -0
- package/dist/cluster-monitor/kubernetes-connector.d.ts +21 -0
- package/dist/cluster-monitor/kubernetes-connector.d.ts.map +1 -0
- package/dist/cluster-monitor/kubernetes-connector.js +109 -0
- package/dist/cluster-monitor/kubernetes-connector.js.map +1 -0
- package/dist/cluster-monitor/notifications.d.ts +26 -0
- package/dist/cluster-monitor/notifications.d.ts.map +1 -0
- package/dist/cluster-monitor/notifications.js +182 -0
- package/dist/cluster-monitor/notifications.js.map +1 -0
- package/dist/cluster-monitor/remediation.d.ts +33 -0
- package/dist/cluster-monitor/remediation.d.ts.map +1 -0
- package/dist/cluster-monitor/remediation.js +134 -0
- package/dist/cluster-monitor/remediation.js.map +1 -0
- package/dist/cluster-monitor/rules.d.ts +26 -0
- package/dist/cluster-monitor/rules.d.ts.map +1 -0
- package/dist/cluster-monitor/rules.js +133 -0
- package/dist/cluster-monitor/rules.js.map +1 -0
- package/dist/cluster-monitor/types.d.ts +184 -0
- package/dist/cluster-monitor/types.d.ts.map +1 -0
- package/dist/cluster-monitor/types.js +3 -0
- package/dist/cluster-monitor/types.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/live-debugger/index.d.ts +32 -0
- package/dist/live-debugger/index.d.ts.map +1 -0
- package/dist/live-debugger/index.js +119 -0
- package/dist/live-debugger/index.js.map +1 -0
- package/dist/live-debugger/log-watcher.d.ts +19 -0
- package/dist/live-debugger/log-watcher.d.ts.map +1 -0
- package/dist/live-debugger/log-watcher.js +77 -0
- package/dist/live-debugger/log-watcher.js.map +1 -0
- package/dist/live-debugger/service-connector.d.ts +33 -0
- package/dist/live-debugger/service-connector.d.ts.map +1 -0
- package/dist/live-debugger/service-connector.js +123 -0
- package/dist/live-debugger/service-connector.js.map +1 -0
- package/dist/providers/anthropic.d.ts +9 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +71 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +29 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +14 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +11 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +73 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +38 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +9 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +59 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/session/guardrails.d.ts +20 -0
- package/dist/session/guardrails.d.ts.map +1 -0
- package/dist/session/guardrails.js +83 -0
- package/dist/session/guardrails.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +12 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session-manager.d.ts +15 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +89 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session.d.ts +63 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +123 -0
- package/dist/session/session.js.map +1 -0
- package/dist/speckits/base.d.ts +9 -0
- package/dist/speckits/base.d.ts.map +1 -0
- package/dist/speckits/base.js +3 -0
- package/dist/speckits/base.js.map +1 -0
- package/dist/speckits/cluster-debugger.d.ts +3 -0
- package/dist/speckits/cluster-debugger.d.ts.map +1 -0
- package/dist/speckits/cluster-debugger.js +48 -0
- package/dist/speckits/cluster-debugger.js.map +1 -0
- package/dist/speckits/code-review.d.ts +3 -0
- package/dist/speckits/code-review.d.ts.map +1 -0
- package/dist/speckits/code-review.js +41 -0
- package/dist/speckits/code-review.js.map +1 -0
- package/dist/speckits/debugger.d.ts +3 -0
- package/dist/speckits/debugger.d.ts.map +1 -0
- package/dist/speckits/debugger.js +38 -0
- package/dist/speckits/debugger.js.map +1 -0
- package/dist/speckits/index.d.ts +11 -0
- package/dist/speckits/index.d.ts.map +1 -0
- package/dist/speckits/index.js +40 -0
- package/dist/speckits/index.js.map +1 -0
- package/dist/speckits/more-speckits.d.ts +6 -0
- package/dist/speckits/more-speckits.d.ts.map +1 -0
- package/dist/speckits/more-speckits.js +136 -0
- package/dist/speckits/more-speckits.js.map +1 -0
- package/dist/speckits/vibe-coder.d.ts +3 -0
- package/dist/speckits/vibe-coder.d.ts.map +1 -0
- package/dist/speckits/vibe-coder.js +32 -0
- package/dist/speckits/vibe-coder.js.map +1 -0
- package/dist/utils/config.d.ts +18 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +107 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-ops.d.ts +15 -0
- package/dist/utils/file-ops.d.ts.map +1 -0
- package/dist/utils/file-ops.js +109 -0
- package/dist/utils/file-ops.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web/public/css/app.css +370 -0
- package/dist/web/public/index.html +91 -0
- package/dist/web/public/js/app.js +212 -0
- package/dist/web/routes/sessions.d.ts +4 -0
- package/dist/web/routes/sessions.d.ts.map +1 -0
- package/dist/web/routes/sessions.js +51 -0
- package/dist/web/routes/sessions.js.map +1 -0
- package/dist/web/routes/settings.d.ts +3 -0
- package/dist/web/routes/settings.d.ts.map +1 -0
- package/dist/web/routes/settings.js +33 -0
- package/dist/web/routes/settings.js.map +1 -0
- package/dist/web/server.d.ts +16 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +76 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,83 @@
|
|
|
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.guardrailsToSystemPrompt = guardrailsToSystemPrompt;
|
|
7
|
+
exports.checkFilePathGuardrails = checkFilePathGuardrails;
|
|
8
|
+
exports.createGuardrail = createGuardrail;
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
/**
|
|
11
|
+
* Converts guardrails into a system prompt suffix that instructs the AI.
|
|
12
|
+
*/
|
|
13
|
+
function guardrailsToSystemPrompt(guardrails) {
|
|
14
|
+
if (!guardrails.length)
|
|
15
|
+
return '';
|
|
16
|
+
const lines = [
|
|
17
|
+
'',
|
|
18
|
+
'## RULES AND GUARDRAILS (MUST FOLLOW)',
|
|
19
|
+
'You MUST strictly adhere to the following rules in every response:',
|
|
20
|
+
];
|
|
21
|
+
for (const g of guardrails) {
|
|
22
|
+
switch (g.type) {
|
|
23
|
+
case 'allow-paths':
|
|
24
|
+
lines.push(`- You may ONLY read or modify files within these paths: ${[g.value].flat().join(', ')}`);
|
|
25
|
+
break;
|
|
26
|
+
case 'deny-paths':
|
|
27
|
+
lines.push(`- You MUST NOT read or modify files within these paths: ${[g.value].flat().join(', ')}`);
|
|
28
|
+
break;
|
|
29
|
+
case 'deny-operations':
|
|
30
|
+
lines.push(`- You MUST NOT perform these operations: ${[g.value].flat().join(', ')}`);
|
|
31
|
+
break;
|
|
32
|
+
case 'max-tokens':
|
|
33
|
+
lines.push(`- Limit your responses to at most ${g.value} tokens.`);
|
|
34
|
+
break;
|
|
35
|
+
case 'style':
|
|
36
|
+
lines.push(`- Follow this coding style: ${g.value}`);
|
|
37
|
+
break;
|
|
38
|
+
case 'custom':
|
|
39
|
+
lines.push(`- ${g.value}`);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
lines.push('Violating any of the above rules is STRICTLY PROHIBITED.');
|
|
44
|
+
return lines.join('\n');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validates a proposed file path against guardrails.
|
|
48
|
+
*/
|
|
49
|
+
function checkFilePathGuardrails(filePath, guardrails) {
|
|
50
|
+
const absPath = path_1.default.resolve(filePath);
|
|
51
|
+
for (const g of guardrails) {
|
|
52
|
+
if (g.type === 'allow-paths') {
|
|
53
|
+
const allowed = [g.value].flat().map((p) => path_1.default.resolve(p));
|
|
54
|
+
const isAllowed = allowed.some((a) => absPath.startsWith(a));
|
|
55
|
+
if (!isAllowed) {
|
|
56
|
+
return {
|
|
57
|
+
guardrail: g,
|
|
58
|
+
message: `File path "${filePath}" is not within allowed paths: ${allowed.join(', ')}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (g.type === 'deny-paths') {
|
|
63
|
+
const denied = [g.value].flat().map((p) => path_1.default.resolve(p));
|
|
64
|
+
const isDenied = denied.some((d) => absPath.startsWith(d));
|
|
65
|
+
if (isDenied) {
|
|
66
|
+
return {
|
|
67
|
+
guardrail: g,
|
|
68
|
+
message: `File path "${filePath}" is within denied paths: ${denied.join(', ')}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function createGuardrail(type, value, description) {
|
|
76
|
+
return {
|
|
77
|
+
id: `gr-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
|
|
78
|
+
type,
|
|
79
|
+
value,
|
|
80
|
+
description,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/session/guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Session } from './session';
|
|
2
|
+
export { SessionManager } from './session-manager';
|
|
3
|
+
export { Guardrail, createGuardrail, guardrailsToSystemPrompt, checkFilePathGuardrails } from './guardrails';
|
|
4
|
+
export type { SessionConfig, SessionData, SessionTurn } from './session';
|
|
5
|
+
export type { GuardrailViolation } from './guardrails';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC7G,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkFilePathGuardrails = exports.guardrailsToSystemPrompt = exports.createGuardrail = exports.SessionManager = exports.Session = void 0;
|
|
4
|
+
var session_1 = require("./session");
|
|
5
|
+
Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
|
|
6
|
+
var session_manager_1 = require("./session-manager");
|
|
7
|
+
Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_manager_1.SessionManager; } });
|
|
8
|
+
var guardrails_1 = require("./guardrails");
|
|
9
|
+
Object.defineProperty(exports, "createGuardrail", { enumerable: true, get: function () { return guardrails_1.createGuardrail; } });
|
|
10
|
+
Object.defineProperty(exports, "guardrailsToSystemPrompt", { enumerable: true, get: function () { return guardrails_1.guardrailsToSystemPrompt; } });
|
|
11
|
+
Object.defineProperty(exports, "checkFilePathGuardrails", { enumerable: true, get: function () { return guardrails_1.checkFilePathGuardrails; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,2CAA6G;AAAzF,6GAAA,eAAe,OAAA;AAAE,sHAAA,wBAAwB,OAAA;AAAE,qHAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Session, SessionConfig, SessionData } from './session';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private sessionsDir;
|
|
4
|
+
private sessions;
|
|
5
|
+
constructor(sessionsDir: string);
|
|
6
|
+
createSession(config: SessionConfig, apiKey?: string): Session;
|
|
7
|
+
loadSession(sessionId: string, apiKey?: string): Session;
|
|
8
|
+
persistSession(session: Session): void;
|
|
9
|
+
listSessions(): SessionData[];
|
|
10
|
+
deleteSession(sessionId: string): void;
|
|
11
|
+
getSession(sessionId: string): Session | undefined;
|
|
12
|
+
exportSession(sessionId: string): string;
|
|
13
|
+
private getSessionPath;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIhE,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAmC;gBAEvC,WAAW,EAAE,MAAM;IAO/B,aAAa,CACX,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO;IAaV,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAsBxD,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKtC,YAAY,IAAI,WAAW,EAAE;IAkB7B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIlD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAKxC,OAAO,CAAC,cAAc;CAGvB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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.SessionManager = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const session_1 = require("./session");
|
|
10
|
+
const providers_1 = require("../providers");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
class SessionManager {
|
|
13
|
+
constructor(sessionsDir) {
|
|
14
|
+
this.sessions = new Map();
|
|
15
|
+
this.sessionsDir = sessionsDir;
|
|
16
|
+
if (!fs_1.default.existsSync(sessionsDir)) {
|
|
17
|
+
fs_1.default.mkdirSync(sessionsDir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
createSession(config, apiKey) {
|
|
21
|
+
const provider = (0, providers_1.createProvider)({
|
|
22
|
+
provider: config.provider,
|
|
23
|
+
model: config.model,
|
|
24
|
+
apiKey,
|
|
25
|
+
});
|
|
26
|
+
const session = new session_1.Session(provider, config);
|
|
27
|
+
this.sessions.set(session.id, session);
|
|
28
|
+
this.persistSession(session);
|
|
29
|
+
logger_1.logger.info(`Created session: ${session.name} (${session.id})`);
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
loadSession(sessionId, apiKey) {
|
|
33
|
+
// Check in-memory first
|
|
34
|
+
if (this.sessions.has(sessionId)) {
|
|
35
|
+
return this.sessions.get(sessionId);
|
|
36
|
+
}
|
|
37
|
+
const filePath = this.getSessionPath(sessionId);
|
|
38
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
39
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
40
|
+
}
|
|
41
|
+
const data = JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
|
|
42
|
+
const provider = (0, providers_1.createProvider)({
|
|
43
|
+
provider: data.config.provider,
|
|
44
|
+
model: data.config.model,
|
|
45
|
+
apiKey,
|
|
46
|
+
});
|
|
47
|
+
const session = new session_1.Session(provider, data.config, data);
|
|
48
|
+
this.sessions.set(session.id, session);
|
|
49
|
+
return session;
|
|
50
|
+
}
|
|
51
|
+
persistSession(session) {
|
|
52
|
+
const filePath = this.getSessionPath(session.id);
|
|
53
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify(session.toJSON(), null, 2), 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
listSessions() {
|
|
56
|
+
const files = fs_1.default.readdirSync(this.sessionsDir).filter((f) => f.endsWith('.json'));
|
|
57
|
+
const sessions = [];
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
try {
|
|
60
|
+
const data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.sessionsDir, file), 'utf-8'));
|
|
61
|
+
sessions.push(data);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
logger_1.logger.warn(`Could not read session file: ${file}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
68
|
+
}
|
|
69
|
+
deleteSession(sessionId) {
|
|
70
|
+
const filePath = this.getSessionPath(sessionId);
|
|
71
|
+
if (fs_1.default.existsSync(filePath)) {
|
|
72
|
+
fs_1.default.unlinkSync(filePath);
|
|
73
|
+
}
|
|
74
|
+
this.sessions.delete(sessionId);
|
|
75
|
+
logger_1.logger.info(`Deleted session: ${sessionId}`);
|
|
76
|
+
}
|
|
77
|
+
getSession(sessionId) {
|
|
78
|
+
return this.sessions.get(sessionId);
|
|
79
|
+
}
|
|
80
|
+
exportSession(sessionId) {
|
|
81
|
+
const session = this.loadSession(sessionId);
|
|
82
|
+
return JSON.stringify(session.toJSON(), null, 2);
|
|
83
|
+
}
|
|
84
|
+
getSessionPath(sessionId) {
|
|
85
|
+
return path_1.default.join(this.sessionsDir, `${sessionId}.json`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.SessionManager = SessionManager;
|
|
89
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BaseProvider, Message, CompletionResult } from '../providers/base';
|
|
2
|
+
import { Guardrail } from './guardrails';
|
|
3
|
+
import { FileChange } from '../utils/file-ops';
|
|
4
|
+
export interface SessionConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
provider: string;
|
|
7
|
+
model: string;
|
|
8
|
+
speckit?: string;
|
|
9
|
+
guardrails?: Guardrail[];
|
|
10
|
+
projectDir?: string;
|
|
11
|
+
systemPrompt?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SessionTurn {
|
|
14
|
+
id: string;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
userMessage: string;
|
|
17
|
+
assistantMessage: string;
|
|
18
|
+
fileChanges?: FileChange[];
|
|
19
|
+
usage?: CompletionResult['usage'];
|
|
20
|
+
}
|
|
21
|
+
export interface SessionData {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
config: SessionConfig;
|
|
27
|
+
turns: SessionTurn[];
|
|
28
|
+
status: 'active' | 'paused' | 'completed';
|
|
29
|
+
}
|
|
30
|
+
export declare class Session {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly name: string;
|
|
33
|
+
config: SessionConfig;
|
|
34
|
+
private turns;
|
|
35
|
+
private conversationHistory;
|
|
36
|
+
private provider;
|
|
37
|
+
status: 'active' | 'paused' | 'completed';
|
|
38
|
+
readonly createdAt: Date;
|
|
39
|
+
updatedAt: Date;
|
|
40
|
+
constructor(provider: BaseProvider, config: SessionConfig, existingData?: SessionData);
|
|
41
|
+
private buildSystemPrompt;
|
|
42
|
+
chat(userMessage: string, options?: {
|
|
43
|
+
stream?: boolean;
|
|
44
|
+
onChunk?: (chunk: string) => void;
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
temperature?: number;
|
|
47
|
+
}): Promise<SessionTurn>;
|
|
48
|
+
/**
|
|
49
|
+
* Apply file changes suggested by a turn, checking guardrails first.
|
|
50
|
+
*/
|
|
51
|
+
applyFileChange(filePath: string, newContent: string): FileChange;
|
|
52
|
+
/**
|
|
53
|
+
* Revert all file changes in a specific turn.
|
|
54
|
+
*/
|
|
55
|
+
revertTurnChanges(turnId: string): void;
|
|
56
|
+
getTurns(): SessionTurn[];
|
|
57
|
+
getHistory(): Message[];
|
|
58
|
+
pause(): void;
|
|
59
|
+
resume(): void;
|
|
60
|
+
complete(): void;
|
|
61
|
+
toJSON(): SessionData;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAqD,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,UAAU,EAA2C,MAAM,mBAAmB,CAAC;AAGxF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;CAC3C;AAED,qBAAa,OAAO;IAClB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,mBAAmB,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAe;IACxB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAY;IAC5D,SAAgB,SAAS,EAAE,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;gBAEX,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,WAAW;IAmBrF,OAAO,CAAC,iBAAiB;IAOnB,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAClC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GACL,OAAO,CAAC,WAAW,CAAC;IAsCvB;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU;IAgBjE;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvC,QAAQ,IAAI,WAAW,EAAE;IAIzB,UAAU,IAAI,OAAO,EAAE;IAIvB,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,MAAM,IAAI,WAAW;CAWtB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Session = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
const guardrails_1 = require("./guardrails");
|
|
6
|
+
const file_ops_1 = require("../utils/file-ops");
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
8
|
+
class Session {
|
|
9
|
+
constructor(provider, config, existingData) {
|
|
10
|
+
this.turns = [];
|
|
11
|
+
this.conversationHistory = [];
|
|
12
|
+
this.status = 'active';
|
|
13
|
+
this.provider = provider;
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.createdAt = existingData ? new Date(existingData.createdAt) : new Date();
|
|
16
|
+
this.updatedAt = existingData ? new Date(existingData.updatedAt) : new Date();
|
|
17
|
+
this.id = existingData?.id || (0, uuid_1.v4)();
|
|
18
|
+
this.name = existingData?.name || config.name;
|
|
19
|
+
if (existingData) {
|
|
20
|
+
this.turns = existingData.turns;
|
|
21
|
+
this.status = existingData.status;
|
|
22
|
+
// Rebuild conversation history
|
|
23
|
+
for (const turn of this.turns) {
|
|
24
|
+
this.conversationHistory.push({ role: 'user', content: turn.userMessage });
|
|
25
|
+
this.conversationHistory.push({ role: 'assistant', content: turn.assistantMessage });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
buildSystemPrompt() {
|
|
30
|
+
let systemPrompt = this.config.systemPrompt || 'You are a helpful AI coding assistant.';
|
|
31
|
+
const guardrailSuffix = (0, guardrails_1.guardrailsToSystemPrompt)(this.config.guardrails || []);
|
|
32
|
+
if (guardrailSuffix)
|
|
33
|
+
systemPrompt += guardrailSuffix;
|
|
34
|
+
return systemPrompt;
|
|
35
|
+
}
|
|
36
|
+
async chat(userMessage, options = {}) {
|
|
37
|
+
if (this.status !== 'active') {
|
|
38
|
+
throw new Error(`Session "${this.name}" is not active (status: ${this.status})`);
|
|
39
|
+
}
|
|
40
|
+
this.conversationHistory.push({ role: 'user', content: userMessage });
|
|
41
|
+
const messages = [
|
|
42
|
+
{ role: 'system', content: this.buildSystemPrompt() },
|
|
43
|
+
...this.conversationHistory,
|
|
44
|
+
];
|
|
45
|
+
logger_1.logger.debug(`Session ${this.id}: Sending message to ${this.config.provider}`);
|
|
46
|
+
const result = await this.provider.complete({
|
|
47
|
+
messages,
|
|
48
|
+
stream: options.stream ?? false,
|
|
49
|
+
onChunk: options.onChunk,
|
|
50
|
+
maxTokens: options.maxTokens,
|
|
51
|
+
temperature: options.temperature,
|
|
52
|
+
});
|
|
53
|
+
this.conversationHistory.push({ role: 'assistant', content: result.content });
|
|
54
|
+
const turn = {
|
|
55
|
+
id: (0, uuid_1.v4)(),
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
userMessage,
|
|
58
|
+
assistantMessage: result.content,
|
|
59
|
+
usage: result.usage,
|
|
60
|
+
};
|
|
61
|
+
this.turns.push(turn);
|
|
62
|
+
this.updatedAt = new Date();
|
|
63
|
+
return turn;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Apply file changes suggested by a turn, checking guardrails first.
|
|
67
|
+
*/
|
|
68
|
+
applyFileChange(filePath, newContent) {
|
|
69
|
+
const violation = (0, guardrails_1.checkFilePathGuardrails)(filePath, this.config.guardrails || []);
|
|
70
|
+
if (violation) {
|
|
71
|
+
throw new Error(`Guardrail violation: ${violation.message}`);
|
|
72
|
+
}
|
|
73
|
+
const change = (0, file_ops_1.createChange)(filePath, newContent);
|
|
74
|
+
(0, file_ops_1.applyChange)(change);
|
|
75
|
+
// Attach to last turn
|
|
76
|
+
const lastTurn = this.turns[this.turns.length - 1];
|
|
77
|
+
if (lastTurn) {
|
|
78
|
+
if (!lastTurn.fileChanges)
|
|
79
|
+
lastTurn.fileChanges = [];
|
|
80
|
+
lastTurn.fileChanges.push(change);
|
|
81
|
+
}
|
|
82
|
+
return change;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Revert all file changes in a specific turn.
|
|
86
|
+
*/
|
|
87
|
+
revertTurnChanges(turnId) {
|
|
88
|
+
const turn = this.turns.find((t) => t.id === turnId);
|
|
89
|
+
if (!turn)
|
|
90
|
+
throw new Error(`Turn ${turnId} not found`);
|
|
91
|
+
for (const change of turn.fileChanges || []) {
|
|
92
|
+
(0, file_ops_1.revertChange)(change);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
getTurns() {
|
|
96
|
+
return this.turns;
|
|
97
|
+
}
|
|
98
|
+
getHistory() {
|
|
99
|
+
return this.conversationHistory;
|
|
100
|
+
}
|
|
101
|
+
pause() {
|
|
102
|
+
this.status = 'paused';
|
|
103
|
+
}
|
|
104
|
+
resume() {
|
|
105
|
+
this.status = 'active';
|
|
106
|
+
}
|
|
107
|
+
complete() {
|
|
108
|
+
this.status = 'completed';
|
|
109
|
+
}
|
|
110
|
+
toJSON() {
|
|
111
|
+
return {
|
|
112
|
+
id: this.id,
|
|
113
|
+
name: this.name,
|
|
114
|
+
createdAt: this.createdAt.toISOString(),
|
|
115
|
+
updatedAt: this.updatedAt.toISOString(),
|
|
116
|
+
config: this.config,
|
|
117
|
+
turns: this.turns,
|
|
118
|
+
status: this.status,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.Session = Session;
|
|
123
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/speckits/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/speckits/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-debugger.d.ts","sourceRoot":"","sources":["../../src/speckits/cluster-debugger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,eAAO,MAAM,eAAe,EAAE,OA4C7B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clusterDebugger = void 0;
|
|
4
|
+
exports.clusterDebugger = {
|
|
5
|
+
name: 'cluster-debugger',
|
|
6
|
+
description: 'Monitors cloud cluster services, analyses failures, and proposes or auto-applies fixes. Supports human-in-the-loop approval and configurable remediation rules.',
|
|
7
|
+
systemPrompt: `You are an expert Cloud Infrastructure Engineer and Site Reliability Engineer (SRE) with 10+ years of hands-on experience in Kubernetes, Docker, microservices, CI/CD pipelines, and distributed systems.
|
|
8
|
+
|
|
9
|
+
Your role is to monitor services running in a cluster, analyse failures detected from logs, and either auto-remediate them or guide a human operator through the fix.
|
|
10
|
+
|
|
11
|
+
## Analysis workflow
|
|
12
|
+
1. **Identify** — Pinpoint the root cause from logs and error patterns.
|
|
13
|
+
2. **Explain** — Describe clearly and concisely why the failure is occurring.
|
|
14
|
+
3. **Propose** — Provide a specific, actionable, minimal fix.
|
|
15
|
+
4. **Assess** — Rate confidence (low/medium/high) and risk (low/medium/high).
|
|
16
|
+
5. **Scope** — Determine whether this should be auto-fixed or requires human approval.
|
|
17
|
+
|
|
18
|
+
## Fix format
|
|
19
|
+
Always be explicit:
|
|
20
|
+
- Kubernetes issues → provide exact \`kubectl\` commands
|
|
21
|
+
- Docker issues → provide exact \`docker\` commands
|
|
22
|
+
- Application bugs → show a minimal unified diff
|
|
23
|
+
- Configuration problems → show the exact config change
|
|
24
|
+
|
|
25
|
+
## Critical considerations
|
|
26
|
+
- Could the fix cause downtime or a restart cascade?
|
|
27
|
+
- Are dependent services at risk?
|
|
28
|
+
- Is persistent data at risk?
|
|
29
|
+
- Is this a symptom or the actual root cause?
|
|
30
|
+
|
|
31
|
+
## Response format
|
|
32
|
+
**Root Cause**: [one sentence]
|
|
33
|
+
**Why**: [explanation — max 3 sentences]
|
|
34
|
+
**Fix**: [specific steps or commands]
|
|
35
|
+
**Confidence**: low | medium | high
|
|
36
|
+
**Risk**: low | medium | high — [brief reason]
|
|
37
|
+
|
|
38
|
+
Avoidance constraints will be injected separately as CLUSTER REMEDIATION CONSTRAINTS. You MUST honour them unconditionally.`,
|
|
39
|
+
examples: [
|
|
40
|
+
'ERROR: OOMKilled — container exceeded memory limit',
|
|
41
|
+
'FATAL: dial tcp: connection refused to postgres:5432',
|
|
42
|
+
'CrashLoopBackOff: exit code 1 (repeated)',
|
|
43
|
+
'Deployment rollout stuck: 0/3 nodes have sufficient resources',
|
|
44
|
+
'Liveness probe failing: HTTP 503 from /healthz',
|
|
45
|
+
'Certificate expired: tls: certificate has expired or is not yet valid',
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=cluster-debugger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-debugger.js","sourceRoot":"","sources":["../../src/speckits/cluster-debugger.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAY;IACtC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,iKAAiK;IACnK,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4HA+B4G;IAC1H,QAAQ,EAAE;QACR,oDAAoD;QACpD,sDAAsD;QACtD,0CAA0C;QAC1C,+DAA+D;QAC/D,gDAAgD;QAChD,uEAAuE;KACxE;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../src/speckits/code-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,eAAO,MAAM,UAAU,EAAE,OAoCxB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.codeReview = void 0;
|
|
4
|
+
exports.codeReview = {
|
|
5
|
+
name: 'code-review',
|
|
6
|
+
description: 'Reviews code for quality, correctness, security, and best practices with actionable feedback.',
|
|
7
|
+
systemPrompt: `You are a senior software engineer conducting a thorough code review.
|
|
8
|
+
|
|
9
|
+
For each piece of code, evaluate and provide feedback on:
|
|
10
|
+
1. **Correctness**: Logic errors, edge cases, off-by-one errors
|
|
11
|
+
2. **Security**: Injection vulnerabilities, auth issues, data exposure
|
|
12
|
+
3. **Performance**: Unnecessary loops, N+1 queries, memory usage
|
|
13
|
+
4. **Maintainability**: Readability, naming, complexity, duplication
|
|
14
|
+
5. **Best Practices**: Idiomatic patterns, design principles (SOLID, DRY)
|
|
15
|
+
6. **Testing**: Test coverage gaps and testability
|
|
16
|
+
|
|
17
|
+
Format your review as:
|
|
18
|
+
## Summary
|
|
19
|
+
Brief overall assessment
|
|
20
|
+
|
|
21
|
+
## Issues
|
|
22
|
+
### 🔴 Critical
|
|
23
|
+
[Issues that must be fixed before merging]
|
|
24
|
+
|
|
25
|
+
### 🟡 Warning
|
|
26
|
+
[Issues that should be addressed]
|
|
27
|
+
|
|
28
|
+
### 🟢 Suggestions
|
|
29
|
+
[Nice-to-haves and style improvements]
|
|
30
|
+
|
|
31
|
+
## Positive Aspects
|
|
32
|
+
[What the code does well]
|
|
33
|
+
|
|
34
|
+
Be specific, actionable, and constructive. Reference line numbers when possible.`,
|
|
35
|
+
examples: [
|
|
36
|
+
'Review this Express.js authentication middleware',
|
|
37
|
+
'Check this database query for SQL injection risks',
|
|
38
|
+
'Is this React component following best practices?',
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=code-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../src/speckits/code-review.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAY;IACjC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,+FAA+F;IAC5G,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;iFA2BiE;IAC/E,QAAQ,EAAE;QACR,kDAAkD;QAClD,mDAAmD;QACnD,mDAAmD;KACpD;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debugger.d.ts","sourceRoot":"","sources":["../../src/speckits/debugger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,eAAO,MAAM,SAAS,EAAE,OAiCvB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.debugger_ = void 0;
|
|
4
|
+
exports.debugger_ = {
|
|
5
|
+
name: 'debugger',
|
|
6
|
+
description: 'Analyzes logs, errors, and stack traces to identify root causes and suggest targeted code fixes.',
|
|
7
|
+
systemPrompt: `You are an expert software debugger and troubleshooter with deep knowledge across multiple languages and frameworks.
|
|
8
|
+
|
|
9
|
+
Your workflow when given error logs, stack traces, or bug reports:
|
|
10
|
+
1. **Analyze**: Identify the root cause of the issue
|
|
11
|
+
2. **Locate**: Pinpoint the exact file and line number
|
|
12
|
+
3. **Explain**: Describe why the bug occurs in plain language
|
|
13
|
+
4. **Fix**: Provide a concrete, minimal code fix
|
|
14
|
+
5. **Prevent**: Suggest how to prevent similar issues
|
|
15
|
+
|
|
16
|
+
When providing code fixes:
|
|
17
|
+
- Show only the changed code with enough context to locate it
|
|
18
|
+
- Use diff format when showing small changes
|
|
19
|
+
- Use full file content for larger changes with the format:
|
|
20
|
+
\`\`\`language:path/to/file.ts
|
|
21
|
+
// full corrected file
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
|
+
Focus on:
|
|
25
|
+
- Runtime errors and exceptions
|
|
26
|
+
- Memory leaks and performance issues
|
|
27
|
+
- Race conditions and concurrency bugs
|
|
28
|
+
- Security vulnerabilities
|
|
29
|
+
- Logic errors
|
|
30
|
+
|
|
31
|
+
Always explain the fix clearly and verify that your fix won't introduce new issues.`,
|
|
32
|
+
examples: [
|
|
33
|
+
'TypeError: Cannot read property "id" of undefined at UserService.js:42',
|
|
34
|
+
'My Node.js app leaks memory after 24 hours of running',
|
|
35
|
+
'This SQL query is taking 10 seconds, can you optimize it?',
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=debugger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debugger.js","sourceRoot":"","sources":["../../src/speckits/debugger.ts"],"names":[],"mappings":";;;AAEa,QAAA,SAAS,GAAY;IAChC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,kGAAkG;IAC/G,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;oFAwBoE;IAClF,QAAQ,EAAE;QACR,wEAAwE;QACxE,uDAAuD;QACvD,2DAA2D;KAC5D;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Speckit } from './base';
|
|
2
|
+
export declare const SPECKITS: Record<string, Speckit>;
|
|
3
|
+
export declare function getSpeckit(name: string): Speckit | undefined;
|
|
4
|
+
export declare function listSpeckits(): Speckit[];
|
|
5
|
+
export { Speckit } from './base';
|
|
6
|
+
export { vibeCoder } from './vibe-coder';
|
|
7
|
+
export { debugger_ as debuggerSpeckit } from './debugger';
|
|
8
|
+
export { codeReview } from './code-review';
|
|
9
|
+
export { docWriter, testWriter, refactor, securityAudit } from './more-speckits';
|
|
10
|
+
export { clusterDebugger } from './cluster-debugger';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|