@stackmemoryai/stackmemory 0.5.6 → 0.5.8

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.
@@ -0,0 +1,180 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { Command } from "commander";
6
+ import chalk from "chalk";
7
+ import { execSync } from "child_process";
8
+ import { join } from "path";
9
+ import {
10
+ loadConfig,
11
+ saveConfig
12
+ } from "../../hooks/auto-background.js";
13
+ function createAutoBackgroundCommand() {
14
+ const cmd = new Command("auto-bg").description("Manage auto-background settings for long-running commands").addHelpText(
15
+ "after",
16
+ `
17
+ Examples:
18
+ stackmemory auto-bg show Show current configuration
19
+ stackmemory auto-bg enable Enable auto-backgrounding
20
+ stackmemory auto-bg disable Disable auto-backgrounding
21
+ stackmemory auto-bg add "npm publish" Add command to always-background list
22
+ stackmemory auto-bg remove "npm test" Remove command from list
23
+ stackmemory auto-bg timeout 10000 Set timeout to 10 seconds
24
+ stackmemory auto-bg install Install Claude Code hook
25
+ `
26
+ );
27
+ cmd.command("show").description("Show current auto-background configuration").action(() => {
28
+ const config = loadConfig();
29
+ console.log(chalk.blue("Auto-Background Configuration:"));
30
+ console.log();
31
+ console.log(
32
+ ` ${chalk.gray("Enabled:")} ${config.enabled ? chalk.green("yes") : chalk.red("no")}`
33
+ );
34
+ console.log(` ${chalk.gray("Timeout:")} ${config.timeoutMs}ms`);
35
+ console.log(
36
+ ` ${chalk.gray("Verbose:")} ${config.verbose ? "yes" : "no"}`
37
+ );
38
+ console.log();
39
+ console.log(chalk.blue("Always Background:"));
40
+ config.alwaysBackground.forEach((p) => console.log(` - ${p}`));
41
+ console.log();
42
+ console.log(chalk.blue("Never Background:"));
43
+ config.neverBackground.forEach((p) => console.log(` - ${p}`));
44
+ });
45
+ cmd.command("enable").description("Enable auto-backgrounding").action(() => {
46
+ const config = loadConfig();
47
+ config.enabled = true;
48
+ saveConfig(config);
49
+ console.log(chalk.green("Auto-background enabled"));
50
+ });
51
+ cmd.command("disable").description("Disable auto-backgrounding").action(() => {
52
+ const config = loadConfig();
53
+ config.enabled = false;
54
+ saveConfig(config);
55
+ console.log(chalk.yellow("Auto-background disabled"));
56
+ });
57
+ cmd.command("add <pattern>").description("Add command pattern to always-background list").action((pattern) => {
58
+ const config = loadConfig();
59
+ if (!config.alwaysBackground.includes(pattern)) {
60
+ config.alwaysBackground.push(pattern);
61
+ saveConfig(config);
62
+ console.log(chalk.green(`Added: ${pattern}`));
63
+ } else {
64
+ console.log(chalk.yellow(`Already in list: ${pattern}`));
65
+ }
66
+ });
67
+ cmd.command("remove <pattern>").description("Remove command pattern from always-background list").action((pattern) => {
68
+ const config = loadConfig();
69
+ const idx = config.alwaysBackground.indexOf(pattern);
70
+ if (idx !== -1) {
71
+ config.alwaysBackground.splice(idx, 1);
72
+ saveConfig(config);
73
+ console.log(chalk.green(`Removed: ${pattern}`));
74
+ } else {
75
+ console.log(chalk.yellow(`Not in list: ${pattern}`));
76
+ }
77
+ });
78
+ cmd.command("timeout <ms>").description("Set timeout threshold in milliseconds").action((ms) => {
79
+ const config = loadConfig();
80
+ const timeout = parseInt(ms, 10);
81
+ if (isNaN(timeout) || timeout < 0) {
82
+ console.log(chalk.red("Invalid timeout value"));
83
+ return;
84
+ }
85
+ config.timeoutMs = timeout;
86
+ saveConfig(config);
87
+ console.log(chalk.green(`Timeout set to ${timeout}ms`));
88
+ });
89
+ cmd.command("verbose [on|off]").description("Enable/disable verbose logging").action((value) => {
90
+ const config = loadConfig();
91
+ if (value === void 0) {
92
+ config.verbose = !config.verbose;
93
+ } else {
94
+ config.verbose = value === "on" || value === "true";
95
+ }
96
+ saveConfig(config);
97
+ console.log(
98
+ chalk.green(
99
+ `Verbose logging ${config.verbose ? "enabled" : "disabled"}`
100
+ )
101
+ );
102
+ });
103
+ cmd.command("reset").description("Reset configuration to defaults").action(() => {
104
+ const defaultConfig = {
105
+ enabled: true,
106
+ timeoutMs: 5e3,
107
+ alwaysBackground: [
108
+ "npm install",
109
+ "npm ci",
110
+ "yarn install",
111
+ "pnpm install",
112
+ "bun install",
113
+ "npm run build",
114
+ "yarn build",
115
+ "pnpm build",
116
+ "cargo build",
117
+ "go build",
118
+ "make",
119
+ "npm test",
120
+ "npm run test",
121
+ "yarn test",
122
+ "pytest",
123
+ "jest",
124
+ "vitest",
125
+ "cargo test",
126
+ "docker build",
127
+ "docker-compose up",
128
+ "docker compose up",
129
+ "git clone",
130
+ "git fetch --all",
131
+ "npx tsc",
132
+ "tsc --noEmit",
133
+ "eslint .",
134
+ "npm run lint"
135
+ ],
136
+ neverBackground: [
137
+ "vim",
138
+ "nvim",
139
+ "nano",
140
+ "less",
141
+ "more",
142
+ "top",
143
+ "htop",
144
+ "echo",
145
+ "cat",
146
+ "ls",
147
+ "pwd",
148
+ "cd",
149
+ "which",
150
+ "git status",
151
+ "git diff",
152
+ "git log"
153
+ ],
154
+ verbose: false
155
+ };
156
+ saveConfig(defaultConfig);
157
+ console.log(chalk.green("Configuration reset to defaults"));
158
+ });
159
+ cmd.command("install").description("Install Claude Code hook for auto-backgrounding").action(() => {
160
+ try {
161
+ const scriptPath = join(
162
+ __dirname,
163
+ "../../../scripts/install-auto-background-hook.sh"
164
+ );
165
+ execSync(`bash "${scriptPath}"`, { stdio: "inherit" });
166
+ } catch {
167
+ console.error(chalk.red("Failed to install hook"));
168
+ console.log(
169
+ chalk.gray(
170
+ "Run manually: bash scripts/install-auto-background-hook.sh"
171
+ )
172
+ );
173
+ }
174
+ });
175
+ return cmd;
176
+ }
177
+ export {
178
+ createAutoBackgroundCommand
179
+ };
180
+ //# sourceMappingURL=auto-background.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/auto-background.ts"],
4
+ "sourcesContent": ["/**\n * CLI command for managing auto-background settings\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { join } from 'path';\nimport {\n loadConfig,\n saveConfig,\n AutoBackgroundConfig,\n} from '../../hooks/auto-background.js';\n\n// __dirname provided by esbuild banner\n\nexport function createAutoBackgroundCommand(): Command {\n const cmd = new Command('auto-bg')\n .description('Manage auto-background settings for long-running commands')\n .addHelpText(\n 'after',\n `\nExamples:\n stackmemory auto-bg show Show current configuration\n stackmemory auto-bg enable Enable auto-backgrounding\n stackmemory auto-bg disable Disable auto-backgrounding\n stackmemory auto-bg add \"npm publish\" Add command to always-background list\n stackmemory auto-bg remove \"npm test\" Remove command from list\n stackmemory auto-bg timeout 10000 Set timeout to 10 seconds\n stackmemory auto-bg install Install Claude Code hook\n`\n );\n\n cmd\n .command('show')\n .description('Show current auto-background configuration')\n .action(() => {\n const config = loadConfig();\n console.log(chalk.blue('Auto-Background Configuration:'));\n console.log();\n console.log(\n ` ${chalk.gray('Enabled:')} ${config.enabled ? chalk.green('yes') : chalk.red('no')}`\n );\n console.log(` ${chalk.gray('Timeout:')} ${config.timeoutMs}ms`);\n console.log(\n ` ${chalk.gray('Verbose:')} ${config.verbose ? 'yes' : 'no'}`\n );\n console.log();\n console.log(chalk.blue('Always Background:'));\n config.alwaysBackground.forEach((p) => console.log(` - ${p}`));\n console.log();\n console.log(chalk.blue('Never Background:'));\n config.neverBackground.forEach((p) => console.log(` - ${p}`));\n });\n\n cmd\n .command('enable')\n .description('Enable auto-backgrounding')\n .action(() => {\n const config = loadConfig();\n config.enabled = true;\n saveConfig(config);\n console.log(chalk.green('Auto-background enabled'));\n });\n\n cmd\n .command('disable')\n .description('Disable auto-backgrounding')\n .action(() => {\n const config = loadConfig();\n config.enabled = false;\n saveConfig(config);\n console.log(chalk.yellow('Auto-background disabled'));\n });\n\n cmd\n .command('add <pattern>')\n .description('Add command pattern to always-background list')\n .action((pattern: string) => {\n const config = loadConfig();\n if (!config.alwaysBackground.includes(pattern)) {\n config.alwaysBackground.push(pattern);\n saveConfig(config);\n console.log(chalk.green(`Added: ${pattern}`));\n } else {\n console.log(chalk.yellow(`Already in list: ${pattern}`));\n }\n });\n\n cmd\n .command('remove <pattern>')\n .description('Remove command pattern from always-background list')\n .action((pattern: string) => {\n const config = loadConfig();\n const idx = config.alwaysBackground.indexOf(pattern);\n if (idx !== -1) {\n config.alwaysBackground.splice(idx, 1);\n saveConfig(config);\n console.log(chalk.green(`Removed: ${pattern}`));\n } else {\n console.log(chalk.yellow(`Not in list: ${pattern}`));\n }\n });\n\n cmd\n .command('timeout <ms>')\n .description('Set timeout threshold in milliseconds')\n .action((ms: string) => {\n const config = loadConfig();\n const timeout = parseInt(ms, 10);\n if (isNaN(timeout) || timeout < 0) {\n console.log(chalk.red('Invalid timeout value'));\n return;\n }\n config.timeoutMs = timeout;\n saveConfig(config);\n console.log(chalk.green(`Timeout set to ${timeout}ms`));\n });\n\n cmd\n .command('verbose [on|off]')\n .description('Enable/disable verbose logging')\n .action((value?: string) => {\n const config = loadConfig();\n if (value === undefined) {\n config.verbose = !config.verbose;\n } else {\n config.verbose = value === 'on' || value === 'true';\n }\n saveConfig(config);\n console.log(\n chalk.green(\n `Verbose logging ${config.verbose ? 'enabled' : 'disabled'}`\n )\n );\n });\n\n cmd\n .command('reset')\n .description('Reset configuration to defaults')\n .action(() => {\n const defaultConfig: AutoBackgroundConfig = {\n enabled: true,\n timeoutMs: 5000,\n alwaysBackground: [\n 'npm install',\n 'npm ci',\n 'yarn install',\n 'pnpm install',\n 'bun install',\n 'npm run build',\n 'yarn build',\n 'pnpm build',\n 'cargo build',\n 'go build',\n 'make',\n 'npm test',\n 'npm run test',\n 'yarn test',\n 'pytest',\n 'jest',\n 'vitest',\n 'cargo test',\n 'docker build',\n 'docker-compose up',\n 'docker compose up',\n 'git clone',\n 'git fetch --all',\n 'npx tsc',\n 'tsc --noEmit',\n 'eslint .',\n 'npm run lint',\n ],\n neverBackground: [\n 'vim',\n 'nvim',\n 'nano',\n 'less',\n 'more',\n 'top',\n 'htop',\n 'echo',\n 'cat',\n 'ls',\n 'pwd',\n 'cd',\n 'which',\n 'git status',\n 'git diff',\n 'git log',\n ],\n verbose: false,\n };\n saveConfig(defaultConfig);\n console.log(chalk.green('Configuration reset to defaults'));\n });\n\n cmd\n .command('install')\n .description('Install Claude Code hook for auto-backgrounding')\n .action(() => {\n try {\n // Find the install script\n const scriptPath = join(\n __dirname,\n '../../../scripts/install-auto-background-hook.sh'\n );\n execSync(`bash \"${scriptPath}\"`, { stdio: 'inherit' });\n } catch {\n console.error(chalk.red('Failed to install hook'));\n console.log(\n chalk.gray(\n 'Run manually: bash scripts/install-auto-background-hook.sh'\n )\n );\n }\n });\n\n return cmd;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,276 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { Command } from "commander";
6
+ import chalk from "chalk";
7
+ import {
8
+ loadSMSConfig,
9
+ saveSMSConfig,
10
+ sendSMSNotification,
11
+ notifyReviewReady,
12
+ notifyWithYesNo,
13
+ notifyTaskComplete,
14
+ cleanupExpiredPrompts
15
+ } from "../../hooks/sms-notify.js";
16
+ function createSMSNotifyCommand() {
17
+ const cmd = new Command("notify").description(
18
+ "SMS notification system for review alerts (optional, requires Twilio)"
19
+ ).addHelpText(
20
+ "after",
21
+ `
22
+ Setup (optional):
23
+ 1. Create Twilio account at https://twilio.com
24
+ 2. Get Account SID, Auth Token, and phone number
25
+ 3. Set environment variables:
26
+ export TWILIO_ACCOUNT_SID=your_sid
27
+ export TWILIO_AUTH_TOKEN=your_token
28
+ export TWILIO_FROM_NUMBER=+1234567890
29
+ export TWILIO_TO_NUMBER=+1234567890
30
+ 4. Enable: stackmemory notify enable
31
+
32
+ Examples:
33
+ stackmemory notify status Check configuration
34
+ stackmemory notify enable Enable notifications
35
+ stackmemory notify test Send test message
36
+ stackmemory notify send "PR ready" Send custom message
37
+ stackmemory notify review "PR #123" Send review notification with options
38
+ stackmemory notify ask "Deploy?" Send yes/no prompt
39
+ `
40
+ );
41
+ cmd.command("status").description("Show notification configuration status").action(() => {
42
+ const config = loadSMSConfig();
43
+ console.log(chalk.blue("SMS Notification Status:"));
44
+ console.log();
45
+ const hasCreds = config.accountSid && config.authToken && config.fromNumber && config.toNumber;
46
+ console.log(
47
+ ` ${chalk.gray("Enabled:")} ${config.enabled ? chalk.green("yes") : chalk.red("no")}`
48
+ );
49
+ console.log(
50
+ ` ${chalk.gray("Configured:")} ${hasCreds ? chalk.green("yes") : chalk.yellow("no (set env vars)")}`
51
+ );
52
+ if (config.fromNumber) {
53
+ console.log(` ${chalk.gray("From:")} ${maskPhone(config.fromNumber)}`);
54
+ }
55
+ if (config.toNumber) {
56
+ console.log(` ${chalk.gray("To:")} ${maskPhone(config.toNumber)}`);
57
+ }
58
+ console.log();
59
+ console.log(chalk.blue("Notify On:"));
60
+ console.log(
61
+ ` ${chalk.gray("Task Complete:")} ${config.notifyOn.taskComplete ? "yes" : "no"}`
62
+ );
63
+ console.log(
64
+ ` ${chalk.gray("Review Ready:")} ${config.notifyOn.reviewReady ? "yes" : "no"}`
65
+ );
66
+ console.log(
67
+ ` ${chalk.gray("Errors:")} ${config.notifyOn.error ? "yes" : "no"}`
68
+ );
69
+ if (config.quietHours?.enabled) {
70
+ console.log();
71
+ console.log(
72
+ chalk.blue(
73
+ `Quiet Hours: ${config.quietHours.start} - ${config.quietHours.end}`
74
+ )
75
+ );
76
+ }
77
+ console.log();
78
+ console.log(
79
+ ` ${chalk.gray("Pending Prompts:")} ${config.pendingPrompts.length}`
80
+ );
81
+ console.log(
82
+ ` ${chalk.gray("Response Timeout:")} ${config.responseTimeout}s`
83
+ );
84
+ if (!hasCreds) {
85
+ console.log();
86
+ console.log(
87
+ chalk.yellow("To configure, set these environment variables:")
88
+ );
89
+ console.log(chalk.gray(" export TWILIO_ACCOUNT_SID=your_sid"));
90
+ console.log(chalk.gray(" export TWILIO_AUTH_TOKEN=your_token"));
91
+ console.log(chalk.gray(" export TWILIO_FROM_NUMBER=+1234567890"));
92
+ console.log(chalk.gray(" export TWILIO_TO_NUMBER=+1234567890"));
93
+ }
94
+ });
95
+ cmd.command("enable").description("Enable SMS notifications").action(() => {
96
+ const config = loadSMSConfig();
97
+ config.enabled = true;
98
+ saveSMSConfig(config);
99
+ console.log(chalk.green("SMS notifications enabled"));
100
+ const hasCreds = config.accountSid && config.authToken && config.fromNumber && config.toNumber;
101
+ if (!hasCreds) {
102
+ console.log(
103
+ chalk.yellow(
104
+ "Note: Set Twilio environment variables to send messages"
105
+ )
106
+ );
107
+ }
108
+ });
109
+ cmd.command("disable").description("Disable SMS notifications").action(() => {
110
+ const config = loadSMSConfig();
111
+ config.enabled = false;
112
+ saveSMSConfig(config);
113
+ console.log(chalk.yellow("SMS notifications disabled"));
114
+ });
115
+ cmd.command("test").description("Send a test notification").action(async () => {
116
+ console.log(chalk.blue("Sending test notification..."));
117
+ const result = await sendSMSNotification({
118
+ type: "custom",
119
+ title: "StackMemory Test",
120
+ message: "This is a test notification from StackMemory."
121
+ });
122
+ if (result.success) {
123
+ console.log(chalk.green("Test message sent successfully!"));
124
+ } else {
125
+ console.log(chalk.red(`Failed: ${result.error}`));
126
+ }
127
+ });
128
+ cmd.command("send <message>").description("Send a custom notification").option("-t, --title <title>", "Message title", "StackMemory Alert").action(async (message, options) => {
129
+ const result = await sendSMSNotification({
130
+ type: "custom",
131
+ title: options.title,
132
+ message
133
+ });
134
+ if (result.success) {
135
+ console.log(chalk.green("Message sent!"));
136
+ } else {
137
+ console.log(chalk.red(`Failed: ${result.error}`));
138
+ }
139
+ });
140
+ cmd.command("review <title>").description("Send review-ready notification with options").option("-m, --message <msg>", "Description", "Ready for your review").option(
141
+ "-o, --options <opts>",
142
+ "Comma-separated options",
143
+ "Approve,Request Changes,Skip"
144
+ ).action(
145
+ async (title, options) => {
146
+ const opts = options.options.split(",").map((o) => ({
147
+ label: o.trim()
148
+ }));
149
+ console.log(chalk.blue("Sending review notification..."));
150
+ const result = await notifyReviewReady(title, options.message, opts);
151
+ if (result.success) {
152
+ console.log(chalk.green("Review notification sent!"));
153
+ if (result.promptId) {
154
+ console.log(chalk.gray(`Prompt ID: ${result.promptId}`));
155
+ }
156
+ } else {
157
+ console.log(chalk.red(`Failed: ${result.error}`));
158
+ }
159
+ }
160
+ );
161
+ cmd.command("ask <question>").description("Send a yes/no prompt").option("-t, --title <title>", "Message title", "StackMemory").action(async (question, options) => {
162
+ console.log(chalk.blue("Sending yes/no prompt..."));
163
+ const result = await notifyWithYesNo(options.title, question);
164
+ if (result.success) {
165
+ console.log(chalk.green("Prompt sent!"));
166
+ if (result.promptId) {
167
+ console.log(chalk.gray(`Prompt ID: ${result.promptId}`));
168
+ }
169
+ } else {
170
+ console.log(chalk.red(`Failed: ${result.error}`));
171
+ }
172
+ });
173
+ cmd.command("complete <task>").description("Send task completion notification").option("-s, --summary <text>", "Task summary", "").action(async (task, options) => {
174
+ const result = await notifyTaskComplete(
175
+ task,
176
+ options.summary || `Task "${task}" has been completed.`
177
+ );
178
+ if (result.success) {
179
+ console.log(chalk.green("Completion notification sent!"));
180
+ } else {
181
+ console.log(chalk.red(`Failed: ${result.error}`));
182
+ }
183
+ });
184
+ cmd.command("quiet").description("Configure quiet hours").option("--enable", "Enable quiet hours").option("--disable", "Disable quiet hours").option("--start <time>", "Start time (HH:MM)", "22:00").option("--end <time>", "End time (HH:MM)", "08:00").action(
185
+ (options) => {
186
+ const config = loadSMSConfig();
187
+ if (!config.quietHours) {
188
+ config.quietHours = { enabled: false, start: "22:00", end: "08:00" };
189
+ }
190
+ if (options.enable) {
191
+ config.quietHours.enabled = true;
192
+ } else if (options.disable) {
193
+ config.quietHours.enabled = false;
194
+ }
195
+ if (options.start) {
196
+ config.quietHours.start = options.start;
197
+ }
198
+ if (options.end) {
199
+ config.quietHours.end = options.end;
200
+ }
201
+ saveSMSConfig(config);
202
+ if (config.quietHours.enabled) {
203
+ console.log(
204
+ chalk.green(
205
+ `Quiet hours enabled: ${config.quietHours.start} - ${config.quietHours.end}`
206
+ )
207
+ );
208
+ } else {
209
+ console.log(chalk.yellow("Quiet hours disabled"));
210
+ }
211
+ }
212
+ );
213
+ cmd.command("toggle <type>").description(
214
+ "Toggle notification type (taskComplete|reviewReady|error|custom)"
215
+ ).action((type) => {
216
+ const config = loadSMSConfig();
217
+ const validTypes = ["taskComplete", "reviewReady", "error", "custom"];
218
+ if (!validTypes.includes(type)) {
219
+ console.log(chalk.red(`Invalid type. Use: ${validTypes.join(", ")}`));
220
+ return;
221
+ }
222
+ const key = type;
223
+ config.notifyOn[key] = !config.notifyOn[key];
224
+ saveSMSConfig(config);
225
+ console.log(
226
+ chalk.green(
227
+ `${type} notifications ${config.notifyOn[key] ? "enabled" : "disabled"}`
228
+ )
229
+ );
230
+ });
231
+ cmd.command("pending").description("List pending prompts awaiting response").action(() => {
232
+ const config = loadSMSConfig();
233
+ if (config.pendingPrompts.length === 0) {
234
+ console.log(chalk.gray("No pending prompts"));
235
+ return;
236
+ }
237
+ console.log(chalk.blue("Pending Prompts:"));
238
+ config.pendingPrompts.forEach((p) => {
239
+ const expires = new Date(p.expiresAt);
240
+ const remaining = Math.round((expires.getTime() - Date.now()) / 1e3);
241
+ console.log();
242
+ console.log(` ${chalk.gray("ID:")} ${p.id}`);
243
+ console.log(` ${chalk.gray("Type:")} ${p.type}`);
244
+ console.log(
245
+ ` ${chalk.gray("Message:")} ${p.message.substring(0, 50)}...`
246
+ );
247
+ console.log(
248
+ ` ${chalk.gray("Expires:")} ${remaining > 0 ? `${remaining}s` : chalk.red("expired")}`
249
+ );
250
+ });
251
+ });
252
+ cmd.command("cleanup").description("Remove expired pending prompts").action(() => {
253
+ const removed = cleanupExpiredPrompts();
254
+ console.log(chalk.green(`Removed ${removed} expired prompt(s)`));
255
+ });
256
+ cmd.command("timeout <seconds>").description("Set response timeout for prompts").action((seconds) => {
257
+ const config = loadSMSConfig();
258
+ const timeout = parseInt(seconds, 10);
259
+ if (isNaN(timeout) || timeout < 30) {
260
+ console.log(chalk.red("Timeout must be at least 30 seconds"));
261
+ return;
262
+ }
263
+ config.responseTimeout = timeout;
264
+ saveSMSConfig(config);
265
+ console.log(chalk.green(`Response timeout set to ${timeout} seconds`));
266
+ });
267
+ return cmd;
268
+ }
269
+ function maskPhone(phone) {
270
+ if (phone.length < 8) return phone;
271
+ return phone.substring(0, 4) + "****" + phone.substring(phone.length - 2);
272
+ }
273
+ export {
274
+ createSMSNotifyCommand
275
+ };
276
+ //# sourceMappingURL=sms-notify.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/sms-notify.ts"],
4
+ "sourcesContent": ["/**\n * CLI command for SMS notification management\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n loadSMSConfig,\n saveSMSConfig,\n sendSMSNotification,\n notifyReviewReady,\n notifyWithYesNo,\n notifyTaskComplete,\n cleanupExpiredPrompts,\n} from '../../hooks/sms-notify.js';\n\nexport function createSMSNotifyCommand(): Command {\n const cmd = new Command('notify')\n .description(\n 'SMS notification system for review alerts (optional, requires Twilio)'\n )\n .addHelpText(\n 'after',\n `\nSetup (optional):\n 1. Create Twilio account at https://twilio.com\n 2. Get Account SID, Auth Token, and phone number\n 3. Set environment variables:\n export TWILIO_ACCOUNT_SID=your_sid\n export TWILIO_AUTH_TOKEN=your_token\n export TWILIO_FROM_NUMBER=+1234567890\n export TWILIO_TO_NUMBER=+1234567890\n 4. Enable: stackmemory notify enable\n\nExamples:\n stackmemory notify status Check configuration\n stackmemory notify enable Enable notifications\n stackmemory notify test Send test message\n stackmemory notify send \"PR ready\" Send custom message\n stackmemory notify review \"PR #123\" Send review notification with options\n stackmemory notify ask \"Deploy?\" Send yes/no prompt\n`\n );\n\n cmd\n .command('status')\n .description('Show notification configuration status')\n .action(() => {\n const config = loadSMSConfig();\n\n console.log(chalk.blue('SMS Notification Status:'));\n console.log();\n\n // Check if configured\n const hasCreds =\n config.accountSid &&\n config.authToken &&\n config.fromNumber &&\n config.toNumber;\n\n console.log(\n ` ${chalk.gray('Enabled:')} ${config.enabled ? chalk.green('yes') : chalk.red('no')}`\n );\n console.log(\n ` ${chalk.gray('Configured:')} ${hasCreds ? chalk.green('yes') : chalk.yellow('no (set env vars)')}`\n );\n\n if (config.fromNumber) {\n console.log(` ${chalk.gray('From:')} ${maskPhone(config.fromNumber)}`);\n }\n if (config.toNumber) {\n console.log(` ${chalk.gray('To:')} ${maskPhone(config.toNumber)}`);\n }\n\n console.log();\n console.log(chalk.blue('Notify On:'));\n console.log(\n ` ${chalk.gray('Task Complete:')} ${config.notifyOn.taskComplete ? 'yes' : 'no'}`\n );\n console.log(\n ` ${chalk.gray('Review Ready:')} ${config.notifyOn.reviewReady ? 'yes' : 'no'}`\n );\n console.log(\n ` ${chalk.gray('Errors:')} ${config.notifyOn.error ? 'yes' : 'no'}`\n );\n\n if (config.quietHours?.enabled) {\n console.log();\n console.log(\n chalk.blue(\n `Quiet Hours: ${config.quietHours.start} - ${config.quietHours.end}`\n )\n );\n }\n\n console.log();\n console.log(\n ` ${chalk.gray('Pending Prompts:')} ${config.pendingPrompts.length}`\n );\n console.log(\n ` ${chalk.gray('Response Timeout:')} ${config.responseTimeout}s`\n );\n\n if (!hasCreds) {\n console.log();\n console.log(\n chalk.yellow('To configure, set these environment variables:')\n );\n console.log(chalk.gray(' export TWILIO_ACCOUNT_SID=your_sid'));\n console.log(chalk.gray(' export TWILIO_AUTH_TOKEN=your_token'));\n console.log(chalk.gray(' export TWILIO_FROM_NUMBER=+1234567890'));\n console.log(chalk.gray(' export TWILIO_TO_NUMBER=+1234567890'));\n }\n });\n\n cmd\n .command('enable')\n .description('Enable SMS notifications')\n .action(() => {\n const config = loadSMSConfig();\n config.enabled = true;\n saveSMSConfig(config);\n console.log(chalk.green('SMS notifications enabled'));\n\n const hasCreds =\n config.accountSid &&\n config.authToken &&\n config.fromNumber &&\n config.toNumber;\n if (!hasCreds) {\n console.log(\n chalk.yellow(\n 'Note: Set Twilio environment variables to send messages'\n )\n );\n }\n });\n\n cmd\n .command('disable')\n .description('Disable SMS notifications')\n .action(() => {\n const config = loadSMSConfig();\n config.enabled = false;\n saveSMSConfig(config);\n console.log(chalk.yellow('SMS notifications disabled'));\n });\n\n cmd\n .command('test')\n .description('Send a test notification')\n .action(async () => {\n console.log(chalk.blue('Sending test notification...'));\n\n const result = await sendSMSNotification({\n type: 'custom',\n title: 'StackMemory Test',\n message: 'This is a test notification from StackMemory.',\n });\n\n if (result.success) {\n console.log(chalk.green('Test message sent successfully!'));\n } else {\n console.log(chalk.red(`Failed: ${result.error}`));\n }\n });\n\n cmd\n .command('send <message>')\n .description('Send a custom notification')\n .option('-t, --title <title>', 'Message title', 'StackMemory Alert')\n .action(async (message: string, options: { title: string }) => {\n const result = await sendSMSNotification({\n type: 'custom',\n title: options.title,\n message,\n });\n\n if (result.success) {\n console.log(chalk.green('Message sent!'));\n } else {\n console.log(chalk.red(`Failed: ${result.error}`));\n }\n });\n\n cmd\n .command('review <title>')\n .description('Send review-ready notification with options')\n .option('-m, --message <msg>', 'Description', 'Ready for your review')\n .option(\n '-o, --options <opts>',\n 'Comma-separated options',\n 'Approve,Request Changes,Skip'\n )\n .action(\n async (title: string, options: { message: string; options: string }) => {\n const opts = options.options.split(',').map((o) => ({\n label: o.trim(),\n }));\n\n console.log(chalk.blue('Sending review notification...'));\n\n const result = await notifyReviewReady(title, options.message, opts);\n\n if (result.success) {\n console.log(chalk.green('Review notification sent!'));\n if (result.promptId) {\n console.log(chalk.gray(`Prompt ID: ${result.promptId}`));\n }\n } else {\n console.log(chalk.red(`Failed: ${result.error}`));\n }\n }\n );\n\n cmd\n .command('ask <question>')\n .description('Send a yes/no prompt')\n .option('-t, --title <title>', 'Message title', 'StackMemory')\n .action(async (question: string, options: { title: string }) => {\n console.log(chalk.blue('Sending yes/no prompt...'));\n\n const result = await notifyWithYesNo(options.title, question);\n\n if (result.success) {\n console.log(chalk.green('Prompt sent!'));\n if (result.promptId) {\n console.log(chalk.gray(`Prompt ID: ${result.promptId}`));\n }\n } else {\n console.log(chalk.red(`Failed: ${result.error}`));\n }\n });\n\n cmd\n .command('complete <task>')\n .description('Send task completion notification')\n .option('-s, --summary <text>', 'Task summary', '')\n .action(async (task: string, options: { summary: string }) => {\n const result = await notifyTaskComplete(\n task,\n options.summary || `Task \"${task}\" has been completed.`\n );\n\n if (result.success) {\n console.log(chalk.green('Completion notification sent!'));\n } else {\n console.log(chalk.red(`Failed: ${result.error}`));\n }\n });\n\n cmd\n .command('quiet')\n .description('Configure quiet hours')\n .option('--enable', 'Enable quiet hours')\n .option('--disable', 'Disable quiet hours')\n .option('--start <time>', 'Start time (HH:MM)', '22:00')\n .option('--end <time>', 'End time (HH:MM)', '08:00')\n .action(\n (options: {\n enable?: boolean;\n disable?: boolean;\n start: string;\n end: string;\n }) => {\n const config = loadSMSConfig();\n\n if (!config.quietHours) {\n config.quietHours = { enabled: false, start: '22:00', end: '08:00' };\n }\n\n if (options.enable) {\n config.quietHours.enabled = true;\n } else if (options.disable) {\n config.quietHours.enabled = false;\n }\n\n if (options.start) {\n config.quietHours.start = options.start;\n }\n if (options.end) {\n config.quietHours.end = options.end;\n }\n\n saveSMSConfig(config);\n\n if (config.quietHours.enabled) {\n console.log(\n chalk.green(\n `Quiet hours enabled: ${config.quietHours.start} - ${config.quietHours.end}`\n )\n );\n } else {\n console.log(chalk.yellow('Quiet hours disabled'));\n }\n }\n );\n\n cmd\n .command('toggle <type>')\n .description(\n 'Toggle notification type (taskComplete|reviewReady|error|custom)'\n )\n .action((type: string) => {\n const config = loadSMSConfig();\n const validTypes = ['taskComplete', 'reviewReady', 'error', 'custom'];\n\n if (!validTypes.includes(type)) {\n console.log(chalk.red(`Invalid type. Use: ${validTypes.join(', ')}`));\n return;\n }\n\n const key = type as keyof typeof config.notifyOn;\n config.notifyOn[key] = !config.notifyOn[key];\n saveSMSConfig(config);\n\n console.log(\n chalk.green(\n `${type} notifications ${config.notifyOn[key] ? 'enabled' : 'disabled'}`\n )\n );\n });\n\n cmd\n .command('pending')\n .description('List pending prompts awaiting response')\n .action(() => {\n const config = loadSMSConfig();\n\n if (config.pendingPrompts.length === 0) {\n console.log(chalk.gray('No pending prompts'));\n return;\n }\n\n console.log(chalk.blue('Pending Prompts:'));\n config.pendingPrompts.forEach((p) => {\n const expires = new Date(p.expiresAt);\n const remaining = Math.round((expires.getTime() - Date.now()) / 1000);\n\n console.log();\n console.log(` ${chalk.gray('ID:')} ${p.id}`);\n console.log(` ${chalk.gray('Type:')} ${p.type}`);\n console.log(\n ` ${chalk.gray('Message:')} ${p.message.substring(0, 50)}...`\n );\n console.log(\n ` ${chalk.gray('Expires:')} ${remaining > 0 ? `${remaining}s` : chalk.red('expired')}`\n );\n });\n });\n\n cmd\n .command('cleanup')\n .description('Remove expired pending prompts')\n .action(() => {\n const removed = cleanupExpiredPrompts();\n console.log(chalk.green(`Removed ${removed} expired prompt(s)`));\n });\n\n cmd\n .command('timeout <seconds>')\n .description('Set response timeout for prompts')\n .action((seconds: string) => {\n const config = loadSMSConfig();\n const timeout = parseInt(seconds, 10);\n\n if (isNaN(timeout) || timeout < 30) {\n console.log(chalk.red('Timeout must be at least 30 seconds'));\n return;\n }\n\n config.responseTimeout = timeout;\n saveSMSConfig(config);\n console.log(chalk.green(`Response timeout set to ${timeout} seconds`));\n });\n\n return cmd;\n}\n\nfunction maskPhone(phone: string): string {\n if (phone.length < 8) return phone;\n return phone.substring(0, 4) + '****' + phone.substring(phone.length - 2);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/cli/index.js CHANGED
@@ -46,6 +46,8 @@ import { createHooksCommand } from "./commands/hooks.js";
46
46
  import { createShellCommand } from "./commands/shell.js";
47
47
  import { createAPICommand } from "./commands/api.js";
48
48
  import { createCleanupProcessesCommand } from "./commands/cleanup-processes.js";
49
+ import { createAutoBackgroundCommand } from "./commands/auto-background.js";
50
+ import { createSMSNotifyCommand } from "./commands/sms-notify.js";
49
51
  import { ProjectManager } from "../core/projects/project-manager.js";
50
52
  import Database from "better-sqlite3";
51
53
  import { join } from "path";
@@ -437,6 +439,8 @@ program.addCommand(createHooksCommand());
437
439
  program.addCommand(createShellCommand());
438
440
  program.addCommand(createAPICommand());
439
441
  program.addCommand(createCleanupProcessesCommand());
442
+ program.addCommand(createAutoBackgroundCommand());
443
+ program.addCommand(createSMSNotifyCommand());
440
444
  program.command("dashboard").description("Display monitoring dashboard in terminal").option("-w, --watch", "Auto-refresh dashboard").option("-i, --interval <seconds>", "Refresh interval in seconds", "5").action(async (options) => {
441
445
  const { dashboardCommand } = await import("./commands/dashboard.js");
442
446
  await dashboardCommand.handler(options);