@stackmemoryai/stackmemory 0.3.3 → 0.3.5
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 +19 -18
- package/dist/cli/commands/chromadb.js +267 -0
- package/dist/cli/commands/chromadb.js.map +7 -0
- package/dist/cli/commands/context.js +15 -5
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/skills.js +262 -0
- package/dist/cli/commands/skills.js.map +7 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +2 -2
- package/dist/core/context/frame-handoff-manager.js +399 -9
- package/dist/core/context/frame-handoff-manager.js.map +2 -2
- package/dist/core/context/frame-manager.js +11 -2
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/storage/chromadb-adapter.js +346 -0
- package/dist/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/skills/claude-skills.js +666 -0
- package/dist/skills/claude-skills.js.map +7 -0
- package/package.json +21 -31
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import { ClaudeSkillsManager } from "../../skills/claude-skills.js";
|
|
6
|
+
import { DualStackManager } from "../../core/context/dual-stack-manager.js";
|
|
7
|
+
import { FrameHandoffManager } from "../../core/context/frame-handoff-manager.js";
|
|
8
|
+
import { ContextRetriever } from "../../core/retrieval/context-retriever.js";
|
|
9
|
+
import { SQLiteAdapter } from "../../core/database/sqlite-adapter.js";
|
|
10
|
+
import { ConfigManager } from "../../core/config/config-manager.js";
|
|
11
|
+
import * as path from "path";
|
|
12
|
+
import * as os from "os";
|
|
13
|
+
async function initializeSkillContext() {
|
|
14
|
+
const config = ConfigManager.getInstance();
|
|
15
|
+
const projectId = config.get("project.id");
|
|
16
|
+
const userId = config.get("user.id") || process.env.USER || "default";
|
|
17
|
+
const dbPath = path.join(
|
|
18
|
+
os.homedir(),
|
|
19
|
+
".stackmemory",
|
|
20
|
+
"data",
|
|
21
|
+
projectId,
|
|
22
|
+
"stackmemory.db"
|
|
23
|
+
);
|
|
24
|
+
const database = new SQLiteAdapter(projectId, { dbPath });
|
|
25
|
+
await database.connect();
|
|
26
|
+
const dualStackManager = new DualStackManager(database, projectId, userId);
|
|
27
|
+
const handoffManager = new FrameHandoffManager(dualStackManager);
|
|
28
|
+
const contextRetriever = new ContextRetriever(database);
|
|
29
|
+
return {
|
|
30
|
+
projectId,
|
|
31
|
+
userId,
|
|
32
|
+
dualStackManager,
|
|
33
|
+
handoffManager,
|
|
34
|
+
contextRetriever,
|
|
35
|
+
database
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function createSkillsCommand() {
|
|
39
|
+
const skillsCmd = new Command("skills").description("Execute Claude skills for enhanced workflow");
|
|
40
|
+
skillsCmd.command("handoff <targetUser> <message>").description("Streamline frame handoffs between team members").option("-p, --priority <level>", "Set priority (low, medium, high, critical)", "medium").option("-f, --frames <frames...>", "Specific frames to handoff").option("--no-auto-detect", "Disable auto-detection of frames").action(async (targetUser, message, options) => {
|
|
41
|
+
const spinner = ora("Initiating handoff...").start();
|
|
42
|
+
try {
|
|
43
|
+
const context = await initializeSkillContext();
|
|
44
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
45
|
+
const result = await skillsManager.executeSkill("handoff", [targetUser, message], {
|
|
46
|
+
priority: options.priority,
|
|
47
|
+
frames: options.frames,
|
|
48
|
+
autoDetect: options.autoDetect !== false
|
|
49
|
+
});
|
|
50
|
+
spinner.stop();
|
|
51
|
+
if (result.success) {
|
|
52
|
+
console.log(chalk.green("\u2713"), result.message);
|
|
53
|
+
if (result.data) {
|
|
54
|
+
console.log(chalk.cyan("\nHandoff Details:"));
|
|
55
|
+
console.log(` ID: ${result.data.handoffId}`);
|
|
56
|
+
console.log(` Frames: ${result.data.frameCount}`);
|
|
57
|
+
console.log(` Priority: ${result.data.priority}`);
|
|
58
|
+
if (result.data.actionItems?.length > 0) {
|
|
59
|
+
console.log(chalk.yellow("\n Action Items:"));
|
|
60
|
+
result.data.actionItems.forEach((item) => {
|
|
61
|
+
console.log(` \u2022 ${item}`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
67
|
+
}
|
|
68
|
+
await context.database.disconnect();
|
|
69
|
+
} catch (error) {
|
|
70
|
+
spinner.stop();
|
|
71
|
+
console.error(chalk.red("Error:"), error.message);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const checkpointCmd = skillsCmd.command("checkpoint").description("Create and manage recovery points");
|
|
76
|
+
checkpointCmd.command("create <description>").description("Create a new checkpoint").option("--files <files...>", "Include specific files in checkpoint").option("--auto-detect-risky", "Auto-detect risky operations").action(async (description, options) => {
|
|
77
|
+
const spinner = ora("Creating checkpoint...").start();
|
|
78
|
+
try {
|
|
79
|
+
const context = await initializeSkillContext();
|
|
80
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
81
|
+
const result = await skillsManager.executeSkill("checkpoint", ["create", description], {
|
|
82
|
+
includeFiles: options.files,
|
|
83
|
+
autoDetectRisky: options.autoDetectRisky
|
|
84
|
+
});
|
|
85
|
+
spinner.stop();
|
|
86
|
+
if (result.success) {
|
|
87
|
+
console.log(chalk.green("\u2713"), result.message);
|
|
88
|
+
if (result.data) {
|
|
89
|
+
console.log(chalk.cyan("\nCheckpoint Info:"));
|
|
90
|
+
console.log(` ID: ${result.data.checkpointId}`);
|
|
91
|
+
console.log(` Time: ${result.data.timestamp}`);
|
|
92
|
+
console.log(` Frames: ${result.data.frameCount}`);
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
96
|
+
}
|
|
97
|
+
await context.database.disconnect();
|
|
98
|
+
} catch (error) {
|
|
99
|
+
spinner.stop();
|
|
100
|
+
console.error(chalk.red("Error:"), error.message);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
checkpointCmd.command("restore <checkpointId>").description("Restore from a checkpoint").action(async (checkpointId) => {
|
|
105
|
+
const spinner = ora("Restoring checkpoint...").start();
|
|
106
|
+
try {
|
|
107
|
+
const context = await initializeSkillContext();
|
|
108
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
109
|
+
const result = await skillsManager.executeSkill("checkpoint", ["restore", checkpointId]);
|
|
110
|
+
spinner.stop();
|
|
111
|
+
if (result.success) {
|
|
112
|
+
console.log(chalk.green("\u2713"), result.message);
|
|
113
|
+
if (result.data) {
|
|
114
|
+
console.log(chalk.cyan("\nRestored:"));
|
|
115
|
+
console.log(` Frames: ${result.data.frameCount}`);
|
|
116
|
+
console.log(` Files: ${result.data.filesRestored}`);
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
120
|
+
}
|
|
121
|
+
await context.database.disconnect();
|
|
122
|
+
} catch (error) {
|
|
123
|
+
spinner.stop();
|
|
124
|
+
console.error(chalk.red("Error:"), error.message);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
checkpointCmd.command("list").description("List available checkpoints").option("-l, --limit <number>", "Limit number of results", "10").option("-s, --since <date>", "Show checkpoints since date").action(async (options) => {
|
|
129
|
+
const spinner = ora("Loading checkpoints...").start();
|
|
130
|
+
try {
|
|
131
|
+
const context = await initializeSkillContext();
|
|
132
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
133
|
+
const result = await skillsManager.executeSkill("checkpoint", ["list"], {
|
|
134
|
+
limit: parseInt(options.limit),
|
|
135
|
+
since: options.since ? new Date(options.since) : void 0
|
|
136
|
+
});
|
|
137
|
+
spinner.stop();
|
|
138
|
+
if (result.success) {
|
|
139
|
+
console.log(chalk.cyan("Available Checkpoints:\n"));
|
|
140
|
+
if (result.data && result.data.length > 0) {
|
|
141
|
+
result.data.forEach((cp) => {
|
|
142
|
+
const riskIndicator = cp.risky ? chalk.yellow(" [RISKY]") : "";
|
|
143
|
+
console.log(`${chalk.bold(cp.id)}${riskIndicator}`);
|
|
144
|
+
console.log(` ${cp.description}`);
|
|
145
|
+
console.log(chalk.gray(` ${cp.timestamp} (${cp.frameCount} frames)
|
|
146
|
+
`));
|
|
147
|
+
});
|
|
148
|
+
} else {
|
|
149
|
+
console.log(chalk.gray("No checkpoints found"));
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
153
|
+
}
|
|
154
|
+
await context.database.disconnect();
|
|
155
|
+
} catch (error) {
|
|
156
|
+
spinner.stop();
|
|
157
|
+
console.error(chalk.red("Error:"), error.message);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
checkpointCmd.command("diff <checkpoint1> <checkpoint2>").description("Show differences between two checkpoints").action(async (checkpoint1, checkpoint2) => {
|
|
162
|
+
const spinner = ora("Comparing checkpoints...").start();
|
|
163
|
+
try {
|
|
164
|
+
const context = await initializeSkillContext();
|
|
165
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
166
|
+
const result = await skillsManager.executeSkill("checkpoint", ["diff", checkpoint1, checkpoint2]);
|
|
167
|
+
spinner.stop();
|
|
168
|
+
if (result.success) {
|
|
169
|
+
console.log(chalk.cyan("Checkpoint Diff:\n"));
|
|
170
|
+
if (result.data) {
|
|
171
|
+
console.log(` Time difference: ${result.data.timeDiff}`);
|
|
172
|
+
console.log(` Frame difference: ${result.data.framesDiff}`);
|
|
173
|
+
console.log(` New frames: ${result.data.newFrames}`);
|
|
174
|
+
console.log(` Removed frames: ${result.data.removedFrames}`);
|
|
175
|
+
console.log(` Modified frames: ${result.data.modifiedFrames}`);
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
179
|
+
}
|
|
180
|
+
await context.database.disconnect();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
spinner.stop();
|
|
183
|
+
console.error(chalk.red("Error:"), error.message);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
skillsCmd.command("dig <query>").description("Deep historical context retrieval").option("-d, --depth <depth>", "Search depth (e.g., 30days, 6months, all)", "30days").option("--patterns", "Extract patterns from results").option("--decisions", "Extract key decisions").option("--timeline", "Generate activity timeline").action(async (query, options) => {
|
|
188
|
+
const spinner = ora("Digging through context...").start();
|
|
189
|
+
try {
|
|
190
|
+
const context = await initializeSkillContext();
|
|
191
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
192
|
+
const result = await skillsManager.executeSkill("dig", [query], {
|
|
193
|
+
depth: options.depth,
|
|
194
|
+
patterns: options.patterns,
|
|
195
|
+
decisions: options.decisions,
|
|
196
|
+
timeline: options.timeline
|
|
197
|
+
});
|
|
198
|
+
spinner.stop();
|
|
199
|
+
if (result.success) {
|
|
200
|
+
console.log(chalk.green("\u2713"), result.message);
|
|
201
|
+
if (result.data) {
|
|
202
|
+
console.log(chalk.cyan(`
|
|
203
|
+
Searched ${result.data.timeRange.from} to ${result.data.timeRange.to}`));
|
|
204
|
+
if (result.data.summary) {
|
|
205
|
+
console.log("\n" + result.data.summary);
|
|
206
|
+
} else {
|
|
207
|
+
if (result.data.topResults?.length > 0) {
|
|
208
|
+
console.log(chalk.cyan("\nTop Results:"));
|
|
209
|
+
result.data.topResults.forEach((r) => {
|
|
210
|
+
console.log(` ${chalk.yellow(`[${r.score.toFixed(2)}]`)} ${r.summary}`);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (result.data.patterns?.length > 0) {
|
|
214
|
+
console.log(chalk.cyan("\nDetected Patterns:"));
|
|
215
|
+
result.data.patterns.forEach((p) => {
|
|
216
|
+
console.log(` ${p.name}: ${p.count} occurrences`);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (result.data.decisions?.length > 0) {
|
|
220
|
+
console.log(chalk.cyan("\nKey Decisions:"));
|
|
221
|
+
result.data.decisions.slice(0, 5).forEach((d) => {
|
|
222
|
+
console.log(` ${chalk.gray(new Date(d.timestamp).toLocaleDateString())}: ${d.decision}`);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
if (result.data.timeline?.length > 0) {
|
|
226
|
+
console.log(chalk.cyan("\nActivity Timeline:"));
|
|
227
|
+
result.data.timeline.slice(0, 5).forEach((t) => {
|
|
228
|
+
console.log(` ${t.date}: ${t.itemCount} activities`);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
console.log(chalk.red("\u2717"), result.message);
|
|
235
|
+
}
|
|
236
|
+
await context.database.disconnect();
|
|
237
|
+
} catch (error) {
|
|
238
|
+
spinner.stop();
|
|
239
|
+
console.error(chalk.red("Error:"), error.message);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
skillsCmd.command("help [skill]").description("Show help for a specific skill").action(async (skill) => {
|
|
244
|
+
const context = await initializeSkillContext();
|
|
245
|
+
const skillsManager = new ClaudeSkillsManager(context);
|
|
246
|
+
if (skill) {
|
|
247
|
+
console.log(skillsManager.getSkillHelp(skill));
|
|
248
|
+
} else {
|
|
249
|
+
console.log(chalk.cyan("Available Claude Skills:\n"));
|
|
250
|
+
console.log(" handoff - Streamline frame handoffs between team members");
|
|
251
|
+
console.log(" checkpoint - Create and manage recovery points");
|
|
252
|
+
console.log(" dig - Deep historical context retrieval\n");
|
|
253
|
+
console.log('Use "stackmemory skills help <skill>" for detailed help on each skill');
|
|
254
|
+
}
|
|
255
|
+
await context.database.disconnect();
|
|
256
|
+
});
|
|
257
|
+
return skillsCmd;
|
|
258
|
+
}
|
|
259
|
+
export {
|
|
260
|
+
createSkillsCommand
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/cli/commands/skills.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Claude Skills CLI Commands\n * Integrates Claude skills into the stackmemory CLI\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ClaudeSkillsManager, type SkillContext } from '../../skills/claude-skills.js';\nimport { DualStackManager } from '../../core/context/dual-stack-manager.js';\nimport { FrameHandoffManager } from '../../core/context/frame-handoff-manager.js';\nimport { ContextRetriever } from '../../core/retrieval/context-retriever.js';\nimport { SQLiteAdapter } from '../../core/database/sqlite-adapter.js';\nimport { ConfigManager } from '../../core/config/config-manager.js';\nimport * as path from 'path';\nimport * as os from 'os';\n\nasync function initializeSkillContext(): Promise<SkillContext> {\n const config = ConfigManager.getInstance();\n const projectId = config.get('project.id');\n const userId = config.get('user.id') || process.env.USER || 'default';\n \n const dbPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'data',\n projectId,\n 'stackmemory.db'\n );\n\n const database = new SQLiteAdapter(projectId, { dbPath });\n await database.connect();\n\n const dualStackManager = new DualStackManager(database, projectId, userId);\n const handoffManager = new FrameHandoffManager(dualStackManager);\n const contextRetriever = new ContextRetriever(database);\n\n return {\n projectId,\n userId,\n dualStackManager,\n handoffManager,\n contextRetriever,\n database,\n };\n}\n\nexport function createSkillsCommand(): Command {\n const skillsCmd = new Command('skills')\n .description('Execute Claude skills for enhanced workflow');\n\n // Handoff skill command\n skillsCmd\n .command('handoff <targetUser> <message>')\n .description('Streamline frame handoffs between team members')\n .option('-p, --priority <level>', 'Set priority (low, medium, high, critical)', 'medium')\n .option('-f, --frames <frames...>', 'Specific frames to handoff')\n .option('--no-auto-detect', 'Disable auto-detection of frames')\n .action(async (targetUser, message, options) => {\n const spinner = ora('Initiating handoff...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('handoff', [targetUser, message], {\n priority: options.priority,\n frames: options.frames,\n autoDetect: options.autoDetect !== false,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nHandoff Details:'));\n console.log(` ID: ${result.data.handoffId}`);\n console.log(` Frames: ${result.data.frameCount}`);\n console.log(` Priority: ${result.data.priority}`);\n if (result.data.actionItems?.length > 0) {\n console.log(chalk.yellow('\\n Action Items:'));\n result.data.actionItems.forEach(item => {\n console.log(` \u2022 ${item}`);\n });\n }\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Checkpoint skill commands\n const checkpointCmd = skillsCmd.command('checkpoint')\n .description('Create and manage recovery points');\n\n checkpointCmd\n .command('create <description>')\n .description('Create a new checkpoint')\n .option('--files <files...>', 'Include specific files in checkpoint')\n .option('--auto-detect-risky', 'Auto-detect risky operations')\n .action(async (description, options) => {\n const spinner = ora('Creating checkpoint...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['create', description], {\n includeFiles: options.files,\n autoDetectRisky: options.autoDetectRisky,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nCheckpoint Info:'));\n console.log(` ID: ${result.data.checkpointId}`);\n console.log(` Time: ${result.data.timestamp}`);\n console.log(` Frames: ${result.data.frameCount}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('restore <checkpointId>')\n .description('Restore from a checkpoint')\n .action(async (checkpointId) => {\n const spinner = ora('Restoring checkpoint...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['restore', checkpointId]);\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n if (result.data) {\n console.log(chalk.cyan('\\nRestored:'));\n console.log(` Frames: ${result.data.frameCount}`);\n console.log(` Files: ${result.data.filesRestored}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('list')\n .description('List available checkpoints')\n .option('-l, --limit <number>', 'Limit number of results', '10')\n .option('-s, --since <date>', 'Show checkpoints since date')\n .action(async (options) => {\n const spinner = ora('Loading checkpoints...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['list'], {\n limit: parseInt(options.limit),\n since: options.since ? new Date(options.since) : undefined,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.cyan('Available Checkpoints:\\n'));\n if (result.data && result.data.length > 0) {\n result.data.forEach((cp: any) => {\n const riskIndicator = cp.risky ? chalk.yellow(' [RISKY]') : '';\n console.log(`${chalk.bold(cp.id)}${riskIndicator}`);\n console.log(` ${cp.description}`);\n console.log(chalk.gray(` ${cp.timestamp} (${cp.frameCount} frames)\\n`));\n });\n } else {\n console.log(chalk.gray('No checkpoints found'));\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n checkpointCmd\n .command('diff <checkpoint1> <checkpoint2>')\n .description('Show differences between two checkpoints')\n .action(async (checkpoint1, checkpoint2) => {\n const spinner = ora('Comparing checkpoints...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('checkpoint', ['diff', checkpoint1, checkpoint2]);\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.cyan('Checkpoint Diff:\\n'));\n if (result.data) {\n console.log(` Time difference: ${result.data.timeDiff}`);\n console.log(` Frame difference: ${result.data.framesDiff}`);\n console.log(` New frames: ${result.data.newFrames}`);\n console.log(` Removed frames: ${result.data.removedFrames}`);\n console.log(` Modified frames: ${result.data.modifiedFrames}`);\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Context Archaeologist skill command\n skillsCmd\n .command('dig <query>')\n .description('Deep historical context retrieval')\n .option('-d, --depth <depth>', 'Search depth (e.g., 30days, 6months, all)', '30days')\n .option('--patterns', 'Extract patterns from results')\n .option('--decisions', 'Extract key decisions')\n .option('--timeline', 'Generate activity timeline')\n .action(async (query, options) => {\n const spinner = ora('Digging through context...').start();\n \n try {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n const result = await skillsManager.executeSkill('dig', [query], {\n depth: options.depth,\n patterns: options.patterns,\n decisions: options.decisions,\n timeline: options.timeline,\n });\n\n spinner.stop();\n\n if (result.success) {\n console.log(chalk.green('\u2713'), result.message);\n \n if (result.data) {\n console.log(chalk.cyan(`\\nSearched ${result.data.timeRange.from} to ${result.data.timeRange.to}`));\n \n if (result.data.summary) {\n console.log('\\n' + result.data.summary);\n } else {\n // Display top results\n if (result.data.topResults?.length > 0) {\n console.log(chalk.cyan('\\nTop Results:'));\n result.data.topResults.forEach((r: any) => {\n console.log(` ${chalk.yellow(`[${r.score.toFixed(2)}]`)} ${r.summary}`);\n });\n }\n\n // Display patterns if found\n if (result.data.patterns?.length > 0) {\n console.log(chalk.cyan('\\nDetected Patterns:'));\n result.data.patterns.forEach((p: any) => {\n console.log(` ${p.name}: ${p.count} occurrences`);\n });\n }\n\n // Display decisions if found\n if (result.data.decisions?.length > 0) {\n console.log(chalk.cyan('\\nKey Decisions:'));\n result.data.decisions.slice(0, 5).forEach((d: any) => {\n console.log(` ${chalk.gray(new Date(d.timestamp).toLocaleDateString())}: ${d.decision}`);\n });\n }\n\n // Display timeline if generated\n if (result.data.timeline?.length > 0) {\n console.log(chalk.cyan('\\nActivity Timeline:'));\n result.data.timeline.slice(0, 5).forEach((t: any) => {\n console.log(` ${t.date}: ${t.itemCount} activities`);\n });\n }\n }\n }\n } else {\n console.log(chalk.red('\u2717'), result.message);\n }\n\n await context.database.disconnect();\n } catch (error) {\n spinner.stop();\n console.error(chalk.red('Error:'), error.message);\n process.exit(1);\n }\n });\n\n // Help command for skills\n skillsCmd\n .command('help [skill]')\n .description('Show help for a specific skill')\n .action(async (skill) => {\n const context = await initializeSkillContext();\n const skillsManager = new ClaudeSkillsManager(context);\n \n if (skill) {\n console.log(skillsManager.getSkillHelp(skill));\n } else {\n console.log(chalk.cyan('Available Claude Skills:\\n'));\n console.log(' handoff - Streamline frame handoffs between team members');\n console.log(' checkpoint - Create and manage recovery points');\n console.log(' dig - Deep historical context retrieval\\n');\n console.log('Use \"stackmemory skills help <skill>\" for detailed help on each skill');\n }\n \n await context.database.disconnect();\n });\n\n return skillsCmd;\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
process.env.STACKMEMORY_CLI = "true";
|
|
2
3
|
import { program } from "commander";
|
|
3
4
|
import { logger } from "../core/monitoring/logger.js";
|
|
4
5
|
import { FrameManager } from "../core/context/frame-manager.js";
|
|
@@ -27,6 +28,7 @@ import { registerLinearTestCommand } from "./commands/linear-test.js";
|
|
|
27
28
|
import { registerLinearListCommand } from "./commands/linear-list.js";
|
|
28
29
|
import { registerLinearMigrateCommand } from "./commands/linear-migrate.js";
|
|
29
30
|
import { registerLinearCreateCommand } from "./commands/linear-create.js";
|
|
31
|
+
import { createChromaDBCommand } from "./commands/chromadb.js";
|
|
30
32
|
import { createSessionCommands } from "./commands/session.js";
|
|
31
33
|
import { registerWorktreeCommands } from "./commands/worktree.js";
|
|
32
34
|
import { registerOnboardingCommand } from "./commands/onboard.js";
|
|
@@ -39,6 +41,7 @@ import { createConfigCommand } from "./commands/config.js";
|
|
|
39
41
|
import { createAgentCommand } from "./commands/agent.js";
|
|
40
42
|
import { createHandoffCommand } from "./commands/handoff.js";
|
|
41
43
|
import { createStorageCommand } from "./commands/storage.js";
|
|
44
|
+
import { createSkillsCommand } from "./commands/skills.js";
|
|
42
45
|
import clearCommand from "./commands/clear.js";
|
|
43
46
|
import createWorkflowCommand from "./commands/workflow.js";
|
|
44
47
|
import monitorCommand from "./commands/monitor.js";
|
|
@@ -970,6 +973,7 @@ registerLinearTestCommand(program);
|
|
|
970
973
|
registerLinearListCommand(program);
|
|
971
974
|
registerLinearMigrateCommand(program);
|
|
972
975
|
registerLinearCreateCommand(program);
|
|
976
|
+
program.addCommand(createChromaDBCommand());
|
|
973
977
|
program.addCommand(createSessionCommands());
|
|
974
978
|
program.addCommand(webhookCommand());
|
|
975
979
|
program.addCommand(createTaskCommands());
|
|
@@ -980,6 +984,7 @@ program.addCommand(createConfigCommand());
|
|
|
980
984
|
program.addCommand(createAgentCommand());
|
|
981
985
|
program.addCommand(createHandoffCommand());
|
|
982
986
|
program.addCommand(createStorageCommand());
|
|
987
|
+
program.addCommand(createSkillsCommand());
|
|
983
988
|
program.addCommand(clearCommand);
|
|
984
989
|
program.addCommand(createWorkflowCommand());
|
|
985
990
|
program.addCommand(monitorCommand);
|