@ekkos/cli 1.3.2 → 1.3.6

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 (123) hide show
  1. package/dist/capture/jsonl-rewriter.d.ts +1 -1
  2. package/dist/capture/jsonl-rewriter.js +3 -3
  3. package/dist/capture/transcript-repair.d.ts +2 -2
  4. package/dist/capture/transcript-repair.js +2 -2
  5. package/dist/commands/claw.d.ts +13 -0
  6. package/dist/commands/claw.js +253 -0
  7. package/dist/commands/dashboard.js +617 -83
  8. package/dist/commands/doctor.d.ts +3 -3
  9. package/dist/commands/doctor.js +6 -79
  10. package/dist/commands/gemini.d.ts +19 -0
  11. package/dist/commands/gemini.js +193 -0
  12. package/dist/commands/init.js +2 -25
  13. package/dist/commands/run.d.ts +0 -1
  14. package/dist/commands/run.js +147 -241
  15. package/dist/commands/scan.d.ts +21 -0
  16. package/dist/commands/scan.js +386 -0
  17. package/dist/commands/swarm-dashboard.js +156 -28
  18. package/dist/commands/swarm.d.ts +1 -1
  19. package/dist/commands/swarm.js +1 -1
  20. package/dist/commands/test-claude.d.ts +2 -2
  21. package/dist/commands/test-claude.js +3 -3
  22. package/dist/deploy/index.d.ts +0 -2
  23. package/dist/deploy/index.js +0 -2
  24. package/dist/deploy/settings.d.ts +2 -2
  25. package/dist/deploy/settings.js +42 -4
  26. package/dist/deploy/skills.js +1 -2
  27. package/dist/index.js +79 -19
  28. package/dist/lib/usage-parser.js +5 -4
  29. package/dist/utils/proxy-url.d.ts +12 -1
  30. package/dist/utils/proxy-url.js +16 -1
  31. package/dist/utils/templates.js +1 -1
  32. package/package.json +4 -6
  33. package/templates/CLAUDE.md +49 -107
  34. package/dist/agent/daemon.d.ts +0 -130
  35. package/dist/agent/daemon.js +0 -606
  36. package/dist/agent/health-check.d.ts +0 -35
  37. package/dist/agent/health-check.js +0 -243
  38. package/dist/agent/pty-runner.d.ts +0 -53
  39. package/dist/agent/pty-runner.js +0 -190
  40. package/dist/commands/agent.d.ts +0 -50
  41. package/dist/commands/agent.js +0 -544
  42. package/dist/commands/setup-remote.d.ts +0 -20
  43. package/dist/commands/setup-remote.js +0 -582
  44. package/dist/commands/synk.d.ts +0 -7
  45. package/dist/commands/synk.js +0 -339
  46. package/dist/cron/index.d.ts +0 -7
  47. package/dist/cron/index.js +0 -13
  48. package/dist/cron/promoter.d.ts +0 -70
  49. package/dist/cron/promoter.js +0 -403
  50. package/dist/synk/api.d.ts +0 -22
  51. package/dist/synk/api.js +0 -133
  52. package/dist/synk/auth.d.ts +0 -7
  53. package/dist/synk/auth.js +0 -30
  54. package/dist/synk/config.d.ts +0 -18
  55. package/dist/synk/config.js +0 -37
  56. package/dist/synk/daemon/control-client.d.ts +0 -11
  57. package/dist/synk/daemon/control-client.js +0 -101
  58. package/dist/synk/daemon/control-server.d.ts +0 -24
  59. package/dist/synk/daemon/control-server.js +0 -91
  60. package/dist/synk/daemon/run.d.ts +0 -14
  61. package/dist/synk/daemon/run.js +0 -338
  62. package/dist/synk/encryption.d.ts +0 -17
  63. package/dist/synk/encryption.js +0 -133
  64. package/dist/synk/index.d.ts +0 -13
  65. package/dist/synk/index.js +0 -36
  66. package/dist/synk/machine-client.d.ts +0 -42
  67. package/dist/synk/machine-client.js +0 -218
  68. package/dist/synk/persistence.d.ts +0 -51
  69. package/dist/synk/persistence.js +0 -211
  70. package/dist/synk/qr.d.ts +0 -5
  71. package/dist/synk/qr.js +0 -33
  72. package/dist/synk/session-bridge.d.ts +0 -58
  73. package/dist/synk/session-bridge.js +0 -171
  74. package/dist/synk/session-client.d.ts +0 -46
  75. package/dist/synk/session-client.js +0 -240
  76. package/dist/synk/types.d.ts +0 -574
  77. package/dist/synk/types.js +0 -74
  78. package/dist/utils/verify-remote-terminal.d.ts +0 -10
  79. package/dist/utils/verify-remote-terminal.js +0 -415
  80. package/templates/README.md +0 -378
  81. package/templates/claude-plugins/PHASE2_COMPLETION.md +0 -346
  82. package/templates/claude-plugins/PLUGIN_PROPOSALS.md +0 -1776
  83. package/templates/claude-plugins/README.md +0 -587
  84. package/templates/claude-plugins/agents/code-reviewer.json +0 -14
  85. package/templates/claude-plugins/agents/debug-detective.json +0 -15
  86. package/templates/claude-plugins/agents/git-companion.json +0 -14
  87. package/templates/claude-plugins/blog-manager/.claude-plugin/plugin.json +0 -8
  88. package/templates/claude-plugins/blog-manager/commands/blog.md +0 -691
  89. package/templates/claude-plugins/golden-loop-monitor/.claude-plugin/plugin.json +0 -8
  90. package/templates/claude-plugins/golden-loop-monitor/commands/loop-status.md +0 -434
  91. package/templates/claude-plugins/learning-tracker/.claude-plugin/plugin.json +0 -8
  92. package/templates/claude-plugins/learning-tracker/commands/my-patterns.md +0 -282
  93. package/templates/claude-plugins/memory-lens/.claude-plugin/plugin.json +0 -8
  94. package/templates/claude-plugins/memory-lens/commands/memory-search.md +0 -181
  95. package/templates/claude-plugins/pattern-coach/.claude-plugin/plugin.json +0 -8
  96. package/templates/claude-plugins/pattern-coach/commands/forge.md +0 -365
  97. package/templates/claude-plugins/project-schema-validator/.claude-plugin/plugin.json +0 -8
  98. package/templates/claude-plugins/project-schema-validator/commands/validate-schema.md +0 -582
  99. package/templates/commands/continue.md +0 -47
  100. package/templates/cursor-rules/ekkos-memory.md +0 -127
  101. package/templates/ekkos-manifest.json +0 -223
  102. package/templates/helpers/json-parse.cjs +0 -101
  103. package/templates/plan-template.md +0 -306
  104. package/templates/shared/hooks-enabled.json +0 -22
  105. package/templates/shared/session-words.json +0 -45
  106. package/templates/skills/ekkOS_Deep_Recall/Skill.md +0 -282
  107. package/templates/skills/ekkOS_Learn/Skill.md +0 -265
  108. package/templates/skills/ekkOS_Memory_First/Skill.md +0 -206
  109. package/templates/skills/ekkOS_Plan_Assist/Skill.md +0 -302
  110. package/templates/skills/ekkOS_Preferences/Skill.md +0 -247
  111. package/templates/skills/ekkOS_Reflect/Skill.md +0 -257
  112. package/templates/skills/ekkOS_Safety/Skill.md +0 -265
  113. package/templates/skills/ekkOS_Schema/Skill.md +0 -251
  114. package/templates/skills/ekkOS_Summary/Skill.md +0 -257
  115. package/templates/spec-template.md +0 -159
  116. package/templates/windsurf-rules/ekkos-memory.md +0 -127
  117. package/templates/windsurf-skills/README.md +0 -58
  118. package/templates/windsurf-skills/ekkos-continue/SKILL.md +0 -81
  119. package/templates/windsurf-skills/ekkos-golden-loop/SKILL.md +0 -225
  120. package/templates/windsurf-skills/ekkos-insights/SKILL.md +0 -138
  121. package/templates/windsurf-skills/ekkos-recall/SKILL.md +0 -96
  122. package/templates/windsurf-skills/ekkos-safety/SKILL.md +0 -89
  123. package/templates/windsurf-skills/ekkos-vault/SKILL.md +0 -86
@@ -1,339 +0,0 @@
1
- "use strict";
2
- /**
3
- * ekkOS_synk commands — remote session sync for Claude Code
4
- *
5
- * Provides: ekkos synk auth, connect, disconnect, sessions, daemon start/stop/status, doctor
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- var __importDefault = (this && this.__importDefault) || function (mod) {
41
- return (mod && mod.__esModule) ? mod : { "default": mod };
42
- };
43
- Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.registerSynkCommands = registerSynkCommands;
45
- const chalk_1 = __importDefault(require("chalk"));
46
- function registerSynkCommands(program) {
47
- const synkCmd = program
48
- .command('synk')
49
- .description('Remote session sync — control Claude Code from anywhere');
50
- // ── Auth ──
51
- synkCmd
52
- .command('auth')
53
- .description('Authenticate with synk-server and display QR code for mobile pairing')
54
- .option('-f, --force', 'Force re-authentication')
55
- .action(async (options) => {
56
- const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
57
- const { readCredentials } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
58
- const { getRandomBytes, encodeBase64 } = await Promise.resolve().then(() => __importStar(require('../synk/encryption')));
59
- const { authGetToken, generateAppUrl } = await Promise.resolve().then(() => __importStar(require('../synk/auth')));
60
- const { displayQRCode } = await Promise.resolve().then(() => __importStar(require('../synk/qr')));
61
- synkConfig.ensureDirectories();
62
- let credentials = await readCredentials();
63
- if (credentials && !options.force) {
64
- console.log(chalk_1.default.green(' Already authenticated with synk-server.'));
65
- console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
66
- console.log(chalk_1.default.gray(` Use --force to re-authenticate.`));
67
- // Still show QR code for mobile pairing
68
- if (credentials.encryption.type === 'legacy') {
69
- const url = generateAppUrl(credentials.encryption.secret);
70
- displayQRCode(url);
71
- }
72
- return;
73
- }
74
- console.log('');
75
- console.log(chalk_1.default.cyan.bold(' ekkOS_synk') + chalk_1.default.gray(' — Setting up remote session sync'));
76
- console.log('');
77
- // Generate new secret key
78
- const secret = getRandomBytes(32);
79
- try {
80
- const token = await authGetToken(secret);
81
- const { writeCredentialsLegacy } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
82
- await writeCredentialsLegacy({ secret, token });
83
- console.log(chalk_1.default.green(' Authenticated successfully!'));
84
- console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
85
- console.log(chalk_1.default.gray(` Credentials saved to: ${synkConfig.credentialsFile}`));
86
- // Show QR code for mobile pairing
87
- const url = generateAppUrl(secret);
88
- displayQRCode(url);
89
- }
90
- catch (error) {
91
- console.error(chalk_1.default.red(` Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`));
92
- process.exit(1);
93
- }
94
- });
95
- // ── Status (default when running `ekkos synk`) ──
96
- synkCmd
97
- .command('status', { isDefault: true })
98
- .description('Show synk connection status')
99
- .action(async () => {
100
- const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
101
- const { readCredentials, readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
102
- console.log('');
103
- console.log(chalk_1.default.cyan.bold(' ekkOS_synk') + chalk_1.default.gray(' — Remote Session Sync'));
104
- console.log('');
105
- // Check credentials
106
- const credentials = await readCredentials();
107
- if (!credentials) {
108
- console.log(chalk_1.default.yellow(' Not authenticated.'));
109
- console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk auth'));
110
- console.log('');
111
- return;
112
- }
113
- console.log(` ${chalk_1.default.green('●')} Authenticated`);
114
- console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
115
- // Check daemon
116
- const daemonState = await readDaemonState();
117
- if (daemonState) {
118
- try {
119
- process.kill(daemonState.pid, 0);
120
- console.log(` ${chalk_1.default.green('●')} Daemon running`);
121
- console.log(chalk_1.default.gray(` PID: ${daemonState.pid} | Port: ${daemonState.httpPort}`));
122
- console.log(chalk_1.default.gray(` Started: ${daemonState.startTime}`));
123
- if (daemonState.lastHeartbeat) {
124
- console.log(chalk_1.default.gray(` Last heartbeat: ${daemonState.lastHeartbeat}`));
125
- }
126
- }
127
- catch {
128
- console.log(` ${chalk_1.default.red('●')} Daemon not running (stale state)`);
129
- console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk daemon start'));
130
- }
131
- }
132
- else {
133
- console.log(` ${chalk_1.default.gray('○')} Daemon not running`);
134
- console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk daemon start'));
135
- }
136
- console.log('');
137
- });
138
- // ── Connect ──
139
- synkCmd
140
- .command('connect')
141
- .description('Start daemon and connect to synk-server')
142
- .action(async () => {
143
- const { readCredentials } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
144
- const credentials = await readCredentials();
145
- if (!credentials) {
146
- console.log(chalk_1.default.yellow(' Not authenticated. Run: ') + chalk_1.default.white('ekkos synk auth'));
147
- process.exit(1);
148
- }
149
- console.log(chalk_1.default.cyan(' Starting synk daemon...'));
150
- // Spawn daemon in detached mode
151
- const { spawn } = await Promise.resolve().then(() => __importStar(require('node:child_process')));
152
- const child = spawn(process.execPath, [process.argv[1], 'synk', 'daemon', 'start-sync'], {
153
- detached: true,
154
- stdio: 'ignore',
155
- });
156
- child.unref();
157
- // Wait a moment and check if it started
158
- await new Promise(resolve => setTimeout(resolve, 1500));
159
- const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
160
- const state = await readDaemonState();
161
- if (state) {
162
- console.log(chalk_1.default.green(' Daemon started successfully!'));
163
- console.log(chalk_1.default.gray(` PID: ${state.pid} | Port: ${state.httpPort}`));
164
- }
165
- else {
166
- console.log(chalk_1.default.yellow(' Daemon may still be starting. Check: ') + chalk_1.default.white('ekkos synk status'));
167
- }
168
- });
169
- // ── Disconnect ──
170
- synkCmd
171
- .command('disconnect')
172
- .description('Stop the synk daemon')
173
- .action(async () => {
174
- const { stopDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
175
- console.log(chalk_1.default.cyan(' Stopping synk daemon...'));
176
- await stopDaemon();
177
- console.log(chalk_1.default.green(' Daemon stopped.'));
178
- });
179
- // ── Sessions ──
180
- synkCmd
181
- .command('sessions')
182
- .description('List active synk sessions')
183
- .option('-j, --json', 'Output as JSON')
184
- .action(async (options) => {
185
- const { listDaemonSessions } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
186
- const sessions = await listDaemonSessions();
187
- if (options.json) {
188
- console.log(JSON.stringify(sessions, null, 2));
189
- return;
190
- }
191
- console.log('');
192
- console.log(chalk_1.default.cyan.bold(' Synk Sessions'));
193
- console.log('');
194
- if (sessions.length === 0) {
195
- console.log(chalk_1.default.gray(' No active sessions.'));
196
- }
197
- else {
198
- for (const session of sessions) {
199
- console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(session.synkSessionId || 'unknown')}`);
200
- console.log(chalk_1.default.gray(` PID: ${session.pid} | Started by: ${session.startedBy}`));
201
- }
202
- }
203
- console.log('');
204
- });
205
- // ── Daemon subcommand ──
206
- const daemonCmd = synkCmd
207
- .command('daemon')
208
- .description('Manage the synk background daemon');
209
- daemonCmd
210
- .command('start')
211
- .description('Start the synk daemon')
212
- .option('-v, --verbose', 'Show verbose output')
213
- .action(async (options) => {
214
- const { checkIfDaemonRunning } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
215
- const running = await checkIfDaemonRunning();
216
- if (running) {
217
- console.log(chalk_1.default.yellow(' Daemon is already running.'));
218
- return;
219
- }
220
- console.log(chalk_1.default.cyan(' Starting synk daemon...'));
221
- const { spawn } = await Promise.resolve().then(() => __importStar(require('node:child_process')));
222
- const child = spawn(process.execPath, [process.argv[1], 'synk', 'daemon', 'start-sync'], {
223
- detached: true,
224
- stdio: options.verbose ? 'inherit' : 'ignore',
225
- });
226
- child.unref();
227
- await new Promise(resolve => setTimeout(resolve, 1500));
228
- const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
229
- const state = await readDaemonState();
230
- if (state) {
231
- console.log(chalk_1.default.green(' Daemon started.'));
232
- console.log(chalk_1.default.gray(` PID: ${state.pid} | Port: ${state.httpPort}`));
233
- }
234
- else {
235
- console.log(chalk_1.default.yellow(' Daemon may still be starting...'));
236
- }
237
- });
238
- // Internal: start-sync runs the daemon in the foreground (called by detached process)
239
- daemonCmd
240
- .command('start-sync')
241
- .description('Run daemon in foreground (internal)')
242
- .action(async () => {
243
- const { startDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/run')));
244
- await startDaemon();
245
- });
246
- daemonCmd
247
- .command('stop')
248
- .description('Stop the synk daemon')
249
- .action(async () => {
250
- const { stopDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
251
- console.log(chalk_1.default.cyan(' Stopping synk daemon...'));
252
- await stopDaemon();
253
- console.log(chalk_1.default.green(' Daemon stopped.'));
254
- });
255
- daemonCmd
256
- .command('status')
257
- .description('Show daemon status')
258
- .option('-j, --json', 'Output as JSON')
259
- .action(async (options) => {
260
- const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
261
- const state = await readDaemonState();
262
- if (options.json) {
263
- console.log(JSON.stringify(state, null, 2));
264
- return;
265
- }
266
- if (!state) {
267
- console.log(chalk_1.default.gray(' Daemon is not running.'));
268
- return;
269
- }
270
- try {
271
- process.kill(state.pid, 0);
272
- console.log(` ${chalk_1.default.green('●')} Daemon running`);
273
- console.log(chalk_1.default.gray(` PID: ${state.pid}`));
274
- console.log(chalk_1.default.gray(` Port: ${state.httpPort}`));
275
- console.log(chalk_1.default.gray(` Started: ${state.startTime}`));
276
- console.log(chalk_1.default.gray(` Version: ${state.startedWithCliVersion}`));
277
- if (state.lastHeartbeat) {
278
- console.log(chalk_1.default.gray(` Last heartbeat: ${state.lastHeartbeat}`));
279
- }
280
- if (state.daemonLogPath) {
281
- console.log(chalk_1.default.gray(` Log: ${state.daemonLogPath}`));
282
- }
283
- }
284
- catch {
285
- console.log(` ${chalk_1.default.red('●')} Daemon not running (stale state file)`);
286
- console.log(chalk_1.default.gray(' Cleaning up...'));
287
- const { clearDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
288
- await clearDaemonState();
289
- console.log(chalk_1.default.gray(' Done.'));
290
- }
291
- });
292
- // ── Doctor ──
293
- synkCmd
294
- .command('doctor')
295
- .description('Diagnose synk connectivity and configuration')
296
- .action(async () => {
297
- const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
298
- const { readCredentials, readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
299
- const axios = (await Promise.resolve().then(() => __importStar(require('axios')))).default;
300
- console.log('');
301
- console.log(chalk_1.default.cyan.bold(' ekkOS_synk Doctor'));
302
- console.log('');
303
- // Check config
304
- console.log(chalk_1.default.gray(' Server URL: ') + synkConfig.serverUrl);
305
- console.log(chalk_1.default.gray(' Data dir: ') + synkConfig.synkHomeDir);
306
- // Check credentials
307
- const credentials = await readCredentials();
308
- if (credentials) {
309
- console.log(` ${chalk_1.default.green('✓')} Credentials found`);
310
- }
311
- else {
312
- console.log(` ${chalk_1.default.red('✗')} No credentials — run "ekkos synk auth"`);
313
- return;
314
- }
315
- // Check server connectivity
316
- try {
317
- const response = await axios.get(synkConfig.serverUrl, { timeout: 5000 });
318
- console.log(` ${chalk_1.default.green('✓')} Server reachable`);
319
- }
320
- catch (error) {
321
- console.log(` ${chalk_1.default.red('✗')} Server unreachable: ${error instanceof Error ? error.message : 'Unknown error'}`);
322
- }
323
- // Check daemon
324
- const daemonState = await readDaemonState();
325
- if (daemonState) {
326
- try {
327
- process.kill(daemonState.pid, 0);
328
- console.log(` ${chalk_1.default.green('✓')} Daemon running (PID ${daemonState.pid})`);
329
- }
330
- catch {
331
- console.log(` ${chalk_1.default.yellow('!')} Stale daemon state (PID ${daemonState.pid} not running)`);
332
- }
333
- }
334
- else {
335
- console.log(` ${chalk_1.default.gray('○')} Daemon not running`);
336
- }
337
- console.log('');
338
- });
339
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * ekkOS Cron Jobs
3
- * ================
4
- *
5
- * Background jobs for ekkOS maintenance and evolution.
6
- */
7
- export { evaluatePromotions, queryPatternStats, writePatchConfig, type PromoterConfig, type PromotionResult, type PromotedPatchConfig, type PromotedPattern, } from './promoter.js';
@@ -1,13 +0,0 @@
1
- "use strict";
2
- /**
3
- * ekkOS Cron Jobs
4
- * ================
5
- *
6
- * Background jobs for ekkOS maintenance and evolution.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.writePatchConfig = exports.queryPatternStats = exports.evaluatePromotions = void 0;
10
- var promoter_js_1 = require("./promoter.js");
11
- Object.defineProperty(exports, "evaluatePromotions", { enumerable: true, get: function () { return promoter_js_1.evaluatePromotions; } });
12
- Object.defineProperty(exports, "queryPatternStats", { enumerable: true, get: function () { return promoter_js_1.queryPatternStats; } });
13
- Object.defineProperty(exports, "writePatchConfig", { enumerable: true, get: function () { return promoter_js_1.writePatchConfig; } });
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * ekkOS PROMETHEUS Pattern Promoter
4
- * ==================================
5
- *
6
- * Daily cron job that evaluates patterns for promotion to constitutional memory.
7
- *
8
- * Constitutional patterns are injected into the system prompt via @ekkos/patch,
9
- * making them "instincts" that don't require retrieval.
10
- *
11
- * Promotion Criteria (default):
12
- * - Success rate ≥ 85%
13
- * - Applications ≥ 5
14
- * - Skip rate ≤ 10%
15
- * - Confidence ≥ 70%
16
- * - Used within last 30 days
17
- * - Used in ≥ 2 unique sessions
18
- *
19
- * Usage:
20
- * npx ekkos-promote # Run promotion evaluation
21
- * npx ekkos-promote --dry-run # Preview without applying changes
22
- * npx ekkos-promote --user <uuid> # Promote for specific user
23
- *
24
- * Schedule via launchd (macOS) or cron:
25
- * 0 6 * * * /path/to/node /path/to/ekkos-promote
26
- */
27
- import { SupabaseClient } from '@supabase/supabase-js';
28
- import { type PatternStats } from '@ekkos/prometheus';
29
- interface PromoterConfig {
30
- supabaseUrl: string;
31
- supabaseKey: string;
32
- dryRun: boolean;
33
- userId?: string;
34
- patchConfigPath: string;
35
- verbose: boolean;
36
- }
37
- interface PromotionResult {
38
- evaluated: number;
39
- promoted: number;
40
- demoted: number;
41
- patterns: Array<{
42
- patternId: string;
43
- title: string;
44
- action: 'promoted' | 'demoted' | 'unchanged';
45
- score: number;
46
- reason?: string;
47
- }>;
48
- patchConfig?: PromotedPatchConfig;
49
- }
50
- interface PromotedPattern {
51
- id: string;
52
- title: string;
53
- problem: string;
54
- solution: string;
55
- promotedAt: string;
56
- successRate: number;
57
- appliedCount: number;
58
- tags?: string[];
59
- }
60
- interface PromotedPatchConfig {
61
- version: string;
62
- generatedAt: string;
63
- promotedPatterns: PromotedPattern[];
64
- totalPatterns: number;
65
- }
66
- declare function queryPatternStats(supabase: SupabaseClient, userId?: string): Promise<PatternStats[]>;
67
- declare function evaluatePromotions(supabase: SupabaseClient, config: PromoterConfig): Promise<PromotionResult>;
68
- declare function writePatchConfig(config: PromotedPatchConfig, outputPath: string): void;
69
- export { evaluatePromotions, queryPatternStats, writePatchConfig };
70
- export type { PromoterConfig, PromotionResult, PromotedPatchConfig, PromotedPattern };