ai-devkit 0.14.0 → 0.16.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 +6 -0
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +43 -17
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/install.d.ts +7 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +74 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/phase.js +1 -1
- package/dist/commands/phase.js.map +1 -1
- package/dist/lib/Config.d.ts +3 -1
- package/dist/lib/Config.d.ts.map +1 -1
- package/dist/lib/Config.js +39 -6
- package/dist/lib/Config.js.map +1 -1
- package/dist/lib/SkillManager.d.ts.map +1 -1
- package/dist/lib/SkillManager.js +8 -2
- package/dist/lib/SkillManager.js.map +1 -1
- package/dist/lib/TemplateManager.d.ts.map +1 -1
- package/dist/lib/TemplateManager.js +1 -12
- package/dist/lib/TemplateManager.js.map +1 -1
- package/dist/services/config/config.service.d.ts +6 -0
- package/dist/services/config/config.service.d.ts.map +1 -0
- package/dist/services/config/config.service.js +55 -0
- package/dist/services/config/config.service.js.map +1 -0
- package/dist/services/install/install.service.d.ts +19 -0
- package/dist/services/install/install.service.d.ts.map +1 -0
- package/dist/services/install/install.service.js +125 -0
- package/dist/services/install/install.service.js.map +1 -0
- package/dist/templates/commands/capture-knowledge.md +7 -5
- package/dist/templates/commands/check-implementation.md +7 -4
- package/dist/templates/commands/code-review.md +7 -4
- package/dist/templates/commands/debug.md +7 -4
- package/dist/templates/commands/execute-plan.md +7 -4
- package/dist/templates/commands/new-requirement.md +7 -6
- package/dist/templates/commands/remember.md +6 -4
- package/dist/templates/commands/review-design.md +13 -10
- package/dist/templates/commands/review-requirements.md +11 -8
- package/dist/templates/commands/simplify-implementation.md +6 -3
- package/dist/templates/commands/update-planning.md +6 -3
- package/dist/templates/commands/writing-test.md +8 -5
- package/dist/templates/templates/commands/capture-knowledge.md +7 -5
- package/dist/templates/templates/commands/check-implementation.md +7 -4
- package/dist/templates/templates/commands/code-review.md +7 -4
- package/dist/templates/templates/commands/debug.md +7 -4
- package/dist/templates/templates/commands/execute-plan.md +7 -4
- package/dist/templates/templates/commands/new-requirement.md +7 -6
- package/dist/templates/templates/commands/remember.md +6 -4
- package/dist/templates/templates/commands/review-design.md +13 -10
- package/dist/templates/templates/commands/review-requirements.md +11 -8
- package/dist/templates/templates/commands/simplify-implementation.md +6 -3
- package/dist/templates/templates/commands/update-planning.md +6 -3
- package/dist/templates/templates/commands/writing-test.md +8 -5
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util/config.d.ts +8 -0
- package/dist/util/config.d.ts.map +1 -0
- package/dist/util/config.js +100 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/process.d.ts +1 -1
- package/dist/util/process.d.ts.map +1 -1
- package/package.json +5 -3
- package/templates/commands/capture-knowledge.md +7 -5
- package/templates/commands/check-implementation.md +7 -4
- package/templates/commands/code-review.md +7 -4
- package/templates/commands/debug.md +7 -4
- package/templates/commands/execute-plan.md +7 -4
- package/templates/commands/new-requirement.md +7 -6
- package/templates/commands/remember.md +6 -4
- package/templates/commands/review-design.md +13 -10
- package/templates/commands/review-requirements.md +11 -8
- package/templates/commands/simplify-implementation.md +6 -3
- package/templates/commands/update-planning.md +6 -3
- package/templates/commands/writing-test.md +8 -5
- package/dist/lib/AgentManager.d.ts +0 -104
- package/dist/lib/AgentManager.d.ts.map +0 -1
- package/dist/lib/AgentManager.js +0 -185
- package/dist/lib/AgentManager.js.map +0 -1
- package/dist/lib/TerminalFocusManager.d.ts +0 -22
- package/dist/lib/TerminalFocusManager.d.ts.map +0 -1
- package/dist/lib/TerminalFocusManager.js +0 -195
- package/dist/lib/TerminalFocusManager.js.map +0 -1
- package/dist/lib/adapters/AgentAdapter.d.ts +0 -92
- package/dist/lib/adapters/AgentAdapter.d.ts.map +0 -1
- package/dist/lib/adapters/AgentAdapter.js +0 -29
- package/dist/lib/adapters/AgentAdapter.js.map +0 -1
- package/dist/lib/adapters/ClaudeCodeAdapter.d.ts +0 -66
- package/dist/lib/adapters/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/lib/adapters/ClaudeCodeAdapter.js +0 -306
- package/dist/lib/adapters/ClaudeCodeAdapter.js.map +0 -1
- package/dist/templates/env/base.md +0 -101
- package/dist/templates/templates/env/base.md +0 -101
- package/templates/env/base.md +0 -101
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TerminalFocusManager.js","sourceRoot":"","sources":["../../src/lib/TerminalFocusManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Adapter Interface
|
|
3
|
-
*
|
|
4
|
-
* Defines the contract for detecting and managing different types of AI agents.
|
|
5
|
-
* Each adapter is responsible for detecting agents of a specific type (e.g., Claude Code).
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Type of AI agent
|
|
9
|
-
*/
|
|
10
|
-
export type AgentType = 'Claude Code' | 'Gemini CLI' | 'Codex' | "Other";
|
|
11
|
-
/**
|
|
12
|
-
* Current status of an agent
|
|
13
|
-
*/
|
|
14
|
-
export declare enum AgentStatus {
|
|
15
|
-
RUNNING = "running",
|
|
16
|
-
WAITING = "waiting",
|
|
17
|
-
IDLE = "idle",
|
|
18
|
-
UNKNOWN = "unknown"
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Status display configuration
|
|
22
|
-
*/
|
|
23
|
-
export interface StatusConfig {
|
|
24
|
-
emoji: string;
|
|
25
|
-
label: string;
|
|
26
|
-
color: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Status configuration map
|
|
30
|
-
*/
|
|
31
|
-
export declare const STATUS_CONFIG: Record<AgentStatus, StatusConfig>;
|
|
32
|
-
/**
|
|
33
|
-
* Information about a detected agent
|
|
34
|
-
*/
|
|
35
|
-
export interface AgentInfo {
|
|
36
|
-
/** Project-based name (e.g., "ai-devkit" or "ai-devkit (merry)") */
|
|
37
|
-
name: string;
|
|
38
|
-
/** Type of agent */
|
|
39
|
-
type: AgentType;
|
|
40
|
-
/** Current status */
|
|
41
|
-
status: AgentStatus;
|
|
42
|
-
/** Display format for status (e.g., "🟡 wait", "🟢 run") */
|
|
43
|
-
statusDisplay: string;
|
|
44
|
-
/** Last user prompt from history (truncated ~40 chars) */
|
|
45
|
-
summary: string;
|
|
46
|
-
/** Process ID */
|
|
47
|
-
pid: number;
|
|
48
|
-
/** Working directory/project path */
|
|
49
|
-
projectPath: string;
|
|
50
|
-
/** Session UUID */
|
|
51
|
-
sessionId: string;
|
|
52
|
-
/** Human-readable session name (e.g., "merry-wobbling-starlight"), may be undefined for new sessions */
|
|
53
|
-
slug?: string;
|
|
54
|
-
/** Timestamp of last activity */
|
|
55
|
-
lastActive: Date;
|
|
56
|
-
/** Relative time display (e.g., "2m ago", "just now") */
|
|
57
|
-
lastActiveDisplay: string;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Information about a running process
|
|
61
|
-
*/
|
|
62
|
-
export interface ProcessInfo {
|
|
63
|
-
/** Process ID */
|
|
64
|
-
pid: number;
|
|
65
|
-
/** Process command */
|
|
66
|
-
command: string;
|
|
67
|
-
/** Working directory */
|
|
68
|
-
cwd: string;
|
|
69
|
-
/** Terminal TTY (e.g., "ttys030") */
|
|
70
|
-
tty: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Agent Adapter Interface
|
|
74
|
-
*
|
|
75
|
-
* Implementations must provide detection logic for a specific agent type.
|
|
76
|
-
*/
|
|
77
|
-
export interface AgentAdapter {
|
|
78
|
-
/** Type of agent this adapter handles */
|
|
79
|
-
readonly type: AgentType;
|
|
80
|
-
/**
|
|
81
|
-
* Detect running agents of this type
|
|
82
|
-
* @returns List of detected agents
|
|
83
|
-
*/
|
|
84
|
-
detectAgents(): Promise<AgentInfo[]>;
|
|
85
|
-
/**
|
|
86
|
-
* Check if this adapter can handle the given process
|
|
87
|
-
* @param processInfo Process information
|
|
88
|
-
* @returns True if this adapter can handle the process
|
|
89
|
-
*/
|
|
90
|
-
canHandle(processInfo: ProcessInfo): boolean;
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=AgentAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/AgentAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;GAEG;AACH,oBAAY,WAAW;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,CAK3D,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,IAAI,EAAE,SAAS,CAAC;IAEhB,qBAAqB;IACrB,MAAM,EAAE,WAAW,CAAC;IAEpB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IAEtB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAElB,wGAAwG;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iCAAiC;IACjC,UAAU,EAAE,IAAI,CAAC;IAEjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CAChD"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Agent Adapter Interface
|
|
4
|
-
*
|
|
5
|
-
* Defines the contract for detecting and managing different types of AI agents.
|
|
6
|
-
* Each adapter is responsible for detecting agents of a specific type (e.g., Claude Code).
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.STATUS_CONFIG = exports.AgentStatus = void 0;
|
|
10
|
-
/**
|
|
11
|
-
* Current status of an agent
|
|
12
|
-
*/
|
|
13
|
-
var AgentStatus;
|
|
14
|
-
(function (AgentStatus) {
|
|
15
|
-
AgentStatus["RUNNING"] = "running";
|
|
16
|
-
AgentStatus["WAITING"] = "waiting";
|
|
17
|
-
AgentStatus["IDLE"] = "idle";
|
|
18
|
-
AgentStatus["UNKNOWN"] = "unknown";
|
|
19
|
-
})(AgentStatus || (exports.AgentStatus = AgentStatus = {}));
|
|
20
|
-
/**
|
|
21
|
-
* Status configuration map
|
|
22
|
-
*/
|
|
23
|
-
exports.STATUS_CONFIG = {
|
|
24
|
-
[AgentStatus.RUNNING]: { emoji: '🟢', label: 'running', color: 'green' },
|
|
25
|
-
[AgentStatus.WAITING]: { emoji: '🟡', label: 'waiting', color: 'yellow' },
|
|
26
|
-
[AgentStatus.IDLE]: { emoji: '⚪', label: 'idle', color: 'dim' },
|
|
27
|
-
[AgentStatus.UNKNOWN]: { emoji: '❓', label: 'unknown', color: 'gray' },
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=AgentAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentAdapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/AgentAdapter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAOH;;GAEG;AACH,IAAY,WAKX;AALD,WAAY,WAAW;IACnB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,kCAAmB,CAAA;AACvB,CAAC,EALW,WAAW,2BAAX,WAAW,QAKtB;AAWD;;GAEG;AACU,QAAA,aAAa,GAAsC;IAC5D,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;IACxE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACzE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;IAC/D,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;CACzE,CAAC"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code Adapter
|
|
3
|
-
*
|
|
4
|
-
* Detects running Claude Code agents by reading session files
|
|
5
|
-
* from ~/.claude/ directory and correlating with running processes.
|
|
6
|
-
*/
|
|
7
|
-
import type { AgentAdapter, AgentInfo, ProcessInfo } from './AgentAdapter';
|
|
8
|
-
/**
|
|
9
|
-
* Claude Code Adapter
|
|
10
|
-
*
|
|
11
|
-
* Detects Claude Code agents by:
|
|
12
|
-
* 1. Finding running claude processes
|
|
13
|
-
* 2. Reading session files from ~/.claude/projects/
|
|
14
|
-
* 3. Matching sessions to processes via CWD
|
|
15
|
-
* 4. Extracting status from session JSONL
|
|
16
|
-
* 5. Extracting summary from history.jsonl
|
|
17
|
-
*/
|
|
18
|
-
export declare class ClaudeCodeAdapter implements AgentAdapter {
|
|
19
|
-
readonly type: "Claude Code";
|
|
20
|
-
/** Threshold in minutes before considering a session idle */
|
|
21
|
-
private static readonly IDLE_THRESHOLD_MINUTES;
|
|
22
|
-
private claudeDir;
|
|
23
|
-
private projectsDir;
|
|
24
|
-
private historyPath;
|
|
25
|
-
constructor();
|
|
26
|
-
/**
|
|
27
|
-
* Check if this adapter can handle a given process
|
|
28
|
-
*/
|
|
29
|
-
canHandle(processInfo: ProcessInfo): boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Detect running Claude Code agents
|
|
32
|
-
*/
|
|
33
|
-
detectAgents(): Promise<AgentInfo[]>;
|
|
34
|
-
/**
|
|
35
|
-
* Read all Claude Code sessions
|
|
36
|
-
*/
|
|
37
|
-
private readSessions;
|
|
38
|
-
/**
|
|
39
|
-
* Read a session JSONL file
|
|
40
|
-
* Only reads last 100 lines for performance with large files
|
|
41
|
-
*/
|
|
42
|
-
private readSessionLog;
|
|
43
|
-
/**
|
|
44
|
-
* Read history.jsonl for user prompts
|
|
45
|
-
* Only reads last 100 lines for performance
|
|
46
|
-
*/
|
|
47
|
-
private readHistory;
|
|
48
|
-
/**
|
|
49
|
-
* Determine agent status from session entry
|
|
50
|
-
*/
|
|
51
|
-
private determineStatus;
|
|
52
|
-
/**
|
|
53
|
-
* Generate unique agent name
|
|
54
|
-
* Uses project basename, appends slug if multiple sessions for same project
|
|
55
|
-
*/
|
|
56
|
-
private generateAgentName;
|
|
57
|
-
/**
|
|
58
|
-
* Truncate summary to ~40 characters
|
|
59
|
-
*/
|
|
60
|
-
private truncateSummary;
|
|
61
|
-
/**
|
|
62
|
-
* Get relative time display (e.g., "2m ago", "just now")
|
|
63
|
-
*/
|
|
64
|
-
private getRelativeTime;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=ClaudeCodeAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8C3E;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IAEvC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAEnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAS5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA+E1C;;OAEG;IACH,OAAO,CAAC,YAAY;IAyDpB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqCvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,eAAe;CAc1B"}
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Claude Code Adapter
|
|
4
|
-
*
|
|
5
|
-
* Detects running Claude Code agents by reading session files
|
|
6
|
-
* from ~/.claude/ directory and correlating with running processes.
|
|
7
|
-
*/
|
|
8
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
-
if (k2 === undefined) k2 = k;
|
|
10
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
-
}
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.ClaudeCodeAdapter = void 0;
|
|
43
|
-
const fs = __importStar(require("fs"));
|
|
44
|
-
const path = __importStar(require("path"));
|
|
45
|
-
const AgentAdapter_1 = require("./AgentAdapter");
|
|
46
|
-
const process_1 = require("../../util/process");
|
|
47
|
-
const file_1 = require("../../util/file");
|
|
48
|
-
/**
|
|
49
|
-
* Claude Code Adapter
|
|
50
|
-
*
|
|
51
|
-
* Detects Claude Code agents by:
|
|
52
|
-
* 1. Finding running claude processes
|
|
53
|
-
* 2. Reading session files from ~/.claude/projects/
|
|
54
|
-
* 3. Matching sessions to processes via CWD
|
|
55
|
-
* 4. Extracting status from session JSONL
|
|
56
|
-
* 5. Extracting summary from history.jsonl
|
|
57
|
-
*/
|
|
58
|
-
class ClaudeCodeAdapter {
|
|
59
|
-
constructor() {
|
|
60
|
-
this.type = 'Claude Code';
|
|
61
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
62
|
-
this.claudeDir = path.join(homeDir, '.claude');
|
|
63
|
-
this.projectsDir = path.join(this.claudeDir, 'projects');
|
|
64
|
-
this.historyPath = path.join(this.claudeDir, 'history.jsonl');
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Check if this adapter can handle a given process
|
|
68
|
-
*/
|
|
69
|
-
canHandle(processInfo) {
|
|
70
|
-
return processInfo.command.toLowerCase().includes('claude');
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Detect running Claude Code agents
|
|
74
|
-
*/
|
|
75
|
-
async detectAgents() {
|
|
76
|
-
// 1. Find running claude processes
|
|
77
|
-
const claudeProcesses = (0, process_1.listProcesses)({ namePattern: 'claude' });
|
|
78
|
-
if (claudeProcesses.length === 0) {
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
// 2. Read all sessions
|
|
82
|
-
const sessions = this.readSessions();
|
|
83
|
-
// 3. Read history for summaries
|
|
84
|
-
const history = this.readHistory();
|
|
85
|
-
// 4. Group processes by CWD
|
|
86
|
-
const processesByCwd = new Map();
|
|
87
|
-
for (const p of claudeProcesses) {
|
|
88
|
-
const list = processesByCwd.get(p.cwd) || [];
|
|
89
|
-
list.push(p);
|
|
90
|
-
processesByCwd.set(p.cwd, list);
|
|
91
|
-
}
|
|
92
|
-
// 5. Match sessions to processes
|
|
93
|
-
const agents = [];
|
|
94
|
-
for (const [cwd, processes] of processesByCwd) {
|
|
95
|
-
// Find sessions for this project path
|
|
96
|
-
const projectSessions = sessions.filter(s => s.projectPath === cwd);
|
|
97
|
-
if (projectSessions.length === 0) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
// Sort sessions by last active time (newest first)
|
|
101
|
-
projectSessions.sort((a, b) => {
|
|
102
|
-
const timeA = a.lastActive?.getTime() || 0;
|
|
103
|
-
const timeB = b.lastActive?.getTime() || 0;
|
|
104
|
-
return timeB - timeA;
|
|
105
|
-
});
|
|
106
|
-
// Map processes to the most recent sessions
|
|
107
|
-
// If there are 2 processes, we take the 2 most recent sessions
|
|
108
|
-
const activeSessions = projectSessions.slice(0, processes.length);
|
|
109
|
-
for (let i = 0; i < activeSessions.length; i++) {
|
|
110
|
-
const session = activeSessions[i];
|
|
111
|
-
const process = processes[i]; // Assign process to session (arbitrary 1-to-1 mapping)
|
|
112
|
-
const historyEntry = [...history].reverse().find(h => h.sessionId === session.sessionId);
|
|
113
|
-
const summary = historyEntry?.display || 'Session started';
|
|
114
|
-
const status = this.determineStatus(session);
|
|
115
|
-
const agentName = this.generateAgentName(session, agents); // Pass currently built agents for collision checks
|
|
116
|
-
// Get status display config
|
|
117
|
-
const statusConfig = AgentAdapter_1.STATUS_CONFIG[status] || AgentAdapter_1.STATUS_CONFIG[AgentAdapter_1.AgentStatus.UNKNOWN];
|
|
118
|
-
const statusDisplay = `${statusConfig.emoji} ${statusConfig.label}`;
|
|
119
|
-
const lastActiveDisplay = this.getRelativeTime(session.lastActive || new Date());
|
|
120
|
-
agents.push({
|
|
121
|
-
name: agentName,
|
|
122
|
-
type: this.type,
|
|
123
|
-
status,
|
|
124
|
-
statusDisplay,
|
|
125
|
-
summary: this.truncateSummary(summary),
|
|
126
|
-
pid: process.pid,
|
|
127
|
-
projectPath: session.projectPath,
|
|
128
|
-
sessionId: session.sessionId,
|
|
129
|
-
slug: session.slug,
|
|
130
|
-
lastActive: session.lastActive || new Date(),
|
|
131
|
-
lastActiveDisplay,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return agents;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Read all Claude Code sessions
|
|
139
|
-
*/
|
|
140
|
-
readSessions() {
|
|
141
|
-
if (!fs.existsSync(this.projectsDir)) {
|
|
142
|
-
return [];
|
|
143
|
-
}
|
|
144
|
-
const sessions = [];
|
|
145
|
-
const projectDirs = fs.readdirSync(this.projectsDir);
|
|
146
|
-
for (const dirName of projectDirs) {
|
|
147
|
-
if (dirName.startsWith('.')) {
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
|
-
const projectDir = path.join(this.projectsDir, dirName);
|
|
151
|
-
if (!fs.statSync(projectDir).isDirectory()) {
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
// Read sessions-index.json to get original project path
|
|
155
|
-
const indexPath = path.join(projectDir, 'sessions-index.json');
|
|
156
|
-
if (!fs.existsSync(indexPath)) {
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const sessionsIndex = (0, file_1.readJson)(indexPath);
|
|
160
|
-
if (!sessionsIndex) {
|
|
161
|
-
console.error(`Failed to parse ${indexPath}`);
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
const sessionFiles = fs.readdirSync(projectDir).filter(f => f.endsWith('.jsonl'));
|
|
165
|
-
for (const sessionFile of sessionFiles) {
|
|
166
|
-
const sessionId = sessionFile.replace('.jsonl', '');
|
|
167
|
-
const sessionLogPath = path.join(projectDir, sessionFile);
|
|
168
|
-
try {
|
|
169
|
-
const sessionData = this.readSessionLog(sessionLogPath);
|
|
170
|
-
sessions.push({
|
|
171
|
-
sessionId,
|
|
172
|
-
projectPath: sessionsIndex.originalPath,
|
|
173
|
-
slug: sessionData.slug,
|
|
174
|
-
sessionLogPath,
|
|
175
|
-
lastEntry: sessionData.lastEntry,
|
|
176
|
-
lastActive: sessionData.lastActive,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
console.error(`Failed to read session ${sessionId}:`, error);
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return sessions;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Read a session JSONL file
|
|
189
|
-
* Only reads last 100 lines for performance with large files
|
|
190
|
-
*/
|
|
191
|
-
readSessionLog(logPath) {
|
|
192
|
-
const lines = (0, file_1.readLastLines)(logPath, 100);
|
|
193
|
-
let slug;
|
|
194
|
-
let lastEntry;
|
|
195
|
-
let lastActive;
|
|
196
|
-
for (const line of lines) {
|
|
197
|
-
try {
|
|
198
|
-
const entry = JSON.parse(line);
|
|
199
|
-
if (entry.slug && !slug) {
|
|
200
|
-
slug = entry.slug;
|
|
201
|
-
}
|
|
202
|
-
lastEntry = entry;
|
|
203
|
-
if (entry.timestamp) {
|
|
204
|
-
lastActive = new Date(entry.timestamp);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return { slug, lastEntry, lastActive };
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Read history.jsonl for user prompts
|
|
215
|
-
* Only reads last 100 lines for performance
|
|
216
|
-
*/
|
|
217
|
-
readHistory() {
|
|
218
|
-
return (0, file_1.readJsonLines)(this.historyPath, 100);
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Determine agent status from session entry
|
|
222
|
-
*/
|
|
223
|
-
determineStatus(session) {
|
|
224
|
-
if (!session.lastEntry) {
|
|
225
|
-
return AgentAdapter_1.AgentStatus.UNKNOWN;
|
|
226
|
-
}
|
|
227
|
-
const entryType = session.lastEntry.type;
|
|
228
|
-
const lastActive = session.lastActive || new Date(0);
|
|
229
|
-
const ageMinutes = (Date.now() - lastActive.getTime()) / 1000 / 60;
|
|
230
|
-
if (ageMinutes > ClaudeCodeAdapter.IDLE_THRESHOLD_MINUTES) {
|
|
231
|
-
return AgentAdapter_1.AgentStatus.IDLE;
|
|
232
|
-
}
|
|
233
|
-
if (entryType === 'user') {
|
|
234
|
-
// Check if user interrupted manually - this puts agent back in waiting state
|
|
235
|
-
const content = session.lastEntry?.message?.content;
|
|
236
|
-
if (Array.isArray(content)) {
|
|
237
|
-
const isInterrupted = content.some((c) => (c.type === 'text' && c.text?.includes('[Request interrupted')) ||
|
|
238
|
-
(c.type === 'tool_result' && c.content?.includes('[Request interrupted')));
|
|
239
|
-
if (isInterrupted)
|
|
240
|
-
return AgentAdapter_1.AgentStatus.WAITING;
|
|
241
|
-
}
|
|
242
|
-
return AgentAdapter_1.AgentStatus.RUNNING;
|
|
243
|
-
}
|
|
244
|
-
if (entryType === 'progress' || entryType === 'thinking') {
|
|
245
|
-
return AgentAdapter_1.AgentStatus.RUNNING;
|
|
246
|
-
}
|
|
247
|
-
else if (entryType === 'assistant') {
|
|
248
|
-
return AgentAdapter_1.AgentStatus.WAITING;
|
|
249
|
-
}
|
|
250
|
-
else if (entryType === 'system') {
|
|
251
|
-
return AgentAdapter_1.AgentStatus.IDLE;
|
|
252
|
-
}
|
|
253
|
-
return AgentAdapter_1.AgentStatus.UNKNOWN;
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Generate unique agent name
|
|
257
|
-
* Uses project basename, appends slug if multiple sessions for same project
|
|
258
|
-
*/
|
|
259
|
-
generateAgentName(session, existingAgents) {
|
|
260
|
-
const projectName = path.basename(session.projectPath);
|
|
261
|
-
const sameProjectAgents = existingAgents.filter(a => a.projectPath === session.projectPath);
|
|
262
|
-
if (sameProjectAgents.length === 0) {
|
|
263
|
-
return projectName;
|
|
264
|
-
}
|
|
265
|
-
// Multiple sessions for same project, append slug
|
|
266
|
-
if (session.slug) {
|
|
267
|
-
// Use first word of slug for brevity (with safety check for format)
|
|
268
|
-
const slugPart = session.slug.includes('-')
|
|
269
|
-
? session.slug.split('-')[0]
|
|
270
|
-
: session.slug.slice(0, 8);
|
|
271
|
-
return `${projectName} (${slugPart})`;
|
|
272
|
-
}
|
|
273
|
-
// No slug available, use session ID prefix
|
|
274
|
-
return `${projectName} (${session.sessionId.slice(0, 8)})`;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Truncate summary to ~40 characters
|
|
278
|
-
*/
|
|
279
|
-
truncateSummary(summary, maxLength = 40) {
|
|
280
|
-
if (summary.length <= maxLength) {
|
|
281
|
-
return summary;
|
|
282
|
-
}
|
|
283
|
-
return summary.slice(0, maxLength - 3) + '...';
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Get relative time display (e.g., "2m ago", "just now")
|
|
287
|
-
*/
|
|
288
|
-
getRelativeTime(date) {
|
|
289
|
-
const now = new Date();
|
|
290
|
-
const diffMs = now.getTime() - date.getTime();
|
|
291
|
-
const diffMins = Math.floor(diffMs / 60000);
|
|
292
|
-
if (diffMins < 1)
|
|
293
|
-
return 'just now';
|
|
294
|
-
if (diffMins < 60)
|
|
295
|
-
return `${diffMins}m ago`;
|
|
296
|
-
const diffHours = Math.floor(diffMins / 60);
|
|
297
|
-
if (diffHours < 24)
|
|
298
|
-
return `${diffHours}h ago`;
|
|
299
|
-
const diffDays = Math.floor(diffHours / 24);
|
|
300
|
-
return `${diffDays}d ago`;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
|
|
304
|
-
/** Threshold in minutes before considering a session idle */
|
|
305
|
-
ClaudeCodeAdapter.IDLE_THRESHOLD_MINUTES = 5;
|
|
306
|
-
//# sourceMappingURL=ClaudeCodeAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeCodeAdapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,iDAA4D;AAC5D,gDAAmD;AACnD,0CAAyE;AA2CzE;;;;;;;;;GASG;AACH,MAAa,iBAAiB;IAU1B;QATS,SAAI,GAAG,aAAsB,CAAC;QAUnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,WAAwB;QAC9B,OAAO,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QACd,mCAAmC;QACnC,MAAM,eAAe,GAAG,IAAA,uBAAa,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEjE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAErC,gCAAgC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,iCAAiC;QACjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,EAAE,CAAC;YAC5C,sCAAsC;YACtC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC;YAEpE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,SAAS;YACb,CAAC;YAED,mDAAmD;YACnD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC3C,OAAO,KAAK,GAAG,KAAK,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,4CAA4C;YAC5C,+DAA+D;YAC/D,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,uDAAuD;gBAErF,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CACzC,CAAC;gBACF,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,iBAAiB,CAAC;gBAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,mDAAmD;gBAE9G,4BAA4B;gBAC5B,MAAM,YAAY,GAAG,4BAAa,CAAC,MAAM,CAAC,IAAI,4BAAa,CAAC,0BAAW,CAAC,OAAO,CAAC,CAAC;gBACjF,MAAM,aAAa,GAAG,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;gBACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;gBAEjF,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM;oBACN,aAAa;oBACb,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;oBACtC,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE;oBAC5C,iBAAiB;iBACpB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,YAAY;QAChB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAErD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACb,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzC,SAAS;YACb,CAAC;YAED,wDAAwD;YACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;YAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,SAAS;YACb,CAAC;YAED,MAAM,aAAa,GAAG,IAAA,eAAQ,EAAgB,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;gBAC9C,SAAS;YACb,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAElF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAE1D,IAAI,CAAC;oBACD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;oBAExD,QAAQ,CAAC,IAAI,CAAC;wBACV,SAAS;wBACT,WAAW,EAAE,aAAa,CAAC,YAAY;wBACvC,IAAI,EAAE,WAAW,CAAC,IAAI;wBACtB,cAAc;wBACd,SAAS,EAAE,WAAW,CAAC,SAAS;wBAChC,UAAU,EAAE,WAAW,CAAC,UAAU;qBACrC,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC7D,SAAS;gBACb,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,OAAe;QAKlC,MAAM,KAAK,GAAG,IAAA,oBAAa,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE1C,IAAI,IAAwB,CAAC;QAC7B,IAAI,SAAmC,CAAC;QACxC,IAAI,UAA4B,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBACD,MAAM,KAAK,GAAiB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE7C,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACtB,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACtB,CAAC;gBAED,SAAS,GAAG,KAAK,CAAC;gBAElB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBAClB,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,SAAS;YACb,CAAC;QACL,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,WAAW;QACf,OAAO,IAAA,oBAAa,EAAe,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAsB;QAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,0BAAW,CAAC,OAAO,CAAC;QAC/B,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEnE,IAAI,UAAU,GAAG,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;YACxD,OAAO,0BAAW,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACvB,6EAA6E;YAC7E,MAAM,OAAO,GAAI,OAAO,CAAC,SAAiB,EAAE,OAAO,EAAE,OAAO,CAAC;YAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC1C,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;oBAC/D,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAC5E,CAAC;gBACF,IAAI,aAAa;oBAAE,OAAO,0BAAW,CAAC,OAAO,CAAC;YAClD,CAAC;YACD,OAAO,0BAAW,CAAC,OAAO,CAAC;QAC/B,CAAC;QAED,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YACvD,OAAO,0BAAW,CAAC,OAAO,CAAC;QAC/B,CAAC;aAAM,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO,0BAAW,CAAC,OAAO,CAAC;QAC/B,CAAC;aAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,0BAAW,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,OAAO,0BAAW,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,OAAsB,EAAE,cAA2B;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEvD,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAC7C,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,kDAAkD;QAClD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,oEAAoE;YACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACvC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,OAAO,GAAG,WAAW,KAAK,QAAQ,GAAG,CAAC;QAC1C,CAAC;QAED,2CAA2C;QAC3C,OAAO,GAAG,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAe,EAAE,YAAoB,EAAE;QAC3D,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAU;QAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAE5C,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACpC,IAAI,QAAQ,GAAG,EAAE;YAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;QAE7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,SAAS,OAAO,CAAC;QAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC9B,CAAC;;AAhTL,8CAiTC;AA9SG,6DAA6D;AACrC,wCAAsB,GAAG,CAAC,AAAJ,CAAK"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# AI DevKit Rules
|
|
2
|
-
|
|
3
|
-
## Project Context
|
|
4
|
-
This project uses ai-devkit for structured AI-assisted development. Phase documentation is located in `docs/ai/`.
|
|
5
|
-
|
|
6
|
-
## Documentation Structure
|
|
7
|
-
- `docs/ai/requirements/` - Problem understanding and requirements
|
|
8
|
-
- `docs/ai/design/` - System architecture and design decisions (include mermaid diagrams)
|
|
9
|
-
- `docs/ai/planning/` - Task breakdown and project planning
|
|
10
|
-
- `docs/ai/implementation/` - Implementation guides and notes
|
|
11
|
-
- `docs/ai/testing/` - Testing strategy and test cases
|
|
12
|
-
- `docs/ai/deployment/` - Deployment and infrastructure docs
|
|
13
|
-
- `docs/ai/monitoring/` - Monitoring and observability setup
|
|
14
|
-
|
|
15
|
-
## Code Style & Standards
|
|
16
|
-
- Follow the project's established code style and conventions
|
|
17
|
-
- Write clear, self-documenting code with meaningful variable names
|
|
18
|
-
- Add comments for complex logic or non-obvious decisions
|
|
19
|
-
|
|
20
|
-
## Development Workflow
|
|
21
|
-
- Review phase documentation in `docs/ai/` before implementing features
|
|
22
|
-
- Keep requirements, design, and implementation docs updated as the project evolves
|
|
23
|
-
- Reference the planning doc for task breakdown and priorities
|
|
24
|
-
- Copy the testing template (`docs/ai/testing/README.md`) before creating feature-specific testing docs
|
|
25
|
-
|
|
26
|
-
## AI Interaction Guidelines
|
|
27
|
-
- When implementing features, first check relevant phase documentation
|
|
28
|
-
- For new features, start with requirements clarification
|
|
29
|
-
- Update phase docs when significant changes or decisions are made
|
|
30
|
-
|
|
31
|
-
## Skills (Extend Your Capabilities)
|
|
32
|
-
Skills are packaged capabilities that teach you new competencies, patterns, and best practices. Check for installed skills in the project's skill directory and use them to enhance your work.
|
|
33
|
-
|
|
34
|
-
### Using Installed Skills
|
|
35
|
-
1. **Check for skills**: Look for `SKILL.md` files in the project's skill directory
|
|
36
|
-
2. **Read skill instructions**: Each skill contains detailed guidance on when and how to use it
|
|
37
|
-
3. **Apply skill knowledge**: Follow the patterns, commands, and best practices defined in the skill
|
|
38
|
-
|
|
39
|
-
### Key Installed Skills
|
|
40
|
-
- **memory**: Use AI DevKit's memory service via CLI commands when MCP is unavailable. Read the skill for detailed `memory store` and `memory search` command usage.
|
|
41
|
-
|
|
42
|
-
### When to Reference Skills
|
|
43
|
-
- Before implementing features that match a skill's domain
|
|
44
|
-
- When MCP tools are unavailable but skill provides CLI alternatives
|
|
45
|
-
- To follow established patterns and conventions defined in skills
|
|
46
|
-
|
|
47
|
-
## Knowledge Memory (Always Use When Helpful)
|
|
48
|
-
The AI assistant should proactively use knowledge memory throughout all interactions.
|
|
49
|
-
|
|
50
|
-
> **Tip**: If MCP is unavailable, use the **memory skill** for detailed CLI command reference.
|
|
51
|
-
|
|
52
|
-
### When to Search Memory
|
|
53
|
-
- Before starting any task, search for relevant project conventions, patterns, or decisions
|
|
54
|
-
- When you need clarification on how something was done before
|
|
55
|
-
- To check for existing solutions to similar problems
|
|
56
|
-
- To understand project-specific terminology or standards
|
|
57
|
-
|
|
58
|
-
**How to search**:
|
|
59
|
-
- Use `memory.searchKnowledge` MCP tool with relevant keywords, tags, and scope
|
|
60
|
-
- If MCP tools are unavailable, use `npx ai-devkit@latest memory search` CLI command (see memory skill for details)
|
|
61
|
-
- Example: Search for "authentication patterns" when implementing auth features
|
|
62
|
-
|
|
63
|
-
### When to Store Memory
|
|
64
|
-
- After making important architectural or design decisions
|
|
65
|
-
- When discovering useful patterns or solutions worth reusing
|
|
66
|
-
- If the user explicitly asks to "remember this" or save guidance
|
|
67
|
-
- When you establish new conventions or standards for the project
|
|
68
|
-
|
|
69
|
-
**How to store**:
|
|
70
|
-
- Use `memory.storeKnowledge` MCP tool
|
|
71
|
-
- If MCP tools are unavailable, use `npx ai-devkit@latest memory store` CLI command (see memory skill for details)
|
|
72
|
-
- Include clear title, detailed content, relevant tags, and appropriate scope
|
|
73
|
-
- Make knowledge specific and actionable, not generic advice
|
|
74
|
-
|
|
75
|
-
### Memory Best Practices
|
|
76
|
-
- **Be Proactive**: Search memory before asking the user repetitive questions
|
|
77
|
-
- **Be Specific**: Store knowledge that's actionable and reusable
|
|
78
|
-
- **Use Tags**: Tag knowledge appropriately for easy discovery (e.g., "api", "testing", "architecture")
|
|
79
|
-
- **Scope Appropriately**: Use `global` for general patterns, `project:<name>` for project-specific knowledge
|
|
80
|
-
|
|
81
|
-
## Testing & Quality
|
|
82
|
-
- Write tests alongside implementation
|
|
83
|
-
- Follow the testing strategy defined in `docs/ai/testing/`
|
|
84
|
-
- Use `/writing-test` to generate unit and integration tests targeting 100% coverage
|
|
85
|
-
- Ensure code passes all tests before considering it complete
|
|
86
|
-
|
|
87
|
-
## Documentation
|
|
88
|
-
- Update phase documentation when requirements or design changes
|
|
89
|
-
- Keep inline code comments focused and relevant
|
|
90
|
-
- Document architectural decisions and their rationale
|
|
91
|
-
- Use mermaid diagrams for any architectural or data-flow visuals (update existing diagrams if needed)
|
|
92
|
-
- Record test coverage results and outstanding gaps in `docs/ai/testing/`
|
|
93
|
-
|
|
94
|
-
## Key Commands
|
|
95
|
-
When working on this project, you can run commands to:
|
|
96
|
-
- Understand project requirements and goals (`review-requirements`)
|
|
97
|
-
- Review architectural decisions (`review-design`)
|
|
98
|
-
- Plan and execute tasks (`execute-plan`)
|
|
99
|
-
- Verify implementation against design (`check-implementation`)
|
|
100
|
-
- Writing tests (`writing-test`)
|
|
101
|
-
- Perform structured code reviews (`code-review`)
|