@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.
- package/dist/capture/jsonl-rewriter.d.ts +1 -1
- package/dist/capture/jsonl-rewriter.js +3 -3
- package/dist/capture/transcript-repair.d.ts +2 -2
- package/dist/capture/transcript-repair.js +2 -2
- package/dist/commands/claw.d.ts +13 -0
- package/dist/commands/claw.js +253 -0
- package/dist/commands/dashboard.js +617 -83
- package/dist/commands/doctor.d.ts +3 -3
- package/dist/commands/doctor.js +6 -79
- package/dist/commands/gemini.d.ts +19 -0
- package/dist/commands/gemini.js +193 -0
- package/dist/commands/init.js +2 -25
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/run.js +147 -241
- package/dist/commands/scan.d.ts +21 -0
- package/dist/commands/scan.js +386 -0
- package/dist/commands/swarm-dashboard.js +156 -28
- package/dist/commands/swarm.d.ts +1 -1
- package/dist/commands/swarm.js +1 -1
- package/dist/commands/test-claude.d.ts +2 -2
- package/dist/commands/test-claude.js +3 -3
- package/dist/deploy/index.d.ts +0 -2
- package/dist/deploy/index.js +0 -2
- package/dist/deploy/settings.d.ts +2 -2
- package/dist/deploy/settings.js +42 -4
- package/dist/deploy/skills.js +1 -2
- package/dist/index.js +79 -19
- package/dist/lib/usage-parser.js +5 -4
- package/dist/utils/proxy-url.d.ts +12 -1
- package/dist/utils/proxy-url.js +16 -1
- package/dist/utils/templates.js +1 -1
- package/package.json +4 -6
- package/templates/CLAUDE.md +49 -107
- package/dist/agent/daemon.d.ts +0 -130
- package/dist/agent/daemon.js +0 -606
- package/dist/agent/health-check.d.ts +0 -35
- package/dist/agent/health-check.js +0 -243
- package/dist/agent/pty-runner.d.ts +0 -53
- package/dist/agent/pty-runner.js +0 -190
- package/dist/commands/agent.d.ts +0 -50
- package/dist/commands/agent.js +0 -544
- package/dist/commands/setup-remote.d.ts +0 -20
- package/dist/commands/setup-remote.js +0 -582
- package/dist/commands/synk.d.ts +0 -7
- package/dist/commands/synk.js +0 -339
- package/dist/cron/index.d.ts +0 -7
- package/dist/cron/index.js +0 -13
- package/dist/cron/promoter.d.ts +0 -70
- package/dist/cron/promoter.js +0 -403
- package/dist/synk/api.d.ts +0 -22
- package/dist/synk/api.js +0 -133
- package/dist/synk/auth.d.ts +0 -7
- package/dist/synk/auth.js +0 -30
- package/dist/synk/config.d.ts +0 -18
- package/dist/synk/config.js +0 -37
- package/dist/synk/daemon/control-client.d.ts +0 -11
- package/dist/synk/daemon/control-client.js +0 -101
- package/dist/synk/daemon/control-server.d.ts +0 -24
- package/dist/synk/daemon/control-server.js +0 -91
- package/dist/synk/daemon/run.d.ts +0 -14
- package/dist/synk/daemon/run.js +0 -338
- package/dist/synk/encryption.d.ts +0 -17
- package/dist/synk/encryption.js +0 -133
- package/dist/synk/index.d.ts +0 -13
- package/dist/synk/index.js +0 -36
- package/dist/synk/machine-client.d.ts +0 -42
- package/dist/synk/machine-client.js +0 -218
- package/dist/synk/persistence.d.ts +0 -51
- package/dist/synk/persistence.js +0 -211
- package/dist/synk/qr.d.ts +0 -5
- package/dist/synk/qr.js +0 -33
- package/dist/synk/session-bridge.d.ts +0 -58
- package/dist/synk/session-bridge.js +0 -171
- package/dist/synk/session-client.d.ts +0 -46
- package/dist/synk/session-client.js +0 -240
- package/dist/synk/types.d.ts +0 -574
- package/dist/synk/types.js +0 -74
- package/dist/utils/verify-remote-terminal.d.ts +0 -10
- package/dist/utils/verify-remote-terminal.js +0 -415
- package/templates/README.md +0 -378
- package/templates/claude-plugins/PHASE2_COMPLETION.md +0 -346
- package/templates/claude-plugins/PLUGIN_PROPOSALS.md +0 -1776
- package/templates/claude-plugins/README.md +0 -587
- package/templates/claude-plugins/agents/code-reviewer.json +0 -14
- package/templates/claude-plugins/agents/debug-detective.json +0 -15
- package/templates/claude-plugins/agents/git-companion.json +0 -14
- package/templates/claude-plugins/blog-manager/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/blog-manager/commands/blog.md +0 -691
- package/templates/claude-plugins/golden-loop-monitor/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/golden-loop-monitor/commands/loop-status.md +0 -434
- package/templates/claude-plugins/learning-tracker/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/learning-tracker/commands/my-patterns.md +0 -282
- package/templates/claude-plugins/memory-lens/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/memory-lens/commands/memory-search.md +0 -181
- package/templates/claude-plugins/pattern-coach/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/pattern-coach/commands/forge.md +0 -365
- package/templates/claude-plugins/project-schema-validator/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/project-schema-validator/commands/validate-schema.md +0 -582
- package/templates/commands/continue.md +0 -47
- package/templates/cursor-rules/ekkos-memory.md +0 -127
- package/templates/ekkos-manifest.json +0 -223
- package/templates/helpers/json-parse.cjs +0 -101
- package/templates/plan-template.md +0 -306
- package/templates/shared/hooks-enabled.json +0 -22
- package/templates/shared/session-words.json +0 -45
- package/templates/skills/ekkOS_Deep_Recall/Skill.md +0 -282
- package/templates/skills/ekkOS_Learn/Skill.md +0 -265
- package/templates/skills/ekkOS_Memory_First/Skill.md +0 -206
- package/templates/skills/ekkOS_Plan_Assist/Skill.md +0 -302
- package/templates/skills/ekkOS_Preferences/Skill.md +0 -247
- package/templates/skills/ekkOS_Reflect/Skill.md +0 -257
- package/templates/skills/ekkOS_Safety/Skill.md +0 -265
- package/templates/skills/ekkOS_Schema/Skill.md +0 -251
- package/templates/skills/ekkOS_Summary/Skill.md +0 -257
- package/templates/spec-template.md +0 -159
- package/templates/windsurf-rules/ekkos-memory.md +0 -127
- package/templates/windsurf-skills/README.md +0 -58
- package/templates/windsurf-skills/ekkos-continue/SKILL.md +0 -81
- package/templates/windsurf-skills/ekkos-golden-loop/SKILL.md +0 -225
- package/templates/windsurf-skills/ekkos-insights/SKILL.md +0 -138
- package/templates/windsurf-skills/ekkos-recall/SKILL.md +0 -96
- package/templates/windsurf-skills/ekkos-safety/SKILL.md +0 -89
- package/templates/windsurf-skills/ekkos-vault/SKILL.md +0 -86
package/dist/commands/synk.js
DELETED
|
@@ -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
|
-
}
|
package/dist/cron/index.d.ts
DELETED
|
@@ -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';
|
package/dist/cron/index.js
DELETED
|
@@ -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; } });
|
package/dist/cron/promoter.d.ts
DELETED
|
@@ -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 };
|