superintent 0.0.1
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/LICENSE +21 -0
- package/README.md +226 -0
- package/bin/superintent.js +2 -0
- package/dist/commands/extract.d.ts +2 -0
- package/dist/commands/extract.js +66 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +56 -0
- package/dist/commands/knowledge.d.ts +2 -0
- package/dist/commands/knowledge.js +647 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +153 -0
- package/dist/commands/spec.d.ts +2 -0
- package/dist/commands/spec.js +283 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +43 -0
- package/dist/commands/ticket.d.ts +4 -0
- package/dist/commands/ticket.js +942 -0
- package/dist/commands/ui.d.ts +2 -0
- package/dist/commands/ui.js +954 -0
- package/dist/db/client.d.ts +4 -0
- package/dist/db/client.js +26 -0
- package/dist/db/init-schema.d.ts +2 -0
- package/dist/db/init-schema.js +28 -0
- package/dist/db/parsers.d.ts +24 -0
- package/dist/db/parsers.js +79 -0
- package/dist/db/schema.d.ts +7 -0
- package/dist/db/schema.js +64 -0
- package/dist/db/usage.d.ts +8 -0
- package/dist/db/usage.js +24 -0
- package/dist/embed/model.d.ts +5 -0
- package/dist/embed/model.js +34 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +31 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.js +1 -0
- package/dist/ui/components/index.d.ts +6 -0
- package/dist/ui/components/index.js +13 -0
- package/dist/ui/components/knowledge.d.ts +33 -0
- package/dist/ui/components/knowledge.js +238 -0
- package/dist/ui/components/layout.d.ts +1 -0
- package/dist/ui/components/layout.js +323 -0
- package/dist/ui/components/search.d.ts +15 -0
- package/dist/ui/components/search.js +114 -0
- package/dist/ui/components/spec.d.ts +11 -0
- package/dist/ui/components/spec.js +253 -0
- package/dist/ui/components/ticket.d.ts +90 -0
- package/dist/ui/components/ticket.js +604 -0
- package/dist/ui/components/utils.d.ts +26 -0
- package/dist/ui/components/utils.js +34 -0
- package/dist/ui/styles.css +2 -0
- package/dist/utils/cli.d.ts +21 -0
- package/dist/utils/cli.js +31 -0
- package/dist/utils/config.d.ts +12 -0
- package/dist/utils/config.js +116 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.js +13 -0
- package/dist/utils/io.d.ts +8 -0
- package/dist/utils/io.js +15 -0
- package/package.json +60 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createClient } from '@libsql/client';
|
|
2
|
+
import { loadConfig } from '../utils/config.js';
|
|
3
|
+
let client = null;
|
|
4
|
+
export async function getClient() {
|
|
5
|
+
if (client) {
|
|
6
|
+
return client;
|
|
7
|
+
}
|
|
8
|
+
const config = loadConfig();
|
|
9
|
+
client = createClient({
|
|
10
|
+
url: config.url,
|
|
11
|
+
...(config.authToken && { authToken: config.authToken }),
|
|
12
|
+
});
|
|
13
|
+
return client;
|
|
14
|
+
}
|
|
15
|
+
export async function createClientWithConfig(url, authToken) {
|
|
16
|
+
return createClient({
|
|
17
|
+
url,
|
|
18
|
+
...(authToken && { authToken }),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function closeClient() {
|
|
22
|
+
if (client) {
|
|
23
|
+
client.close();
|
|
24
|
+
client = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CREATE_TICKETS_TABLE, CREATE_TICKETS_INDEXES, CREATE_KNOWLEDGE_TABLE, CREATE_KNOWLEDGE_INDEXES, CREATE_VECTOR_INDEX, CREATE_SPECS_TABLE, CREATE_SPECS_INDEXES, } from './schema.js';
|
|
2
|
+
export async function initSchema(client) {
|
|
3
|
+
// Create tickets table
|
|
4
|
+
await client.execute(CREATE_TICKETS_TABLE);
|
|
5
|
+
const ticketIndexes = CREATE_TICKETS_INDEXES.split(';').filter(s => s.trim());
|
|
6
|
+
for (const stmt of ticketIndexes) {
|
|
7
|
+
await client.execute(stmt);
|
|
8
|
+
}
|
|
9
|
+
// Create knowledge table
|
|
10
|
+
await client.execute(CREATE_KNOWLEDGE_TABLE);
|
|
11
|
+
const knowledgeIndexes = CREATE_KNOWLEDGE_INDEXES.split(';').filter(s => s.trim());
|
|
12
|
+
for (const stmt of knowledgeIndexes) {
|
|
13
|
+
await client.execute(stmt);
|
|
14
|
+
}
|
|
15
|
+
// Vector index
|
|
16
|
+
try {
|
|
17
|
+
await client.execute(CREATE_VECTOR_INDEX);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
console.warn('Warning: Could not create vector index.');
|
|
21
|
+
}
|
|
22
|
+
// Create specs table
|
|
23
|
+
await client.execute(CREATE_SPECS_TABLE);
|
|
24
|
+
const specIndexes = CREATE_SPECS_INDEXES.split(';').filter(s => s.trim());
|
|
25
|
+
for (const stmt of specIndexes) {
|
|
26
|
+
await client.execute(stmt);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared database row parsers for Ticket, Knowledge, and SearchResult types.
|
|
3
|
+
* Consolidates duplicated parsing logic from command files.
|
|
4
|
+
*/
|
|
5
|
+
import type { Ticket, Knowledge, SearchResult, Spec } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a database row into a Ticket object.
|
|
8
|
+
* Handles JSON parsing for array/object fields.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseTicketRow(row: Record<string, unknown>): Ticket;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a database row into a Knowledge object.
|
|
13
|
+
* Handles JSON parsing for tags array and provides defaults.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseKnowledgeRow(row: Record<string, unknown>): Knowledge;
|
|
16
|
+
/**
|
|
17
|
+
* Parse a database row into a Spec object.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSpecRow(row: Record<string, unknown>): Spec;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a database row from a vector search into a SearchResult.
|
|
22
|
+
* Converts distance to similarity score (1 - distance).
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseSearchRow(row: Record<string, unknown>): SearchResult;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared database row parsers for Ticket, Knowledge, and SearchResult types.
|
|
3
|
+
* Consolidates duplicated parsing logic from command files.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse a database row into a Ticket object.
|
|
7
|
+
* Handles JSON parsing for array/object fields.
|
|
8
|
+
*/
|
|
9
|
+
export function parseTicketRow(row) {
|
|
10
|
+
return {
|
|
11
|
+
id: row.id,
|
|
12
|
+
type: row.type,
|
|
13
|
+
title: row.title,
|
|
14
|
+
status: row.status,
|
|
15
|
+
intent: row.intent,
|
|
16
|
+
context: row.context,
|
|
17
|
+
constraints_use: row.constraints_use ? JSON.parse(row.constraints_use) : undefined,
|
|
18
|
+
constraints_avoid: row.constraints_avoid ? JSON.parse(row.constraints_avoid) : undefined,
|
|
19
|
+
assumptions: row.assumptions ? JSON.parse(row.assumptions) : undefined,
|
|
20
|
+
tasks: row.tasks ? JSON.parse(row.tasks) : undefined,
|
|
21
|
+
definition_of_done: row.definition_of_done ? JSON.parse(row.definition_of_done) : undefined,
|
|
22
|
+
change_class: row.change_class,
|
|
23
|
+
change_class_reason: row.change_class_reason,
|
|
24
|
+
plan: row.plan ? JSON.parse(row.plan) : undefined,
|
|
25
|
+
origin_spec_id: row.origin_spec_id,
|
|
26
|
+
derived_knowledge: row.derived_knowledge ? JSON.parse(row.derived_knowledge) : undefined,
|
|
27
|
+
comments: row.comments ? JSON.parse(row.comments) : undefined,
|
|
28
|
+
created_at: row.created_at,
|
|
29
|
+
updated_at: row.updated_at,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse a database row into a Knowledge object.
|
|
34
|
+
* Handles JSON parsing for tags array and provides defaults.
|
|
35
|
+
*/
|
|
36
|
+
export function parseKnowledgeRow(row) {
|
|
37
|
+
return {
|
|
38
|
+
id: row.id,
|
|
39
|
+
namespace: row.namespace,
|
|
40
|
+
chunk_index: row.chunk_index,
|
|
41
|
+
title: row.title,
|
|
42
|
+
content: row.content,
|
|
43
|
+
category: row.category,
|
|
44
|
+
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
45
|
+
source: row.source || 'manual',
|
|
46
|
+
origin_ticket_id: row.origin_ticket_id,
|
|
47
|
+
origin_ticket_type: row.origin_ticket_type,
|
|
48
|
+
confidence: row.confidence,
|
|
49
|
+
active: Boolean(row.active),
|
|
50
|
+
decision_scope: row.decision_scope || 'global',
|
|
51
|
+
usage_count: row.usage_count || 0,
|
|
52
|
+
last_used_at: row.last_used_at,
|
|
53
|
+
created_at: row.created_at,
|
|
54
|
+
updated_at: row.updated_at,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse a database row into a Spec object.
|
|
59
|
+
*/
|
|
60
|
+
export function parseSpecRow(row) {
|
|
61
|
+
return {
|
|
62
|
+
id: row.id,
|
|
63
|
+
title: row.title,
|
|
64
|
+
content: row.content,
|
|
65
|
+
created_at: row.created_at,
|
|
66
|
+
updated_at: row.updated_at,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse a database row from a vector search into a SearchResult.
|
|
71
|
+
* Converts distance to similarity score (1 - distance).
|
|
72
|
+
*/
|
|
73
|
+
export function parseSearchRow(row) {
|
|
74
|
+
const distance = row.distance;
|
|
75
|
+
return {
|
|
76
|
+
...parseKnowledgeRow(row),
|
|
77
|
+
score: 1 - distance,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const CREATE_TICKETS_TABLE = "\nCREATE TABLE IF NOT EXISTS tickets (\n id TEXT PRIMARY KEY,\n type TEXT,\n title TEXT,\n status TEXT NOT NULL DEFAULT 'Backlog',\n intent TEXT NOT NULL,\n context TEXT,\n constraints_use TEXT,\n constraints_avoid TEXT,\n assumptions TEXT,\n tasks TEXT,\n definition_of_done TEXT,\n change_class TEXT,\n change_class_reason TEXT,\n plan TEXT,\n derived_knowledge TEXT,\n comments TEXT,\n origin_spec_id TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n)";
|
|
2
|
+
export declare const CREATE_TICKETS_INDEXES = "\nCREATE INDEX IF NOT EXISTS idx_tickets_status ON tickets(status);\nCREATE INDEX IF NOT EXISTS idx_tickets_created ON tickets(created_at)";
|
|
3
|
+
export declare const CREATE_KNOWLEDGE_TABLE = "\nCREATE TABLE IF NOT EXISTS knowledge (\n id TEXT PRIMARY KEY,\n namespace TEXT NOT NULL DEFAULT 'global',\n chunk_index INTEGER DEFAULT 0,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n embedding F32_BLOB(384),\n category TEXT,\n tags TEXT,\n source TEXT NOT NULL DEFAULT 'manual',\n origin_ticket_id TEXT,\n origin_ticket_type TEXT,\n confidence REAL DEFAULT 1.0,\n active INTEGER DEFAULT 1,\n decision_scope TEXT NOT NULL DEFAULT 'global',\n usage_count INTEGER DEFAULT 0,\n last_used_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n FOREIGN KEY (origin_ticket_id) REFERENCES tickets(id)\n)";
|
|
4
|
+
export declare const CREATE_KNOWLEDGE_INDEXES = "\nCREATE INDEX IF NOT EXISTS idx_knowledge_namespace ON knowledge(namespace);\nCREATE INDEX IF NOT EXISTS idx_knowledge_category ON knowledge(category);\nCREATE INDEX IF NOT EXISTS idx_knowledge_active ON knowledge(active);\nCREATE INDEX IF NOT EXISTS idx_knowledge_scope ON knowledge(decision_scope)";
|
|
5
|
+
export declare const CREATE_VECTOR_INDEX = "\nCREATE INDEX IF NOT EXISTS knowledge_embedding_idx ON knowledge(libsql_vector_idx(embedding))";
|
|
6
|
+
export declare const CREATE_SPECS_TABLE = "\nCREATE TABLE IF NOT EXISTS specs (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n)";
|
|
7
|
+
export declare const CREATE_SPECS_INDEXES = "\nCREATE INDEX IF NOT EXISTS idx_specs_created ON specs(created_at)";
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const CREATE_TICKETS_TABLE = `
|
|
2
|
+
CREATE TABLE IF NOT EXISTS tickets (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
type TEXT,
|
|
5
|
+
title TEXT,
|
|
6
|
+
status TEXT NOT NULL DEFAULT 'Backlog',
|
|
7
|
+
intent TEXT NOT NULL,
|
|
8
|
+
context TEXT,
|
|
9
|
+
constraints_use TEXT,
|
|
10
|
+
constraints_avoid TEXT,
|
|
11
|
+
assumptions TEXT,
|
|
12
|
+
tasks TEXT,
|
|
13
|
+
definition_of_done TEXT,
|
|
14
|
+
change_class TEXT,
|
|
15
|
+
change_class_reason TEXT,
|
|
16
|
+
plan TEXT,
|
|
17
|
+
derived_knowledge TEXT,
|
|
18
|
+
comments TEXT,
|
|
19
|
+
origin_spec_id TEXT,
|
|
20
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
21
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
22
|
+
)`;
|
|
23
|
+
export const CREATE_TICKETS_INDEXES = `
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_tickets_status ON tickets(status);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_tickets_created ON tickets(created_at)`;
|
|
26
|
+
export const CREATE_KNOWLEDGE_TABLE = `
|
|
27
|
+
CREATE TABLE IF NOT EXISTS knowledge (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
namespace TEXT NOT NULL DEFAULT 'global',
|
|
30
|
+
chunk_index INTEGER DEFAULT 0,
|
|
31
|
+
title TEXT NOT NULL,
|
|
32
|
+
content TEXT NOT NULL,
|
|
33
|
+
embedding F32_BLOB(384),
|
|
34
|
+
category TEXT,
|
|
35
|
+
tags TEXT,
|
|
36
|
+
source TEXT NOT NULL DEFAULT 'manual',
|
|
37
|
+
origin_ticket_id TEXT,
|
|
38
|
+
origin_ticket_type TEXT,
|
|
39
|
+
confidence REAL DEFAULT 1.0,
|
|
40
|
+
active INTEGER DEFAULT 1,
|
|
41
|
+
decision_scope TEXT NOT NULL DEFAULT 'global',
|
|
42
|
+
usage_count INTEGER DEFAULT 0,
|
|
43
|
+
last_used_at TEXT,
|
|
44
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
45
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
46
|
+
FOREIGN KEY (origin_ticket_id) REFERENCES tickets(id)
|
|
47
|
+
)`;
|
|
48
|
+
export const CREATE_KNOWLEDGE_INDEXES = `
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_namespace ON knowledge(namespace);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_category ON knowledge(category);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_active ON knowledge(active);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_scope ON knowledge(decision_scope)`;
|
|
53
|
+
export const CREATE_VECTOR_INDEX = `
|
|
54
|
+
CREATE INDEX IF NOT EXISTS knowledge_embedding_idx ON knowledge(libsql_vector_idx(embedding))`;
|
|
55
|
+
export const CREATE_SPECS_TABLE = `
|
|
56
|
+
CREATE TABLE IF NOT EXISTS specs (
|
|
57
|
+
id TEXT PRIMARY KEY,
|
|
58
|
+
title TEXT NOT NULL,
|
|
59
|
+
content TEXT NOT NULL,
|
|
60
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
61
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
62
|
+
)`;
|
|
63
|
+
export const CREATE_SPECS_INDEXES = `
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_specs_created ON specs(created_at)`;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge usage tracking utilities.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Track usage for knowledge entries by incrementing usage_count and updating last_used_at.
|
|
6
|
+
* Silently fails on error since usage tracking is non-critical.
|
|
7
|
+
*/
|
|
8
|
+
export declare function trackUsage(ids: string[]): Promise<void>;
|
package/dist/db/usage.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge usage tracking utilities.
|
|
3
|
+
*/
|
|
4
|
+
import { getClient } from './client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Track usage for knowledge entries by incrementing usage_count and updating last_used_at.
|
|
7
|
+
* Silently fails on error since usage tracking is non-critical.
|
|
8
|
+
*/
|
|
9
|
+
export async function trackUsage(ids) {
|
|
10
|
+
if (ids.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
const client = await getClient();
|
|
14
|
+
const now = new Date().toISOString();
|
|
15
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
16
|
+
await client.execute({
|
|
17
|
+
sql: `UPDATE knowledge SET usage_count = usage_count + 1, last_used_at = ? WHERE id IN (${placeholders})`,
|
|
18
|
+
args: [now, ...ids],
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Silently fail - usage tracking is non-critical
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { pipeline, env } from '@huggingface/transformers';
|
|
2
|
+
// Suppress model loading warnings
|
|
3
|
+
env.allowLocalModels = true;
|
|
4
|
+
env.allowRemoteModels = true;
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
let extractor = null;
|
|
7
|
+
const MODEL_NAME = 'Xenova/all-MiniLM-L6-v2';
|
|
8
|
+
/**
|
|
9
|
+
* Get or initialize the embedding pipeline.
|
|
10
|
+
* First call downloads the model (~23MB), subsequent calls use cache.
|
|
11
|
+
*/
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
async function getEmbedder() {
|
|
14
|
+
if (extractor) {
|
|
15
|
+
return extractor;
|
|
16
|
+
}
|
|
17
|
+
extractor = await pipeline('feature-extraction', MODEL_NAME, {
|
|
18
|
+
dtype: 'fp32', // Explicitly set to suppress warning
|
|
19
|
+
});
|
|
20
|
+
return extractor;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate embedding for a single text.
|
|
24
|
+
* Returns a 384-dimensional normalized vector.
|
|
25
|
+
*/
|
|
26
|
+
export async function embed(text) {
|
|
27
|
+
const embedder = await getEmbedder();
|
|
28
|
+
const result = await embedder(text, {
|
|
29
|
+
pooling: 'mean',
|
|
30
|
+
normalize: true,
|
|
31
|
+
});
|
|
32
|
+
// Convert Float32Array to regular array
|
|
33
|
+
return Array.from(result.data);
|
|
34
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import { initCommand } from './commands/init.js';
|
|
7
|
+
import { statusCommand } from './commands/status.js';
|
|
8
|
+
import { ticketCommand } from './commands/ticket.js';
|
|
9
|
+
import { extractCommand } from './commands/extract.js';
|
|
10
|
+
import { searchCommand } from './commands/search.js';
|
|
11
|
+
import { knowledgeCommand } from './commands/knowledge.js';
|
|
12
|
+
import { uiCommand } from './commands/ui.js';
|
|
13
|
+
import { specCommand } from './commands/spec.js';
|
|
14
|
+
// Read version from package.json
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
18
|
+
const program = new Command();
|
|
19
|
+
program
|
|
20
|
+
.name('superintent')
|
|
21
|
+
.description('CLI companion for the Superintent Claude Code plugin')
|
|
22
|
+
.version(packageJson.version);
|
|
23
|
+
program.addCommand(initCommand);
|
|
24
|
+
program.addCommand(statusCommand);
|
|
25
|
+
program.addCommand(ticketCommand);
|
|
26
|
+
program.addCommand(extractCommand);
|
|
27
|
+
program.addCommand(searchCommand);
|
|
28
|
+
program.addCommand(knowledgeCommand);
|
|
29
|
+
program.addCommand(uiCommand);
|
|
30
|
+
program.addCommand(specCommand);
|
|
31
|
+
program.parse();
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export interface TicketPlan {
|
|
2
|
+
files: string[];
|
|
3
|
+
taskSteps: {
|
|
4
|
+
task: string;
|
|
5
|
+
steps: string[];
|
|
6
|
+
}[];
|
|
7
|
+
dodVerification: {
|
|
8
|
+
dod: string;
|
|
9
|
+
verify: string;
|
|
10
|
+
}[];
|
|
11
|
+
decisions: {
|
|
12
|
+
choice: string;
|
|
13
|
+
reason: string;
|
|
14
|
+
}[];
|
|
15
|
+
tradeOffs: {
|
|
16
|
+
considered: string;
|
|
17
|
+
rejected: string;
|
|
18
|
+
}[];
|
|
19
|
+
rollback?: {
|
|
20
|
+
steps: string[];
|
|
21
|
+
reversibility: 'full' | 'partial' | 'none';
|
|
22
|
+
};
|
|
23
|
+
irreversibleActions: string[];
|
|
24
|
+
edgeCases: string[];
|
|
25
|
+
}
|
|
26
|
+
export type TicketType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'chore' | 'test';
|
|
27
|
+
export interface Ticket {
|
|
28
|
+
id: string;
|
|
29
|
+
type?: TicketType;
|
|
30
|
+
title?: string;
|
|
31
|
+
status: 'Backlog' | 'In Progress' | 'In Review' | 'Done' | 'Blocked' | 'Paused' | 'Abandoned' | 'Superseded';
|
|
32
|
+
intent: string;
|
|
33
|
+
context?: string;
|
|
34
|
+
constraints_use?: string[];
|
|
35
|
+
constraints_avoid?: string[];
|
|
36
|
+
assumptions?: string[];
|
|
37
|
+
tasks?: TaskItem[];
|
|
38
|
+
definition_of_done?: TaskItem[];
|
|
39
|
+
change_class?: 'A' | 'B' | 'C';
|
|
40
|
+
change_class_reason?: string;
|
|
41
|
+
plan?: TicketPlan;
|
|
42
|
+
origin_spec_id?: string;
|
|
43
|
+
derived_knowledge?: string[];
|
|
44
|
+
comments?: TicketComment[];
|
|
45
|
+
created_at?: string;
|
|
46
|
+
updated_at?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface TaskItem {
|
|
49
|
+
text: string;
|
|
50
|
+
done: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface TicketComment {
|
|
53
|
+
text: string;
|
|
54
|
+
timestamp: string;
|
|
55
|
+
}
|
|
56
|
+
export interface TicketInput {
|
|
57
|
+
id: string;
|
|
58
|
+
type?: TicketType;
|
|
59
|
+
title?: string;
|
|
60
|
+
intent: string;
|
|
61
|
+
context?: string;
|
|
62
|
+
constraints?: {
|
|
63
|
+
use?: string[];
|
|
64
|
+
avoid?: string[];
|
|
65
|
+
};
|
|
66
|
+
assumptions?: string[];
|
|
67
|
+
tasks?: string[] | TaskItem[];
|
|
68
|
+
definitionOfDone?: string[] | TaskItem[];
|
|
69
|
+
changeClass?: 'A' | 'B' | 'C';
|
|
70
|
+
changeClassReason?: string;
|
|
71
|
+
}
|
|
72
|
+
export type KnowledgeCategory = 'pattern' | 'truth' | 'principle' | 'architecture' | 'gotcha';
|
|
73
|
+
export type DecisionScope = 'new-only' | 'backward-compatible' | 'global' | 'legacy-frozen';
|
|
74
|
+
export type KnowledgeSource = 'ticket' | 'discovery' | 'manual';
|
|
75
|
+
export interface Knowledge {
|
|
76
|
+
id: string;
|
|
77
|
+
namespace: string;
|
|
78
|
+
chunk_index: number;
|
|
79
|
+
title: string;
|
|
80
|
+
content: string;
|
|
81
|
+
category?: KnowledgeCategory;
|
|
82
|
+
tags?: string[];
|
|
83
|
+
source: KnowledgeSource;
|
|
84
|
+
origin_ticket_id?: string;
|
|
85
|
+
origin_ticket_type?: TicketType;
|
|
86
|
+
confidence: number;
|
|
87
|
+
active: boolean;
|
|
88
|
+
decision_scope: DecisionScope;
|
|
89
|
+
usage_count: number;
|
|
90
|
+
last_used_at?: string;
|
|
91
|
+
created_at?: string;
|
|
92
|
+
updated_at?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface KnowledgeInput {
|
|
95
|
+
namespace?: string;
|
|
96
|
+
title: string;
|
|
97
|
+
content: string;
|
|
98
|
+
category?: KnowledgeCategory;
|
|
99
|
+
tags?: string[];
|
|
100
|
+
source?: KnowledgeSource;
|
|
101
|
+
originTicketId?: string;
|
|
102
|
+
originTicketType?: TicketType;
|
|
103
|
+
confidence?: number;
|
|
104
|
+
decisionScope?: DecisionScope;
|
|
105
|
+
}
|
|
106
|
+
export interface SearchResult extends Knowledge {
|
|
107
|
+
score: number;
|
|
108
|
+
}
|
|
109
|
+
export interface Spec {
|
|
110
|
+
id: string;
|
|
111
|
+
title: string;
|
|
112
|
+
content: string;
|
|
113
|
+
created_at?: string;
|
|
114
|
+
updated_at?: string;
|
|
115
|
+
}
|
|
116
|
+
export interface CliResponse<T = unknown> {
|
|
117
|
+
success: boolean;
|
|
118
|
+
data?: T;
|
|
119
|
+
error?: string;
|
|
120
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { escapeHtml, ColumnData, renderMarkdownEditor } from './utils.js';
|
|
2
|
+
export { getHtml } from './layout.js';
|
|
3
|
+
export { renderTicketCard, renderKanbanView, renderKanbanColumns, renderColumnMore, renderTicketModal, renderNewTicketModal, renderEditTicketModal, } from './ticket.js';
|
|
4
|
+
export { renderKnowledgeView, renderKnowledgeList, renderKnowledgeModal, } from './knowledge.js';
|
|
5
|
+
export { renderSearchView, renderSearchResults, } from './search.js';
|
|
6
|
+
export { renderSpecView, renderSpecList, renderSpecCard, renderSpecModal, renderNewSpecModal, renderEditSpecModal, } from './spec.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Barrel export for UI components
|
|
2
|
+
// Utils
|
|
3
|
+
export { escapeHtml, renderMarkdownEditor } from './utils.js';
|
|
4
|
+
// Layout
|
|
5
|
+
export { getHtml } from './layout.js';
|
|
6
|
+
// Ticket components
|
|
7
|
+
export { renderTicketCard, renderKanbanView, renderKanbanColumns, renderColumnMore, renderTicketModal, renderNewTicketModal, renderEditTicketModal, } from './ticket.js';
|
|
8
|
+
// Knowledge components
|
|
9
|
+
export { renderKnowledgeView, renderKnowledgeList, renderKnowledgeModal, } from './knowledge.js';
|
|
10
|
+
// Search components
|
|
11
|
+
export { renderSearchView, renderSearchResults, } from './search.js';
|
|
12
|
+
// Spec components
|
|
13
|
+
export { renderSpecView, renderSpecList, renderSpecCard, renderSpecModal, renderNewSpecModal, renderEditSpecModal, } from './spec.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare function renderKnowledgeView(): string;
|
|
2
|
+
export declare function renderKnowledgeList(items: {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
content: string;
|
|
6
|
+
category?: string;
|
|
7
|
+
namespace: string;
|
|
8
|
+
source?: string;
|
|
9
|
+
origin_ticket_type?: string;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
confidence: number;
|
|
12
|
+
active: boolean;
|
|
13
|
+
decision_scope: string;
|
|
14
|
+
created_at?: string;
|
|
15
|
+
}[]): string;
|
|
16
|
+
export declare function renderKnowledgeModal(knowledge: {
|
|
17
|
+
id: string;
|
|
18
|
+
namespace: string;
|
|
19
|
+
title: string;
|
|
20
|
+
content: string;
|
|
21
|
+
category?: string;
|
|
22
|
+
tags?: string[];
|
|
23
|
+
source: string;
|
|
24
|
+
origin_ticket_id?: string;
|
|
25
|
+
origin_ticket_type?: string;
|
|
26
|
+
confidence: number;
|
|
27
|
+
active: boolean;
|
|
28
|
+
decision_scope: string;
|
|
29
|
+
usage_count?: number;
|
|
30
|
+
last_used_at?: string;
|
|
31
|
+
created_at?: string;
|
|
32
|
+
updated_at?: string;
|
|
33
|
+
}): string;
|