@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.
Files changed (49) hide show
  1. package/dist/cli-helpers.d.ts +14 -0
  2. package/dist/cli-helpers.d.ts.map +1 -0
  3. package/dist/cli-helpers.js +194 -0
  4. package/dist/cli-helpers.js.map +1 -0
  5. package/dist/commands/agents.d.ts +3 -0
  6. package/dist/commands/agents.d.ts.map +1 -0
  7. package/dist/commands/agents.js +50 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/compile.d.ts +3 -0
  10. package/dist/commands/compile.d.ts.map +1 -0
  11. package/dist/commands/compile.js +49 -0
  12. package/dist/commands/compile.js.map +1 -0
  13. package/dist/commands/decisions.d.ts +3 -0
  14. package/dist/commands/decisions.d.ts.map +1 -0
  15. package/dist/commands/decisions.js +206 -0
  16. package/dist/commands/decisions.js.map +1 -0
  17. package/dist/commands/distill.d.ts +3 -0
  18. package/dist/commands/distill.d.ts.map +1 -0
  19. package/dist/commands/distill.js +54 -0
  20. package/dist/commands/distill.js.map +1 -0
  21. package/dist/commands/export-import.d.ts +3 -0
  22. package/dist/commands/export-import.d.ts.map +1 -0
  23. package/dist/commands/export-import.js +109 -0
  24. package/dist/commands/export-import.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +157 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/notifications.d.ts +3 -0
  30. package/dist/commands/notifications.d.ts.map +1 -0
  31. package/dist/commands/notifications.js +96 -0
  32. package/dist/commands/notifications.js.map +1 -0
  33. package/dist/commands/server.d.ts +7 -0
  34. package/dist/commands/server.d.ts.map +1 -0
  35. package/dist/commands/server.js +203 -0
  36. package/dist/commands/server.js.map +1 -0
  37. package/dist/commands/shortcuts.d.ts +11 -0
  38. package/dist/commands/shortcuts.d.ts.map +1 -0
  39. package/dist/commands/shortcuts.js +163 -0
  40. package/dist/commands/shortcuts.js.map +1 -0
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +46 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/decigraph-cli.d.ts +3 -0
  46. package/dist/decigraph-cli.d.ts.map +1 -0
  47. package/dist/decigraph-cli.js +34 -0
  48. package/dist/decigraph-cli.js.map +1 -0
  49. 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":"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"}
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerStatusCommands(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=decigraph-cli.d.ts.map
@@ -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
+ }