@josharsh/demon-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/actions/base.d.ts +4 -0
  4. package/dist/actions/base.d.ts.map +1 -0
  5. package/dist/actions/base.js +32 -0
  6. package/dist/actions/base.js.map +1 -0
  7. package/dist/actions/file.d.ts +7 -0
  8. package/dist/actions/file.d.ts.map +1 -0
  9. package/dist/actions/file.js +35 -0
  10. package/dist/actions/file.js.map +1 -0
  11. package/dist/actions/github.d.ts +7 -0
  12. package/dist/actions/github.d.ts.map +1 -0
  13. package/dist/actions/github.js +125 -0
  14. package/dist/actions/github.js.map +1 -0
  15. package/dist/actions/index.d.ts +5 -0
  16. package/dist/actions/index.d.ts.map +1 -0
  17. package/dist/actions/index.js +22 -0
  18. package/dist/actions/index.js.map +1 -0
  19. package/dist/actions/log.d.ts +7 -0
  20. package/dist/actions/log.d.ts.map +1 -0
  21. package/dist/actions/log.js +30 -0
  22. package/dist/actions/log.js.map +1 -0
  23. package/dist/actions/notify.d.ts +11 -0
  24. package/dist/actions/notify.d.ts.map +1 -0
  25. package/dist/actions/notify.js +34 -0
  26. package/dist/actions/notify.js.map +1 -0
  27. package/dist/actions/script.d.ts +7 -0
  28. package/dist/actions/script.d.ts.map +1 -0
  29. package/dist/actions/script.js +46 -0
  30. package/dist/actions/script.js.map +1 -0
  31. package/dist/actions/slack.d.ts +7 -0
  32. package/dist/actions/slack.d.ts.map +1 -0
  33. package/dist/actions/slack.js +47 -0
  34. package/dist/actions/slack.js.map +1 -0
  35. package/dist/actions/webhook.d.ts +7 -0
  36. package/dist/actions/webhook.d.ts.map +1 -0
  37. package/dist/actions/webhook.js +41 -0
  38. package/dist/actions/webhook.js.map +1 -0
  39. package/dist/adapters/clock.d.ts +3 -0
  40. package/dist/adapters/clock.d.ts.map +1 -0
  41. package/dist/adapters/clock.js +8 -0
  42. package/dist/adapters/clock.js.map +1 -0
  43. package/dist/adapters/fs-kv.d.ts +3 -0
  44. package/dist/adapters/fs-kv.d.ts.map +1 -0
  45. package/dist/adapters/fs-kv.js +34 -0
  46. package/dist/adapters/fs-kv.js.map +1 -0
  47. package/dist/adapters/keys.d.ts +3 -0
  48. package/dist/adapters/keys.d.ts.map +1 -0
  49. package/dist/adapters/keys.js +17 -0
  50. package/dist/adapters/keys.js.map +1 -0
  51. package/dist/commands/ensure-provider.d.ts +7 -0
  52. package/dist/commands/ensure-provider.d.ts.map +1 -0
  53. package/dist/commands/ensure-provider.js +121 -0
  54. package/dist/commands/ensure-provider.js.map +1 -0
  55. package/dist/commands/init.d.ts +2 -0
  56. package/dist/commands/init.d.ts.map +1 -0
  57. package/dist/commands/init.js +196 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/inspect.d.ts +7 -0
  60. package/dist/commands/inspect.d.ts.map +1 -0
  61. package/dist/commands/inspect.js +97 -0
  62. package/dist/commands/inspect.js.map +1 -0
  63. package/dist/commands/install.d.ts +3 -0
  64. package/dist/commands/install.d.ts.map +1 -0
  65. package/dist/commands/install.js +192 -0
  66. package/dist/commands/install.js.map +1 -0
  67. package/dist/commands/logs.d.ts +8 -0
  68. package/dist/commands/logs.d.ts.map +1 -0
  69. package/dist/commands/logs.js +103 -0
  70. package/dist/commands/logs.js.map +1 -0
  71. package/dist/commands/providers.d.ts +5 -0
  72. package/dist/commands/providers.d.ts.map +1 -0
  73. package/dist/commands/providers.js +251 -0
  74. package/dist/commands/providers.js.map +1 -0
  75. package/dist/commands/ps.d.ts +2 -0
  76. package/dist/commands/ps.d.ts.map +1 -0
  77. package/dist/commands/ps.js +87 -0
  78. package/dist/commands/ps.js.map +1 -0
  79. package/dist/commands/secrets.d.ts +9 -0
  80. package/dist/commands/secrets.d.ts.map +1 -0
  81. package/dist/commands/secrets.js +97 -0
  82. package/dist/commands/secrets.js.map +1 -0
  83. package/dist/commands/start.d.ts +10 -0
  84. package/dist/commands/start.d.ts.map +1 -0
  85. package/dist/commands/start.js +238 -0
  86. package/dist/commands/start.js.map +1 -0
  87. package/dist/commands/status.d.ts +2 -0
  88. package/dist/commands/status.d.ts.map +1 -0
  89. package/dist/commands/status.js +69 -0
  90. package/dist/commands/status.js.map +1 -0
  91. package/dist/commands/stop.d.ts +6 -0
  92. package/dist/commands/stop.d.ts.map +1 -0
  93. package/dist/commands/stop.js +43 -0
  94. package/dist/commands/stop.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +253 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/providers/config.d.ts +8 -0
  100. package/dist/providers/config.d.ts.map +1 -0
  101. package/dist/providers/config.js +31 -0
  102. package/dist/providers/config.js.map +1 -0
  103. package/dist/providers/credentials.d.ts +5 -0
  104. package/dist/providers/credentials.d.ts.map +1 -0
  105. package/dist/providers/credentials.js +69 -0
  106. package/dist/providers/credentials.js.map +1 -0
  107. package/dist/providers/registry.d.ts +12 -0
  108. package/dist/providers/registry.d.ts.map +1 -0
  109. package/dist/providers/registry.js +58 -0
  110. package/dist/providers/registry.js.map +1 -0
  111. package/dist/providers/secrets.d.ts +9 -0
  112. package/dist/providers/secrets.d.ts.map +1 -0
  113. package/dist/providers/secrets.js +44 -0
  114. package/dist/providers/secrets.js.map +1 -0
  115. package/dist/providers/system-auth.d.ts +8 -0
  116. package/dist/providers/system-auth.d.ts.map +1 -0
  117. package/dist/providers/system-auth.js +168 -0
  118. package/dist/providers/system-auth.js.map +1 -0
  119. package/dist/runtime/daemon.d.ts +10 -0
  120. package/dist/runtime/daemon.d.ts.map +1 -0
  121. package/dist/runtime/daemon.js +264 -0
  122. package/dist/runtime/daemon.js.map +1 -0
  123. package/dist/runtime/supervisor.d.ts +6 -0
  124. package/dist/runtime/supervisor.d.ts.map +1 -0
  125. package/dist/runtime/supervisor.js +45 -0
  126. package/dist/runtime/supervisor.js.map +1 -0
  127. package/dist/types.d.ts +27 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +7 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils/logger.d.ts +4 -0
  132. package/dist/utils/logger.d.ts.map +1 -0
  133. package/dist/utils/logger.js +44 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/dist/utils/manifest.d.ts +5 -0
  136. package/dist/utils/manifest.d.ts.map +1 -0
  137. package/dist/utils/manifest.js +276 -0
  138. package/dist/utils/manifest.js.map +1 -0
  139. package/dist/utils/paths.d.ts +13 -0
  140. package/dist/utils/paths.d.ts.map +1 -0
  141. package/dist/utils/paths.js +52 -0
  142. package/dist/utils/paths.js.map +1 -0
  143. package/dist/utils/time.d.ts +11 -0
  144. package/dist/utils/time.d.ts.map +1 -0
  145. package/dist/utils/time.js +40 -0
  146. package/dist/utils/time.js.map +1 -0
  147. package/dist/watchers/base.d.ts +3 -0
  148. package/dist/watchers/base.d.ts.map +1 -0
  149. package/dist/watchers/base.js +20 -0
  150. package/dist/watchers/base.js.map +1 -0
  151. package/dist/watchers/filesystem.d.ts +12 -0
  152. package/dist/watchers/filesystem.d.ts.map +1 -0
  153. package/dist/watchers/filesystem.js +211 -0
  154. package/dist/watchers/filesystem.js.map +1 -0
  155. package/dist/watchers/github.d.ts +3 -0
  156. package/dist/watchers/github.d.ts.map +1 -0
  157. package/dist/watchers/github.js +322 -0
  158. package/dist/watchers/github.js.map +1 -0
  159. package/dist/watchers/http.d.ts +13 -0
  160. package/dist/watchers/http.d.ts.map +1 -0
  161. package/dist/watchers/http.js +149 -0
  162. package/dist/watchers/http.js.map +1 -0
  163. package/dist/watchers/index.d.ts +8 -0
  164. package/dist/watchers/index.d.ts.map +1 -0
  165. package/dist/watchers/index.js +25 -0
  166. package/dist/watchers/index.js.map +1 -0
  167. package/examples/README.md +9 -0
  168. package/examples/codebase-guardian.yaml +22 -0
  169. package/examples/competitor-watch.yaml +18 -0
  170. package/examples/founder-sentinel.md +126 -0
  171. package/examples/founder-sentinel.yaml +27 -0
  172. package/package.json +62 -0
@@ -0,0 +1,251 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import inquirer from 'inquirer';
4
+ import Table from 'cli-table3';
5
+ import { providersDir, providerPath, ensureAll } from '../utils/paths.js';
6
+ import { detectSystemAuth } from '../providers/system-auth.js';
7
+ const KNOWN_PROVIDERS = {
8
+ github: {
9
+ type: 'oauth_token',
10
+ fields: ['token'],
11
+ description: 'GitHub Personal Access Token or gh CLI auth',
12
+ },
13
+ slack: {
14
+ type: 'oauth_token',
15
+ fields: ['bot_token'],
16
+ description: 'Slack Bot OAuth Token (xoxb-...)',
17
+ },
18
+ anthropic: {
19
+ type: 'api_key',
20
+ fields: ['api_key'],
21
+ description: 'Anthropic API Key (sk-ant-...)',
22
+ },
23
+ openai: {
24
+ type: 'api_key',
25
+ fields: ['api_key'],
26
+ description: 'OpenAI API Key (sk-...)',
27
+ },
28
+ openrouter: {
29
+ type: 'api_key',
30
+ fields: ['api_key'],
31
+ description: 'OpenRouter API Key',
32
+ },
33
+ webhook: {
34
+ type: 'webhook_url',
35
+ fields: ['url', 'secret'],
36
+ description: 'Webhook endpoint URL and optional signing secret',
37
+ },
38
+ };
39
+ export async function providersAddCommand(providerName) {
40
+ await ensureAll();
41
+ let name = providerName;
42
+ if (!name) {
43
+ const { selected } = await inquirer.prompt([
44
+ {
45
+ type: 'list',
46
+ name: 'selected',
47
+ message: 'Which provider are you adding?',
48
+ choices: [
49
+ ...Object.keys(KNOWN_PROVIDERS).map(k => ({
50
+ name: `${k} — ${KNOWN_PROVIDERS[k].description}`,
51
+ value: k,
52
+ })),
53
+ { name: 'ollama — Local model server (no API key needed)', value: 'ollama' },
54
+ { name: 'mistral — Mistral API', value: 'mistral' },
55
+ { name: 'bedrock — AWS Bedrock (uses AWS credentials)', value: 'bedrock' },
56
+ { name: 'custom (enter manually)', value: '__custom__' },
57
+ ],
58
+ },
59
+ ]);
60
+ name = selected;
61
+ }
62
+ if (name === '__custom__') {
63
+ const { customName } = await inquirer.prompt([
64
+ {
65
+ type: 'input',
66
+ name: 'customName',
67
+ message: 'Provider name:',
68
+ validate: (v) => /^[a-z0-9-]+$/.test(v.trim()) || 'Must be lowercase slug',
69
+ filter: (v) => v.trim().toLowerCase(),
70
+ },
71
+ ]);
72
+ name = customName;
73
+ }
74
+ // ── Try to detect existing system auth first ──────────────────────────────
75
+ const detected = detectSystemAuth(name);
76
+ if (detected) {
77
+ console.log(chalk.cyan(`\n ✓ Found existing ${name} credentials via ${chalk.bold(detected.source)}`));
78
+ const { useDetected } = await inquirer.prompt([
79
+ {
80
+ type: 'confirm',
81
+ name: 'useDetected',
82
+ message: `Use these credentials?`,
83
+ default: true,
84
+ },
85
+ ]);
86
+ if (useDetected) {
87
+ const known = KNOWN_PROVIDERS[name];
88
+ const record = {
89
+ name: name,
90
+ type: known?.type ?? 'api_key',
91
+ credentials: detected.credentials,
92
+ addedAt: new Date().toISOString(),
93
+ };
94
+ await fs.writeJson(providerPath(name), record, { spaces: 2 });
95
+ await fs.chmod(providerPath(name), 0o600);
96
+ console.log(chalk.green(`\n ✓ Provider "${name}" connected via ${detected.source}\n`));
97
+ return;
98
+ }
99
+ console.log(chalk.dim(' Proceeding to manual entry...\n'));
100
+ }
101
+ // ── Manual credential entry ───────────────────────────────────────────────
102
+ const known = KNOWN_PROVIDERS[name];
103
+ // Ollama needs no credentials — just a base URL
104
+ if (name === 'ollama') {
105
+ const { baseUrl } = await inquirer.prompt([
106
+ {
107
+ type: 'input',
108
+ name: 'baseUrl',
109
+ message: 'Ollama base URL:',
110
+ default: 'http://localhost:11434',
111
+ },
112
+ ]);
113
+ const record = {
114
+ name: 'ollama',
115
+ type: 'api_key',
116
+ credentials: { base_url: baseUrl.trim() },
117
+ addedAt: new Date().toISOString(),
118
+ };
119
+ await fs.writeJson(providerPath('ollama'), record, { spaces: 2 });
120
+ await fs.chmod(providerPath('ollama'), 0o600);
121
+ console.log(chalk.green(`\n ✓ Ollama configured at ${baseUrl}\n`));
122
+ return;
123
+ }
124
+ // AWS Bedrock uses AWS credentials, not a single API key
125
+ if (name === 'bedrock') {
126
+ console.log(chalk.dim('\n Bedrock uses your AWS credentials (access key + secret).\n'));
127
+ const { accessKeyId } = await inquirer.prompt([{ type: 'input', name: 'accessKeyId', message: 'AWS Access Key ID:' }]);
128
+ const { secretKey } = await inquirer.prompt([{ type: 'password', name: 'secretKey', message: 'AWS Secret Access Key:', mask: '*' }]);
129
+ const { region } = await inquirer.prompt([{ type: 'input', name: 'region', message: 'AWS Region:', default: 'us-east-1' }]);
130
+ const record = {
131
+ name: 'bedrock',
132
+ type: 'api_key',
133
+ credentials: { access_key_id: accessKeyId.trim(), secret_access_key: secretKey.trim(), region: region.trim() },
134
+ addedAt: new Date().toISOString(),
135
+ };
136
+ await fs.writeJson(providerPath('bedrock'), record, { spaces: 2 });
137
+ await fs.chmod(providerPath('bedrock'), 0o600);
138
+ console.log(chalk.green(`\n ✓ AWS Bedrock configured for region ${region}\n`));
139
+ return;
140
+ }
141
+ const fields = known?.fields ?? ['api_key'];
142
+ const type = known?.type ?? 'api_key';
143
+ const credentials = {};
144
+ for (const field of fields) {
145
+ const { value } = await inquirer.prompt([
146
+ {
147
+ type: 'password',
148
+ name: 'value',
149
+ message: `${field}:`,
150
+ validate: (v) => v.trim().length > 0 || 'Cannot be empty',
151
+ mask: '*',
152
+ },
153
+ ]);
154
+ credentials[field] = value.trim();
155
+ }
156
+ const record = {
157
+ name: name,
158
+ type,
159
+ credentials,
160
+ addedAt: new Date().toISOString(),
161
+ };
162
+ await fs.writeJson(providerPath(name), record, { spaces: 2 });
163
+ await fs.chmod(providerPath(name), 0o600);
164
+ console.log(chalk.green(`\n ✓ Provider "${name}" saved.\n`));
165
+ }
166
+ export async function providersListCommand() {
167
+ await ensureAll();
168
+ const dir = providersDir();
169
+ const files = await fs.readdir(dir);
170
+ const provFiles = files.filter(f => f.endsWith('.json'));
171
+ const table = new Table({
172
+ head: [chalk.bold('NAME'), chalk.bold('STATUS'), chalk.bold('SOURCE'), chalk.bold('ADDED')],
173
+ style: { head: [], border: ['gray'] },
174
+ });
175
+ // Show configured providers
176
+ const configured = new Set();
177
+ for (const file of provFiles) {
178
+ try {
179
+ const record = await fs.readJson(`${dir}/${file}`);
180
+ configured.add(record.name);
181
+ table.push([
182
+ chalk.bold(record.name),
183
+ chalk.green('✓ connected'),
184
+ `saved (${Object.keys(record.credentials).join(', ')})`,
185
+ new Date(record.addedAt).toLocaleDateString(),
186
+ ]);
187
+ }
188
+ catch {
189
+ table.push([file.replace('.json', ''), chalk.red('✗ corrupt'), '', '']);
190
+ }
191
+ }
192
+ // Show available system auth not yet saved
193
+ const allProviders = ['github', 'anthropic', 'openai', 'openrouter', 'groq', 'gemini', 'mistral', 'ollama', 'bedrock'];
194
+ for (const p of allProviders) {
195
+ if (configured.has(p))
196
+ continue;
197
+ const detected = detectSystemAuth(p);
198
+ if (detected) {
199
+ table.push([
200
+ chalk.dim(p),
201
+ chalk.yellow('~ detected'),
202
+ chalk.dim(detected.source),
203
+ chalk.dim('not saved — run: demon providers add ' + p),
204
+ ]);
205
+ }
206
+ }
207
+ if (table.length === 0) {
208
+ console.log(chalk.dim('\n No providers configured or detected.\n'));
209
+ console.log(chalk.dim(' Run `demon providers add` to connect one.\n'));
210
+ return;
211
+ }
212
+ console.log();
213
+ console.log(table.toString());
214
+ console.log();
215
+ }
216
+ export async function providersRemoveCommand(name) {
217
+ await ensureAll();
218
+ const file = providerPath(name);
219
+ if (!(await fs.pathExists(file))) {
220
+ console.error(chalk.red(`\n Provider "${name}" not found.\n`));
221
+ process.exit(1);
222
+ }
223
+ const { confirmed } = await inquirer.prompt([
224
+ {
225
+ type: 'confirm',
226
+ name: 'confirmed',
227
+ message: `Remove provider "${name}"? This will delete its credentials.`,
228
+ default: false,
229
+ },
230
+ ]);
231
+ if (!confirmed) {
232
+ console.log(chalk.yellow(' Aborted.'));
233
+ return;
234
+ }
235
+ await fs.remove(file);
236
+ console.log(chalk.green(`\n Provider "${name}" removed.\n`));
237
+ }
238
+ export async function loadProviderCredentials(name) {
239
+ const file = providerPath(name);
240
+ if (!(await fs.pathExists(file))) {
241
+ return {};
242
+ }
243
+ try {
244
+ const record = await fs.readJson(file);
245
+ return record.credentials;
246
+ }
247
+ catch {
248
+ return {};
249
+ }
250
+ }
251
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/commands/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function psCommand(): Promise<void>;
2
+ //# sourceMappingURL=ps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkF/C"}
@@ -0,0 +1,87 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ import fs from 'fs-extra';
4
+ import { pidsDir } from '../utils/paths.js';
5
+ import prettyMs from 'pretty-ms';
6
+ export async function psCommand() {
7
+ const dir = pidsDir();
8
+ await fs.ensureDir(dir);
9
+ const files = await fs.readdir(dir);
10
+ const stateFiles = files.filter(f => f.endsWith('.json'));
11
+ if (stateFiles.length === 0) {
12
+ console.log(chalk.dim('\n No demons running.\n'));
13
+ console.log(chalk.dim(' Start one with: demon start <manifest.yaml>\n'));
14
+ return;
15
+ }
16
+ const table = new Table({
17
+ head: [
18
+ chalk.bold('NAME'),
19
+ chalk.bold('STATUS'),
20
+ chalk.bold('PID'),
21
+ chalk.bold('MODEL'),
22
+ chalk.bold('MODE'),
23
+ chalk.bold('CYCLES'),
24
+ chalk.bold('ACTIONS'),
25
+ chalk.bold('UPTIME'),
26
+ chalk.bold('LAST CHECK'),
27
+ ],
28
+ style: { head: [], border: ['gray'] },
29
+ colWidths: [22, 10, 8, 22, 10, 8, 9, 12, 20],
30
+ });
31
+ const states = await Promise.all(stateFiles.map(async (file) => {
32
+ try {
33
+ return await fs.readJson(`${dir}/${file}`);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }));
39
+ for (const state of states) {
40
+ if (!state)
41
+ continue;
42
+ // Check if process is still alive for 'running' states
43
+ let effectiveStatus = state.status;
44
+ if (state.status === 'running') {
45
+ if (!isProcessAlive(state.pid)) {
46
+ effectiveStatus = 'stopped';
47
+ }
48
+ }
49
+ const statusColor = {
50
+ running: chalk.green,
51
+ paused: chalk.yellow,
52
+ stopped: chalk.red,
53
+ error: chalk.red,
54
+ starting: chalk.cyan,
55
+ }[effectiveStatus] ?? chalk.white;
56
+ const uptime = state.startedAt
57
+ ? prettyMs(Date.now() - new Date(state.startedAt).getTime(), { compact: true })
58
+ : '—';
59
+ const lastCheck = state.lastCheck
60
+ ? prettyMs(Date.now() - new Date(state.lastCheck).getTime(), { compact: true }) + ' ago'
61
+ : '—';
62
+ table.push([
63
+ chalk.bold(state.name),
64
+ statusColor(effectiveStatus),
65
+ String(state.pid),
66
+ chalk.dim(state.model),
67
+ chalk.dim(state.actionMode),
68
+ String(state.cycles),
69
+ String(state.actionsCount),
70
+ uptime,
71
+ lastCheck,
72
+ ]);
73
+ }
74
+ console.log();
75
+ console.log(table.toString());
76
+ console.log();
77
+ }
78
+ function isProcessAlive(pid) {
79
+ try {
80
+ process.kill(pid, 0);
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ //# sourceMappingURL=ps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function secretsSetCommand(key: string, value?: string): Promise<void>;
2
+ export declare function secretsGetCommand(key: string): Promise<void>;
3
+ export declare function secretsListCommand(): Promise<void>;
4
+ /**
5
+ * Retrieve a secret value programmatically (used by watchers/actions).
6
+ * Returns undefined if not set.
7
+ */
8
+ export declare function getSecret(key: string): Promise<string | undefined>;
9
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAmBA,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlF;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BxD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CASxE"}
@@ -0,0 +1,97 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import inquirer from 'inquirer';
4
+ import Table from 'cli-table3';
5
+ import { join } from 'path';
6
+ import { secretsDir, ensureAll } from '../utils/paths.js';
7
+ function secretPath(key) {
8
+ // Sanitize key for use as filename
9
+ const safe = key.replace(/[^a-zA-Z0-9_.-]/g, '_');
10
+ return join(secretsDir(), `${safe}.json`);
11
+ }
12
+ export async function secretsSetCommand(key, value) {
13
+ await ensureAll();
14
+ let secretValue = value;
15
+ if (!secretValue) {
16
+ const { inputValue } = await inquirer.prompt([
17
+ {
18
+ type: 'password',
19
+ name: 'inputValue',
20
+ message: `Value for "${key}":`,
21
+ mask: '*',
22
+ validate: (v) => v.trim().length > 0 || 'Value cannot be empty',
23
+ },
24
+ ]);
25
+ secretValue = inputValue.trim();
26
+ }
27
+ const record = {
28
+ key,
29
+ value: secretValue,
30
+ setAt: new Date().toISOString(),
31
+ };
32
+ const filePath = secretPath(key);
33
+ await fs.writeJson(filePath, record, { spaces: 2 });
34
+ await fs.chmod(filePath, 0o600);
35
+ console.log(chalk.green(`\n Secret "${key}" saved.\n`));
36
+ }
37
+ export async function secretsGetCommand(key) {
38
+ await ensureAll();
39
+ const filePath = secretPath(key);
40
+ if (!(await fs.pathExists(filePath))) {
41
+ console.error(chalk.red(`\n Secret "${key}" not found.\n`));
42
+ process.exit(1);
43
+ }
44
+ try {
45
+ const record = await fs.readJson(filePath);
46
+ // Only print value to stdout (so it can be captured with $(...))
47
+ process.stdout.write(record.value + '\n');
48
+ }
49
+ catch {
50
+ console.error(chalk.red(`\n Failed to read secret "${key}".\n`));
51
+ process.exit(1);
52
+ }
53
+ }
54
+ export async function secretsListCommand() {
55
+ await ensureAll();
56
+ const dir = secretsDir();
57
+ const files = await fs.readdir(dir);
58
+ const secretFiles = files.filter(f => f.endsWith('.json'));
59
+ if (secretFiles.length === 0) {
60
+ console.log(chalk.dim('\n No secrets stored.\n'));
61
+ console.log(chalk.dim(' Run `demon secrets set <KEY>` to add one.\n'));
62
+ return;
63
+ }
64
+ const table = new Table({
65
+ head: [chalk.bold('KEY'), chalk.bold('SET AT')],
66
+ style: { head: [], border: ['gray'] },
67
+ });
68
+ for (const file of secretFiles) {
69
+ try {
70
+ const record = await fs.readJson(`${dir}/${file}`);
71
+ table.push([record.key, new Date(record.setAt).toLocaleString()]);
72
+ }
73
+ catch {
74
+ table.push([file.replace('.json', ''), chalk.red('corrupt')]);
75
+ }
76
+ }
77
+ console.log();
78
+ console.log(table.toString());
79
+ console.log();
80
+ }
81
+ /**
82
+ * Retrieve a secret value programmatically (used by watchers/actions).
83
+ * Returns undefined if not set.
84
+ */
85
+ export async function getSecret(key) {
86
+ const filePath = secretPath(key);
87
+ if (!(await fs.pathExists(filePath)))
88
+ return undefined;
89
+ try {
90
+ const record = await fs.readJson(filePath);
91
+ return record.value;
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface StartOptions {
2
+ dryRun?: boolean;
3
+ auto?: boolean;
4
+ interval?: string;
5
+ model?: string;
6
+ install?: boolean;
7
+ }
8
+ export declare function startCommand(fileOrIntent: string, options: StartOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AA0DA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiL7F"}