@hipp0/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.
- package/dist/cli-helpers.d.ts +14 -0
- package/dist/cli-helpers.d.ts.map +1 -0
- package/dist/cli-helpers.js +194 -0
- package/dist/cli-helpers.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +50 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +49 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/decisions.d.ts +3 -0
- package/dist/commands/decisions.d.ts.map +1 -0
- package/dist/commands/decisions.js +206 -0
- package/dist/commands/decisions.js.map +1 -0
- package/dist/commands/distill.d.ts +3 -0
- package/dist/commands/distill.d.ts.map +1 -0
- package/dist/commands/distill.js +54 -0
- package/dist/commands/distill.js.map +1 -0
- package/dist/commands/export-import.d.ts +3 -0
- package/dist/commands/export-import.d.ts.map +1 -0
- package/dist/commands/export-import.js +109 -0
- package/dist/commands/export-import.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +157 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/notifications.d.ts +3 -0
- package/dist/commands/notifications.d.ts.map +1 -0
- package/dist/commands/notifications.js +96 -0
- package/dist/commands/notifications.js.map +1 -0
- package/dist/commands/server.d.ts +7 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +203 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +11 -0
- package/dist/commands/shortcuts.d.ts.map +1 -0
- package/dist/commands/shortcuts.js +163 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +46 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/decigraph-cli.d.ts +3 -0
- package/dist/decigraph-cli.d.ts.map +1 -0
- package/dist/decigraph-cli.js +34 -0
- package/dist/decigraph-cli.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hipp0 start — start the Hipp0 server using hipp0.db in the current dir.
|
|
3
|
+
* hipp0 stop — send SIGTERM to the server recorded in .hipp0.pid.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
const _require = createRequire(import.meta.url);
|
|
12
|
+
const PID_FILE = '.hipp0.pid';
|
|
13
|
+
const DEFAULT_PORT = 3100;
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function pidFilePath(dir) {
|
|
18
|
+
return path.join(dir, PID_FILE);
|
|
19
|
+
}
|
|
20
|
+
function readPid(dir) {
|
|
21
|
+
const file = pidFilePath(dir);
|
|
22
|
+
if (!fs.existsSync(file))
|
|
23
|
+
return null;
|
|
24
|
+
const raw = fs.readFileSync(file, 'utf-8').trim();
|
|
25
|
+
const pid = parseInt(raw, 10);
|
|
26
|
+
return isNaN(pid) ? null : pid;
|
|
27
|
+
}
|
|
28
|
+
/** Check whether a process with the given PID is still running. */
|
|
29
|
+
function isRunning(pid) {
|
|
30
|
+
try {
|
|
31
|
+
process.kill(pid, 0);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a Hipp0-style API key: "h0_local_" + 16 random characters.
|
|
40
|
+
*/
|
|
41
|
+
function generateApiKey() {
|
|
42
|
+
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
43
|
+
const uuid = crypto.randomUUID().replace(/-/g, '');
|
|
44
|
+
const raw = uuid.slice(0, 16);
|
|
45
|
+
const mapped = raw
|
|
46
|
+
.split('')
|
|
47
|
+
.map((ch) => chars[parseInt(ch, 16) % chars.length])
|
|
48
|
+
.join('');
|
|
49
|
+
return `h0_local_${mapped}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Locate the @hipp0/server entry-point, tolerating both installed and
|
|
53
|
+
* monorepo layouts.
|
|
54
|
+
*/
|
|
55
|
+
function resolveServerEntry() {
|
|
56
|
+
try {
|
|
57
|
+
return _require.resolve('@hipp0/server');
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Monorepo fallback: look relative to this package.
|
|
61
|
+
return path.resolve(path.dirname(_require.resolve('@hipp0/cli/package.json')), '..', 'server', 'dist', 'index.js');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Start the server as a detached background process.
|
|
66
|
+
* Returns the PID.
|
|
67
|
+
*/
|
|
68
|
+
function spawnServer(dir, sqlitePath, apiKey, port) {
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const serverEntry = resolveServerEntry();
|
|
71
|
+
const child = spawn(process.execPath, [serverEntry], {
|
|
72
|
+
detached: true,
|
|
73
|
+
stdio: 'ignore',
|
|
74
|
+
env: {
|
|
75
|
+
...process.env,
|
|
76
|
+
PORT: String(port),
|
|
77
|
+
HOST: '127.0.0.1',
|
|
78
|
+
HIPP0_SQLITE_PATH: sqlitePath,
|
|
79
|
+
HIPP0_API_KEY: apiKey,
|
|
80
|
+
},
|
|
81
|
+
cwd: dir,
|
|
82
|
+
});
|
|
83
|
+
child.on('error', reject);
|
|
84
|
+
child.unref();
|
|
85
|
+
const pid = child.pid;
|
|
86
|
+
if (pid === undefined) {
|
|
87
|
+
reject(new Error('Failed to obtain server PID'));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Persist the PID so `hipp0 stop` can find it.
|
|
91
|
+
fs.writeFileSync(pidFilePath(dir), String(pid), 'utf-8');
|
|
92
|
+
resolve(pid);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Command registration
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
export function registerServerCommands(program) {
|
|
99
|
+
// hipp0 start
|
|
100
|
+
program
|
|
101
|
+
.command('start')
|
|
102
|
+
.description('Start the Hipp0 server (uses hipp0.db in the current directory)')
|
|
103
|
+
.option('-p, --port <port>', 'Port to listen on', String(DEFAULT_PORT))
|
|
104
|
+
.option('--api-key <key>', 'API key (generated automatically if omitted)')
|
|
105
|
+
.action(async (opts) => {
|
|
106
|
+
const dir = process.cwd();
|
|
107
|
+
const port = parseInt(opts.port ?? String(DEFAULT_PORT), 10);
|
|
108
|
+
const sqlitePath = path.join(dir, 'hipp0.db');
|
|
109
|
+
// If no database exists, delegate to hipp0 init to do full initialisation.
|
|
110
|
+
if (!fs.existsSync(sqlitePath)) {
|
|
111
|
+
console.warn(chalk.yellow('No hipp0.db found in the current directory. Running `hipp0 init`…'));
|
|
112
|
+
// Re-invoke the CLI with `init` so we get the full init flow.
|
|
113
|
+
const cliEntry = process.argv[1];
|
|
114
|
+
if (!cliEntry) {
|
|
115
|
+
console.error(chalk.red('Cannot locate CLI entry-point.'));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
const child = spawn(process.execPath, [cliEntry, 'init', '--port', String(port)], {
|
|
119
|
+
stdio: 'inherit',
|
|
120
|
+
cwd: dir,
|
|
121
|
+
});
|
|
122
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Check if server is already running.
|
|
126
|
+
const existingPid = readPid(dir);
|
|
127
|
+
if (existingPid !== null && isRunning(existingPid)) {
|
|
128
|
+
console.warn(chalk.yellow(`[hipp0] Server is already running (PID ${existingPid})`));
|
|
129
|
+
console.warn(chalk.dim(` API: http://localhost:${port}`));
|
|
130
|
+
console.warn(chalk.dim(` Dashboard: http://localhost:${port}/dashboard`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const apiKey = opts.apiKey ?? generateApiKey();
|
|
134
|
+
const spinner = ora('Starting Hipp0 server…').start();
|
|
135
|
+
try {
|
|
136
|
+
const pid = await spawnServer(dir, sqlitePath, apiKey, port);
|
|
137
|
+
// Give the process a moment to bind before reporting success.
|
|
138
|
+
await new Promise((r) => setTimeout(r, 800));
|
|
139
|
+
if (!isRunning(pid)) {
|
|
140
|
+
spinner.fail('Server process exited unexpectedly. Check logs.');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
spinner.succeed(chalk.green('Hipp0 server started'));
|
|
144
|
+
console.warn('');
|
|
145
|
+
console.warn(` ${chalk.bold('API:')} http://localhost:${port}`);
|
|
146
|
+
console.warn(` ${chalk.bold('Dashboard:')} http://localhost:${port}/dashboard`);
|
|
147
|
+
console.warn(` ${chalk.bold('Database:')} ./hipp0.db`);
|
|
148
|
+
console.warn(` ${chalk.bold('API Key:')} ${chalk.cyan(apiKey)}`);
|
|
149
|
+
console.warn(` ${chalk.bold('PID:')} ${pid}`);
|
|
150
|
+
console.warn('');
|
|
151
|
+
console.warn(chalk.dim(` To stop: hipp0 stop`));
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
spinner.fail('Failed to start server');
|
|
155
|
+
console.error(chalk.red(err.message));
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
// hipp0 stop
|
|
160
|
+
program
|
|
161
|
+
.command('stop')
|
|
162
|
+
.description('Stop the running Hipp0 server')
|
|
163
|
+
.action(async () => {
|
|
164
|
+
const dir = process.cwd();
|
|
165
|
+
const pid = readPid(dir);
|
|
166
|
+
if (pid === null) {
|
|
167
|
+
console.error(chalk.red(`No .hipp0.pid file found in ${dir}. Is the server running from this directory?`));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
if (!isRunning(pid)) {
|
|
171
|
+
console.warn(chalk.yellow(`Process ${pid} is not running. Cleaning up stale PID file.`));
|
|
172
|
+
fs.unlinkSync(pidFilePath(dir));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const spinner = ora(`Stopping server (PID ${pid})…`).start();
|
|
176
|
+
try {
|
|
177
|
+
process.kill(pid, 'SIGTERM');
|
|
178
|
+
// Wait up to 5 s for the process to exit gracefully.
|
|
179
|
+
const deadline = Date.now() + 5000;
|
|
180
|
+
while (isRunning(pid) && Date.now() < deadline) {
|
|
181
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
182
|
+
}
|
|
183
|
+
if (isRunning(pid)) {
|
|
184
|
+
// Force-kill if it didn't exit in time.
|
|
185
|
+
process.kill(pid, 'SIGKILL');
|
|
186
|
+
spinner.warn(chalk.yellow('Server did not stop gracefully; sent SIGKILL.'));
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
spinner.succeed(chalk.green('Hipp0 server stopped.'));
|
|
190
|
+
}
|
|
191
|
+
// Remove the PID file.
|
|
192
|
+
const pf = pidFilePath(dir);
|
|
193
|
+
if (fs.existsSync(pf))
|
|
194
|
+
fs.unlinkSync(pf);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
spinner.fail('Failed to stop server');
|
|
198
|
+
console.error(chalk.red(err.message));
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD,MAAM,QAAQ,GAAG,YAAY,CAAC;AAC9B,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,KAAK,GAAG,sCAAsC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,GAAG;SACf,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;SACnD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,YAAY,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;QACpD,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,EACzD,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,UAAU,CACX,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAClB,GAAW,EACX,UAAkB,EAClB,MAAc,EACd,IAAY;IAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;YACnD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,iBAAiB,EAAE,UAAU;gBAC7B,aAAa,EAAE,MAAM;aACtB;YACD,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAEzD,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,cAAc;IAChB,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,8CAA8C,CAAC;SACzE,MAAM,CAAC,KAAK,EAAE,IAAwC,EAAE,EAAE;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAE9C,2EAA2E;QAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAClF,CAAC;YACF,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBAChF,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CAAC,0CAA0C,WAAW,GAAG,CAAC,CACvE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,IAAI,YAAY,CAAC,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7D,8DAA8D;YAC9D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAE7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,IAAI,YAAY,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,aAAa;IACf,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,+BAA+B,GAAG,8CAA8C,CACjF,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,8CAA8C,CAAC,CAAC,CAAC;YACzF,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QAE7D,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAE7B,qDAAqD;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACnC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,wCAAwC;gBACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,uBAAuB;YACvB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level shortcut commands for the Hipp0 CLI.
|
|
3
|
+
*
|
|
4
|
+
* hipp0 add "title" --tags x,y --affects a,b
|
|
5
|
+
* hipp0 ask "question"
|
|
6
|
+
* hipp0 search --tags security --agent counsel
|
|
7
|
+
* hipp0 list --limit 20
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from 'commander';
|
|
10
|
+
export declare function registerShortcutCommands(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=shortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/commands/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2L/D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { getClient, getProjectId, handleError } from '../cli-helpers.js';
|
|
4
|
+
export function registerShortcutCommands(program) {
|
|
5
|
+
// add
|
|
6
|
+
program
|
|
7
|
+
.command('add <title>')
|
|
8
|
+
.description('Record a new decision')
|
|
9
|
+
.option('--tags <tags>', 'Comma-separated tags')
|
|
10
|
+
.option('--affects <agents>', 'Comma-separated agent names')
|
|
11
|
+
.option('--confidence <level>', 'high, medium, or low', 'high')
|
|
12
|
+
.option('--description <desc>', 'Description of the decision')
|
|
13
|
+
.option('--json', 'Output as JSON')
|
|
14
|
+
.action(async (title, opts) => {
|
|
15
|
+
const client = getClient();
|
|
16
|
+
const projectId = getProjectId();
|
|
17
|
+
const spinner = ora('Recording decision...').start();
|
|
18
|
+
try {
|
|
19
|
+
const decision = await client.createDecision(projectId, {
|
|
20
|
+
title,
|
|
21
|
+
description: opts.description ?? '',
|
|
22
|
+
reasoning: '',
|
|
23
|
+
made_by: 'cli',
|
|
24
|
+
source: 'manual',
|
|
25
|
+
tags: opts.tags ? opts.tags.split(',').map((t) => t.trim()) : [],
|
|
26
|
+
affects: opts.affects ? opts.affects.split(',').map((a) => a.trim()) : [],
|
|
27
|
+
confidence: opts.confidence ?? 'high',
|
|
28
|
+
});
|
|
29
|
+
spinner.stop();
|
|
30
|
+
if (opts.json) {
|
|
31
|
+
console.log(JSON.stringify(decision, null, 2));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(`${chalk.green('✓')} Decision recorded: "${decision.title}" (id: ${decision.id})`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
handleError(err, spinner);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// ask
|
|
42
|
+
program
|
|
43
|
+
.command('ask <question>')
|
|
44
|
+
.description('Ask a natural language question about decisions')
|
|
45
|
+
.option('--json', 'Output as JSON')
|
|
46
|
+
.action(async (question, opts) => {
|
|
47
|
+
const client = getClient();
|
|
48
|
+
const projectId = getProjectId();
|
|
49
|
+
const spinner = ora('Thinking...').start();
|
|
50
|
+
try {
|
|
51
|
+
const result = await client.ask(projectId, question);
|
|
52
|
+
spinner.stop();
|
|
53
|
+
if (opts.json) {
|
|
54
|
+
console.log(JSON.stringify(result, null, 2));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(`\n${result.answer}\n`);
|
|
58
|
+
if (result.sources?.length > 0) {
|
|
59
|
+
console.log(chalk.dim('Sources:'));
|
|
60
|
+
result.sources.forEach((s) => {
|
|
61
|
+
console.log(chalk.dim(` - ${s.title} (relevance: ${s.score})`));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
handleError(err, spinner);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// search
|
|
71
|
+
program
|
|
72
|
+
.command('search [query]')
|
|
73
|
+
.description('Search decisions by text, tags, agent, or status')
|
|
74
|
+
.option('--tags <tags>', 'Comma-separated tags to filter by')
|
|
75
|
+
.option('--agent <name>', 'Filter by agent name')
|
|
76
|
+
.option('--status <status>', 'Filter by status (active, superseded)')
|
|
77
|
+
.option('--limit <n>', 'Max results', '10')
|
|
78
|
+
.option('--json', 'Output as JSON')
|
|
79
|
+
.action(async (query, opts) => {
|
|
80
|
+
const client = getClient();
|
|
81
|
+
const projectId = getProjectId();
|
|
82
|
+
const spinner = ora('Searching...').start();
|
|
83
|
+
try {
|
|
84
|
+
let decisions;
|
|
85
|
+
const limit = parseInt(opts.limit ?? '10', 10);
|
|
86
|
+
if (query) {
|
|
87
|
+
decisions = await client.searchDecisions(projectId, query, limit);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
decisions = await client.listDecisions(projectId, {
|
|
91
|
+
status: opts.status,
|
|
92
|
+
limit,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Client-side tag/agent filtering
|
|
96
|
+
if (opts.tags) {
|
|
97
|
+
const tagSet = new Set(opts.tags.split(',').map((t) => t.trim()));
|
|
98
|
+
decisions = decisions.filter((d) => (d.tags ?? []).some((t) => tagSet.has(t)));
|
|
99
|
+
}
|
|
100
|
+
if (opts.agent) {
|
|
101
|
+
decisions = decisions.filter((d) => (d.affects ?? []).includes(opts.agent) || d.made_by === opts.agent);
|
|
102
|
+
}
|
|
103
|
+
spinner.stop();
|
|
104
|
+
if (opts.json) {
|
|
105
|
+
console.log(JSON.stringify(decisions, null, 2));
|
|
106
|
+
}
|
|
107
|
+
else if (decisions.length === 0) {
|
|
108
|
+
console.log('No decisions found.');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(`\nFound ${decisions.length} decisions:\n`);
|
|
112
|
+
decisions.forEach((d) => {
|
|
113
|
+
const tags = (d.tags ?? []).join(', ');
|
|
114
|
+
console.log(` ${chalk.bold(d.title)} ${chalk.dim(`[${d.status}]`)}`);
|
|
115
|
+
console.log(` ${chalk.dim(`by ${d.made_by}`)}${tags ? chalk.dim(` | tags: ${tags}`) : ''}`);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
handleError(err, spinner);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// list
|
|
124
|
+
program
|
|
125
|
+
.command('list')
|
|
126
|
+
.description('List recent decisions')
|
|
127
|
+
.option('--limit <n>', 'Max results', '20')
|
|
128
|
+
.option('--source <source>', 'Filter by source (manual, auto_distilled)')
|
|
129
|
+
.option('--json', 'Output as JSON')
|
|
130
|
+
.action(async (opts) => {
|
|
131
|
+
const client = getClient();
|
|
132
|
+
const projectId = getProjectId();
|
|
133
|
+
const spinner = ora('Loading decisions...').start();
|
|
134
|
+
try {
|
|
135
|
+
const decisions = await client.listDecisions(projectId, {
|
|
136
|
+
limit: parseInt(opts.limit ?? '20', 10),
|
|
137
|
+
});
|
|
138
|
+
// Client-side source filtering
|
|
139
|
+
const filtered = opts.source
|
|
140
|
+
? decisions.filter((d) => d.source === opts.source)
|
|
141
|
+
: decisions;
|
|
142
|
+
spinner.stop();
|
|
143
|
+
if (opts.json) {
|
|
144
|
+
console.log(JSON.stringify(filtered, null, 2));
|
|
145
|
+
}
|
|
146
|
+
else if (filtered.length === 0) {
|
|
147
|
+
console.log('No decisions found.');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(`\n${filtered.length} decisions:\n`);
|
|
151
|
+
filtered.forEach((d) => {
|
|
152
|
+
const date = new Date(d.created_at).toLocaleDateString();
|
|
153
|
+
console.log(` ${chalk.bold(d.title)} ${chalk.dim(`[${d.status}] ${date}`)}`);
|
|
154
|
+
console.log(` ${chalk.dim(`by ${d.made_by} | source: ${d.source}`)}`);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
handleError(err, spinner);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=shortcuts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../src/commands/shortcuts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8C7D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { getClient, getProjectId, handleError, formatStats, renderAsciiGraph, } from '../cli-helpers.js';
|
|
4
|
+
export function registerStatusCommands(program) {
|
|
5
|
+
program
|
|
6
|
+
.command('status')
|
|
7
|
+
.description('Show project stats overview')
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const client = getClient();
|
|
10
|
+
const projectId = getProjectId();
|
|
11
|
+
const spinner = ora('Loading project status...').start();
|
|
12
|
+
try {
|
|
13
|
+
const [stats, project] = await Promise.all([
|
|
14
|
+
client.getProjectStats(projectId),
|
|
15
|
+
client.getProject(projectId),
|
|
16
|
+
]);
|
|
17
|
+
spinner.stop();
|
|
18
|
+
console.warn(`\n${chalk.bold.blue(`Project: ${project.name}`)}`);
|
|
19
|
+
console.warn(` ${chalk.dim('ID:')} ${chalk.cyan(project.id)}`);
|
|
20
|
+
if (project.description)
|
|
21
|
+
console.warn(` ${chalk.dim('Desc:')} ${project.description}`);
|
|
22
|
+
formatStats(stats);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
handleError(err, spinner);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
program
|
|
29
|
+
.command('graph')
|
|
30
|
+
.description('Show full project decision graph as ASCII')
|
|
31
|
+
.action(async () => {
|
|
32
|
+
const client = getClient();
|
|
33
|
+
const projectId = getProjectId();
|
|
34
|
+
const spinner = ora('Loading project graph...').start();
|
|
35
|
+
try {
|
|
36
|
+
const graph = await client.getProjectGraph(projectId);
|
|
37
|
+
spinner.stop();
|
|
38
|
+
console.warn(chalk.bold(`\nProject Graph: ${graph.nodes.length} nodes, ${graph.edges.length} edges`));
|
|
39
|
+
renderAsciiGraph(graph);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
handleError(err, spinner);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;gBACjC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,WAAW;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAExF,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CACxF,CAAC;YACF,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decigraph-cli.d.ts","sourceRoot":"","sources":["../src/decigraph-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { registerInitCommand } from './commands/init.js';
|
|
4
|
+
import { registerDecisionCommands } from './commands/decisions.js';
|
|
5
|
+
import { registerCompileCommand } from './commands/compile.js';
|
|
6
|
+
import { registerDistillCommand } from './commands/distill.js';
|
|
7
|
+
import { registerAgentCommands } from './commands/agents.js';
|
|
8
|
+
import { registerNotificationCommands } from './commands/notifications.js';
|
|
9
|
+
import { registerStatusCommands } from './commands/status.js';
|
|
10
|
+
import { registerServerCommands } from './commands/server.js';
|
|
11
|
+
import { registerExportImportCommands } from './commands/export-import.js';
|
|
12
|
+
import { registerShortcutCommands } from './commands/shortcuts.js';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('hipp0')
|
|
16
|
+
.description('Hipp0 — AI team memory, decision tracking, and context compilation')
|
|
17
|
+
.version('0.1.0');
|
|
18
|
+
// Top-level shortcut commands (add, ask, search, list)
|
|
19
|
+
registerShortcutCommands(program);
|
|
20
|
+
// Full command groups
|
|
21
|
+
registerInitCommand(program);
|
|
22
|
+
registerDecisionCommands(program);
|
|
23
|
+
registerCompileCommand(program);
|
|
24
|
+
registerDistillCommand(program);
|
|
25
|
+
registerAgentCommands(program);
|
|
26
|
+
registerNotificationCommands(program);
|
|
27
|
+
registerStatusCommands(program);
|
|
28
|
+
registerServerCommands(program);
|
|
29
|
+
registerExportImportCommands(program);
|
|
30
|
+
program.parse(process.argv);
|
|
31
|
+
if (process.argv.length < 3) {
|
|
32
|
+
program.outputHelp();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=decigraph-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decigraph-cli.js","sourceRoot":"","sources":["../src/decigraph-cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uDAAuD;AACvD,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAElC,sBAAsB;AACtB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACtC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAEtC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hipp0/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Command-line interface for Hipp0",
|
|
5
|
+
"author": "Perlantir",
|
|
6
|
+
"repository": {"type": "git", "url": "https://github.com/perlantir/hipp0"},
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"hipp0": "./dist/hipp0-cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsx src/hipp0-cli.ts",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"clean": "rm -rf dist"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@hipp0/core": "workspace:*",
|
|
23
|
+
"@hipp0/sdk": "workspace:*",
|
|
24
|
+
"@hipp0/server": "workspace:*",
|
|
25
|
+
"better-sqlite3": "^12.8.0",
|
|
26
|
+
"commander": "^12.1.0",
|
|
27
|
+
"chalk": "^5.3.0",
|
|
28
|
+
"ora": "^8.1.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
32
|
+
"typescript": "^5.7.0",
|
|
33
|
+
"tsx": "^4.19.0",
|
|
34
|
+
"vitest": "^2.1.0"
|
|
35
|
+
}
|
|
36
|
+
}
|