@plumbus/core 0.4.0 → 0.4.2

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 (101) hide show
  1. package/README.md +14 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/ai/security.d.ts.map +1 -1
  4. package/dist/ai/security.js +14 -1
  5. package/dist/ai/security.js.map +1 -1
  6. package/dist/api/exposure.d.ts +4 -0
  7. package/dist/api/exposure.d.ts.map +1 -0
  8. package/dist/api/exposure.js +5 -0
  9. package/dist/api/exposure.js.map +1 -0
  10. package/dist/api/index.d.ts +1 -0
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/index.js +2 -1
  13. package/dist/api/index.js.map +1 -1
  14. package/dist/api/route-generator.d.ts.map +1 -1
  15. package/dist/api/route-generator.js +48 -6
  16. package/dist/api/route-generator.js.map +1 -1
  17. package/dist/auth/saml-adapter.d.ts.map +1 -1
  18. package/dist/auth/saml-adapter.js +73 -120
  19. package/dist/auth/saml-adapter.js.map +1 -1
  20. package/dist/auth/scim.d.ts.map +1 -1
  21. package/dist/auth/scim.js +6 -1
  22. package/dist/auth/scim.js.map +1 -1
  23. package/dist/cli/cli.d.ts.map +1 -1
  24. package/dist/cli/cli.js +3 -1
  25. package/dist/cli/cli.js.map +1 -1
  26. package/dist/cli/commands/api-manifest.d.ts +26 -0
  27. package/dist/cli/commands/api-manifest.d.ts.map +1 -0
  28. package/dist/cli/commands/api-manifest.js +54 -0
  29. package/dist/cli/commands/api-manifest.js.map +1 -0
  30. package/dist/cli/commands/api.d.ts +3 -0
  31. package/dist/cli/commands/api.d.ts.map +1 -0
  32. package/dist/cli/commands/api.js +179 -0
  33. package/dist/cli/commands/api.js.map +1 -0
  34. package/dist/cli/commands/browser-extension.d.ts +10 -0
  35. package/dist/cli/commands/browser-extension.d.ts.map +1 -0
  36. package/dist/cli/commands/browser-extension.js +235 -0
  37. package/dist/cli/commands/browser-extension.js.map +1 -0
  38. package/dist/cli/commands/index.d.ts +2 -0
  39. package/dist/cli/commands/index.d.ts.map +1 -1
  40. package/dist/cli/commands/index.js +3 -0
  41. package/dist/cli/commands/index.js.map +1 -1
  42. package/dist/cli/commands/init.d.ts +1 -1
  43. package/dist/cli/commands/init.d.ts.map +1 -1
  44. package/dist/cli/commands/init.js +39 -3
  45. package/dist/cli/commands/init.js.map +1 -1
  46. package/dist/cli/commands/verify.d.ts.map +1 -1
  47. package/dist/cli/commands/verify.js +14 -0
  48. package/dist/cli/commands/verify.js.map +1 -1
  49. package/dist/cli/scaffold-write.d.ts +17 -0
  50. package/dist/cli/scaffold-write.d.ts.map +1 -0
  51. package/dist/cli/scaffold-write.js +40 -0
  52. package/dist/cli/scaffold-write.js.map +1 -0
  53. package/dist/cli/templates/resources.d.ts.map +1 -1
  54. package/dist/cli/templates/resources.js +6 -0
  55. package/dist/cli/templates/resources.js.map +1 -1
  56. package/dist/cli/utils.d.ts +2 -0
  57. package/dist/cli/utils.d.ts.map +1 -1
  58. package/dist/cli/utils.js +14 -0
  59. package/dist/cli/utils.js.map +1 -1
  60. package/dist/data/repository.d.ts.map +1 -1
  61. package/dist/data/repository.js +6 -0
  62. package/dist/data/repository.js.map +1 -1
  63. package/dist/define/defineCapability.d.ts +3 -2
  64. package/dist/define/defineCapability.d.ts.map +1 -1
  65. package/dist/define/defineCapability.js +81 -1
  66. package/dist/define/defineCapability.js.map +1 -1
  67. package/dist/errors/http.d.ts +1 -0
  68. package/dist/errors/http.d.ts.map +1 -1
  69. package/dist/errors/http.js +1 -1
  70. package/dist/errors/http.js.map +1 -1
  71. package/dist/flows/step-executor.d.ts.map +1 -1
  72. package/dist/flows/step-executor.js +6 -5
  73. package/dist/flows/step-executor.js.map +1 -1
  74. package/dist/governance/index.d.ts +1 -1
  75. package/dist/governance/index.d.ts.map +1 -1
  76. package/dist/governance/index.js +1 -1
  77. package/dist/governance/index.js.map +1 -1
  78. package/dist/governance/rules/api.d.ts +13 -0
  79. package/dist/governance/rules/api.d.ts.map +1 -0
  80. package/dist/governance/rules/api.js +124 -0
  81. package/dist/governance/rules/api.js.map +1 -0
  82. package/dist/governance/rules/index.d.ts +1 -0
  83. package/dist/governance/rules/index.d.ts.map +1 -1
  84. package/dist/governance/rules/index.js +1 -0
  85. package/dist/governance/rules/index.js.map +1 -1
  86. package/dist/index.d.ts +2 -2
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +2 -2
  89. package/dist/index.js.map +1 -1
  90. package/dist/server/bootstrap.d.ts.map +1 -1
  91. package/dist/server/bootstrap.js +3 -1
  92. package/dist/server/bootstrap.js.map +1 -1
  93. package/dist/types/capability.d.ts +59 -1
  94. package/dist/types/capability.d.ts.map +1 -1
  95. package/dist/types/capability.js +15 -1
  96. package/dist/types/capability.js.map +1 -1
  97. package/dist/types/index.d.ts +1 -1
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/dist/types/index.js.map +1 -1
  100. package/instructions/api.md +19 -0
  101. package/package.json +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCpC,wBAAgB,SAAS,IAAI,OAAO,CA+CnC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC,wBAAgB,SAAS,IAAI,OAAO,CAiDnC"}
package/dist/cli/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Main `plumbus` command with subcommands
3
3
  import { createRequire } from 'node:module';
4
4
  import { Command } from 'commander';
5
- import { registerAgentCommand, registerCapabilityCommand, registerCertifyCommand, registerCreateCommand, registerDbCommand, registerDevCommand, registerDoctorCommand, registerE2ECommand, registerEntityCommand, registerEventCommand, registerFlowCommand, registerGenerateCommand, registerInitCommand, registerMcpCommand, registerMigrateCommand, registerPromptCommand, registerRagCommand, registerRunCommand, registerSeedCommand, registerStartCommand, registerTestCommand, registerTranslationCommand, registerUiCommand, registerUpgradeCommand, registerVerifyCommand, } from './commands/index.js';
5
+ import { registerAgentCommand, registerApiCommand, registerBrowserExtensionCommand, registerCapabilityCommand, registerCertifyCommand, registerCreateCommand, registerDbCommand, registerDevCommand, registerDoctorCommand, registerE2ECommand, registerEntityCommand, registerEventCommand, registerFlowCommand, registerGenerateCommand, registerInitCommand, registerMcpCommand, registerMigrateCommand, registerPromptCommand, registerRagCommand, registerRunCommand, registerSeedCommand, registerStartCommand, registerTestCommand, registerTranslationCommand, registerUiCommand, registerUpgradeCommand, registerVerifyCommand, } from './commands/index.js';
6
6
  import { assertInsidePlumbusProject, commandRequiresProject } from './utils.js';
7
7
  function getVersion() {
8
8
  try {
@@ -40,6 +40,7 @@ export function createCli() {
40
40
  registerPromptCommand(program);
41
41
  registerGenerateCommand(program);
42
42
  registerMcpCommand(program);
43
+ registerApiCommand(program);
43
44
  registerMigrateCommand(program);
44
45
  registerDbCommand(program);
45
46
  registerVerifyCommand(program);
@@ -49,6 +50,7 @@ export function createCli() {
49
50
  registerRunCommand(program);
50
51
  registerSeedCommand(program);
51
52
  registerUiCommand(program);
53
+ registerBrowserExtensionCommand(program);
52
54
  registerUpgradeCommand(program);
53
55
  registerDoctorCommand(program);
54
56
  registerDevCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { CapabilityContract } from '../../types/capability.js';
2
+ export interface ApiManifestLoader {
3
+ parseManifest: (source: string, format: 'yaml' | 'json') => unknown;
4
+ buildDefaultManifest: (capabilities: CapabilityContract[]) => unknown;
5
+ }
6
+ export declare class ApiManifestLoadError extends Error {
7
+ readonly filePath: string;
8
+ readonly reason: 'not-found' | 'invalid';
9
+ constructor(filePath: string, reason: 'not-found' | 'invalid', message: string);
10
+ }
11
+ /**
12
+ * Load an API manifest from disk. Falls back to inline defaults only when the
13
+ * default manifest path is missing (ENOENT). Explicit --manifest paths and
14
+ * parse/schema failures always surface as errors.
15
+ */
16
+ export declare function resolveApiManifest(opts: {
17
+ filePath: string;
18
+ explicitManifest: boolean;
19
+ capabilities: CapabilityContract[];
20
+ api: ApiManifestLoader;
21
+ readFileFn?: (path: string) => Promise<string>;
22
+ }): Promise<{
23
+ manifest: unknown;
24
+ warning?: string;
25
+ }>;
26
+ //# sourceMappingURL=api-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-manifest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/api-manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC;IACpE,oBAAoB,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,KAAK,OAAO,CAAC;CACvE;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;gBAE7B,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM;CAM/E;AAWD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,GAAG,EAAE,iBAAiB,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCnD"}
@@ -0,0 +1,54 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ export class ApiManifestLoadError extends Error {
3
+ filePath;
4
+ reason;
5
+ constructor(filePath, reason, message) {
6
+ super(message);
7
+ this.name = 'ApiManifestLoadError';
8
+ this.filePath = filePath;
9
+ this.reason = reason;
10
+ }
11
+ }
12
+ function isENOENT(err) {
13
+ return (typeof err === 'object' &&
14
+ err !== null &&
15
+ 'code' in err &&
16
+ err.code === 'ENOENT');
17
+ }
18
+ /**
19
+ * Load an API manifest from disk. Falls back to inline defaults only when the
20
+ * default manifest path is missing (ENOENT). Explicit --manifest paths and
21
+ * parse/schema failures always surface as errors.
22
+ */
23
+ export async function resolveApiManifest(opts) {
24
+ const format = opts.filePath.endsWith('.json') ? 'json' : 'yaml';
25
+ try {
26
+ const source = opts.readFileFn
27
+ ? await opts.readFileFn(opts.filePath)
28
+ : await readFile(opts.filePath, 'utf8');
29
+ try {
30
+ return { manifest: opts.api.parseManifest(source, format) };
31
+ }
32
+ catch (err) {
33
+ const detail = err instanceof Error ? err.message : String(err);
34
+ throw new ApiManifestLoadError(opts.filePath, 'invalid', `Failed to parse API manifest at ${opts.filePath}: ${detail}`);
35
+ }
36
+ }
37
+ catch (err) {
38
+ if (err instanceof ApiManifestLoadError) {
39
+ throw err;
40
+ }
41
+ if (isENOENT(err)) {
42
+ if (opts.explicitManifest) {
43
+ throw new ApiManifestLoadError(opts.filePath, 'not-found', `API manifest not found: ${opts.filePath}`);
44
+ }
45
+ return {
46
+ manifest: opts.api.buildDefaultManifest(opts.capabilities),
47
+ warning: `No manifest at ${opts.filePath} — using inline api metadata only`,
48
+ };
49
+ }
50
+ const detail = err instanceof Error ? err.message : String(err);
51
+ throw new ApiManifestLoadError(opts.filePath, 'invalid', `Failed to read API manifest at ${opts.filePath}: ${detail}`);
52
+ }
53
+ }
54
+ //# sourceMappingURL=api-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-manifest.js","sourceRoot":"","sources":["../../../src/cli/commands/api-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,QAAQ,CAAS;IACjB,MAAM,CAA0B;IAEzC,YAAY,QAAgB,EAAE,MAA+B,EAAE,OAAe;QAC5E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAC7C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAMxC;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU;YAC5B,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,IAAI,oBAAoB,CAC5B,IAAI,CAAC,QAAQ,EACb,SAAS,EACT,mCAAmC,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;YACxC,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,MAAM,IAAI,oBAAoB,CAC5B,IAAI,CAAC,QAAQ,EACb,WAAW,EACX,2BAA2B,IAAI,CAAC,QAAQ,EAAE,CAC3C,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC1D,OAAO,EAAE,kBAAkB,IAAI,CAAC,QAAQ,mCAAmC;aAC5E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,IAAI,oBAAoB,CAC5B,IAAI,CAAC,QAAQ,EACb,SAAS,EACT,kCAAkC,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerApiCommand(program: Command): void;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/api.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqGzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0IzD"}
@@ -0,0 +1,179 @@
1
+ // ── plumbus api ──
2
+ // External API contract validation, OpenAPI/docs generation, and compatibility diff.
3
+ import { readFile } from 'node:fs/promises';
4
+ import * as path from 'node:path';
5
+ import { apiRules } from '../../governance/rules/api.js';
6
+ import { createGovernanceRuleEngine } from '../../governance/rule-engine.js';
7
+ import { ApiManifestLoadError, resolveApiManifest } from './api-manifest.js';
8
+ import { discoverResources } from '../discover.js';
9
+ import { info, resolvePath, success, warn, writeFile } from '../utils.js';
10
+ async function loadApiRuntime() {
11
+ try {
12
+ const mod = '@plumbus/api';
13
+ return (await import(mod));
14
+ }
15
+ catch {
16
+ console.error('');
17
+ console.error('API runtime not installed.');
18
+ console.error('Run: pnpm add @plumbus/api');
19
+ console.error('');
20
+ process.exit(1);
21
+ }
22
+ }
23
+ async function loadManifestAndCaps(manifestPath) {
24
+ const api = await loadApiRuntime();
25
+ const resources = await discoverResources();
26
+ const capabilities = resources.capabilities;
27
+ const file = manifestPath ?? resolvePath('api.yaml');
28
+ let manifest;
29
+ try {
30
+ const loaded = await resolveApiManifest({
31
+ filePath: file,
32
+ explicitManifest: manifestPath !== undefined,
33
+ capabilities,
34
+ api,
35
+ });
36
+ manifest = loaded.manifest;
37
+ if (loaded.warning) {
38
+ warn(loaded.warning);
39
+ }
40
+ }
41
+ catch (err) {
42
+ if (err instanceof ApiManifestLoadError) {
43
+ console.error('');
44
+ console.error(err.message);
45
+ console.error('');
46
+ process.exit(1);
47
+ }
48
+ throw err;
49
+ }
50
+ return { api, manifest, capabilities, appRoot: process.cwd() };
51
+ }
52
+ export function registerApiCommand(program) {
53
+ const apiCmd = program
54
+ .command('api')
55
+ .description('External API contract — validate, generate OpenAPI/docs, diff');
56
+ apiCmd
57
+ .command('validate')
58
+ .description('Validate API manifest, policy, path params, fixtures, and governance')
59
+ .option('--manifest <path>', 'Path to API manifest (default: ./api.yaml)')
60
+ .option('--json', 'Output results as JSON')
61
+ .action(async (opts) => {
62
+ const { api, manifest, capabilities, appRoot } = await loadManifestAndCaps(opts.manifest);
63
+ const result = await api.validateApiContract(manifest, capabilities, appRoot);
64
+ const engine = createGovernanceRuleEngine();
65
+ engine.registerMany(apiRules);
66
+ const gov = engine.evaluate({
67
+ capabilities,
68
+ entities: [],
69
+ flows: [],
70
+ events: [],
71
+ prompts: [],
72
+ });
73
+ const allFindings = [
74
+ ...result.manifest,
75
+ ...result.policy,
76
+ ...result.pathParams,
77
+ ...result.fixtures,
78
+ ];
79
+ const govSignals = gov.effective;
80
+ if (opts.json) {
81
+ console.log(JSON.stringify({ ...result, governance: govSignals }, null, 2));
82
+ }
83
+ else {
84
+ for (const f of allFindings) {
85
+ warn(`[${f.code}] ${f.message}`);
86
+ }
87
+ for (const s of govSignals) {
88
+ warn(`[${s.rule}] ${s.description}`);
89
+ }
90
+ }
91
+ if (allFindings.length > 0 || govSignals.length > 0) {
92
+ process.exit(1);
93
+ }
94
+ success('API contract validation passed');
95
+ });
96
+ const generate = apiCmd.command('generate').description('Generate API artifacts');
97
+ generate
98
+ .command('openapi')
99
+ .description('Generate OpenAPI specification')
100
+ .requiredOption('--out <file>', 'Output file path')
101
+ .option('--format <format>', 'json or yaml', 'json')
102
+ .option('--manifest <path>', 'Path to API manifest')
103
+ .action(async (opts) => {
104
+ const { api, manifest, capabilities } = await loadManifestAndCaps(opts.manifest);
105
+ const doc = api.generateOpenApi(capabilities, manifest);
106
+ const outPath = resolvePath(opts.out);
107
+ const format = opts.format === 'yaml' ? 'yaml' : 'json';
108
+ const content = api.serializeOpenApiDocument(doc, format);
109
+ writeFile(outPath, content);
110
+ success(`Wrote OpenAPI spec to ${outPath}`);
111
+ });
112
+ generate
113
+ .command('docs')
114
+ .description('Generate Markdown API documentation')
115
+ .requiredOption('--out <dir>', 'Output directory')
116
+ .option('--manifest <path>', 'Path to API manifest')
117
+ .action(async (opts) => {
118
+ const { api, manifest, capabilities } = await loadManifestAndCaps(opts.manifest);
119
+ const files = api.generateApiDocs(capabilities, manifest);
120
+ const outDir = resolvePath(opts.out);
121
+ for (const [rel, content] of files) {
122
+ writeFile(path.join(outDir, rel), content);
123
+ }
124
+ success(`Wrote ${files.size} doc file(s) to ${outDir}`);
125
+ });
126
+ apiCmd
127
+ .command('diff')
128
+ .description('Compare current OpenAPI against a published spec')
129
+ .requiredOption('--against <file>', 'Previously published OpenAPI file')
130
+ .option('--manifest <path>', 'Path to API manifest')
131
+ .option('--json', 'Output as JSON')
132
+ .action(async (opts) => {
133
+ const { api, manifest, capabilities } = await loadManifestAndCaps(opts.manifest);
134
+ const current = api.generateOpenApi(capabilities, manifest);
135
+ const againstPath = resolvePath(opts.against);
136
+ const prevRaw = await readFile(againstPath, 'utf8');
137
+ const prev = api.parseOpenApiDocument(prevRaw, againstPath);
138
+ const diff = api.diffOpenApi(prev, current);
139
+ if (opts.json) {
140
+ console.log(JSON.stringify(diff, null, 2));
141
+ }
142
+ else {
143
+ for (const b of diff.breaking) {
144
+ warn(`[BREAKING] ${b.message}`);
145
+ }
146
+ for (const nb of diff.nonBreaking) {
147
+ info(`[non-breaking] ${nb.message}`);
148
+ }
149
+ }
150
+ if (diff.breaking.length > 0) {
151
+ process.exit(1);
152
+ }
153
+ success('No breaking API changes detected');
154
+ });
155
+ const testFixtures = apiCmd
156
+ .command('test-fixtures')
157
+ .description('Validate API test fixtures against capability schemas');
158
+ testFixtures
159
+ .command('validate')
160
+ .description('Validate fixture files')
161
+ .option('--json', 'Output as JSON')
162
+ .action(async (opts) => {
163
+ const { api, manifest, capabilities, appRoot } = await loadManifestAndCaps();
164
+ const findings = await api.validateTestFixtures(capabilities, appRoot, manifest);
165
+ if (opts.json) {
166
+ console.log(JSON.stringify({ findings }, null, 2));
167
+ }
168
+ else {
169
+ for (const f of findings) {
170
+ warn(`[${f.code}] ${f.message}`);
171
+ }
172
+ }
173
+ if (findings.length > 0) {
174
+ process.exit(1);
175
+ }
176
+ success('All test fixtures are valid');
177
+ });
178
+ }
179
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cli/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from 'commander';
2
+ export interface BrowserExtensionScaffoldOptions {
3
+ appName?: string;
4
+ apiBaseUrl: string;
5
+ browser?: string;
6
+ force?: boolean;
7
+ json?: boolean;
8
+ }
9
+ export declare function registerBrowserExtensionCommand(program: Command): void;
10
+ //# sourceMappingURL=browser-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-extension.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/browser-extension.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkDzC,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyHD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkJtE"}
@@ -0,0 +1,235 @@
1
+ // ── plumbus browser-extension ──
2
+ // Scaffold a wxt Chrome/Firefox extension wired to Plumbus capabilities.
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { discoverResources } from '../discover.js';
7
+ import { writeGeneratedFiles, writeScaffoldFiles } from '../scaffold-write.js';
8
+ import { findGitRoot, info, resolvePath, success, warn } from '../utils.js';
9
+ function toFlowTriggers(flows) {
10
+ return flows.map((flow) => ({
11
+ name: flow.name,
12
+ domain: flow.domain,
13
+ description: flow.description,
14
+ }));
15
+ }
16
+ function parseBrowsers(value) {
17
+ const v = value ?? 'both';
18
+ if (v === 'chrome')
19
+ return ['chrome'];
20
+ if (v === 'firefox')
21
+ return ['firefox'];
22
+ if (v === 'both')
23
+ return ['chrome', 'firefox'];
24
+ throw new Error(`Invalid --browser "${v}". Use chrome, firefox, or both.`);
25
+ }
26
+ function validateApiBaseUrl(url) {
27
+ let parsed;
28
+ try {
29
+ parsed = new URL(url);
30
+ }
31
+ catch {
32
+ throw new Error(`Invalid --api-base-url "${url}". Must be an absolute http(s) URL.`);
33
+ }
34
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
35
+ throw new Error(`--api-base-url must use http: or https: (got ${parsed.protocol}).`);
36
+ }
37
+ const bad = ['chrome-extension:', 'moz-extension:', 'file:'];
38
+ if (bad.includes(parsed.protocol)) {
39
+ throw new Error(`--api-base-url must not use ${parsed.protocol}`);
40
+ }
41
+ }
42
+ function normalizeApiBaseUrl(url) {
43
+ validateApiBaseUrl(url);
44
+ return url.replace(/\/+$/, '');
45
+ }
46
+ function inferAppName(cwd) {
47
+ let dir = cwd;
48
+ for (let i = 0; i < 8; i++) {
49
+ const pkgPath = path.join(dir, 'package.json');
50
+ if (fs.existsSync(pkgPath)) {
51
+ try {
52
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
53
+ if (typeof pkg.name === 'string' && pkg.name.length > 0) {
54
+ return pkg.name.replace(/^@[^/]+\//, '');
55
+ }
56
+ }
57
+ catch {
58
+ // continue
59
+ }
60
+ }
61
+ const parent = path.dirname(dir);
62
+ if (parent === dir)
63
+ break;
64
+ dir = parent;
65
+ }
66
+ return undefined;
67
+ }
68
+ function resolveRepoRootFromOutput(outputDir) {
69
+ const gitRoot = findGitRoot(path.resolve(outputDir));
70
+ return gitRoot;
71
+ }
72
+ async function loadUiGenerators() {
73
+ const resolvedPath = path.join(process.cwd(), 'node_modules', '@plumbus', 'ui', 'dist', 'index.js');
74
+ if (!fs.existsSync(resolvedPath)) {
75
+ throw new Error('missing-ui');
76
+ }
77
+ return (await import(pathToFileURL(resolvedPath).href));
78
+ }
79
+ async function loadBrowserExtensionGenerators() {
80
+ const resolvedPath = path.join(process.cwd(), 'node_modules', '@plumbus', 'browser-extension', 'dist', 'index.js');
81
+ if (!fs.existsSync(resolvedPath)) {
82
+ throw new Error('missing-browser-extension');
83
+ }
84
+ return (await import(pathToFileURL(resolvedPath).href));
85
+ }
86
+ async function loadScaffoldDeps() {
87
+ try {
88
+ const ui = await loadUiGenerators();
89
+ const browserExtension = await loadBrowserExtensionGenerators();
90
+ return { ui, browserExtension };
91
+ }
92
+ catch (err) {
93
+ const reason = err instanceof Error ? err.message : String(err);
94
+ if (reason === 'missing-ui' || reason === 'missing-browser-extension') {
95
+ console.error('');
96
+ console.error('Browser extension scaffolder dependencies are not installed.');
97
+ console.error('Run: pnpm add @plumbus/ui @plumbus/browser-extension');
98
+ console.error('');
99
+ process.exit(1);
100
+ }
101
+ throw err;
102
+ }
103
+ }
104
+ const CLIENT_HEADER = `// Generated by plumbus browser-extension scaffold.
105
+ // Do not edit manually. Re-run the scaffold command after capability changes.
106
+
107
+ `;
108
+ export function registerBrowserExtensionCommand(program) {
109
+ const browserExtension = program
110
+ .command('browser-extension')
111
+ .description('Scaffold a wxt browser extension wired to Plumbus capabilities');
112
+ browserExtension
113
+ .command('scaffold [output-dir]')
114
+ .description('Generate a Chrome/Firefox extension project')
115
+ .option('--app-name <name>', 'Application name for the generated extension')
116
+ .option('--api-base-url <url>', 'Absolute API base URL (required)', '')
117
+ .option('--browser <target>', 'chrome | firefox | both', 'both')
118
+ .option('--force', 'Overwrite existing scaffold files')
119
+ .option('--json', 'Emit machine-readable result JSON')
120
+ .action(async (outputDir, opts) => {
121
+ if (!opts.apiBaseUrl) {
122
+ console.error('--api-base-url is required');
123
+ process.exit(1);
124
+ }
125
+ let apiBaseUrl;
126
+ try {
127
+ apiBaseUrl = normalizeApiBaseUrl(opts.apiBaseUrl);
128
+ parseBrowsers(opts.browser);
129
+ }
130
+ catch (err) {
131
+ console.error(err instanceof Error ? err.message : String(err));
132
+ process.exit(1);
133
+ }
134
+ const outputRoot = resolvePath(outputDir ?? 'extension');
135
+ const repoRoot = resolveRepoRootFromOutput(outputRoot);
136
+ if (repoRoot && path.resolve(outputRoot) === path.resolve(repoRoot) && !opts.force) {
137
+ console.error('Refusing to scaffold into repository root. Pass a subdirectory or use --force.');
138
+ process.exit(1);
139
+ }
140
+ let appName = opts.appName;
141
+ if (!appName) {
142
+ appName = inferAppName(process.cwd());
143
+ if (appName && !opts.json) {
144
+ info(`Inferred --app-name ${appName}`);
145
+ }
146
+ }
147
+ if (!appName) {
148
+ console.error('--app-name is required (could not infer from package.json)');
149
+ process.exit(1);
150
+ }
151
+ const { ui, browserExtension } = await loadScaffoldDeps();
152
+ try {
153
+ browserExtension.assertValidAppName(appName);
154
+ }
155
+ catch (err) {
156
+ console.error(err instanceof Error ? err.message : String(err));
157
+ process.exit(1);
158
+ }
159
+ if (!opts.json) {
160
+ info('Discovering capabilities and flows...');
161
+ }
162
+ const resources = await discoverResources();
163
+ const flows = toFlowTriggers(resources.flows);
164
+ const browsers = parseBrowsers(opts.browser);
165
+ const registryEntries = [
166
+ ...resources.capabilities.map((cap) => {
167
+ const exportName = ui.capabilityClientFnName(cap);
168
+ browserExtension.assertValidClientExportName(exportName, `capability "${cap.name}"`);
169
+ return { messageKey: exportName, exportName };
170
+ }),
171
+ ...flows.map((flow) => {
172
+ const exportName = ui.flowTriggerFnName(flow);
173
+ browserExtension.assertValidClientExportName(exportName, `flow "${flow.name}"`);
174
+ return { messageKey: exportName, exportName };
175
+ }),
176
+ ];
177
+ const sampleSel = browserExtension.selectSampleCapability(resources.capabilities);
178
+ const sampleMessageKey = sampleSel.mode === 'zero-input' && sampleSel.capability
179
+ ? ui.capabilityClientFnName(sampleSel.capability)
180
+ : undefined;
181
+ const clientContent = CLIENT_HEADER +
182
+ ui.generateClientModule(resources.capabilities, flows, { baseUrl: apiBaseUrl });
183
+ const shellFiles = browserExtension.generateBrowserExtensionScaffold({
184
+ config: {
185
+ appName,
186
+ apiBaseUrl,
187
+ browsers,
188
+ auth: true,
189
+ registryEntries,
190
+ sampleMessageKey,
191
+ },
192
+ capabilities: resources.capabilities,
193
+ flows,
194
+ });
195
+ const clientFile = { path: 'src/client/api.ts', content: clientContent };
196
+ const scaffoldResult = writeScaffoldFiles(outputRoot, shellFiles, opts.force);
197
+ const clientWritten = writeGeneratedFiles(outputRoot, [clientFile]);
198
+ const plumbusCache = resolvePath('.plumbus/generated/browser-extension');
199
+ if (path.resolve(plumbusCache) !== path.resolve(outputRoot)) {
200
+ writeGeneratedFiles(plumbusCache, [clientFile]);
201
+ }
202
+ const warnings = [];
203
+ if (scaffoldResult.skipped.length > 0) {
204
+ warnings.push(`${scaffoldResult.skipped.length} scaffold file(s) skipped (already exist)`);
205
+ }
206
+ if (opts.force && scaffoldResult.overwritten.length > 0) {
207
+ warnings.push('Existing scaffold files were overwritten — local edits may be lost');
208
+ }
209
+ const result = {
210
+ outputDir: outputRoot,
211
+ written: [...scaffoldResult.written, ...clientWritten],
212
+ skipped: scaffoldResult.skipped,
213
+ overwritten: scaffoldResult.overwritten,
214
+ generatedClient: 'src/client/api.ts',
215
+ warnings,
216
+ };
217
+ if (opts.json) {
218
+ console.log(JSON.stringify(result, null, 2));
219
+ return;
220
+ }
221
+ for (const file of scaffoldResult.written) {
222
+ success(`Generated ${path.relative(process.cwd(), file)}`);
223
+ }
224
+ for (const file of clientWritten) {
225
+ success(`Generated ${path.relative(process.cwd(), file)}`);
226
+ }
227
+ for (const file of scaffoldResult.skipped) {
228
+ warn(`Skipped (exists): ${path.relative(process.cwd(), file)}`);
229
+ }
230
+ if (opts.force && scaffoldResult.overwritten.length > 0) {
231
+ warn('Used --force: existing scaffold files may have been overwritten.');
232
+ }
233
+ });
234
+ }
235
+ //# sourceMappingURL=browser-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-extension.js","sourceRoot":"","sources":["../../../src/cli/commands/browser-extension.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,yEAAyE;AAGzE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAsB,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAmD5E,SAAS,cAAc,CAAC,KAAuB;IAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC;IAC1B,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,kCAAkC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,qCAAqC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAsB,CAAC;gBAC9E,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAiB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,OAAO,CAAC,GAAG,EAAE,EACb,cAAc,EACd,UAAU,EACV,IAAI,EACJ,MAAM,EACN,UAAU,CACX,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAsB,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,8BAA8B;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,OAAO,CAAC,GAAG,EAAE,EACb,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,MAAM,EACN,UAAU,CACX,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAoC,CAAC;AAC7F,CAAC;AAED,KAAK,UAAU,gBAAgB;IAI7B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACpC,MAAM,gBAAgB,GAAG,MAAM,8BAA8B,EAAE,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC9E,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG;;;CAGrB,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAAC,OAAgB;IAC9D,MAAM,gBAAgB,GAAG,OAAO;SAC7B,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,gEAAgE,CAAC,CAAC;IAEjF,gBAAgB;SACb,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;SAC3E,MAAM,CAAC,sBAAsB,EAAE,kCAAkC,EAAE,EAAE,CAAC;SACtE,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,CAAC;SAC/D,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,IAAqC,EAAE,EAAE;QACrF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnF,OAAO,CAAC,KAAK,CACX,gFAAgF,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE1D,IAAI,CAAC;YACH,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,eAAe,GAAG;YACtB,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,MAAM,UAAU,GAAG,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAClD,gBAAgB,CAAC,2BAA2B,CAAC,UAAU,EAAE,eAAe,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;gBACrF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC,CAAC;YACF,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpB,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC9C,gBAAgB,CAAC,2BAA2B,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC,CAAC;SACH,CAAC;QAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClF,MAAM,gBAAgB,GACpB,SAAS,CAAC,IAAI,KAAK,YAAY,IAAI,SAAS,CAAC,UAAU;YACrD,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,UAAU,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,aAAa,GACjB,aAAa;YACb,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAElF,MAAM,UAAU,GAAG,gBAAgB,CAAC,gCAAgC,CAAC;YACnE,MAAM,EAAE;gBACN,OAAO;gBACP,UAAU;gBACV,QAAQ;gBACR,IAAI,EAAE,IAAI;gBACV,eAAe;gBACf,gBAAgB;aACjB;YACD,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,KAAK;SACN,CAAC,CAAC;QAEH,MAAM,UAAU,GAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAExF,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,aAAa,GAAG,mBAAmB,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,MAAM,YAAY,GAAG,WAAW,CAAC,sCAAsC,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,mBAAmB,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,2CAA2C,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC;YACtD,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,eAAe,EAAE,mBAAmB;YACpC,QAAQ;SACT,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC,qBAAqB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export { registerAgentCommand } from './agent.js';
2
+ export { registerApiCommand } from './api.js';
3
+ export { registerBrowserExtensionCommand } from './browser-extension.js';
2
4
  export { registerCapabilityCommand } from './capability.js';
3
5
  export { registerCertifyCommand } from './certify.js';
4
6
  export { registerCreateCommand } from './create.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -4,6 +4,7 @@
4
4
  //
5
5
  // Available commands:
6
6
  // agent — Generate AI agent briefs for resources
7
+ // api — External API contract validate, generate, diff
7
8
  // capability — Scaffold a new capability
8
9
  // certify — Run compliance profile assessment
9
10
  // create — Scaffold a new Plumbus application
@@ -27,6 +28,8 @@
27
28
  // upgrade — Migrate legacy artifacts after framework upgrades
28
29
  // verify — Run governance rules
29
30
  export { registerAgentCommand } from './agent.js';
31
+ export { registerApiCommand } from './api.js';
32
+ export { registerBrowserExtensionCommand } from './browser-extension.js';
30
33
  export { registerCapabilityCommand } from './capability.js';
31
34
  export { registerCertifyCommand } from './certify.js';
32
35
  export { registerCreateCommand } from './create.js';