@skillsmith/cli 0.5.12 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +92 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/commands/audit-collisions.d.ts +71 -0
  5. package/dist/src/commands/audit-collisions.d.ts.map +1 -0
  6. package/dist/src/commands/audit-collisions.js +300 -0
  7. package/dist/src/commands/audit-collisions.js.map +1 -0
  8. package/dist/src/commands/audit.d.ts +27 -2
  9. package/dist/src/commands/audit.d.ts.map +1 -1
  10. package/dist/src/commands/audit.js +70 -10
  11. package/dist/src/commands/audit.js.map +1 -1
  12. package/dist/src/commands/audit.test.js +2 -2
  13. package/dist/src/commands/audit.test.js.map +1 -1
  14. package/dist/src/commands/config.d.ts +55 -0
  15. package/dist/src/commands/config.d.ts.map +1 -0
  16. package/dist/src/commands/config.js +211 -0
  17. package/dist/src/commands/config.js.map +1 -0
  18. package/dist/src/commands/create.d.ts +3 -3
  19. package/dist/src/commands/create.d.ts.map +1 -1
  20. package/dist/src/commands/create.js +11 -9
  21. package/dist/src/commands/create.js.map +1 -1
  22. package/dist/src/commands/diff.js +2 -2
  23. package/dist/src/commands/diff.js.map +1 -1
  24. package/dist/src/commands/import-local.d.ts +21 -0
  25. package/dist/src/commands/import-local.d.ts.map +1 -0
  26. package/dist/src/commands/import-local.helpers.d.ts +28 -0
  27. package/dist/src/commands/import-local.helpers.d.ts.map +1 -0
  28. package/dist/src/commands/import-local.helpers.js +166 -0
  29. package/dist/src/commands/import-local.helpers.js.map +1 -0
  30. package/dist/src/commands/import-local.js +265 -0
  31. package/dist/src/commands/import-local.js.map +1 -0
  32. package/dist/src/commands/import-local.types.d.ts +59 -0
  33. package/dist/src/commands/import-local.types.d.ts.map +1 -0
  34. package/dist/src/commands/import-local.types.js +2 -0
  35. package/dist/src/commands/import-local.types.js.map +1 -0
  36. package/dist/src/{import.d.ts → commands/import.d.ts} +11 -0
  37. package/dist/src/commands/import.d.ts.map +1 -0
  38. package/dist/src/{import.js → commands/import.js} +36 -2
  39. package/dist/src/commands/import.js.map +1 -0
  40. package/dist/src/commands/index.d.ts +3 -0
  41. package/dist/src/commands/index.d.ts.map +1 -1
  42. package/dist/src/commands/index.js +6 -0
  43. package/dist/src/commands/index.js.map +1 -1
  44. package/dist/src/commands/install-skill.d.ts.map +1 -1
  45. package/dist/src/commands/install-skill.js +6 -3
  46. package/dist/src/commands/install-skill.js.map +1 -1
  47. package/dist/src/commands/install.d.ts.map +1 -1
  48. package/dist/src/commands/install.js +71 -2
  49. package/dist/src/commands/install.js.map +1 -1
  50. package/dist/src/commands/manage.d.ts.map +1 -1
  51. package/dist/src/commands/manage.js +13 -0
  52. package/dist/src/commands/manage.js.map +1 -1
  53. package/dist/src/commands/recommend.helpers.d.ts +5 -1
  54. package/dist/src/commands/recommend.helpers.d.ts.map +1 -1
  55. package/dist/src/commands/recommend.helpers.js +9 -3
  56. package/dist/src/commands/recommend.helpers.js.map +1 -1
  57. package/dist/src/config.d.ts +6 -1
  58. package/dist/src/config.d.ts.map +1 -1
  59. package/dist/src/config.js +8 -2
  60. package/dist/src/config.js.map +1 -1
  61. package/dist/src/index.d.ts +1 -1
  62. package/dist/src/index.js +10 -28
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/templates/mcp-server.template.d.ts +1 -1
  65. package/dist/src/templates/mcp-server.template.d.ts.map +1 -1
  66. package/dist/src/templates/mcp-server.template.js +13 -13
  67. package/dist/src/templates/mcp-server.template.js.map +1 -1
  68. package/dist/src/templates/mcp-server.template.snippets.d.ts +51 -0
  69. package/dist/src/templates/mcp-server.template.snippets.d.ts.map +1 -0
  70. package/dist/src/templates/mcp-server.template.snippets.js +162 -0
  71. package/dist/src/templates/mcp-server.template.snippets.js.map +1 -0
  72. package/dist/src/templates/readme.md.template.d.ts +1 -1
  73. package/dist/src/templates/readme.md.template.d.ts.map +1 -1
  74. package/dist/src/templates/readme.md.template.js +2 -2
  75. package/dist/src/utils/skills-directory.d.ts +26 -7
  76. package/dist/src/utils/skills-directory.d.ts.map +1 -1
  77. package/dist/src/utils/skills-directory.js +75 -30
  78. package/dist/src/utils/skills-directory.js.map +1 -1
  79. package/dist/tests/audit-collisions.test.d.ts +42 -0
  80. package/dist/tests/audit-collisions.test.d.ts.map +1 -0
  81. package/dist/tests/audit-collisions.test.js +370 -0
  82. package/dist/tests/audit-collisions.test.js.map +1 -0
  83. package/dist/tests/audit-restructure.test.d.ts +15 -0
  84. package/dist/tests/audit-restructure.test.d.ts.map +1 -0
  85. package/dist/tests/audit-restructure.test.js +151 -0
  86. package/dist/tests/audit-restructure.test.js.map +1 -0
  87. package/dist/tests/config.test.d.ts +33 -0
  88. package/dist/tests/config.test.d.ts.map +1 -0
  89. package/dist/tests/config.test.js +240 -0
  90. package/dist/tests/config.test.js.map +1 -0
  91. package/dist/tests/install-multi-client.test.d.ts +2 -0
  92. package/dist/tests/install-multi-client.test.d.ts.map +1 -0
  93. package/dist/tests/install-multi-client.test.js +202 -0
  94. package/dist/tests/install-multi-client.test.js.map +1 -0
  95. package/dist/tests/integration/import-local.test.d.ts +2 -0
  96. package/dist/tests/integration/import-local.test.d.ts.map +1 -0
  97. package/dist/tests/integration/import-local.test.js +158 -0
  98. package/dist/tests/integration/import-local.test.js.map +1 -0
  99. package/dist/tests/mcp-server-template.test.js +21 -0
  100. package/dist/tests/mcp-server-template.test.js.map +1 -1
  101. package/dist/tests/skills-directory.test.d.ts +2 -0
  102. package/dist/tests/skills-directory.test.d.ts.map +1 -0
  103. package/dist/tests/skills-directory.test.js +97 -0
  104. package/dist/tests/skills-directory.test.js.map +1 -0
  105. package/dist/tests/unit/import-local.helpers.test.d.ts +2 -0
  106. package/dist/tests/unit/import-local.helpers.test.d.ts.map +1 -0
  107. package/dist/tests/unit/import-local.helpers.test.js +96 -0
  108. package/dist/tests/unit/import-local.helpers.test.js.map +1 -0
  109. package/package.json +9 -3
  110. package/dist/src/import.d.ts.map +0 -1
  111. package/dist/src/import.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @fileoverview `sklx audit collisions` — interactive consumer-namespace audit.
3
+ * @module @skillsmith/cli/commands/audit-collisions
4
+ * @see SMI-4590 Wave 4 PR 5/6 §4 + §9
5
+ *
6
+ * Sibling of `sklx audit advisories` (Step 0a). Wraps the shared
7
+ * `runInventoryAudit` helper from `@skillsmith/mcp-server/audit` (PR 4) so
8
+ * composition logic lives in one place.
9
+ *
10
+ * Flags:
11
+ * --deep Opt into the semantic-overlap detector pass.
12
+ * --json Emit `RunInventoryAuditResult` as JSON to stdout.
13
+ * Bypasses prompts; no file mutation.
14
+ * --apply-all Accept every suggestion. Typed-confirmation gate:
15
+ * user must type the literal phrase `APPLY ALL`.
16
+ * --report-only Write the audit report; no prompts, no apply.
17
+ * --reset-ledger Clear `~/.skillsmith/namespace-overrides.json`. Backs
18
+ * up to `~/.skillsmith/backups/ledger-<ts>.json` first.
19
+ * Typed-confirmation gate: literal phrase `RESET LEDGER`.
20
+ *
21
+ * Typed-confirmation gates are load-bearing UX (plan §235-239). Prompts use
22
+ * `@inquirer/prompts` `input` with strict literal-phrase verification —
23
+ * ANY input other than the exact phrase rejects with a non-zero exit.
24
+ * No fuzzy match, no normalization, no validate-and-retry loop.
25
+ *
26
+ * Default-entry tiebreak: `runInventoryAudit` already picks the most-recently-
27
+ * installed entry (mtime descending) per `buildRenameSuggestions`. The CLI
28
+ * surfaces that target in the prompt copy and lets the user `s`kip to flip
29
+ * to the other entry.
30
+ */
31
+ import { Command } from 'commander';
32
+ import { type RenameSuggestion, type RunInventoryAuditResult } from '@skillsmith/mcp-server/audit';
33
+ declare const APPLY_ALL_PHRASE = "APPLY ALL";
34
+ declare const RESET_LEDGER_PHRASE = "RESET LEDGER";
35
+ declare const CONFIRMATION_REJECTED_MESSAGE = "Confirmation phrase mismatch \u2014 operation aborted. The phrase must match exactly (case-sensitive, including spaces).";
36
+ interface AuditCollisionsOptions {
37
+ deep: boolean;
38
+ json: boolean;
39
+ applyAll: boolean;
40
+ reportOnly: boolean;
41
+ resetLedger: boolean;
42
+ }
43
+ /**
44
+ * Read a single line from stdin and require an exact literal match for
45
+ * `expected`. Used for the load-bearing `APPLY ALL` and `RESET LEDGER`
46
+ * gates per plan §235-239.
47
+ *
48
+ * Strict equality only — no fuzzy match, no normalization. Lowercase,
49
+ * abbreviated, or whitespace-stripped input REJECTS with exit non-zero.
50
+ * Tested on both interactive (TTY) and piped-stdin paths.
51
+ */
52
+ declare function requireConfirmationPhrase(expected: string, prompt: string): Promise<void>;
53
+ declare function runResetLedger(): Promise<void>;
54
+ interface ApplyOutcome {
55
+ collisionId: string;
56
+ status: 'applied' | 'skipped' | 'failed';
57
+ message: string;
58
+ }
59
+ declare function applyOneSuggestion(suggestion: RenameSuggestion, auditId: string, customName?: string): Promise<ApplyOutcome>;
60
+ declare function runApplyAll(audit: RunInventoryAuditResult): Promise<void>;
61
+ declare function runInteractiveLoop(audit: RunInventoryAuditResult): Promise<void>;
62
+ declare function runAuditCollisions(options: AuditCollisionsOptions): Promise<void>;
63
+ /**
64
+ * Build the `audit collisions` subcommand. Registered as a sibling of
65
+ * `audit advisories` in `audit.ts` (Step 0a).
66
+ */
67
+ export declare function createAuditCollisionsSubcommand(): Command;
68
+ export { runAuditCollisions, runResetLedger, runApplyAll, runInteractiveLoop, requireConfirmationPhrase, applyOneSuggestion, APPLY_ALL_PHRASE, RESET_LEDGER_PHRASE, CONFIRMATION_REJECTED_MESSAGE, };
69
+ export type { AuditCollisionsOptions, ApplyOutcome };
70
+ export default createAuditCollisionsSubcommand;
71
+ //# sourceMappingURL=audit-collisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-collisions.d.ts","sourceRoot":"","sources":["../../../src/commands/audit-collisions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAA;AASrC,QAAA,MAAM,gBAAgB,cAAc,CAAA;AACpC,QAAA,MAAM,mBAAmB,iBAAiB,CAAA;AAE1C,QAAA,MAAM,6BAA6B,6HACoF,CAAA;AAMvH,UAAU,sBAAsB;IAC9B,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;CACrB;AAMD;;;;;;;;GAQG;AACH,iBAAe,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxF;AA+BD,iBAAe,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7C;AAMD,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,iBAAe,kBAAkB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAyBvB;AAED,iBAAe,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAMD,iBAAe,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE/E;AA+BD,iBAAe,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChF;AAMD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAwCzD;AAGD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,GAC9B,CAAA;AACD,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAA;AAEpD,eAAe,+BAA+B,CAAA"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * @fileoverview `sklx audit collisions` — interactive consumer-namespace audit.
3
+ * @module @skillsmith/cli/commands/audit-collisions
4
+ * @see SMI-4590 Wave 4 PR 5/6 §4 + §9
5
+ *
6
+ * Sibling of `sklx audit advisories` (Step 0a). Wraps the shared
7
+ * `runInventoryAudit` helper from `@skillsmith/mcp-server/audit` (PR 4) so
8
+ * composition logic lives in one place.
9
+ *
10
+ * Flags:
11
+ * --deep Opt into the semantic-overlap detector pass.
12
+ * --json Emit `RunInventoryAuditResult` as JSON to stdout.
13
+ * Bypasses prompts; no file mutation.
14
+ * --apply-all Accept every suggestion. Typed-confirmation gate:
15
+ * user must type the literal phrase `APPLY ALL`.
16
+ * --report-only Write the audit report; no prompts, no apply.
17
+ * --reset-ledger Clear `~/.skillsmith/namespace-overrides.json`. Backs
18
+ * up to `~/.skillsmith/backups/ledger-<ts>.json` first.
19
+ * Typed-confirmation gate: literal phrase `RESET LEDGER`.
20
+ *
21
+ * Typed-confirmation gates are load-bearing UX (plan §235-239). Prompts use
22
+ * `@inquirer/prompts` `input` with strict literal-phrase verification —
23
+ * ANY input other than the exact phrase rejects with a non-zero exit.
24
+ * No fuzzy match, no normalization, no validate-and-retry loop.
25
+ *
26
+ * Default-entry tiebreak: `runInventoryAudit` already picks the most-recently-
27
+ * installed entry (mtime descending) per `buildRenameSuggestions`. The CLI
28
+ * surfaces that target in the prompt copy and lets the user `s`kip to flip
29
+ * to the other entry.
30
+ */
31
+ import * as crypto from 'node:crypto';
32
+ import * as fs from 'node:fs';
33
+ import { homedir } from 'node:os';
34
+ import { join } from 'node:path';
35
+ import { Command } from 'commander';
36
+ import chalk from 'chalk';
37
+ import { input, select } from '@inquirer/prompts';
38
+ import { applyRename, readLedger, runInventoryAudit, writeLedger, NAMESPACE_OVERRIDES_CURRENT_VERSION, } from '@skillsmith/mcp-server/audit';
39
+ import { sanitizeError } from '../utils/sanitize.js';
40
+ import { getLicenseStatus } from '../utils/license.js';
41
+ // ---------------------------------------------------------------------------
42
+ // Constants
43
+ // ---------------------------------------------------------------------------
44
+ const APPLY_ALL_PHRASE = 'APPLY ALL';
45
+ const RESET_LEDGER_PHRASE = 'RESET LEDGER';
46
+ const CONFIRMATION_REJECTED_MESSAGE = 'Confirmation phrase mismatch — operation aborted. The phrase must match exactly (case-sensitive, including spaces).';
47
+ // ---------------------------------------------------------------------------
48
+ // Typed-confirmation gate
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Read a single line from stdin and require an exact literal match for
52
+ * `expected`. Used for the load-bearing `APPLY ALL` and `RESET LEDGER`
53
+ * gates per plan §235-239.
54
+ *
55
+ * Strict equality only — no fuzzy match, no normalization. Lowercase,
56
+ * abbreviated, or whitespace-stripped input REJECTS with exit non-zero.
57
+ * Tested on both interactive (TTY) and piped-stdin paths.
58
+ */
59
+ async function requireConfirmationPhrase(expected, prompt) {
60
+ const answer = await input({ message: prompt });
61
+ // Strict equality: NO trimming, NO case folding, NO normalization.
62
+ // Two reasons:
63
+ // 1. Plan §237 mandates it ("any other input — including `Y`, `yes`,
64
+ // `apply all` (lowercase), `APPLYALL` (no space) — rejects").
65
+ // 2. `@inquirer/prompts` `input` does NOT trim by default — verified.
66
+ if (answer !== expected) {
67
+ throw new Error(CONFIRMATION_REJECTED_MESSAGE);
68
+ }
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Ledger reset helpers
72
+ // ---------------------------------------------------------------------------
73
+ function ledgerPath() {
74
+ return join(homedir(), '.skillsmith', 'namespace-overrides.json');
75
+ }
76
+ function backupsDir() {
77
+ return join(homedir(), '.skillsmith', 'backups');
78
+ }
79
+ /**
80
+ * Backup the ledger file to `~/.skillsmith/backups/ledger-<ts>-<rand>.json`
81
+ * before the reset clears it. The random suffix prevents two concurrent
82
+ * resets from clobbering each other's backup file.
83
+ */
84
+ function backupLedgerForReset() {
85
+ const src = ledgerPath();
86
+ if (!fs.existsSync(src))
87
+ return null;
88
+ const dir = backupsDir();
89
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
90
+ const ts = new Date().toISOString().replace(/[:.]/g, '-');
91
+ const suffix = crypto.randomBytes(4).toString('hex');
92
+ const backupFile = join(dir, `ledger-${ts}-${suffix}.json`);
93
+ fs.copyFileSync(src, backupFile);
94
+ return backupFile;
95
+ }
96
+ async function runResetLedger() {
97
+ await requireConfirmationPhrase(RESET_LEDGER_PHRASE, `Type ${chalk.bold(RESET_LEDGER_PHRASE)} to confirm clearing the namespace-overrides ledger`);
98
+ const backupFile = backupLedgerForReset();
99
+ await writeLedger({ version: NAMESPACE_OVERRIDES_CURRENT_VERSION, overrides: [] });
100
+ if (backupFile) {
101
+ console.log(`${chalk.green('OK')} Ledger cleared. Backup: ${backupFile}`);
102
+ }
103
+ else {
104
+ console.log(`${chalk.green('OK')} Ledger cleared (no prior ledger to back up).`);
105
+ }
106
+ }
107
+ async function applyOneSuggestion(suggestion, auditId, customName) {
108
+ try {
109
+ const result = await applyRename({
110
+ suggestion,
111
+ request: customName ? { action: 'apply', auditId, customName } : { action: 'apply', auditId },
112
+ });
113
+ if (result.success) {
114
+ return {
115
+ collisionId: suggestion.collisionId,
116
+ status: 'applied',
117
+ message: result.summary,
118
+ };
119
+ }
120
+ return {
121
+ collisionId: suggestion.collisionId,
122
+ status: 'failed',
123
+ message: result.error?.message ?? 'rename failed',
124
+ };
125
+ }
126
+ catch (error) {
127
+ return {
128
+ collisionId: suggestion.collisionId,
129
+ status: 'failed',
130
+ message: sanitizeError(error),
131
+ };
132
+ }
133
+ }
134
+ async function runApplyAll(audit) {
135
+ await requireConfirmationPhrase(APPLY_ALL_PHRASE, `Type ${chalk.bold(APPLY_ALL_PHRASE)} to confirm applying every suggestion (${audit.renameSuggestions.length})`);
136
+ const outcomes = [];
137
+ for (const suggestion of audit.renameSuggestions) {
138
+ outcomes.push(await applyOneSuggestion(suggestion, audit.auditId));
139
+ }
140
+ printApplySummary(outcomes);
141
+ }
142
+ // ---------------------------------------------------------------------------
143
+ // Interactive prompt loop
144
+ // ---------------------------------------------------------------------------
145
+ async function runInteractiveLoop(audit) {
146
+ if (audit.renameSuggestions.length === 0) {
147
+ console.log(chalk.dim('No collisions found.'));
148
+ return;
149
+ }
150
+ console.log(chalk.bold.blue(`\n=== Skillsmith — Namespace audit ===`));
151
+ console.log(chalk.dim(`Audit ID: ${audit.auditId}`));
152
+ console.log(chalk.dim(`Report: ${audit.reportPath}`));
153
+ console.log(`Found ${audit.renameSuggestions.length} collision(s).\n`);
154
+ const outcomes = [];
155
+ let index = 1;
156
+ const total = audit.renameSuggestions.length;
157
+ for (const suggestion of audit.renameSuggestions) {
158
+ console.log(chalk.bold(`[${index}/${total}] ${suggestion.reason}`));
159
+ console.log(` Current: ${suggestion.currentName}`);
160
+ console.log(` Suggested: ${chalk.cyan(suggestion.suggested)}`);
161
+ console.log(chalk.dim(` (default target = most-recently-installed entry, mtime desc)`));
162
+ // Default = `skip` (defensive). Plan §235-239 mandates a typed-
163
+ // confirmation gate for batch apply (`APPLY ALL`); per-item interactive
164
+ // apply MUST mirror that posture so an inattentive Enter-press cannot
165
+ // mutate user state. The user explicitly arrows down + Enter to apply.
166
+ const choice = (await select({
167
+ message: 'Action?',
168
+ choices: [
169
+ { name: 'Skip — leave this collision unchanged (default, safe)', value: 'skip' },
170
+ { name: 'Apply — accept the suggested rename', value: 'apply' },
171
+ { name: 'Edit — provide a custom name', value: 'edit' },
172
+ { name: 'Quit — abort the loop', value: 'quit' },
173
+ ],
174
+ default: 'skip',
175
+ }));
176
+ if (choice === 'quit') {
177
+ console.log(chalk.yellow('Aborted by user.'));
178
+ break;
179
+ }
180
+ if (choice === 'skip') {
181
+ outcomes.push({
182
+ collisionId: suggestion.collisionId,
183
+ status: 'skipped',
184
+ message: 'skipped by user',
185
+ });
186
+ index += 1;
187
+ continue;
188
+ }
189
+ if (choice === 'edit') {
190
+ const customName = await input({
191
+ message: 'Enter custom name:',
192
+ validate: (v) => v.trim().length > 0 || 'Name cannot be empty',
193
+ });
194
+ outcomes.push(await applyOneSuggestion(suggestion, audit.auditId, customName.trim()));
195
+ index += 1;
196
+ continue;
197
+ }
198
+ // choice === 'apply'
199
+ outcomes.push(await applyOneSuggestion(suggestion, audit.auditId));
200
+ index += 1;
201
+ }
202
+ printApplySummary(outcomes);
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // Output
206
+ // ---------------------------------------------------------------------------
207
+ function printApplySummary(outcomes) {
208
+ const applied = outcomes.filter((o) => o.status === 'applied').length;
209
+ const skipped = outcomes.filter((o) => o.status === 'skipped').length;
210
+ const failed = outcomes.filter((o) => o.status === 'failed').length;
211
+ console.log(chalk.bold('\nSummary:'));
212
+ console.log(` ${chalk.green('Applied')}: ${applied}`);
213
+ console.log(` ${chalk.yellow('Skipped')}: ${skipped}`);
214
+ console.log(` ${chalk.red('Failed')}: ${failed}`);
215
+ for (const outcome of outcomes) {
216
+ const tag = outcome.status === 'applied'
217
+ ? chalk.green('OK')
218
+ : outcome.status === 'skipped'
219
+ ? chalk.yellow('SKIP')
220
+ : chalk.red('FAIL');
221
+ console.log(` ${tag} ${outcome.collisionId} — ${outcome.message}`);
222
+ }
223
+ }
224
+ // ---------------------------------------------------------------------------
225
+ // Main entry
226
+ // ---------------------------------------------------------------------------
227
+ async function runAuditCollisions(options) {
228
+ // --reset-ledger short-circuits before any audit run.
229
+ if (options.resetLedger) {
230
+ // Touch readLedger to surface higher-version errors before clearing.
231
+ // (readLedger throws on namespace.ledger.version_unsupported.)
232
+ await readLedger();
233
+ await runResetLedger();
234
+ return;
235
+ }
236
+ // Resolve tier from license status — the detector gates the semantic
237
+ // pass on `audit_mode`, which is tier-defaulted via runInventoryAudit's
238
+ // resolver. We pass the resolved tier through so a Team user gets
239
+ // `power_user` (semantic) by default.
240
+ const status = await getLicenseStatus();
241
+ const tier = status.tier ?? 'community';
242
+ const audit = await runInventoryAudit({ deep: options.deep, tier });
243
+ if (options.json) {
244
+ console.log(JSON.stringify(audit, null, 2));
245
+ return;
246
+ }
247
+ if (options.reportOnly) {
248
+ console.log(`${chalk.green('OK')} Audit report written to ${audit.reportPath}`);
249
+ return;
250
+ }
251
+ if (options.applyAll) {
252
+ await runApplyAll(audit);
253
+ return;
254
+ }
255
+ await runInteractiveLoop(audit);
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // Command factory
259
+ // ---------------------------------------------------------------------------
260
+ /**
261
+ * Build the `audit collisions` subcommand. Registered as a sibling of
262
+ * `audit advisories` in `audit.ts` (Step 0a).
263
+ */
264
+ export function createAuditCollisionsSubcommand() {
265
+ return new Command('collisions')
266
+ .description('Detect and resolve consumer-namespace collisions in ~/.claude/ ' +
267
+ '(Default: most-recently-installed entry, mtime descending)')
268
+ .option('--deep', 'Opt into the semantic-overlap detector pass', false)
269
+ .option('--json', 'Emit JSON to stdout; no prompts; no file mutation', false)
270
+ .option('--apply-all', 'Accept every suggestion (typed-confirmation gate: literal phrase `APPLY ALL`)', false)
271
+ .option('--report-only', 'Write the audit report; no prompts; no apply', false)
272
+ .option('--reset-ledger', 'Clear ~/.skillsmith/namespace-overrides.json (typed-confirmation gate: literal phrase `RESET LEDGER`)', false)
273
+ .action(async (opts) => {
274
+ try {
275
+ await runAuditCollisions({
276
+ deep: opts['deep'] === true,
277
+ json: opts['json'] === true,
278
+ applyAll: opts['applyAll'] === true,
279
+ reportOnly: opts['reportOnly'] === true,
280
+ resetLedger: opts['resetLedger'] === true,
281
+ });
282
+ }
283
+ catch (error) {
284
+ const message = error instanceof Error ? error.message : sanitizeError(error);
285
+ // Confirmation rejection is not a stack-trace-worthy failure —
286
+ // print the canonical message and exit non-zero.
287
+ if (message === CONFIRMATION_REJECTED_MESSAGE) {
288
+ console.error(chalk.yellow(message));
289
+ }
290
+ else {
291
+ console.error(chalk.red('Error:'), message);
292
+ }
293
+ process.exit(1);
294
+ }
295
+ });
296
+ }
297
+ // Internal exports for tests.
298
+ export { runAuditCollisions, runResetLedger, runApplyAll, runInteractiveLoop, requireConfirmationPhrase, applyOneSuggestion, APPLY_ALL_PHRASE, RESET_LEDGER_PHRASE, CONFIRMATION_REJECTED_MESSAGE, };
299
+ export default createAuditCollisionsSubcommand;
300
+ //# sourceMappingURL=audit-collisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-collisions.js","sourceRoot":"","sources":["../../../src/commands/audit-collisions.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @fileoverview skillsmith audit command — CLI security advisory checker
3
3
  * @module @skillsmith/cli/commands/audit
4
- * @see SMI-skill-version-tracking Wave 3
4
+ * @see SMI-skill-version-tracking Wave 3 (advisories subcommand)
5
+ * @see SMI-4590 Wave 4 Step 0a — restructured into parent `audit` command
5
6
  *
6
7
  * Lists active security advisories for installed skills in npm-audit style
7
8
  * output. Advisories are published by the Skillsmith team as security
@@ -9,10 +10,34 @@
9
10
  *
10
11
  * Tier gate: Team (via requireTier).
11
12
  * Use --fix to attempt `skillsmith update <skill>` for each advisory with a patch.
13
+ *
14
+ * Surface (post-SMI-4590 Step 0a):
15
+ * - `sklx audit advisories <skill-id>` (canonical)
16
+ * - `sklx audit <skill-id>` (deprecation alias — emits warning, forwards to advisories)
17
+ * - `sklx audit collisions` is the namespace-collision audit (SMI-4590 PR 5/6).
12
18
  */
13
19
  import { Command } from 'commander';
14
20
  /**
15
- * Create the audit command
21
+ * Build the `advisories` subcommand. Same body as the pre-SMI-4590 flat
22
+ * `audit` command — only the surface (parent + name) changed.
23
+ *
24
+ * @internal exported for tests; consumers should use {@link createAuditCommand}.
25
+ */
26
+ export declare function createAuditAdvisoriesSubcommand(): Command;
27
+ /**
28
+ * Deprecation warning for top-level `sklx audit <skill-id>` flat invocation.
29
+ * Removal target: next minor release.
30
+ *
31
+ * @internal exported for tests.
32
+ */
33
+ export declare const AUDIT_FLAT_DEPRECATION_NOTICE = "[DEPRECATED] sklx audit <skill-id> is deprecated; use 'sklx audit advisories <skill-id>' instead. This alias will be removed in the next minor version.";
34
+ /**
35
+ * Build the parent `audit` command. Subcommands:
36
+ * - `advisories` — security advisory checker (canonical, Team tier).
37
+ * - `<skill-id>` (positional fallback) — deprecation alias forwarding to
38
+ * `advisories`. Emits a stderr warning. Removed in next minor release.
39
+ *
40
+ * `sklx audit collisions` is added by SMI-4590 PR 5/6.
16
41
  */
17
42
  export declare function createAuditCommand(): Command;
18
43
  export default createAuditCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwInC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAgB5C;AAED,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8InC;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAgBzD;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,4JACiH,CAAA;AAE3J;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA2C5C;AAED,eAAe,kBAAkB,CAAA"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @fileoverview skillsmith audit command — CLI security advisory checker
3
3
  * @module @skillsmith/cli/commands/audit
4
- * @see SMI-skill-version-tracking Wave 3
4
+ * @see SMI-skill-version-tracking Wave 3 (advisories subcommand)
5
+ * @see SMI-4590 Wave 4 Step 0a — restructured into parent `audit` command
5
6
  *
6
7
  * Lists active security advisories for installed skills in npm-audit style
7
8
  * output. Advisories are published by the Skillsmith team as security
@@ -9,6 +10,11 @@
9
10
  *
10
11
  * Tier gate: Team (via requireTier).
11
12
  * Use --fix to attempt `skillsmith update <skill>` for each advisory with a patch.
13
+ *
14
+ * Surface (post-SMI-4590 Step 0a):
15
+ * - `sklx audit advisories <skill-id>` (canonical)
16
+ * - `sklx audit <skill-id>` (deprecation alias — emits warning, forwards to advisories)
17
+ * - `sklx audit collisions` is the namespace-collision audit (SMI-4590 PR 5/6).
12
18
  */
13
19
  import { Command } from 'commander';
14
20
  import chalk from 'chalk';
@@ -16,6 +22,7 @@ import { createDatabaseAsync, initializeSchema, AdvisoryRepository, } from '@ski
16
22
  import { DEFAULT_DB_PATH } from '../config.js';
17
23
  import { sanitizeError } from '../utils/sanitize.js';
18
24
  import { requireTier } from '../utils/require-tier.js';
25
+ import { createAuditCollisionsSubcommand } from './audit-collisions.js';
19
26
  // ============================================================================
20
27
  // Severity display helpers
21
28
  // ============================================================================
@@ -68,10 +75,7 @@ function printSummary(counts) {
68
75
  console.log(` ${chalk.cyan('[-] low ')} ${counts['low']}`);
69
76
  console.log(` ${' total '.padEnd(14)} ${total}`);
70
77
  }
71
- // ============================================================================
72
- // Command action
73
- // ============================================================================
74
- async function runAudit(options) {
78
+ async function runAdvisoriesAudit(options) {
75
79
  // Team tier required for security advisories
76
80
  await requireTier('team');
77
81
  const db = await createDatabaseAsync(options.db);
@@ -115,19 +119,74 @@ async function runAudit(options) {
115
119
  }
116
120
  }
117
121
  // ============================================================================
118
- // Command factory
122
+ // Command factories
119
123
  // ============================================================================
120
124
  /**
121
- * Create the audit command
125
+ * Build the `advisories` subcommand. Same body as the pre-SMI-4590 flat
126
+ * `audit` command — only the surface (parent + name) changed.
127
+ *
128
+ * @internal exported for tests; consumers should use {@link createAuditCommand}.
122
129
  */
123
- export function createAuditCommand() {
124
- return new Command('audit')
130
+ export function createAuditAdvisoriesSubcommand() {
131
+ return new Command('advisories')
125
132
  .description('Check installed skills for known security advisories (Team tier required)')
126
133
  .option('-d, --db <path>', 'Database file path', DEFAULT_DB_PATH)
127
134
  .option('--fix', 'Attempt to update skills with available patches')
128
135
  .action(async (opts) => {
129
136
  try {
130
- await runAudit({
137
+ await runAdvisoriesAudit({
138
+ db: opts['db'],
139
+ fix: opts['fix'] ?? false,
140
+ });
141
+ }
142
+ catch (error) {
143
+ console.error(chalk.red('Error:'), sanitizeError(error));
144
+ process.exit(1);
145
+ }
146
+ });
147
+ }
148
+ /**
149
+ * Deprecation warning for top-level `sklx audit <skill-id>` flat invocation.
150
+ * Removal target: next minor release.
151
+ *
152
+ * @internal exported for tests.
153
+ */
154
+ export const AUDIT_FLAT_DEPRECATION_NOTICE = "[DEPRECATED] sklx audit <skill-id> is deprecated; use 'sklx audit advisories <skill-id>' instead. This alias will be removed in the next minor version.";
155
+ /**
156
+ * Build the parent `audit` command. Subcommands:
157
+ * - `advisories` — security advisory checker (canonical, Team tier).
158
+ * - `<skill-id>` (positional fallback) — deprecation alias forwarding to
159
+ * `advisories`. Emits a stderr warning. Removed in next minor release.
160
+ *
161
+ * `sklx audit collisions` is added by SMI-4590 PR 5/6.
162
+ */
163
+ export function createAuditCommand() {
164
+ const audit = new Command('audit').description('Audit installed skills (advisories, namespace collisions)');
165
+ audit.addCommand(createAuditAdvisoriesSubcommand());
166
+ // SMI-4590 PR 5/6 — register `collisions` sibling subcommand.
167
+ audit.addCommand(createAuditCollisionsSubcommand());
168
+ // Deprecation alias: `sklx audit <skill-id>` → forward to `advisories`.
169
+ // Implemented as a default-action on the parent: when Commander is invoked
170
+ // with positional args that don't match a registered subcommand, emit the
171
+ // deprecation notice and route to the advisories action.
172
+ //
173
+ // We use `.argument('[skillId]')` + `.action()` to capture the positional
174
+ // fallback. Commander resolves registered subcommands first, so this fires
175
+ // only for unknown subcommand strings (treated as <skill-id>).
176
+ audit
177
+ .argument('[skillId]', 'Legacy positional skill-id (deprecated; use `advisories <skill-id>`)')
178
+ .option('-d, --db <path>', 'Database file path (deprecated alias)', DEFAULT_DB_PATH)
179
+ .option('--fix', 'Attempt to update skills with available patches (deprecated alias)')
180
+ .action(async (skillId, opts) => {
181
+ if (skillId === undefined) {
182
+ // No subcommand and no positional — print parent help.
183
+ audit.help();
184
+ return;
185
+ }
186
+ // Emit deprecation warning to stderr; do not pollute stdout.
187
+ console.error(chalk.yellow(AUDIT_FLAT_DEPRECATION_NOTICE));
188
+ try {
189
+ await runAdvisoriesAudit({
131
190
  db: opts['db'],
132
191
  fix: opts['fix'] ?? false,
133
192
  });
@@ -137,6 +196,7 @@ export function createAuditCommand() {
137
196
  process.exit(1);
138
197
  }
139
198
  });
199
+ return audit;
140
200
  }
141
201
  export default createAuditCommand;
142
202
  //# sourceMappingURL=audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/commands/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -30,9 +30,9 @@ function makeAdvisory(overrides = {}) {
30
30
  describe('audit command — AdvisoryRepository integration', () => {
31
31
  let db;
32
32
  let repo;
33
- beforeEach(() => {
33
+ beforeEach(async () => {
34
34
  process.env['SKILLSMITH_SKIP_LICENSE_CHECK'] = 'true';
35
- db = createTestDatabase();
35
+ db = await createTestDatabase();
36
36
  repo = new AdvisoryRepository(db);
37
37
  });
38
38
  afterEach(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"audit.test.js","sourceRoot":"","sources":["../../../src/commands/audit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.test.js","sourceRoot":"","sources":["../../../src/commands/audit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAI5E,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,YAAY,CAAC,YAAoC,EAAE;IAC1D,OAAO;QACL,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,sBAAsB;QACnC,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,sEAAsE;AACtE,wEAAwE;AACxE,sEAAsE;AACtE,oEAAoE;AACpE,+EAA+E;AAE/E,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,IAAI,EAAgB,CAAA;IACpB,IAAI,IAAwB,CAAA;IAE5B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAA;QACrD,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAA;QAC/B,IAAI,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QACnD,aAAa,CAAC,EAAE,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAC/F,CAAA;QACD,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CACzF,CAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAElC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAA;QACnF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAA;QAC3E,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC;YACX,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,mCAAmC;YAC1C,QAAQ,EAAE,UAAU;SACrB,CAAC,CACH,CAAA;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QACtE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;QACzF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAA;QAE3F,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAE,CAAA;QAE5E,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,CAAA;QAC9C,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAA;IACtD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,gEAAgE;AAChE,+EAA+E;AAE/E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAA;QAErD,6CAA6C;QAC7C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;QAChE,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;QAE1D,OAAO,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QAE5C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;QAEhE,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}