@derive-ltd/uht-substrate 1.0.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/README.md +242 -0
- package/dist/client.d.ts +107 -0
- package/dist/client.js +253 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/classify.d.ts +3 -0
- package/dist/commands/classify.js +29 -0
- package/dist/commands/classify.js.map +1 -0
- package/dist/commands/compare.d.ts +3 -0
- package/dist/commands/compare.js +20 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +36 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/entities.d.ts +3 -0
- package/dist/commands/entities.js +144 -0
- package/dist/commands/entities.js.map +1 -0
- package/dist/commands/facts.d.ts +3 -0
- package/dist/commands/facts.js +130 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/impact.d.ts +3 -0
- package/dist/commands/impact.js +148 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.js +35 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/namespaces.d.ts +3 -0
- package/dist/commands/namespaces.js +34 -0
- package/dist/commands/namespaces.js.map +1 -0
- package/dist/commands/semantic.d.ts +3 -0
- package/dist/commands/semantic.js +34 -0
- package/dist/commands/semantic.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.js +310 -0
- package/dist/output.js.map +1 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { output } from "../output.js";
|
|
2
|
+
export function registerCompareCommands(program, getClient, getFormat) {
|
|
3
|
+
program
|
|
4
|
+
.command("compare")
|
|
5
|
+
.description("Compare two entities")
|
|
6
|
+
.argument("<entity-a>", "First entity")
|
|
7
|
+
.argument("<entity-b>", "Second entity")
|
|
8
|
+
.action(async (entityA, entityB) => {
|
|
9
|
+
output(await getClient().compare(entityA, entityB), getFormat());
|
|
10
|
+
});
|
|
11
|
+
program
|
|
12
|
+
.command("batch-compare")
|
|
13
|
+
.description("Compare an entity against multiple candidates, ranked by Jaccard")
|
|
14
|
+
.argument("<entity>", "Reference entity")
|
|
15
|
+
.argument("<candidates...>", "Candidate entities to compare against")
|
|
16
|
+
.action(async (entity, candidates) => {
|
|
17
|
+
output(await getClient().batchCompare(entity, candidates), getFormat());
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,uBAAuB,CACrC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sBAAsB,CAAC;SACnC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC;SACtC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;QACjD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;SACxC,QAAQ,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,UAAoB,EAAE,EAAE;QACrD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { saveConfigFile, showConfig } from "../config.js";
|
|
2
|
+
const VALID_KEYS = {
|
|
3
|
+
"api-url": "apiUrl",
|
|
4
|
+
"token": "token",
|
|
5
|
+
"format": "format",
|
|
6
|
+
};
|
|
7
|
+
export function registerConfigCommands(program) {
|
|
8
|
+
const config = program
|
|
9
|
+
.command("config")
|
|
10
|
+
.description("Manage CLI configuration");
|
|
11
|
+
config
|
|
12
|
+
.command("set")
|
|
13
|
+
.description("Set a config value")
|
|
14
|
+
.argument("<key>", `Config key: ${Object.keys(VALID_KEYS).join(", ")}`)
|
|
15
|
+
.argument("<value>", "Config value")
|
|
16
|
+
.action((key, value) => {
|
|
17
|
+
const mapped = VALID_KEYS[key];
|
|
18
|
+
if (!mapped) {
|
|
19
|
+
console.error(`Unknown config key: ${key}`);
|
|
20
|
+
console.error(`Valid keys: ${Object.keys(VALID_KEYS).join(", ")}`);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
saveConfigFile({ [mapped]: value });
|
|
24
|
+
console.log(`Set ${key} = ${key === "token" ? "***" : value}`);
|
|
25
|
+
});
|
|
26
|
+
config
|
|
27
|
+
.command("show")
|
|
28
|
+
.description("Show current configuration")
|
|
29
|
+
.action(() => {
|
|
30
|
+
const cfg = showConfig();
|
|
31
|
+
for (const [k, v] of Object.entries(cfg)) {
|
|
32
|
+
console.log(`${k}: ${v}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,GAA2B;IACzC,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE3C,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oBAAoB,CAAC;SACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACtE,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { output } from "../output.js";
|
|
2
|
+
const TRAIT_NAMES = [
|
|
3
|
+
"physical_object", "synthetic", "biological", "powered",
|
|
4
|
+
"structural", "observable", "physical_medium", "active",
|
|
5
|
+
"intentionally_designed", "outputs_effect", "processes_signals", "state_transforming",
|
|
6
|
+
"human_interactive", "system_integrated", "functionally_autonomous", "system_essential",
|
|
7
|
+
"symbolic", "signalling", "rule_governed", "compositional",
|
|
8
|
+
"normative", "meta", "temporal", "digital_virtual",
|
|
9
|
+
"social_construct", "institutionally_defined", "identity_linked", "regulated",
|
|
10
|
+
"economically_significant", "politicised", "ritualised", "ethically_significant",
|
|
11
|
+
];
|
|
12
|
+
export function registerEntityCommands(program, getClient, getFormat) {
|
|
13
|
+
const entities = program
|
|
14
|
+
.command("entities")
|
|
15
|
+
.description("Entity management commands");
|
|
16
|
+
entities
|
|
17
|
+
.command("list")
|
|
18
|
+
.description("List entities in the knowledge graph")
|
|
19
|
+
.option("-n, --name <filter>", "Filter by name substring")
|
|
20
|
+
.option("--hex <pattern>", "Filter by hex pattern")
|
|
21
|
+
.option("--namespace <ns>", "Filter by namespace (e.g. 'SE', 'SE:aerospace')")
|
|
22
|
+
.option("-l, --limit <n>", "Max results (or 'all')", "50")
|
|
23
|
+
.option("--offset <n>", "Skip N results", "0")
|
|
24
|
+
.option("--count-only", "Return only the total count without fetching entities")
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
const limit = opts.limit.toLowerCase() === "all" ? 10000 : parseInt(opts.limit) || 50;
|
|
27
|
+
output(await getClient().listEntities({
|
|
28
|
+
name_contains: opts.name,
|
|
29
|
+
hex_pattern: opts.hex,
|
|
30
|
+
namespace: opts.namespace,
|
|
31
|
+
limit,
|
|
32
|
+
offset: parseInt(opts.offset),
|
|
33
|
+
count_only: opts.countOnly,
|
|
34
|
+
}), getFormat());
|
|
35
|
+
});
|
|
36
|
+
entities
|
|
37
|
+
.command("get")
|
|
38
|
+
.description("Get a single entity by name or UUID")
|
|
39
|
+
.option("-n, --name <name>", "Entity name (case-insensitive)")
|
|
40
|
+
.option("-u, --uuid <uuid>", "Entity UUID")
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
if (!opts.name && !opts.uuid) {
|
|
43
|
+
console.error("Error: provide --name or --uuid");
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
output(await getClient().getEntity(opts), getFormat());
|
|
47
|
+
});
|
|
48
|
+
entities
|
|
49
|
+
.command("update")
|
|
50
|
+
.description("Update entity metadata")
|
|
51
|
+
.argument("<name>", "Exact entity name")
|
|
52
|
+
.option("--display-name <displayName>", "Short display name for presentation (empty to clear)")
|
|
53
|
+
.action(async (name, opts) => {
|
|
54
|
+
output(await getClient().updateEntity(name, { display_name: opts.displayName }), getFormat());
|
|
55
|
+
});
|
|
56
|
+
entities
|
|
57
|
+
.command("delete")
|
|
58
|
+
.description("Delete an entity and its trait edges from the local graph (facts are kept as unbound)")
|
|
59
|
+
.argument("<name>", "Exact entity name")
|
|
60
|
+
.action(async (name) => {
|
|
61
|
+
output(await getClient().deleteEntity(name), getFormat());
|
|
62
|
+
});
|
|
63
|
+
entities
|
|
64
|
+
.command("deduplicate")
|
|
65
|
+
.description("Find/remove entities that leaked from global into a namespace")
|
|
66
|
+
.requiredOption("--namespace <ns>", "Namespace to deduplicate")
|
|
67
|
+
.option("--apply", "Actually remove duplicates (default is dry run)")
|
|
68
|
+
.action(async (opts) => {
|
|
69
|
+
output(await getClient().deduplicateNamespace(opts.namespace, !opts.apply), getFormat());
|
|
70
|
+
});
|
|
71
|
+
entities
|
|
72
|
+
.command("find-similar")
|
|
73
|
+
.description("[Experimental] Find entities similar to the given entity")
|
|
74
|
+
.argument("<entity>", "Entity to find similar items for")
|
|
75
|
+
.option("-l, --limit <n>", "Max results", "5")
|
|
76
|
+
.option("--min-traits <n>", "Minimum shared traits", "20")
|
|
77
|
+
.action(async (entity, opts) => {
|
|
78
|
+
output(await getClient().findSimilar(entity, {
|
|
79
|
+
limit: parseInt(opts.limit),
|
|
80
|
+
min_shared_traits: parseInt(opts.minTraits),
|
|
81
|
+
}), getFormat());
|
|
82
|
+
});
|
|
83
|
+
entities
|
|
84
|
+
.command("merge")
|
|
85
|
+
.description("Merge source entity into target, transferring all facts and relationships")
|
|
86
|
+
.argument("<source>", "Entity to merge FROM (will be deleted)")
|
|
87
|
+
.argument("<target>", "Entity to merge INTO (will be kept)")
|
|
88
|
+
.action(async (source, target) => {
|
|
89
|
+
output(await getClient().mergeEntities(source, target), getFormat());
|
|
90
|
+
});
|
|
91
|
+
entities
|
|
92
|
+
.command("reclassify")
|
|
93
|
+
.description("Re-run classification on an existing entity, preserving UUID and facts")
|
|
94
|
+
.argument("<name>", "Exact entity name")
|
|
95
|
+
.option("-c, --context <ctx>", "Context to guide reclassification")
|
|
96
|
+
.option("-n, --namespace <ns>", "Namespace to search in")
|
|
97
|
+
.action(async (name, opts) => {
|
|
98
|
+
output(await getClient().reclassifyEntity(name, {
|
|
99
|
+
context: opts.context,
|
|
100
|
+
namespace: opts.namespace,
|
|
101
|
+
}), getFormat());
|
|
102
|
+
});
|
|
103
|
+
entities
|
|
104
|
+
.command("history")
|
|
105
|
+
.description("Show classification history of an entity")
|
|
106
|
+
.argument("<name>", "Entity name")
|
|
107
|
+
.option("-l, --limit <n>", "Max history entries", "50")
|
|
108
|
+
.action(async (name, opts) => {
|
|
109
|
+
output(await getClient().getEntityHistory(name, parseInt(opts.limit)), getFormat());
|
|
110
|
+
});
|
|
111
|
+
entities
|
|
112
|
+
.command("search-traits")
|
|
113
|
+
.description("Search entities by trait pattern (use --<trait-name> or --no-<trait-name>)")
|
|
114
|
+
.option("-l, --limit <n>", "Max results", "100")
|
|
115
|
+
.allowUnknownOption(true)
|
|
116
|
+
.action(async function () {
|
|
117
|
+
const rawArgs = this.args;
|
|
118
|
+
const query = {};
|
|
119
|
+
let limit = "100";
|
|
120
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
121
|
+
const arg = rawArgs[i];
|
|
122
|
+
if (arg === "--limit" || arg === "-l") {
|
|
123
|
+
limit = rawArgs[++i] ?? "100";
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// --trait-name or --no-trait-name
|
|
127
|
+
const noMatch = arg.match(/^--no-(.+)$/);
|
|
128
|
+
const yesMatch = arg.match(/^--(.+)$/);
|
|
129
|
+
if (noMatch) {
|
|
130
|
+
const trait = noMatch[1].replace(/-/g, "_");
|
|
131
|
+
if (TRAIT_NAMES.includes(trait))
|
|
132
|
+
query[trait] = "false";
|
|
133
|
+
}
|
|
134
|
+
else if (yesMatch) {
|
|
135
|
+
const trait = yesMatch[1].replace(/-/g, "_");
|
|
136
|
+
if (TRAIT_NAMES.includes(trait))
|
|
137
|
+
query[trait] = "true";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
query["limit"] = limit;
|
|
141
|
+
output(await getClient().searchByTraits(query), getFormat());
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/commands/entities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,WAAW,GAAG;IAClB,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS;IACvD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ;IACvD,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB;IACrF,mBAAmB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,kBAAkB;IACvF,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe;IAC1D,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB;IAClD,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,WAAW;IAC7E,0BAA0B,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB;CACjF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,cAAc,EAAE,uDAAuD,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,IAA6G,EAAE,EAAE;QAC9H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC;YAC7B,aAAa,EAAE,IAAI,CAAC,IAAI;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,8BAA8B,EAAE,sDAAsD,CAAC;SAC9F,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA8B,EAAE,EAAE;QAC7D,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uFAAuF,CAAC;SACpG,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,cAAc,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SAC9D,MAAM,CAAC,SAAS,EAAE,iDAAiD,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAA4C,EAAE,EAAE;QAC7D,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EACnE,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACxD,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAA0C,EAAE,EAAE;QAC3E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE;YACpC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;SAC5C,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2EAA2E,CAAC;SACxF,QAAQ,CAAC,UAAU,EAAE,wCAAwC,CAAC;SAC9D,QAAQ,CAAC,UAAU,EAAE,qCAAqC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;QAC/C,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,wEAAwE,CAAC;SACrF,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA8C,EAAE,EAAE;QAC7E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAuB,EAAE,EAAE;QACtD,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,KAAK,CAAC;SAC/C,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YACxB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACtC,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,kCAAkC;YAClC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC1D,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC9C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YACzD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { output } from "../output.js";
|
|
3
|
+
export function registerFactCommands(program, getClient, getFormat) {
|
|
4
|
+
const facts = program
|
|
5
|
+
.command("facts")
|
|
6
|
+
.description("Fact management commands");
|
|
7
|
+
facts
|
|
8
|
+
.command("store")
|
|
9
|
+
.description("Store a fact in the knowledge graph")
|
|
10
|
+
.argument("<subject>", "Subject of the fact")
|
|
11
|
+
.argument("<predicate>", "Relationship/predicate")
|
|
12
|
+
.argument("<object>", "Object value")
|
|
13
|
+
.option("-u, --user <id>", "User ID", "default")
|
|
14
|
+
.option("-n, --namespace <ns>", "Namespace")
|
|
15
|
+
.action(async (subject, predicate, object, opts) => {
|
|
16
|
+
output(await getClient().storeFact(subject, predicate, object, {
|
|
17
|
+
user_id: opts.user,
|
|
18
|
+
namespace: opts.namespace,
|
|
19
|
+
}), getFormat());
|
|
20
|
+
});
|
|
21
|
+
facts
|
|
22
|
+
.command("store-bulk")
|
|
23
|
+
.description("Store multiple facts from a JSON file")
|
|
24
|
+
.option("-f, --file <path>", "JSON file with array of facts (or - for stdin)")
|
|
25
|
+
.option("-n, --namespace <ns>", "Default namespace for all facts (overridden by per-fact namespace)")
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
let data;
|
|
28
|
+
if (!opts.file || opts.file === "-") {
|
|
29
|
+
const chunks = [];
|
|
30
|
+
for await (const chunk of process.stdin) {
|
|
31
|
+
chunks.push(chunk);
|
|
32
|
+
}
|
|
33
|
+
data = Buffer.concat(chunks).toString("utf-8");
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
data = readFileSync(opts.file, "utf-8");
|
|
37
|
+
}
|
|
38
|
+
let parsed = JSON.parse(data);
|
|
39
|
+
// Apply default namespace if provided and fact doesn't already have one
|
|
40
|
+
if (opts.namespace) {
|
|
41
|
+
parsed = parsed.map(f => ({ ...f, namespace: f.namespace || opts.namespace }));
|
|
42
|
+
}
|
|
43
|
+
output(await getClient().storeFactsBulk(parsed), getFormat());
|
|
44
|
+
});
|
|
45
|
+
facts
|
|
46
|
+
.command("upsert")
|
|
47
|
+
.description("Upsert a fact (create or update)")
|
|
48
|
+
.argument("<subject>", "Subject of the fact")
|
|
49
|
+
.argument("<predicate>", "Relationship/predicate")
|
|
50
|
+
.argument("<object>", "Object value")
|
|
51
|
+
.option("-u, --user <id>", "User ID", "default")
|
|
52
|
+
.option("-n, --namespace <ns>", "Namespace")
|
|
53
|
+
.action(async (subject, predicate, object, opts) => {
|
|
54
|
+
output(await getClient().upsertFact(subject, predicate, object, {
|
|
55
|
+
user_id: opts.user,
|
|
56
|
+
namespace: opts.namespace,
|
|
57
|
+
}), getFormat());
|
|
58
|
+
});
|
|
59
|
+
facts
|
|
60
|
+
.command("query")
|
|
61
|
+
.description("Query facts with flexible filters")
|
|
62
|
+
.option("-s, --subject <subject>", "Filter by subject")
|
|
63
|
+
.option("-o, --object <object>", "Filter by object value")
|
|
64
|
+
.option("-p, --predicate <predicate>", "Filter by predicate")
|
|
65
|
+
.option("-c, --category <category>", "Filter by category")
|
|
66
|
+
.option("-u, --user <id>", "Filter by user ID")
|
|
67
|
+
.option("-n, --namespace <ns>", "Filter by namespace")
|
|
68
|
+
.option("-l, --limit <n>", "Max results (or 'all')", "50")
|
|
69
|
+
.action(async (opts) => {
|
|
70
|
+
const limit = opts.limit.toLowerCase() === "all" ? 10000 : parseInt(opts.limit) || 50;
|
|
71
|
+
output(await getClient().queryFacts({
|
|
72
|
+
subject: opts.subject,
|
|
73
|
+
object_value: opts.object,
|
|
74
|
+
predicate: opts.predicate,
|
|
75
|
+
category: opts.category,
|
|
76
|
+
user_id: opts.user,
|
|
77
|
+
namespace: opts.namespace,
|
|
78
|
+
limit,
|
|
79
|
+
}), getFormat());
|
|
80
|
+
});
|
|
81
|
+
facts
|
|
82
|
+
.command("update")
|
|
83
|
+
.description("Update an existing fact")
|
|
84
|
+
.argument("<fact-id>", "UUID of the fact")
|
|
85
|
+
.option("-s, --subject <subject>", "New subject")
|
|
86
|
+
.option("-p, --predicate <predicate>", "New predicate")
|
|
87
|
+
.option("-o, --object <object>", "New object value")
|
|
88
|
+
.action(async (factId, opts) => {
|
|
89
|
+
output(await getClient().updateFact(factId, {
|
|
90
|
+
subject: opts.subject,
|
|
91
|
+
predicate: opts.predicate,
|
|
92
|
+
object_value: opts.object,
|
|
93
|
+
}), getFormat());
|
|
94
|
+
});
|
|
95
|
+
facts
|
|
96
|
+
.command("delete")
|
|
97
|
+
.description("Delete a fact from the knowledge graph")
|
|
98
|
+
.argument("<fact-id>", "UUID of the fact")
|
|
99
|
+
.action(async (factId) => {
|
|
100
|
+
output(await getClient().deleteFact(factId), getFormat());
|
|
101
|
+
});
|
|
102
|
+
facts
|
|
103
|
+
.command("user-context")
|
|
104
|
+
.description("Get stored facts and preferences for a user")
|
|
105
|
+
.option("-u, --user <id>", "User ID", "default")
|
|
106
|
+
.action(async (opts) => {
|
|
107
|
+
output(await getClient().getUserContext(opts.user), getFormat());
|
|
108
|
+
});
|
|
109
|
+
facts
|
|
110
|
+
.command("namespace-context")
|
|
111
|
+
.description("Get all entities and facts under a namespace")
|
|
112
|
+
.argument("<namespace>", "Namespace code")
|
|
113
|
+
.option("-u, --user <id>", "Filter facts by user ID")
|
|
114
|
+
.action(async (namespace, opts) => {
|
|
115
|
+
output(await getClient().getNamespaceContext(namespace, opts.user), getFormat());
|
|
116
|
+
});
|
|
117
|
+
facts
|
|
118
|
+
.command("reconcile")
|
|
119
|
+
.description("Reconcile UHT facts against AIRGen trace links")
|
|
120
|
+
.requiredOption("--namespace <ns>", "UHT namespace to reconcile")
|
|
121
|
+
.requiredOption("--tenant <slug>", "AIRGen tenant slug")
|
|
122
|
+
.requiredOption("--project <slug>", "AIRGen project slug")
|
|
123
|
+
.option("--airgen-url <url>", "AIRGen API URL (or set AIRGEN_API_URL)")
|
|
124
|
+
.option("--airgen-email <email>", "AIRGen email (or set AIRGEN_EMAIL)")
|
|
125
|
+
.option("--airgen-password <pw>", "AIRGen password (or set AIRGEN_PASSWORD)")
|
|
126
|
+
.action(async (opts) => {
|
|
127
|
+
output(await getClient().reconcileFacts(opts.namespace, opts.tenant, opts.project, { airgen_url: opts.airgenUrl, airgen_email: opts.airgenEmail, airgen_password: opts.airgenPassword }), getFormat());
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../../src/commands/facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { bold, cyan, green, red, yellow } from "../output.js";
|
|
3
|
+
// --- Helpers ---
|
|
4
|
+
function getActiveTraitNames(traits) {
|
|
5
|
+
return traits.filter((t) => t.present && t.name).map((t) => t.name);
|
|
6
|
+
}
|
|
7
|
+
function findFlippedTraits(oldTraits, newTraits) {
|
|
8
|
+
const flipped = [];
|
|
9
|
+
const oldMap = new Map(oldTraits.map((t) => [t.bit, t]));
|
|
10
|
+
for (const nt of newTraits) {
|
|
11
|
+
const ot = oldMap.get(nt.bit);
|
|
12
|
+
if (!ot)
|
|
13
|
+
continue;
|
|
14
|
+
if (ot.present && !nt.present && ot.name) {
|
|
15
|
+
flipped.push({ bit: nt.bit, name: ot.name, direction: "removed" });
|
|
16
|
+
}
|
|
17
|
+
else if (!ot.present && nt.present && nt.name) {
|
|
18
|
+
flipped.push({ bit: nt.bit, name: nt.name, direction: "added" });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return flipped;
|
|
22
|
+
}
|
|
23
|
+
// --- Core logic ---
|
|
24
|
+
async function runImpact(client, diff) {
|
|
25
|
+
const added = [];
|
|
26
|
+
const removed = [];
|
|
27
|
+
const drift = [];
|
|
28
|
+
// Classify added requirements
|
|
29
|
+
const addedReqs = diff.added ?? [];
|
|
30
|
+
for (const req of addedReqs) {
|
|
31
|
+
const result = (await client.classify(req.text));
|
|
32
|
+
added.push({
|
|
33
|
+
ref: req.ref,
|
|
34
|
+
hex: result.hex_code,
|
|
35
|
+
text: req.text,
|
|
36
|
+
top_traits: getActiveTraitNames(result.traits),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Classify removed requirements
|
|
40
|
+
const removedReqs = diff.removed ?? [];
|
|
41
|
+
for (const req of removedReqs) {
|
|
42
|
+
const result = (await client.classify(req.text));
|
|
43
|
+
removed.push({
|
|
44
|
+
ref: req.ref,
|
|
45
|
+
hex: result.hex_code,
|
|
46
|
+
text: req.text,
|
|
47
|
+
top_traits: getActiveTraitNames(result.traits),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Classify both sides of modified requirements and detect drift
|
|
51
|
+
const modifiedReqs = diff.modified ?? [];
|
|
52
|
+
for (const req of modifiedReqs) {
|
|
53
|
+
const [oldResult, newResult] = (await Promise.all([
|
|
54
|
+
client.classify(req.old_text),
|
|
55
|
+
client.classify(req.new_text),
|
|
56
|
+
]));
|
|
57
|
+
if (oldResult.hex_code !== newResult.hex_code) {
|
|
58
|
+
drift.push({
|
|
59
|
+
ref: req.ref,
|
|
60
|
+
old_hex: oldResult.hex_code,
|
|
61
|
+
new_hex: newResult.hex_code,
|
|
62
|
+
old_text: req.old_text,
|
|
63
|
+
new_text: req.new_text,
|
|
64
|
+
flipped_traits: findFlippedTraits(oldResult.traits, newResult.traits),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
summary: {
|
|
70
|
+
added: addedReqs.length,
|
|
71
|
+
removed: removedReqs.length,
|
|
72
|
+
modified: modifiedReqs.length,
|
|
73
|
+
semantic_drift: drift.length,
|
|
74
|
+
},
|
|
75
|
+
drift,
|
|
76
|
+
added,
|
|
77
|
+
removed,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// --- Pretty output ---
|
|
81
|
+
function prettyPrintImpact(result) {
|
|
82
|
+
const s = result.summary;
|
|
83
|
+
const driftLabel = s.semantic_drift > 0
|
|
84
|
+
? ` (${yellow(`${s.semantic_drift} with semantic drift`)})`
|
|
85
|
+
: "";
|
|
86
|
+
console.log(bold("Summary: ") +
|
|
87
|
+
`${green(`${s.added} added`)}, ${red(`${s.removed} removed`)}, ` +
|
|
88
|
+
`${cyan(`${s.modified} modified`)}${driftLabel}`);
|
|
89
|
+
if (result.drift.length) {
|
|
90
|
+
console.log(bold("\nSemantic Drift:"));
|
|
91
|
+
for (const d of result.drift) {
|
|
92
|
+
console.log(` ${bold(d.ref)} ${red(d.old_hex)} → ${green(d.new_hex)}`);
|
|
93
|
+
for (const f of d.flipped_traits) {
|
|
94
|
+
const arrow = f.direction === "added" ? green("+") : red("-");
|
|
95
|
+
console.log(` ${arrow} ${f.name}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (result.added.length) {
|
|
100
|
+
console.log(bold("\nAdded:"));
|
|
101
|
+
for (const a of result.added) {
|
|
102
|
+
console.log(` ${bold(a.ref)} ${cyan(a.hex)} ${a.top_traits.join(", ")}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (result.removed.length) {
|
|
106
|
+
console.log(bold("\nRemoved:"));
|
|
107
|
+
for (const r of result.removed) {
|
|
108
|
+
console.log(` ${bold(r.ref)} ${cyan(r.hex)} ${r.top_traits.join(", ")}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// --- Command registration ---
|
|
113
|
+
export function registerImpactCommand(program, getClient, getFormat) {
|
|
114
|
+
program
|
|
115
|
+
.command("impact")
|
|
116
|
+
.description("Analyse semantic impact of requirement changes from an airgen diff")
|
|
117
|
+
.requiredOption("--airgen-diff <path>", "Path to airgen diff JSON file (airgen diff --json)")
|
|
118
|
+
.option("--json", "Force JSON output")
|
|
119
|
+
.action(async (opts) => {
|
|
120
|
+
const filePath = opts.airgenDiff;
|
|
121
|
+
if (!existsSync(filePath)) {
|
|
122
|
+
console.error(`Error: File not found: ${filePath}`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
let diff;
|
|
126
|
+
try {
|
|
127
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
128
|
+
diff = JSON.parse(raw);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
console.error(`Error: Could not parse ${filePath} as JSON. Expected airgen diff format: { summary, added, removed, modified }`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
if (!diff.added && !diff.removed && !diff.modified) {
|
|
135
|
+
console.error(`Error: No added, removed, or modified arrays found in ${filePath}. Expected airgen diff format.`);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
const result = await runImpact(getClient(), diff);
|
|
139
|
+
const format = opts.json ? "json" : getFormat();
|
|
140
|
+
if (format === "json") {
|
|
141
|
+
console.log(JSON.stringify(result, null, 2));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
prettyPrintImpact(result);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/commands/impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { output } from "../output.js";
|
|
2
|
+
export function registerInfoCommands(program, getClient, getFormat) {
|
|
3
|
+
program
|
|
4
|
+
.command("info")
|
|
5
|
+
.description("Get system information and overview")
|
|
6
|
+
.action(async () => {
|
|
7
|
+
output(await getClient().info(), getFormat());
|
|
8
|
+
});
|
|
9
|
+
program
|
|
10
|
+
.command("traits")
|
|
11
|
+
.description("Get all 32 trait definitions")
|
|
12
|
+
.action(async () => {
|
|
13
|
+
output(await getClient().traits(), getFormat());
|
|
14
|
+
});
|
|
15
|
+
program
|
|
16
|
+
.command("trait-prompts")
|
|
17
|
+
.description("Get classifier prompts sent to the LLM (includes edge cases and examples)")
|
|
18
|
+
.option("-e, --entity <name>", "Entity name to substitute into prompts")
|
|
19
|
+
.option("-d, --description <desc>", "Entity description to substitute")
|
|
20
|
+
.option("-b, --bit <n>", "Single trait bit (1-32), or omit for all")
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
output(await getClient().traitPrompts({
|
|
23
|
+
entity_name: opts.entity,
|
|
24
|
+
entity_description: opts.description,
|
|
25
|
+
bit: opts.bit ? parseInt(opts.bit) : undefined,
|
|
26
|
+
}), getFormat());
|
|
27
|
+
});
|
|
28
|
+
program
|
|
29
|
+
.command("patterns")
|
|
30
|
+
.description("Get reasoning patterns for tool orchestration")
|
|
31
|
+
.action(async () => {
|
|
32
|
+
output(await getClient().patterns(), getFormat());
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,0BAA0B,EAAE,kCAAkC,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAA6D,EAAE,EAAE;QAC9E,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,YAAY,CAAC;YAC7B,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,kBAAkB,EAAE,IAAI,CAAC,WAAW;YACpC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/C,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { output } from "../output.js";
|
|
2
|
+
export function registerNamespaceCommands(program, getClient, getFormat) {
|
|
3
|
+
const ns = program
|
|
4
|
+
.command("namespaces")
|
|
5
|
+
.alias("ns")
|
|
6
|
+
.description("Namespace management commands");
|
|
7
|
+
ns.command("create")
|
|
8
|
+
.description("Create a new namespace")
|
|
9
|
+
.argument("<code>", "Unique namespace code (e.g. SE:aerospace)")
|
|
10
|
+
.argument("<name>", "Human-readable name")
|
|
11
|
+
.option("-d, --description <desc>", "Optional description")
|
|
12
|
+
.action(async (code, name, opts) => {
|
|
13
|
+
output(await getClient().createNamespace(code, name, opts.description), getFormat());
|
|
14
|
+
});
|
|
15
|
+
ns.command("list")
|
|
16
|
+
.description("List namespaces")
|
|
17
|
+
.option("-p, --parent <code>", "List children of this namespace")
|
|
18
|
+
.option("--descendants", "Include entire subtree", false)
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
output(await getClient().listNamespaces({
|
|
21
|
+
parent: opts.parent,
|
|
22
|
+
include_descendants: opts.descendants,
|
|
23
|
+
}), getFormat());
|
|
24
|
+
});
|
|
25
|
+
ns.command("assign")
|
|
26
|
+
.description("Assign an entity to a namespace")
|
|
27
|
+
.argument("<entity>", "Entity name")
|
|
28
|
+
.argument("<namespace>", "Namespace code")
|
|
29
|
+
.option("--no-primary", "Do not set as primary namespace")
|
|
30
|
+
.action(async (entity, namespace, opts) => {
|
|
31
|
+
output(await getClient().assignNamespace(entity, namespace, opts.primary), getFormat());
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=namespaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespaces.js","sourceRoot":"","sources":["../../src/commands/namespaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,yBAAyB,CACvC,OAAgB,EAChB,SAA0B,EAC1B,SAAkC;IAElC,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,YAAY,CAAC;SACrB,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEhD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,QAAQ,EAAE,2CAA2C,CAAC;SAC/D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACzC,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,IAA8B,EAAE,EAAE;QAC3E,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAA+C,EAAE,EAAE;QAChE,MAAM,CACJ,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,WAAW;SACtC,CAAC,EACF,SAAS,EAAE,CACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;SACnC,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAE,IAA0B,EAAE,EAAE;QAC9E,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACP,CAAC"}
|