@nvwa-os/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.
@@ -0,0 +1,169 @@
1
+ // @bun
2
+ import"./cli-z1w83f81.js";
3
+
4
+ // ../agent/integration-capabilities.ts
5
+ import { mkdirSync, readFileSync, writeFileSync } from "fs";
6
+ import { join } from "path";
7
+
8
+ // ../common/src/integration-capabilities.ts
9
+ import { createHash } from "crypto";
10
+ var INTEGRATION_CAPABILITIES_VERSION = 1;
11
+ function normalizeCapabilityId(raw) {
12
+ const id = raw.trim().toLowerCase();
13
+ if (!/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/.test(id))
14
+ return null;
15
+ return id;
16
+ }
17
+ function sortCapabilities(caps) {
18
+ return [...new Set(caps.map((c) => c.trim()).filter(Boolean))].sort((a, b) => a.localeCompare(b));
19
+ }
20
+ function parseIntegrationCapabilitiesFile(jsonText) {
21
+ let doc;
22
+ try {
23
+ doc = JSON.parse(jsonText);
24
+ } catch (e) {
25
+ const msg = e instanceof Error ? e.message : String(e);
26
+ throw new Error(`capabilities.json: invalid JSON: ${msg}`);
27
+ }
28
+ if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
29
+ throw new Error("capabilities.json: root must be an object");
30
+ }
31
+ const o = doc;
32
+ const contractId = typeof o.contractId === "string" ? o.contractId.trim() : "";
33
+ if (!contractId)
34
+ throw new Error("capabilities.json: contractId required");
35
+ if (o.version !== INTEGRATION_CAPABILITIES_VERSION) {
36
+ throw new Error(`capabilities.json: unsupported version ${String(o.version)}`);
37
+ }
38
+ if (!Array.isArray(o.capabilities)) {
39
+ throw new Error("capabilities.json: capabilities must be an array");
40
+ }
41
+ const capabilities = [];
42
+ for (const item of o.capabilities) {
43
+ if (typeof item !== "string")
44
+ throw new Error("capabilities.json: capability must be string");
45
+ const norm = normalizeCapabilityId(item);
46
+ if (!norm)
47
+ throw new Error(`capabilities.json: invalid capability id ${item}`);
48
+ capabilities.push(norm);
49
+ }
50
+ const generatedAt = typeof o.generatedAt === "string" ? o.generatedAt.trim() : "";
51
+ if (!generatedAt)
52
+ throw new Error("capabilities.json: generatedAt required");
53
+ const sourceOpenApiSha = typeof o.sourceOpenApiSha === "string" ? o.sourceOpenApiSha.trim() : "";
54
+ if (!sourceOpenApiSha)
55
+ throw new Error("capabilities.json: sourceOpenApiSha required");
56
+ return {
57
+ contractId,
58
+ version: INTEGRATION_CAPABILITIES_VERSION,
59
+ capabilities: sortCapabilities(capabilities),
60
+ generatedAt,
61
+ sourceOpenApiSha
62
+ };
63
+ }
64
+ function serializeIntegrationCapabilitiesFile(file) {
65
+ return `${JSON.stringify({
66
+ contractId: file.contractId,
67
+ version: file.version,
68
+ capabilities: sortCapabilities(file.capabilities),
69
+ generatedAt: file.generatedAt,
70
+ sourceOpenApiSha: file.sourceOpenApiSha
71
+ }, null, 2)}
72
+ `;
73
+ }
74
+ function sha256Hex(text) {
75
+ return createHash("sha256").update(text).digest("hex");
76
+ }
77
+ function extractCapabilitiesFromOpenApiYaml(openApiYaml) {
78
+ const caps = [];
79
+ const lines = openApiYaml.split(`
80
+ `);
81
+ for (const line of lines) {
82
+ const m = /x-nvwa-capability:\s*([^\s#]+)/.exec(line);
83
+ if (m?.[1]) {
84
+ const norm = normalizeCapabilityId(m[1]);
85
+ if (norm)
86
+ caps.push(norm);
87
+ }
88
+ }
89
+ return sortCapabilities(caps);
90
+ }
91
+ function buildCapabilitiesFileFromOpenApi(opts) {
92
+ const capabilities = extractCapabilitiesFromOpenApiYaml(opts.openApiYaml);
93
+ if (capabilities.length === 0) {
94
+ throw new Error("capabilities.json: no x-nvwa-capability found in openapi.yaml; add extensions during api_batch");
95
+ }
96
+ return {
97
+ contractId: opts.contractId.trim(),
98
+ version: INTEGRATION_CAPABILITIES_VERSION,
99
+ capabilities,
100
+ generatedAt: opts.generatedAt ?? new Date().toISOString(),
101
+ sourceOpenApiSha: sha256Hex(opts.openApiYaml)
102
+ };
103
+ }
104
+ function verifyCapabilitiesMatchOpenApi(openApiYaml, capabilitiesJson) {
105
+ let file;
106
+ try {
107
+ file = parseIntegrationCapabilitiesFile(capabilitiesJson);
108
+ } catch (e) {
109
+ return e instanceof Error ? e.message : String(e);
110
+ }
111
+ const expectedSha = sha256Hex(openApiYaml);
112
+ if (file.sourceOpenApiSha !== expectedSha) {
113
+ return "capabilities.json sourceOpenApiSha stale; re-run api_batch";
114
+ }
115
+ const fromOpenApi = extractCapabilitiesFromOpenApiYaml(openApiYaml);
116
+ if (sortCapabilities(fromOpenApi).join(",") !== sortCapabilities(file.capabilities).join(",")) {
117
+ return "capabilities.json capabilities mismatch openapi x-nvwa-capability";
118
+ }
119
+ return null;
120
+ }
121
+
122
+ // ../agent/integration-capabilities.ts
123
+ function integrationSimOpenApiRelPath() {
124
+ return "openapi/openapi.yaml";
125
+ }
126
+ function integrationSimCapabilitiesRelPath() {
127
+ return "src/generated/capabilities.json";
128
+ }
129
+ function refreshIntegrationSimCapabilitiesFile(simDir, contractId) {
130
+ const openApiPath = join(simDir, integrationSimOpenApiRelPath());
131
+ let openApiYaml;
132
+ try {
133
+ openApiYaml = readFileSync(openApiPath, "utf8");
134
+ } catch {
135
+ return `missing ${integrationSimOpenApiRelPath()}`;
136
+ }
137
+ const capPath = join(simDir, integrationSimCapabilitiesRelPath());
138
+ mkdirSync(join(simDir, "src/generated"), { recursive: true });
139
+ try {
140
+ const file = buildCapabilitiesFileFromOpenApi({ contractId, openApiYaml });
141
+ writeFileSync(capPath, serializeIntegrationCapabilitiesFile(file), "utf8");
142
+ return null;
143
+ } catch (e) {
144
+ return e instanceof Error ? e.message : String(e);
145
+ }
146
+ }
147
+ function validateIntegrationSimCapabilitiesGate(simDir) {
148
+ const openApiPath = join(simDir, integrationSimOpenApiRelPath());
149
+ const capPath = join(simDir, integrationSimCapabilitiesRelPath());
150
+ let openApiYaml;
151
+ let capabilitiesJson;
152
+ try {
153
+ openApiYaml = readFileSync(openApiPath, "utf8");
154
+ capabilitiesJson = readFileSync(capPath, "utf8");
155
+ } catch {
156
+ return "capabilities gate: openapi.yaml and src/generated/capabilities.json required after api_batch/regen";
157
+ }
158
+ return verifyCapabilitiesMatchOpenApi(openApiYaml, capabilitiesJson);
159
+ }
160
+ export {
161
+ validateIntegrationSimCapabilitiesGate,
162
+ refreshIntegrationSimCapabilitiesFile,
163
+ integrationSimOpenApiRelPath,
164
+ integrationSimCapabilitiesRelPath,
165
+ buildCapabilitiesFileFromOpenApi
166
+ };
167
+
168
+ //# debugId=7AF79C213BB5B60964756E2164756E21
169
+ //# sourceMappingURL=integration-capabilities-1pm1ad9s.js.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../agent/integration-capabilities.ts", "../../common/src/integration-capabilities.ts"],
4
+ "sourcesContent": [
5
+ "import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport {\n buildCapabilitiesFileFromOpenApi,\n serializeIntegrationCapabilitiesFile,\n verifyCapabilitiesMatchOpenApi,\n} from \"../common/src/integration-capabilities.ts\";\n\nexport function integrationSimOpenApiRelPath(): string {\n return \"openapi/openapi.yaml\";\n}\n\nexport function integrationSimCapabilitiesRelPath(): string {\n return \"src/generated/capabilities.json\";\n}\n\nexport function refreshIntegrationSimCapabilitiesFile(simDir: string, contractId: string): string | null {\n const openApiPath = join(simDir, integrationSimOpenApiRelPath());\n let openApiYaml: string;\n try {\n openApiYaml = readFileSync(openApiPath, \"utf8\");\n } catch {\n return `missing ${integrationSimOpenApiRelPath()}`;\n }\n\n const capPath = join(simDir, integrationSimCapabilitiesRelPath());\n mkdirSync(join(simDir, \"src/generated\"), { recursive: true });\n\n try {\n const file = buildCapabilitiesFileFromOpenApi({ contractId, openApiYaml });\n writeFileSync(capPath, serializeIntegrationCapabilitiesFile(file), \"utf8\");\n return null;\n } catch (e) {\n return e instanceof Error ? e.message : String(e);\n }\n}\n\nexport function validateIntegrationSimCapabilitiesGate(simDir: string): string | null {\n const openApiPath = join(simDir, integrationSimOpenApiRelPath());\n const capPath = join(simDir, integrationSimCapabilitiesRelPath());\n let openApiYaml: string;\n let capabilitiesJson: string;\n try {\n openApiYaml = readFileSync(openApiPath, \"utf8\");\n capabilitiesJson = readFileSync(capPath, \"utf8\");\n } catch {\n return \"capabilities gate: openapi.yaml and src/generated/capabilities.json required after api_batch/regen\";\n }\n return verifyCapabilitiesMatchOpenApi(openApiYaml, capabilitiesJson);\n}\n\n// re-export for tests\nexport { buildCapabilitiesFileFromOpenApi } from \"../common/src/integration-capabilities.ts\";",
6
+ "import { createHash } from \"node:crypto\";\n\n/** @see spec/foundation/integration-manifest.md */\n\nexport const INTEGRATION_CAPABILITIES_VERSION = 1 as const;\n\nexport type IntegrationCapabilitiesFile = {\n contractId: string;\n version: typeof INTEGRATION_CAPABILITIES_VERSION;\n capabilities: string[];\n generatedAt: string;\n sourceOpenApiSha: string;\n};\n\nexport function normalizeCapabilityId(raw: string): string | null {\n const id = raw.trim().toLowerCase();\n if (!/^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)+$/.test(id)) return null;\n return id;\n}\n\nexport function sortCapabilities(caps: string[]): string[] {\n return [...new Set(caps.map((c) => c.trim()).filter(Boolean))].sort((a, b) =>\n a.localeCompare(b),\n );\n}\n\nexport function parseIntegrationCapabilitiesFile(jsonText: string): IntegrationCapabilitiesFile {\n let doc: unknown;\n try {\n doc = JSON.parse(jsonText);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`capabilities.json: invalid JSON: ${msg}`);\n }\n if (!doc || typeof doc !== \"object\" || Array.isArray(doc)) {\n throw new Error(\"capabilities.json: root must be an object\");\n }\n const o = doc as Record<string, unknown>;\n const contractId = typeof o.contractId === \"string\" ? o.contractId.trim() : \"\";\n if (!contractId) throw new Error(\"capabilities.json: contractId required\");\n if (o.version !== INTEGRATION_CAPABILITIES_VERSION) {\n throw new Error(`capabilities.json: unsupported version ${String(o.version)}`);\n }\n if (!Array.isArray(o.capabilities)) {\n throw new Error(\"capabilities.json: capabilities must be an array\");\n }\n const capabilities: string[] = [];\n for (const item of o.capabilities) {\n if (typeof item !== \"string\") throw new Error(\"capabilities.json: capability must be string\");\n const norm = normalizeCapabilityId(item);\n if (!norm) throw new Error(`capabilities.json: invalid capability id ${item}`);\n capabilities.push(norm);\n }\n const generatedAt = typeof o.generatedAt === \"string\" ? o.generatedAt.trim() : \"\";\n if (!generatedAt) throw new Error(\"capabilities.json: generatedAt required\");\n const sourceOpenApiSha =\n typeof o.sourceOpenApiSha === \"string\" ? o.sourceOpenApiSha.trim() : \"\";\n if (!sourceOpenApiSha) throw new Error(\"capabilities.json: sourceOpenApiSha required\");\n return {\n contractId,\n version: INTEGRATION_CAPABILITIES_VERSION,\n capabilities: sortCapabilities(capabilities),\n generatedAt,\n sourceOpenApiSha,\n };\n}\n\nexport function serializeIntegrationCapabilitiesFile(file: IntegrationCapabilitiesFile): string {\n return `${JSON.stringify(\n {\n contractId: file.contractId,\n version: file.version,\n capabilities: sortCapabilities(file.capabilities),\n generatedAt: file.generatedAt,\n sourceOpenApiSha: file.sourceOpenApiSha,\n },\n null,\n 2,\n )}\\n`;\n}\n\nexport function sha256Hex(text: string): string {\n return createHash(\"sha256\").update(text).digest(\"hex\");\n}\n\n/** Extract capability ids from OpenAPI YAML text (x-nvwa-capability on operations). */\nexport function extractCapabilitiesFromOpenApiYaml(openApiYaml: string): string[] {\n const caps: string[] = [];\n const lines = openApiYaml.split(\"\\n\");\n for (const line of lines) {\n const m = /x-nvwa-capability:\\s*([^\\s#]+)/.exec(line);\n if (m?.[1]) {\n const norm = normalizeCapabilityId(m[1]);\n if (norm) caps.push(norm);\n }\n }\n return sortCapabilities(caps);\n}\n\nexport function buildCapabilitiesFileFromOpenApi(opts: {\n contractId: string;\n openApiYaml: string;\n generatedAt?: string;\n}): IntegrationCapabilitiesFile {\n const capabilities = extractCapabilitiesFromOpenApiYaml(opts.openApiYaml);\n if (capabilities.length === 0) {\n throw new Error(\n \"capabilities.json: no x-nvwa-capability found in openapi.yaml; add extensions during api_batch\",\n );\n }\n return {\n contractId: opts.contractId.trim(),\n version: INTEGRATION_CAPABILITIES_VERSION,\n capabilities,\n generatedAt: opts.generatedAt ?? new Date().toISOString(),\n sourceOpenApiSha: sha256Hex(opts.openApiYaml),\n };\n}\n\nexport function verifyCapabilitiesMatchOpenApi(\n openApiYaml: string,\n capabilitiesJson: string,\n): string | null {\n let file: IntegrationCapabilitiesFile;\n try {\n file = parseIntegrationCapabilitiesFile(capabilitiesJson);\n } catch (e) {\n return e instanceof Error ? e.message : String(e);\n }\n const expectedSha = sha256Hex(openApiYaml);\n if (file.sourceOpenApiSha !== expectedSha) {\n return \"capabilities.json sourceOpenApiSha stale; re-run api_batch\";\n }\n const fromOpenApi = extractCapabilitiesFromOpenApiYaml(openApiYaml);\n if (sortCapabilities(fromOpenApi).join(\",\") !== sortCapabilities(file.capabilities).join(\",\")) {\n return \"capabilities.json capabilities mismatch openapi x-nvwa-capability\";\n }\n return null;\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "7AF79C213BB5B60964756E2164756E21",
10
+ "names": []
11
+ }
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@nvwa-os/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "nvwa-os": "./bin/nvwa-os"
7
+ },
8
+ "files": [
9
+ "dist",
10
+ "bin",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "check": "tsc --noEmit",
15
+ "test": "bun test",
16
+ "build": "bun run scripts/build.ts"
17
+ },
18
+ "dependencies": {
19
+ "@nvwa-os/common": "workspace:*"
20
+ },
21
+ "devDependencies": {
22
+ "@types/bun": "latest",
23
+ "typescript": "^5.8.0"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ }
28
+ }