@stackmemoryai/stackmemory 0.5.22 → 0.5.24

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.
Files changed (77) hide show
  1. package/dist/cli/claude-sm.js +2 -0
  2. package/dist/cli/claude-sm.js.map +2 -2
  3. package/dist/cli/commands/discovery.js +279 -0
  4. package/dist/cli/commands/discovery.js.map +7 -0
  5. package/dist/cli/commands/retrieval.js +248 -0
  6. package/dist/cli/commands/retrieval.js.map +7 -0
  7. package/dist/cli/index.js +4 -0
  8. package/dist/cli/index.js.map +2 -2
  9. package/dist/core/retrieval/llm-context-retrieval.js +33 -1
  10. package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
  11. package/dist/core/retrieval/llm-provider.js +128 -0
  12. package/dist/core/retrieval/llm-provider.js.map +7 -0
  13. package/dist/core/retrieval/retrieval-audit.js +236 -0
  14. package/dist/core/retrieval/retrieval-audit.js.map +7 -0
  15. package/dist/integrations/linear/client.js +125 -0
  16. package/dist/integrations/linear/client.js.map +2 -2
  17. package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
  18. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  19. package/dist/integrations/mcp/handlers/index.js +40 -12
  20. package/dist/integrations/mcp/handlers/index.js.map +2 -2
  21. package/dist/integrations/mcp/server.js +270 -0
  22. package/dist/integrations/mcp/server.js.map +2 -2
  23. package/dist/integrations/mcp/tool-definitions.js +141 -5
  24. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  25. package/package.json +1 -1
  26. package/dist/cli/commands/agent.js +0 -286
  27. package/dist/cli/commands/agent.js.map +0 -7
  28. package/dist/cli/commands/chromadb.js +0 -482
  29. package/dist/cli/commands/chromadb.js.map +0 -7
  30. package/dist/cli/commands/gc.js +0 -251
  31. package/dist/cli/commands/gc.js.map +0 -7
  32. package/dist/cli/commands/infinite-storage.js +0 -292
  33. package/dist/cli/commands/infinite-storage.js.map +0 -7
  34. package/dist/cli/commands/linear-create.js +0 -171
  35. package/dist/cli/commands/linear-create.js.map +0 -7
  36. package/dist/cli/commands/linear-list.js +0 -103
  37. package/dist/cli/commands/linear-list.js.map +0 -7
  38. package/dist/cli/commands/linear-migrate.js +0 -64
  39. package/dist/cli/commands/linear-migrate.js.map +0 -7
  40. package/dist/cli/commands/linear-test.js +0 -134
  41. package/dist/cli/commands/linear-test.js.map +0 -7
  42. package/dist/cli/commands/tui.js +0 -77
  43. package/dist/cli/commands/tui.js.map +0 -7
  44. package/dist/cli/commands/webhook.js +0 -181
  45. package/dist/cli/commands/webhook.js.map +0 -7
  46. package/dist/cli/streamlined-cli.js +0 -144
  47. package/dist/cli/streamlined-cli.js.map +0 -7
  48. package/dist/core/events/event-bus.js +0 -110
  49. package/dist/core/events/event-bus.js.map +0 -7
  50. package/dist/core/frame/workflow-templates-stub.js +0 -42
  51. package/dist/core/frame/workflow-templates-stub.js.map +0 -7
  52. package/dist/core/plugins/plugin-interface.js +0 -87
  53. package/dist/core/plugins/plugin-interface.js.map +0 -7
  54. package/dist/core/session/clear-survival-stub.js +0 -53
  55. package/dist/core/session/clear-survival-stub.js.map +0 -7
  56. package/dist/core/storage/chromadb-simple.js +0 -172
  57. package/dist/core/storage/chromadb-simple.js.map +0 -7
  58. package/dist/core/storage/simplified-storage.js +0 -328
  59. package/dist/core/storage/simplified-storage.js.map +0 -7
  60. package/dist/features/tasks/pebbles-task-store.js +0 -647
  61. package/dist/features/tasks/pebbles-task-store.js.map +0 -7
  62. package/dist/integrations/linear/sync-enhanced.js +0 -202
  63. package/dist/integrations/linear/sync-enhanced.js.map +0 -7
  64. package/dist/plugins/linear/index.js +0 -166
  65. package/dist/plugins/linear/index.js.map +0 -7
  66. package/dist/plugins/loader.js +0 -57
  67. package/dist/plugins/loader.js.map +0 -7
  68. package/dist/plugins/plugin-interface.js +0 -67
  69. package/dist/plugins/plugin-interface.js.map +0 -7
  70. package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
  71. package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
  72. package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
  73. package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
  74. package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
  75. package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
  76. package/dist/utils/logger.js +0 -52
  77. package/dist/utils/logger.js.map +0 -7
@@ -1,171 +0,0 @@
1
- import chalk from "chalk";
2
- import { LinearRestClient } from "../../integrations/linear/rest-client.js";
3
- function getEnv(key, defaultValue) {
4
- const value = process.env[key];
5
- if (value === void 0) {
6
- if (defaultValue !== void 0) return defaultValue;
7
- throw new Error(`Environment variable ${key} is required`);
8
- }
9
- return value;
10
- }
11
- function getOptionalEnv(key) {
12
- return process.env[key];
13
- }
14
- function registerLinearCreateCommand(parent) {
15
- parent.command("linear:create").description("Create a new Linear task in the correct project").option("--api-key <key>", "Linear API key for target workspace").option("--title <title>", "Task title (required)").option("--description <desc>", "Task description").option(
16
- "--priority <level>",
17
- "Priority: urgent(1), high(2), medium(3), low(4)",
18
- "3"
19
- ).option(
20
- "--state <state>",
21
- "Initial state: backlog, todo, started",
22
- "backlog"
23
- ).action(async (options) => {
24
- try {
25
- const apiKey = options.apiKey || process.env["LINEAR_NEW_API_KEY"];
26
- if (!apiKey) {
27
- console.error(
28
- chalk.red(
29
- "\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY"
30
- )
31
- );
32
- return;
33
- }
34
- if (!options.title) {
35
- console.error(
36
- chalk.red('\u274C Task title required. Use --title "Your task title"')
37
- );
38
- return;
39
- }
40
- const client = new LinearRestClient(apiKey);
41
- console.log(chalk.yellow("\u{1F504} Creating new Linear task..."));
42
- const team = await client.getTeam();
43
- console.log(chalk.cyan(`\u{1F3AF} Target team: ${team.name} (${team.key})`));
44
- const createQuery = `
45
- mutation CreateIssue($input: IssueCreateInput!) {
46
- issueCreate(input: $input) {
47
- success
48
- issue {
49
- id
50
- identifier
51
- title
52
- description
53
- state {
54
- id
55
- name
56
- type
57
- }
58
- priority
59
- url
60
- createdAt
61
- }
62
- }
63
- }
64
- `;
65
- const taskInput = {
66
- title: options.title,
67
- description: options.description || "",
68
- teamId: team.id,
69
- priority: parseInt(options.priority)
70
- };
71
- const response = await client.makeRequest(createQuery, { input: taskInput });
72
- if (!response.data?.issueCreate?.success) {
73
- throw new Error("Failed to create task in Linear");
74
- }
75
- const task = response.data.issueCreate.issue;
76
- console.log(chalk.green("\n\u2705 Task created successfully!"));
77
- console.log(chalk.blue(`\u{1F4CB} ${task.identifier}: ${task.title}`));
78
- console.log(chalk.gray(` State: ${task.state.name}`));
79
- console.log(chalk.gray(` Priority: ${task.priority}`));
80
- console.log(chalk.gray(` URL: ${task.url}`));
81
- if (options.description) {
82
- console.log(chalk.gray(` Description: ${options.description}`));
83
- }
84
- } catch (error) {
85
- console.error(
86
- chalk.red("\u274C Task creation failed:"),
87
- error.message
88
- );
89
- }
90
- });
91
- parent.command("linear:quick").description("Quick task creation with prompts").option("--api-key <key>", "Linear API key for target workspace").action(async (options) => {
92
- try {
93
- const apiKey = options.apiKey || process.env["LINEAR_NEW_API_KEY"];
94
- if (!apiKey) {
95
- console.error(
96
- chalk.red(
97
- "\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY"
98
- )
99
- );
100
- return;
101
- }
102
- const readline = await import("readline");
103
- const rl = readline.createInterface({
104
- input: process.stdin,
105
- output: process.stdout
106
- });
107
- const question = (prompt) => {
108
- return new Promise((resolve) => {
109
- rl.question(prompt, resolve);
110
- });
111
- };
112
- console.log(chalk.blue("\u{1F4DD} Quick Linear Task Creation"));
113
- console.log(chalk.gray("Press Ctrl+C to cancel at any time\n"));
114
- const title = await question(chalk.yellow("Task title: "));
115
- if (!title.trim()) {
116
- console.log(chalk.red("\u274C Title is required"));
117
- rl.close();
118
- return;
119
- }
120
- const description = await question(
121
- chalk.yellow("Description (optional): ")
122
- );
123
- const priorityInput = await question(
124
- chalk.yellow("Priority (1=urgent, 2=high, 3=medium, 4=low) [3]: ")
125
- );
126
- const priority = priorityInput.trim() || "3";
127
- rl.close();
128
- console.log(chalk.yellow("\n\u{1F504} Creating task..."));
129
- const client = new LinearRestClient(apiKey);
130
- const team = await client.getTeam();
131
- const createQuery = `
132
- mutation CreateIssue($input: IssueCreateInput!) {
133
- issueCreate(input: $input) {
134
- success
135
- issue {
136
- id
137
- identifier
138
- title
139
- state { name }
140
- priority
141
- url
142
- }
143
- }
144
- }
145
- `;
146
- const taskInput = {
147
- title: title.trim(),
148
- description: description.trim() || void 0,
149
- teamId: team.id,
150
- priority: parseInt(priority)
151
- };
152
- const response = await client.makeRequest(createQuery, { input: taskInput });
153
- if (!response.data?.issueCreate?.success) {
154
- throw new Error("Failed to create task in Linear");
155
- }
156
- const task = response.data.issueCreate.issue;
157
- console.log(chalk.green("\n\u2705 Task created successfully!"));
158
- console.log(chalk.blue(`\u{1F4CB} ${task.identifier}: ${task.title}`));
159
- console.log(chalk.gray(` URL: ${task.url}`));
160
- } catch (error) {
161
- console.error(
162
- chalk.red("\u274C Task creation failed:"),
163
- error.message
164
- );
165
- }
166
- });
167
- }
168
- export {
169
- registerLinearCreateCommand
170
- };
171
- //# sourceMappingURL=linear-create.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/linear-create.ts"],
4
- "sourcesContent": ["/**\n * Linear Task Creation Command\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { LinearRestClient } from '../../integrations/linear/rest-client.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport function registerLinearCreateCommand(parent: Command) {\n parent\n .command('linear:create')\n .description('Create a new Linear task in the correct project')\n .option('--api-key <key>', 'Linear API key for target workspace')\n .option('--title <title>', 'Task title (required)')\n .option('--description <desc>', 'Task description')\n .option(\n '--priority <level>',\n 'Priority: urgent(1), high(2), medium(3), low(4)',\n '3'\n )\n .option(\n '--state <state>',\n 'Initial state: backlog, todo, started',\n 'backlog'\n )\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env['LINEAR_NEW_API_KEY'];\n\n if (!apiKey) {\n console.error(\n chalk.red(\n '\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY'\n )\n );\n return;\n }\n\n if (!options.title) {\n console.error(\n chalk.red('\u274C Task title required. Use --title \"Your task title\"')\n );\n return;\n }\n\n const client = new LinearRestClient(apiKey);\n\n console.log(chalk.yellow('\uD83D\uDD04 Creating new Linear task...'));\n\n // Get team info\n const team = await client.getTeam();\n console.log(chalk.cyan(`\uD83C\uDFAF Target team: ${team.name} (${team.key})`));\n\n // Create the task\n const createQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n description\n state {\n id\n name\n type\n }\n priority\n url\n createdAt\n }\n }\n }\n `;\n\n const taskInput = {\n title: options.title,\n description: options.description || '',\n teamId: team.id,\n priority: parseInt(options.priority),\n };\n\n const response = await client.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new Error('Failed to create task in Linear');\n }\n\n const task = response.data.issueCreate.issue;\n\n console.log(chalk.green('\\n\u2705 Task created successfully!'));\n console.log(chalk.blue(`\uD83D\uDCCB ${task.identifier}: ${task.title}`));\n console.log(chalk.gray(` State: ${task.state.name}`));\n console.log(chalk.gray(` Priority: ${task.priority}`));\n console.log(chalk.gray(` URL: ${task.url}`));\n\n if (options.description) {\n console.log(chalk.gray(` Description: ${options.description}`));\n }\n } catch (error: unknown) {\n console.error(\n chalk.red('\u274C Task creation failed:'),\n (error as Error).message\n );\n }\n });\n\n parent\n .command('linear:quick')\n .description('Quick task creation with prompts')\n .option('--api-key <key>', 'Linear API key for target workspace')\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env['LINEAR_NEW_API_KEY'];\n\n if (!apiKey) {\n console.error(\n chalk.red(\n '\u274C API key required. Use --api-key or set LINEAR_NEW_API_KEY'\n )\n );\n return;\n }\n\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, resolve);\n });\n };\n\n console.log(chalk.blue('\uD83D\uDCDD Quick Linear Task Creation'));\n console.log(chalk.gray('Press Ctrl+C to cancel at any time\\n'));\n\n const title = await question(chalk.yellow('Task title: '));\n if (!title.trim()) {\n console.log(chalk.red('\u274C Title is required'));\n rl.close();\n return;\n }\n\n const description = await question(\n chalk.yellow('Description (optional): ')\n );\n const priorityInput = await question(\n chalk.yellow('Priority (1=urgent, 2=high, 3=medium, 4=low) [3]: ')\n );\n const priority = priorityInput.trim() || '3';\n\n rl.close();\n\n console.log(chalk.yellow('\\n\uD83D\uDD04 Creating task...'));\n\n const client = new LinearRestClient(apiKey);\n const team = await client.getTeam();\n\n const createQuery = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n state { name }\n priority\n url\n }\n }\n }\n `;\n\n const taskInput = {\n title: title.trim(),\n description: description.trim() || undefined,\n teamId: team.id,\n priority: parseInt(priority),\n };\n\n const response = await client.makeRequest<{\n data: {\n issueCreate: {\n success: boolean;\n issue: any;\n };\n };\n }>(createQuery, { input: taskInput });\n\n if (!response.data?.issueCreate?.success) {\n throw new Error('Failed to create task in Linear');\n }\n\n const task = response.data.issueCreate.issue;\n\n console.log(chalk.green('\\n\u2705 Task created successfully!'));\n console.log(chalk.blue(`\uD83D\uDCCB ${task.identifier}: ${task.title}`));\n console.log(chalk.gray(` URL: ${task.url}`));\n } catch (error: unknown) {\n console.error(\n chalk.red('\u274C Task creation failed:'),\n (error as Error).message\n );\n }\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,103 +0,0 @@
1
- import chalk from "chalk";
2
- import { LinearRestClient } from "../../integrations/linear/rest-client.js";
3
- function getEnv(key, defaultValue) {
4
- const value = process.env[key];
5
- if (value === void 0) {
6
- if (defaultValue !== void 0) return defaultValue;
7
- throw new Error(`Environment variable ${key} is required`);
8
- }
9
- return value;
10
- }
11
- function getOptionalEnv(key) {
12
- return process.env[key];
13
- }
14
- function registerLinearListCommand(parent) {
15
- parent.command("linear:list").alias("linear:ls").description("List Linear tasks (fast, memory-cached)").option("--limit <n>", "Number of tasks to show", "20").option(
16
- "--status <status>",
17
- "Filter by status (backlog, started, completed, etc.)"
18
- ).option("--my", "Show only tasks assigned to me").option("--cache", "Show cache stats only").option("--refresh", "Force refresh cache").option("--count", "Show count by status only").action(async (options) => {
19
- try {
20
- const apiKey = process.env["LINEAR_API_KEY"];
21
- if (!apiKey) {
22
- console.log(
23
- chalk.yellow("\u26A0 Set LINEAR_API_KEY environment variable")
24
- );
25
- return;
26
- }
27
- const restClient = new LinearRestClient(apiKey);
28
- if (options.cache) {
29
- const stats = restClient.getCacheStats();
30
- console.log(chalk.cyan("\u{1F4CA} Cache Stats:"));
31
- console.log(` Size: ${stats.size} tasks`);
32
- console.log(` Age: ${Math.round(stats.age / 1e3)}s`);
33
- console.log(` Fresh: ${stats.fresh ? "yes" : "no"}`);
34
- console.log(
35
- ` Last sync: ${new Date(stats.lastSync).toLocaleString()}`
36
- );
37
- return;
38
- }
39
- if (options.count) {
40
- const counts = await restClient.getTaskCounts();
41
- console.log(chalk.cyan("\u{1F4CA} Task Counts:"));
42
- Object.entries(counts).sort(([, a], [, b]) => b - a).forEach(([status, count]) => {
43
- console.log(` ${status}: ${count}`);
44
- });
45
- const cacheStats2 = restClient.getCacheStats();
46
- console.log(
47
- chalk.gray(
48
- `
49
- Cache: ${cacheStats2.size} tasks, age: ${Math.round(cacheStats2.age / 1e3)}s`
50
- )
51
- );
52
- return;
53
- }
54
- let tasks;
55
- if (options.my) {
56
- tasks = await restClient.getMyTasks();
57
- } else if (options.status) {
58
- tasks = await restClient.getTasksByStatus(options.status);
59
- } else {
60
- tasks = await restClient.getAllTasks(options.refresh);
61
- }
62
- if (!tasks || tasks.length === 0) {
63
- console.log(chalk.gray("No tasks found"));
64
- return;
65
- }
66
- const limit = parseInt(options.limit);
67
- const displayTasks = tasks.slice(0, limit);
68
- console.log(
69
- chalk.cyan(
70
- `
71
- \u{1F4CB} Linear Tasks (${displayTasks.length}/${tasks.length}):`
72
- )
73
- );
74
- displayTasks.forEach((task) => {
75
- const priority = task.priority ? `P${task.priority}` : "";
76
- const assignee = task.assignee ? ` @${task.assignee.name}` : "";
77
- const statusColor = task.state.type === "completed" ? chalk.green : task.state.type === "started" ? chalk.yellow : chalk.gray;
78
- console.log(`${chalk.blue(task.identifier)} ${task.title}`);
79
- console.log(
80
- chalk.gray(
81
- ` ${statusColor(task.state.name)} ${priority}${assignee}`
82
- )
83
- );
84
- });
85
- const cacheStats = restClient.getCacheStats();
86
- console.log(
87
- chalk.gray(
88
- `
89
- ${displayTasks.length} shown, ${tasks.length} total \u2022 Cache: ${Math.round(cacheStats.age / 1e3)}s old`
90
- )
91
- );
92
- } catch (error) {
93
- console.error(
94
- chalk.red("Failed to list tasks:"),
95
- error.message
96
- );
97
- }
98
- });
99
- }
100
- export {
101
- registerLinearListCommand
102
- };
103
- //# sourceMappingURL=linear-list.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/linear-list.ts"],
4
- "sourcesContent": ["/**\n * Simple Linear task list command using memory cache\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { LinearRestClient } from '../../integrations/linear/rest-client.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport function registerLinearListCommand(parent: Command) {\n parent\n .command('linear:list')\n .alias('linear:ls')\n .description('List Linear tasks (fast, memory-cached)')\n .option('--limit <n>', 'Number of tasks to show', '20')\n .option(\n '--status <status>',\n 'Filter by status (backlog, started, completed, etc.)'\n )\n .option('--my', 'Show only tasks assigned to me')\n .option('--cache', 'Show cache stats only')\n .option('--refresh', 'Force refresh cache')\n .option('--count', 'Show count by status only')\n .action(async (options) => {\n try {\n const apiKey = process.env['LINEAR_API_KEY'];\n if (!apiKey) {\n console.log(\n chalk.yellow('\u26A0 Set LINEAR_API_KEY environment variable')\n );\n return;\n }\n\n const restClient = new LinearRestClient(apiKey);\n\n // Show cache stats if requested\n if (options.cache) {\n const stats = restClient.getCacheStats();\n console.log(chalk.cyan('\uD83D\uDCCA Cache Stats:'));\n console.log(` Size: ${stats.size} tasks`);\n console.log(` Age: ${Math.round(stats.age / 1000)}s`);\n console.log(` Fresh: ${stats.fresh ? 'yes' : 'no'}`);\n console.log(\n ` Last sync: ${new Date(stats.lastSync).toLocaleString()}`\n );\n return;\n }\n\n // Show counts only\n if (options.count) {\n const counts = await restClient.getTaskCounts();\n console.log(chalk.cyan('\uD83D\uDCCA Task Counts:'));\n Object.entries(counts)\n .sort(([, a], [, b]) => b - a)\n .forEach(([status, count]) => {\n console.log(` ${status}: ${count}`);\n });\n\n const cacheStats = restClient.getCacheStats();\n console.log(\n chalk.gray(\n `\\nCache: ${cacheStats.size} tasks, age: ${Math.round(cacheStats.age / 1000)}s`\n )\n );\n return;\n }\n\n let tasks;\n if (options.my) {\n tasks = await restClient.getMyTasks();\n } else if (options.status) {\n tasks = await restClient.getTasksByStatus(options.status);\n } else {\n tasks = await restClient.getAllTasks(options.refresh);\n }\n\n if (!tasks || tasks.length === 0) {\n console.log(chalk.gray('No tasks found'));\n return;\n }\n\n // Limit results\n const limit = parseInt(options.limit);\n const displayTasks = tasks.slice(0, limit);\n\n console.log(\n chalk.cyan(\n `\\n\uD83D\uDCCB Linear Tasks (${displayTasks.length}/${tasks.length}):`\n )\n );\n\n displayTasks.forEach((task) => {\n const priority = task.priority ? `P${task.priority}` : '';\n const assignee = task.assignee ? ` @${task.assignee.name}` : '';\n const statusColor =\n task.state.type === 'completed'\n ? chalk.green\n : task.state.type === 'started'\n ? chalk.yellow\n : chalk.gray;\n\n console.log(`${chalk.blue(task.identifier)} ${task.title}`);\n console.log(\n chalk.gray(\n ` ${statusColor(task.state.name)} ${priority}${assignee}`\n )\n );\n });\n\n const cacheStats = restClient.getCacheStats();\n console.log(\n chalk.gray(\n `\\n${displayTasks.length} shown, ${tasks.length} total \u2022 Cache: ${Math.round(cacheStats.age / 1000)}s old`\n )\n );\n } catch (error: unknown) {\n console.error(\n chalk.red('Failed to list tasks:'),\n (error as Error).message\n );\n }\n });\n}\n"],
5
- "mappings": "AAIA,OAAO,WAAW;AAElB,SAAS,wBAAwB;AAEjC,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAEO,SAAS,0BAA0B,QAAiB;AACzD,SACG,QAAQ,aAAa,EACrB,MAAM,WAAW,EACjB,YAAY,yCAAyC,EACrD,OAAO,eAAe,2BAA2B,IAAI,EACrD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,QAAQ,gCAAgC,EAC/C,OAAO,WAAW,uBAAuB,EACzC,OAAO,aAAa,qBAAqB,EACzC,OAAO,WAAW,2BAA2B,EAC7C,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,SAAS,QAAQ,IAAI,gBAAgB;AAC3C,UAAI,CAAC,QAAQ;AACX,gBAAQ;AAAA,UACN,MAAM,OAAO,gDAA2C;AAAA,QAC1D;AACA;AAAA,MACF;AAEA,YAAM,aAAa,IAAI,iBAAiB,MAAM;AAG9C,UAAI,QAAQ,OAAO;AACjB,cAAM,QAAQ,WAAW,cAAc;AACvC,gBAAQ,IAAI,MAAM,KAAK,wBAAiB,CAAC;AACzC,gBAAQ,IAAI,WAAW,MAAM,IAAI,QAAQ;AACzC,gBAAQ,IAAI,UAAU,KAAK,MAAM,MAAM,MAAM,GAAI,CAAC,GAAG;AACrD,gBAAQ,IAAI,YAAY,MAAM,QAAQ,QAAQ,IAAI,EAAE;AACpD,gBAAQ;AAAA,UACN,gBAAgB,IAAI,KAAK,MAAM,QAAQ,EAAE,eAAe,CAAC;AAAA,QAC3D;AACA;AAAA,MACF;AAGA,UAAI,QAAQ,OAAO;AACjB,cAAM,SAAS,MAAM,WAAW,cAAc;AAC9C,gBAAQ,IAAI,MAAM,KAAK,wBAAiB,CAAC;AACzC,eAAO,QAAQ,MAAM,EAClB,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,QAAQ,CAAC,CAAC,QAAQ,KAAK,MAAM;AAC5B,kBAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,EAAE;AAAA,QACrC,CAAC;AAEH,cAAMA,cAAa,WAAW,cAAc;AAC5C,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,SAAYA,YAAW,IAAI,gBAAgB,KAAK,MAAMA,YAAW,MAAM,GAAI,CAAC;AAAA,UAC9E;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,QAAQ,IAAI;AACd,gBAAQ,MAAM,WAAW,WAAW;AAAA,MACtC,WAAW,QAAQ,QAAQ;AACzB,gBAAQ,MAAM,WAAW,iBAAiB,QAAQ,MAAM;AAAA,MAC1D,OAAO;AACL,gBAAQ,MAAM,WAAW,YAAY,QAAQ,OAAO;AAAA,MACtD;AAEA,UAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,gBAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACxC;AAAA,MACF;AAGA,YAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,YAAM,eAAe,MAAM,MAAM,GAAG,KAAK;AAEzC,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,0BAAsB,aAAa,MAAM,IAAI,MAAM,MAAM;AAAA,QAC3D;AAAA,MACF;AAEA,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,WAAW,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK;AACvD,cAAM,WAAW,KAAK,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK;AAC7D,cAAM,cACJ,KAAK,MAAM,SAAS,cAChB,MAAM,QACN,KAAK,MAAM,SAAS,YAClB,MAAM,SACN,MAAM;AAEd,gBAAQ,IAAI,GAAG,MAAM,KAAK,KAAK,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE;AAC1D,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,KAAK,YAAY,KAAK,MAAM,IAAI,CAAC,IAAI,QAAQ,GAAG,QAAQ;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,aAAa,WAAW,cAAc;AAC5C,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,EAAK,aAAa,MAAM,WAAW,MAAM,MAAM,wBAAmB,KAAK,MAAM,WAAW,MAAM,GAAI,CAAC;AAAA,QACrG;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AACvB,cAAQ;AAAA,QACN,MAAM,IAAI,uBAAuB;AAAA,QAChC,MAAgB;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACL;",
6
- "names": ["cacheStats"]
7
- }
@@ -1,64 +0,0 @@
1
- import chalk from "chalk";
2
- import { runMigration } from "../../integrations/linear/migration.js";
3
- function getEnv(key, defaultValue) {
4
- const value = process.env[key];
5
- if (value === void 0) {
6
- if (defaultValue !== void 0) return defaultValue;
7
- throw new Error(`Environment variable ${key} is required`);
8
- }
9
- return value;
10
- }
11
- function getOptionalEnv(key) {
12
- return process.env[key];
13
- }
14
- function registerLinearMigrateCommand(parent) {
15
- parent.command("linear:migrate").description("Migrate STA- tasks from LiftCL to new Linear workspace").option("--source-key <key>", "Source workspace Linear API key").option("--target-key <key>", "Target workspace Linear API key").option("--dry-run", "Preview migration without making changes").option(
16
- "--delete-source",
17
- "Delete tasks from source after successful migration"
18
- ).option("--batch-size <n>", "Number of tasks per batch", "3").option("--delay <ms>", "Delay between batches in milliseconds", "3000").action(async (options) => {
19
- try {
20
- const sourceKey = options.sourceKey || process.env["LINEAR_API_KEY"];
21
- const targetKey = options.targetKey;
22
- if (!sourceKey) {
23
- console.error(
24
- chalk.red(
25
- "\u274C Source API key required. Use --source-key or set LINEAR_API_KEY"
26
- )
27
- );
28
- return;
29
- }
30
- if (!targetKey) {
31
- console.error(
32
- chalk.red("\u274C Target API key required. Use --target-key")
33
- );
34
- return;
35
- }
36
- console.log(chalk.blue("\u{1F680} Starting Linear Migration"));
37
- console.log(chalk.gray(" This will migrate all STA- prefixed tasks"));
38
- if (options.deleteSource) {
39
- console.log(
40
- chalk.yellow(
41
- " \u26A0\uFE0F Tasks will be DELETED from source after migration"
42
- )
43
- );
44
- }
45
- console.log();
46
- await runMigration({
47
- sourceApiKey: sourceKey,
48
- targetApiKey: targetKey,
49
- taskPrefix: "STA-",
50
- deleteFromSource: options.deleteSource,
51
- dryRun: options.dryRun,
52
- batchSize: parseInt(options.batchSize),
53
- delayMs: parseInt(options.delay)
54
- });
55
- } catch (error) {
56
- console.error(chalk.red("Migration failed:"), error.message);
57
- process.exit(1);
58
- }
59
- });
60
- }
61
- export {
62
- registerLinearMigrateCommand
63
- };
64
- //# sourceMappingURL=linear-migrate.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/linear-migrate.ts"],
4
- "sourcesContent": ["/**\n * Linear Migration Command\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { runMigration } from '../../integrations/linear/migration.js';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport function registerLinearMigrateCommand(parent: Command) {\n parent\n .command('linear:migrate')\n .description('Migrate STA- tasks from LiftCL to new Linear workspace')\n .option('--source-key <key>', 'Source workspace Linear API key')\n .option('--target-key <key>', 'Target workspace Linear API key')\n .option('--dry-run', 'Preview migration without making changes')\n .option(\n '--delete-source',\n 'Delete tasks from source after successful migration'\n )\n .option('--batch-size <n>', 'Number of tasks per batch', '3')\n .option('--delay <ms>', 'Delay between batches in milliseconds', '3000')\n .action(async (options) => {\n try {\n const sourceKey = options.sourceKey || process.env['LINEAR_API_KEY'];\n const targetKey = options.targetKey;\n\n if (!sourceKey) {\n console.error(\n chalk.red(\n '\u274C Source API key required. Use --source-key or set LINEAR_API_KEY'\n )\n );\n return;\n }\n\n if (!targetKey) {\n console.error(\n chalk.red('\u274C Target API key required. Use --target-key')\n );\n return;\n }\n\n console.log(chalk.blue('\uD83D\uDE80 Starting Linear Migration'));\n console.log(chalk.gray(' This will migrate all STA- prefixed tasks'));\n if (options.deleteSource) {\n console.log(\n chalk.yellow(\n ' \u26A0\uFE0F Tasks will be DELETED from source after migration'\n )\n );\n }\n console.log();\n\n await runMigration({\n sourceApiKey: sourceKey,\n targetApiKey: targetKey,\n taskPrefix: 'STA-',\n deleteFromSource: options.deleteSource,\n dryRun: options.dryRun,\n batchSize: parseInt(options.batchSize),\n delayMs: parseInt(options.delay),\n });\n } catch (error: unknown) {\n console.error(chalk.red('Migration failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n}\n"],
5
- "mappings": "AAKA,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAE7B,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAEO,SAAS,6BAA6B,QAAiB;AAC5D,SACG,QAAQ,gBAAgB,EACxB,YAAY,wDAAwD,EACpE,OAAO,sBAAsB,iCAAiC,EAC9D,OAAO,sBAAsB,iCAAiC,EAC9D,OAAO,aAAa,0CAA0C,EAC9D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,oBAAoB,6BAA6B,GAAG,EAC3D,OAAO,gBAAgB,yCAAyC,MAAM,EACtE,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,YAAY,QAAQ,aAAa,QAAQ,IAAI,gBAAgB;AACnE,YAAM,YAAY,QAAQ;AAE1B,UAAI,CAAC,WAAW;AACd,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,CAAC,WAAW;AACd,gBAAQ;AAAA,UACN,MAAM,IAAI,kDAA6C;AAAA,QACzD;AACA;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,KAAK,qCAA8B,CAAC;AACtD,cAAQ,IAAI,MAAM,KAAK,8CAA8C,CAAC;AACtE,UAAI,QAAQ,cAAc;AACxB,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,cAAQ,IAAI;AAEZ,YAAM,aAAa;AAAA,QACjB,cAAc;AAAA,QACd,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,kBAAkB,QAAQ;AAAA,QAC1B,QAAQ,QAAQ;AAAA,QAChB,WAAW,SAAS,QAAQ,SAAS;AAAA,QACrC,SAAS,SAAS,QAAQ,KAAK;AAAA,MACjC,CAAC;AAAA,IACH,SAAS,OAAgB;AACvB,cAAQ,MAAM,MAAM,IAAI,mBAAmB,GAAI,MAAgB,OAAO;AACtE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;",
6
- "names": []
7
- }
@@ -1,134 +0,0 @@
1
- import chalk from "chalk";
2
- function getEnv(key, defaultValue) {
3
- const value = process.env[key];
4
- if (value === void 0) {
5
- if (defaultValue !== void 0) return defaultValue;
6
- throw new Error(`Environment variable ${key} is required`);
7
- }
8
- return value;
9
- }
10
- function getOptionalEnv(key) {
11
- return process.env[key];
12
- }
13
- function registerLinearTestCommand(parent) {
14
- parent.command("linear:test").description("Test Linear API connection").option("--api-key <key>", "Linear API key").action(async (options) => {
15
- try {
16
- const apiKey = options.apiKey || process.env["LINEAR_API_KEY"];
17
- if (!apiKey) {
18
- console.log(chalk.red("\u274C No API key provided"));
19
- console.log(
20
- "Use --api-key or set LINEAR_API_KEY environment variable"
21
- );
22
- return;
23
- }
24
- console.log(chalk.yellow("\u{1F504} Testing Linear connection..."));
25
- const response = await fetch("https://api.linear.app/graphql", {
26
- method: "POST",
27
- headers: {
28
- Authorization: apiKey,
29
- "Content-Type": "application/json"
30
- },
31
- body: JSON.stringify({
32
- query: `
33
- query Me {
34
- viewer {
35
- id
36
- name
37
- email
38
- }
39
- teams {
40
- nodes {
41
- id
42
- key
43
- name
44
- }
45
- }
46
- }
47
- `
48
- })
49
- });
50
- if (!response.ok) {
51
- console.log(
52
- chalk.red(`\u274C API Error: ${response.status} ${response.statusText}`)
53
- );
54
- return;
55
- }
56
- const result = await response.json();
57
- if (result.errors) {
58
- console.log(chalk.red("\u274C GraphQL Errors:"));
59
- result.errors.forEach(
60
- (err) => console.log(` - ${err.message}`)
61
- );
62
- return;
63
- }
64
- if (result.data?.viewer) {
65
- console.log(chalk.green("\u2705 Connected to Linear!"));
66
- console.log(chalk.cyan("\n\u{1F464} User:"));
67
- console.log(` Name: ${result.data.viewer.name}`);
68
- console.log(` Email: ${result.data.viewer.email}`);
69
- }
70
- if (result.data?.teams?.nodes?.length > 0) {
71
- console.log(chalk.cyan("\n\u{1F3E2} Teams:"));
72
- result.data.teams.nodes.forEach((team) => {
73
- console.log(` - ${team.name} (${team.key})`);
74
- });
75
- }
76
- console.log(chalk.yellow("\n\u{1F504} Testing issue creation..."));
77
- if (result.data?.teams?.nodes?.length > 0) {
78
- const teamId = result.data.teams.nodes[0].id;
79
- const createResponse = await fetch("https://api.linear.app/graphql", {
80
- method: "POST",
81
- headers: {
82
- Authorization: apiKey,
83
- "Content-Type": "application/json"
84
- },
85
- body: JSON.stringify({
86
- query: `
87
- mutation CreateIssue($input: IssueCreateInput!) {
88
- issueCreate(input: $input) {
89
- success
90
- issue {
91
- id
92
- identifier
93
- title
94
- url
95
- }
96
- }
97
- }
98
- `,
99
- variables: {
100
- input: {
101
- teamId,
102
- title: "[TEST] StackMemory Integration Test",
103
- description: "This is a test issue created by StackMemory to verify Linear integration.",
104
- priority: 4
105
- // Low priority
106
- }
107
- }
108
- })
109
- });
110
- const createResult = await createResponse.json();
111
- if (createResult.data?.issueCreate?.success) {
112
- const issue = createResult.data.issueCreate.issue;
113
- console.log(chalk.green("\u2705 Test issue created successfully!"));
114
- console.log(` ID: ${issue.identifier}`);
115
- console.log(` Title: ${issue.title}`);
116
- console.log(` URL: ${issue.url}`);
117
- console.log(
118
- chalk.gray("\n(You can delete this test issue from Linear)")
119
- );
120
- } else {
121
- console.log(chalk.yellow("\u26A0 Could not create test issue"));
122
- }
123
- }
124
- console.log(chalk.green("\n\u2705 Linear integration test completed!"));
125
- } catch (error) {
126
- console.error(chalk.red("\u274C Test failed:"), error.message);
127
- process.exit(1);
128
- }
129
- });
130
- }
131
- export {
132
- registerLinearTestCommand
133
- };
134
- //# sourceMappingURL=linear-test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/linear-test.ts"],
4
- "sourcesContent": ["/**\n * Simple Linear sync test command\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nexport function registerLinearTestCommand(parent: Command) {\n parent\n .command('linear:test')\n .description('Test Linear API connection')\n .option('--api-key <key>', 'Linear API key')\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env['LINEAR_API_KEY'];\n\n if (!apiKey) {\n console.log(chalk.red('\u274C No API key provided'));\n console.log(\n 'Use --api-key or set LINEAR_API_KEY environment variable'\n );\n return;\n }\n\n console.log(chalk.yellow('\uD83D\uDD04 Testing Linear connection...'));\n\n // Simple GraphQL query to test connection\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n Authorization: apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: `\n query Me {\n viewer {\n id\n name\n email\n }\n teams {\n nodes {\n id\n key\n name\n }\n }\n }\n `,\n }),\n });\n\n if (!response.ok) {\n console.log(\n chalk.red(`\u274C API Error: ${response.status} ${response.statusText}`)\n );\n return;\n }\n\n const result: any = await response.json();\n\n if (result.errors) {\n console.log(chalk.red('\u274C GraphQL Errors:'));\n result.errors.forEach((err: any) =>\n console.log(` - ${err.message}`)\n );\n return;\n }\n\n if (result.data?.viewer) {\n console.log(chalk.green('\u2705 Connected to Linear!'));\n console.log(chalk.cyan('\\n\uD83D\uDC64 User:'));\n console.log(` Name: ${result.data.viewer.name}`);\n console.log(` Email: ${result.data.viewer.email}`);\n }\n\n if (result.data?.teams?.nodes?.length > 0) {\n console.log(chalk.cyan('\\n\uD83C\uDFE2 Teams:'));\n result.data.teams.nodes.forEach((team: any) => {\n console.log(` - ${team.name} (${team.key})`);\n });\n }\n\n // Test creating a sample issue (optional)\n console.log(chalk.yellow('\\n\uD83D\uDD04 Testing issue creation...'));\n\n if (result.data?.teams?.nodes?.length > 0) {\n const teamId = result.data.teams.nodes[0].id;\n\n const createResponse = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n Authorization: apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue {\n id\n identifier\n title\n url\n }\n }\n }\n `,\n variables: {\n input: {\n teamId: teamId,\n title: '[TEST] StackMemory Integration Test',\n description:\n 'This is a test issue created by StackMemory to verify Linear integration.',\n priority: 4, // Low priority\n },\n },\n }),\n });\n\n const createResult: any = await createResponse.json();\n\n if (createResult.data?.issueCreate?.success) {\n const issue = createResult.data.issueCreate.issue;\n console.log(chalk.green('\u2705 Test issue created successfully!'));\n console.log(` ID: ${issue.identifier}`);\n console.log(` Title: ${issue.title}`);\n console.log(` URL: ${issue.url}`);\n\n // Optional: Delete the test issue\n console.log(\n chalk.gray('\\n(You can delete this test issue from Linear)')\n );\n } else {\n console.log(chalk.yellow('\u26A0 Could not create test issue'));\n }\n }\n\n console.log(chalk.green('\\n\u2705 Linear integration test completed!'));\n } catch (error: unknown) {\n console.error(chalk.red('\u274C Test failed:'), (error as Error).message);\n process.exit(1);\n }\n });\n}\n"],
5
- "mappings": "AAIA,OAAO,WAAW;AAGlB,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAEO,SAAS,0BAA0B,QAAiB;AACzD,SACG,QAAQ,aAAa,EACrB,YAAY,4BAA4B,EACxC,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,OAAO,YAAY;AACzB,QAAI;AACF,YAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,gBAAgB;AAE7D,UAAI,CAAC,QAAQ;AACX,gBAAQ,IAAI,MAAM,IAAI,4BAAuB,CAAC;AAC9C,gBAAQ;AAAA,UACN;AAAA,QACF;AACA;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,OAAO,wCAAiC,CAAC;AAG3D,YAAM,WAAW,MAAM,MAAM,kCAAkC;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgBT,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,gBAAQ;AAAA,UACN,MAAM,IAAI,qBAAgB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,QACpE;AACA;AAAA,MACF;AAEA,YAAM,SAAc,MAAM,SAAS,KAAK;AAExC,UAAI,OAAO,QAAQ;AACjB,gBAAQ,IAAI,MAAM,IAAI,wBAAmB,CAAC;AAC1C,eAAO,OAAO;AAAA,UAAQ,CAAC,QACrB,QAAQ,IAAI,OAAO,IAAI,OAAO,EAAE;AAAA,QAClC;AACA;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,QAAQ;AACvB,gBAAQ,IAAI,MAAM,MAAM,6BAAwB,CAAC;AACjD,gBAAQ,IAAI,MAAM,KAAK,mBAAY,CAAC;AACpC,gBAAQ,IAAI,WAAW,OAAO,KAAK,OAAO,IAAI,EAAE;AAChD,gBAAQ,IAAI,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,MACpD;AAEA,UAAI,OAAO,MAAM,OAAO,OAAO,SAAS,GAAG;AACzC,gBAAQ,IAAI,MAAM,KAAK,oBAAa,CAAC;AACrC,eAAO,KAAK,MAAM,MAAM,QAAQ,CAAC,SAAc;AAC7C,kBAAQ,IAAI,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG,GAAG;AAAA,QAC9C,CAAC;AAAA,MACH;AAGA,cAAQ,IAAI,MAAM,OAAO,uCAAgC,CAAC;AAE1D,UAAI,OAAO,MAAM,OAAO,OAAO,SAAS,GAAG;AACzC,cAAM,SAAS,OAAO,KAAK,MAAM,MAAM,CAAC,EAAE;AAE1C,cAAM,iBAAiB,MAAM,MAAM,kCAAkC;AAAA,UACnE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe;AAAA,YACf,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAaP,WAAW;AAAA,cACT,OAAO;AAAA,gBACL;AAAA,gBACA,OAAO;AAAA,gBACP,aACE;AAAA,gBACF,UAAU;AAAA;AAAA,cACZ;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,cAAM,eAAoB,MAAM,eAAe,KAAK;AAEpD,YAAI,aAAa,MAAM,aAAa,SAAS;AAC3C,gBAAM,QAAQ,aAAa,KAAK,YAAY;AAC5C,kBAAQ,IAAI,MAAM,MAAM,yCAAoC,CAAC;AAC7D,kBAAQ,IAAI,SAAS,MAAM,UAAU,EAAE;AACvC,kBAAQ,IAAI,YAAY,MAAM,KAAK,EAAE;AACrC,kBAAQ,IAAI,UAAU,MAAM,GAAG,EAAE;AAGjC,kBAAQ;AAAA,YACN,MAAM,KAAK,gDAAgD;AAAA,UAC7D;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,MAAM,OAAO,oCAA+B,CAAC;AAAA,QAC3D;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,MAAM,6CAAwC,CAAC;AAAA,IACnE,SAAS,OAAgB;AACvB,cAAQ,MAAM,MAAM,IAAI,qBAAgB,GAAI,MAAgB,OAAO;AACnE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;",
6
- "names": []
7
- }
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env node
2
- import { spawn } from "child_process";
3
- import { fileURLToPath } from "url";
4
- import { dirname, join } from "path";
5
- import chalk from "chalk";
6
- function getEnv(key, defaultValue) {
7
- const value = process.env[key];
8
- if (value === void 0) {
9
- if (defaultValue !== void 0) return defaultValue;
10
- throw new Error(`Environment variable ${key} is required`);
11
- }
12
- return value;
13
- }
14
- function getOptionalEnv(key) {
15
- return process.env[key];
16
- }
17
- const __filename = fileURLToPath(import.meta.url);
18
- const __dirname = dirname(__filename);
19
- const tuiCommand = {
20
- command: "tui",
21
- describe: "Launch interactive TUI monitoring dashboard",
22
- builder: (yargs) => {
23
- return yargs.option("server", {
24
- alias: "s",
25
- type: "boolean",
26
- description: "Start WebSocket server for real-time updates",
27
- default: false
28
- }).option("ws-url", {
29
- alias: "w",
30
- type: "string",
31
- description: "WebSocket server URL",
32
- default: "ws://localhost:8080"
33
- }).option("refresh", {
34
- alias: "r",
35
- type: "number",
36
- description: "Auto-refresh interval in milliseconds",
37
- default: 2e3
38
- });
39
- },
40
- handler: async (argv) => {
41
- console.log(chalk.cyan("\u{1F680} Launching StackMemory TUI Dashboard..."));
42
- process.env["STACKMEMORY_WS_URL"] = argv.wsUrl;
43
- const scriptPath = join(__dirname, "../../../scripts/start-tui.sh");
44
- const args = [];
45
- if (argv.server) {
46
- args.push("--with-server");
47
- }
48
- const tui = spawn("bash", [scriptPath, ...args], {
49
- stdio: "inherit",
50
- env: {
51
- ...process.env,
52
- STACKMEMORY_WS_URL: argv.wsUrl
53
- }
54
- });
55
- tui.on("error", (error) => {
56
- console.error(chalk.red("Failed to launch TUI:"), error);
57
- process.exit(1);
58
- });
59
- tui.on("exit", (code) => {
60
- if (code !== 0) {
61
- console.error(chalk.red(`TUI exited with code ${code}`));
62
- process.exit(code || 1);
63
- }
64
- });
65
- }
66
- };
67
- if (require.main === module) {
68
- tuiCommand.handler({
69
- server: process.argv.includes("--server"),
70
- wsUrl: process.env["STACKMEMORY_WS_URL"] || "ws://localhost:8080",
71
- refresh: 2e3
72
- });
73
- }
74
- export {
75
- tuiCommand
76
- };
77
- //# sourceMappingURL=tui.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/cli/commands/tui.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * TUI Command - Launch interactive monitoring dashboard\n */\n\nimport { spawn } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport chalk from 'chalk';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport const tuiCommand = {\n command: 'tui',\n describe: 'Launch interactive TUI monitoring dashboard',\n builder: (yargs: any) => {\n return yargs\n .option('server', {\n alias: 's',\n type: 'boolean',\n description: 'Start WebSocket server for real-time updates',\n default: false,\n })\n .option('ws-url', {\n alias: 'w',\n type: 'string',\n description: 'WebSocket server URL',\n default: 'ws://localhost:8080',\n })\n .option('refresh', {\n alias: 'r',\n type: 'number',\n description: 'Auto-refresh interval in milliseconds',\n default: 2000,\n });\n },\n handler: async (argv: any) => {\n console.log(chalk.cyan('\uD83D\uDE80 Launching StackMemory TUI Dashboard...'));\n\n // Set environment variables\n process.env['STACKMEMORY_WS_URL'] = argv.wsUrl;\n\n // Get script path\n const scriptPath = join(__dirname, '../../../scripts/start-tui.sh');\n\n // Prepare arguments\n const args = [];\n if (argv.server) {\n args.push('--with-server');\n }\n\n // Launch TUI\n const tui = spawn('bash', [scriptPath, ...args], {\n stdio: 'inherit',\n env: {\n ...process.env,\n STACKMEMORY_WS_URL: argv.wsUrl,\n },\n });\n\n tui.on('error', (error) => {\n console.error(chalk.red('Failed to launch TUI:'), error);\n process.exit(1);\n });\n\n tui.on('exit', (code) => {\n if (code !== 0) {\n console.error(chalk.red(`TUI exited with code ${code}`));\n process.exit(code || 1);\n }\n });\n },\n};\n\n// Direct execution support\nif (require.main === module) {\n tuiCommand.handler({\n server: process.argv.includes('--server'),\n wsUrl: process.env['STACKMEMORY_WS_URL'] || 'ws://localhost:8080',\n refresh: 2000,\n });\n}\n"],
5
- "mappings": ";AAKA,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAC9B,OAAO,WAAW;AAElB,SAAS,OAAO,KAAa,cAA+B;AAC1D,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,UAAU,QAAW;AACvB,QAAI,iBAAiB,OAAW,QAAO;AACvC,UAAM,IAAI,MAAM,wBAAwB,GAAG,cAAc;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAiC;AACvD,SAAO,QAAQ,IAAI,GAAG;AACxB;AAEA,MAAM,aAAa,cAAc,YAAY,GAAG;AAChD,MAAM,YAAY,QAAQ,UAAU;AAE7B,MAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,CAAC,UAAe;AACvB,WAAO,MACJ,OAAO,UAAU;AAAA,MAChB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC,EACA,OAAO,UAAU;AAAA,MAChB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC,EACA,OAAO,WAAW;AAAA,MACjB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO,SAAc;AAC5B,YAAQ,IAAI,MAAM,KAAK,kDAA2C,CAAC;AAGnE,YAAQ,IAAI,oBAAoB,IAAI,KAAK;AAGzC,UAAM,aAAa,KAAK,WAAW,+BAA+B;AAGlE,UAAM,OAAO,CAAC;AACd,QAAI,KAAK,QAAQ;AACf,WAAK,KAAK,eAAe;AAAA,IAC3B;AAGA,UAAM,MAAM,MAAM,QAAQ,CAAC,YAAY,GAAG,IAAI,GAAG;AAAA,MAC/C,OAAO;AAAA,MACP,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,oBAAoB,KAAK;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,QAAI,GAAG,SAAS,CAAC,UAAU;AACzB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,GAAG,KAAK;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,QAAI,GAAG,QAAQ,CAAC,SAAS;AACvB,UAAI,SAAS,GAAG;AACd,gBAAQ,MAAM,MAAM,IAAI,wBAAwB,IAAI,EAAE,CAAC;AACvD,gBAAQ,KAAK,QAAQ,CAAC;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGA,IAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAW,QAAQ;AAAA,IACjB,QAAQ,QAAQ,KAAK,SAAS,UAAU;AAAA,IACxC,OAAO,QAAQ,IAAI,oBAAoB,KAAK;AAAA,IAC5C,SAAS;AAAA,EACX,CAAC;AACH;",
6
- "names": []
7
- }