skills-console 0.4.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 (101) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +130 -0
  4. package/dist/adapters/filesystem/agent-registry.d.ts +5 -0
  5. package/dist/adapters/filesystem/agent-registry.js +236 -0
  6. package/dist/adapters/filesystem/agent-registry.js.map +1 -0
  7. package/dist/adapters/filesystem/frontmatter.d.ts +2 -0
  8. package/dist/adapters/filesystem/frontmatter.js +73 -0
  9. package/dist/adapters/filesystem/frontmatter.js.map +1 -0
  10. package/dist/adapters/filesystem/skill-scanner.d.ts +8 -0
  11. package/dist/adapters/filesystem/skill-scanner.js +157 -0
  12. package/dist/adapters/filesystem/skill-scanner.js.map +1 -0
  13. package/dist/adapters/filesystem/skills-lock.d.ts +2 -0
  14. package/dist/adapters/filesystem/skills-lock.js +44 -0
  15. package/dist/adapters/filesystem/skills-lock.js.map +1 -0
  16. package/dist/adapters/skills-cli/command-builder.d.ts +7 -0
  17. package/dist/adapters/skills-cli/command-builder.js +144 -0
  18. package/dist/adapters/skills-cli/command-builder.js.map +1 -0
  19. package/dist/adapters/skills-cli/executor.d.ts +20 -0
  20. package/dist/adapters/skills-cli/executor.js +51 -0
  21. package/dist/adapters/skills-cli/executor.js.map +1 -0
  22. package/dist/adapters/skills-cli/source-parser.d.ts +3 -0
  23. package/dist/adapters/skills-cli/source-parser.js +38 -0
  24. package/dist/adapters/skills-cli/source-parser.js.map +1 -0
  25. package/dist/adapters/skills-cli/types.d.ts +56 -0
  26. package/dist/adapters/skills-cli/types.js +2 -0
  27. package/dist/adapters/skills-cli/types.js.map +1 -0
  28. package/dist/application/backup-manager.d.ts +7 -0
  29. package/dist/application/backup-manager.js +164 -0
  30. package/dist/application/backup-manager.js.map +1 -0
  31. package/dist/application/build-inventory.d.ts +5 -0
  32. package/dist/application/build-inventory.js +103 -0
  33. package/dist/application/build-inventory.js.map +1 -0
  34. package/dist/application/doctor-fixes.d.ts +21 -0
  35. package/dist/application/doctor-fixes.js +103 -0
  36. package/dist/application/doctor-fixes.js.map +1 -0
  37. package/dist/application/history-store.d.ts +5 -0
  38. package/dist/application/history-store.js +42 -0
  39. package/dist/application/history-store.js.map +1 -0
  40. package/dist/application/profile-apply.d.ts +22 -0
  41. package/dist/application/profile-apply.js +69 -0
  42. package/dist/application/profile-apply.js.map +1 -0
  43. package/dist/application/profile-diff.d.ts +3 -0
  44. package/dist/application/profile-diff.js +105 -0
  45. package/dist/application/profile-diff.js.map +1 -0
  46. package/dist/application/profile-store.d.ts +9 -0
  47. package/dist/application/profile-store.js +109 -0
  48. package/dist/application/profile-store.js.map +1 -0
  49. package/dist/application/restore-operation.d.ts +8 -0
  50. package/dist/application/restore-operation.js +27 -0
  51. package/dist/application/restore-operation.js.map +1 -0
  52. package/dist/application/skill-operations.d.ts +32 -0
  53. package/dist/application/skill-operations.js +129 -0
  54. package/dist/application/skill-operations.js.map +1 -0
  55. package/dist/cli-commands.d.ts +8 -0
  56. package/dist/cli-commands.js +111 -0
  57. package/dist/cli-commands.js.map +1 -0
  58. package/dist/cli.d.ts +2 -0
  59. package/dist/cli.js +15 -0
  60. package/dist/cli.js.map +1 -0
  61. package/dist/domain/operations.d.ts +50 -0
  62. package/dist/domain/operations.js +25 -0
  63. package/dist/domain/operations.js.map +1 -0
  64. package/dist/domain/profile.d.ts +43 -0
  65. package/dist/domain/profile.js +2 -0
  66. package/dist/domain/profile.js.map +1 -0
  67. package/dist/domain/types.d.ts +98 -0
  68. package/dist/domain/types.js +2 -0
  69. package/dist/domain/types.js.map +1 -0
  70. package/dist/platform/data-paths.d.ts +3 -0
  71. package/dist/platform/data-paths.js +17 -0
  72. package/dist/platform/data-paths.js.map +1 -0
  73. package/dist/platform/environment.d.ts +6 -0
  74. package/dist/platform/environment.js +71 -0
  75. package/dist/platform/environment.js.map +1 -0
  76. package/dist/platform/redaction.d.ts +1 -0
  77. package/dist/platform/redaction.js +7 -0
  78. package/dist/platform/redaction.js.map +1 -0
  79. package/dist/ui/App.d.ts +2 -0
  80. package/dist/ui/App.js +330 -0
  81. package/dist/ui/App.js.map +1 -0
  82. package/dist/ui/DoctorFixWizard.d.ts +12 -0
  83. package/dist/ui/DoctorFixWizard.js +58 -0
  84. package/dist/ui/DoctorFixWizard.js.map +1 -0
  85. package/dist/ui/OperationWizard.d.ts +19 -0
  86. package/dist/ui/OperationWizard.js +301 -0
  87. package/dist/ui/OperationWizard.js.map +1 -0
  88. package/dist/ui/ProfileWizard.d.ts +15 -0
  89. package/dist/ui/ProfileWizard.js +68 -0
  90. package/dist/ui/ProfileWizard.js.map +1 -0
  91. package/dist/ui/RestoreWizard.d.ts +12 -0
  92. package/dist/ui/RestoreWizard.js +42 -0
  93. package/dist/ui/RestoreWizard.js.map +1 -0
  94. package/dist/version.d.ts +1 -0
  95. package/dist/version.js +2 -0
  96. package/dist/version.js.map +1 -0
  97. package/docs/ARCHITECTURE.md +145 -0
  98. package/docs/OPERATIONS.md +200 -0
  99. package/docs/PROFILES.md +83 -0
  100. package/examples/skills-profile.json +21 -0
  101. package/package.json +71 -0
@@ -0,0 +1,105 @@
1
+ import { createHash } from 'node:crypto';
2
+ function id(...parts) {
3
+ return createHash('sha1').update(parts.join('\0')).digest('hex').slice(0, 16);
4
+ }
5
+ function normalizeSource(source) {
6
+ const trimmed = source.trim().replace(/\.git$/, '').replace(/\/$/, '');
7
+ const githubShorthand = /^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+)$/.exec(trimmed);
8
+ if (githubShorthand) {
9
+ return `github.com/${githubShorthand[1].toLowerCase()}/${githubShorthand[2].toLowerCase()}`;
10
+ }
11
+ try {
12
+ const url = new URL(trimmed.replace(/^git@([^:]+):/, 'ssh://$1/'));
13
+ return `${url.hostname.toLowerCase()}${url.pathname}`.replace(/\/$/, '');
14
+ }
15
+ catch {
16
+ return trimmed.toLowerCase();
17
+ }
18
+ }
19
+ function expectedDiff(expected, actual) {
20
+ const matching = actual.filter((installation) => installation.mutable &&
21
+ installation.skillName === expected.name &&
22
+ installation.scope === expected.scope);
23
+ const actualAgents = new Set(matching.flatMap((installation) => installation.agentIds));
24
+ const missingAgentIds = expected.agentIds.filter((agentId) => !actualAgents.has(agentId));
25
+ let status = 'satisfied';
26
+ let message = 'Desired Skill is installed for every target Agent.';
27
+ if (missingAgentIds.length > 0) {
28
+ status = 'missing';
29
+ message = `Missing for: ${missingAgentIds.join(', ')}.`;
30
+ }
31
+ else if (expected.source) {
32
+ const knownSources = matching.map((item) => item.source).filter((source) => Boolean(source));
33
+ if (knownSources.length === 0) {
34
+ status = 'source-unknown';
35
+ message = 'Installed Skill has no traceable source metadata.';
36
+ }
37
+ else if (!knownSources.some((source) => normalizeSource(source) === normalizeSource(expected.source))) {
38
+ status = 'source-mismatch';
39
+ message = `Expected ${expected.source}, found ${knownSources.join(', ')}.`;
40
+ }
41
+ }
42
+ return {
43
+ id: id('expected', expected.scope, expected.name, ...expected.agentIds),
44
+ status,
45
+ skillName: expected.name,
46
+ scope: expected.scope,
47
+ expected,
48
+ actual: matching,
49
+ missingAgentIds,
50
+ message,
51
+ };
52
+ }
53
+ function extraEntries(profile, inventory) {
54
+ const scopes = new Set(profile.skills.map((skill) => skill.scope));
55
+ if (!profile.policy.manageUserScope) {
56
+ scopes.delete('user');
57
+ }
58
+ const grouped = new Map();
59
+ for (const installation of inventory.installations.filter((item) => item.mutable && item.isEffective && scopes.has(item.scope))) {
60
+ const expected = profile.skills.some((skill) => skill.name === installation.skillName &&
61
+ skill.scope === installation.scope &&
62
+ installation.agentIds.some((agentId) => skill.agentIds.includes(agentId)));
63
+ if (expected) {
64
+ continue;
65
+ }
66
+ const key = `${installation.scope}:${installation.skillName}`;
67
+ grouped.set(key, [...(grouped.get(key) ?? []), installation]);
68
+ }
69
+ return [...grouped.entries()].map(([key, actual]) => {
70
+ const first = actual[0];
71
+ return {
72
+ id: id('extra', key),
73
+ status: 'extra',
74
+ skillName: first.skillName,
75
+ scope: first.scope,
76
+ actual,
77
+ missingAgentIds: [],
78
+ message: profile.policy.removeExtras
79
+ ? 'Installed Skill is not declared and policy allows removal.'
80
+ : 'Installed Skill is not declared; removal policy is disabled.',
81
+ };
82
+ });
83
+ }
84
+ export function diffProfile(profile, inventory) {
85
+ const expectedEntries = profile.skills
86
+ .filter((skill) => profile.policy.manageUserScope || skill.scope !== 'user')
87
+ .map((skill) => expectedDiff(skill, inventory.installations));
88
+ const entries = [...expectedEntries, ...extraEntries(profile, inventory)].sort((a, b) => a.status.localeCompare(b.status) || a.skillName.localeCompare(b.skillName));
89
+ const summary = {
90
+ satisfied: entries.filter((entry) => entry.status === 'satisfied').length,
91
+ missing: entries.filter((entry) => entry.status === 'missing').length,
92
+ sourceMismatch: entries.filter((entry) => entry.status === 'source-mismatch').length,
93
+ sourceUnknown: entries.filter((entry) => entry.status === 'source-unknown').length,
94
+ extra: entries.filter((entry) => entry.status === 'extra').length,
95
+ };
96
+ return {
97
+ profile,
98
+ entries,
99
+ summary,
100
+ hasChanges: summary.missing > 0 ||
101
+ summary.sourceMismatch > 0 ||
102
+ (profile.policy.removeExtras && summary.extra > 0),
103
+ };
104
+ }
105
+ //# sourceMappingURL=profile-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-diff.js","sourceRoot":"","sources":["../../src/application/profile-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SkillsProfile } from '../domain/profile.js';
2
+ import type { Inventory, Scope } from '../domain/types.js';
3
+ export declare function defaultProfilePath(projectRoot: string): string;
4
+ export declare function loadProfile(path: string): Promise<SkillsProfile>;
5
+ export declare function saveProfile(path: string, profile: SkillsProfile): Promise<void>;
6
+ export declare function exportInventoryProfile(inventory: Inventory, options?: {
7
+ scopes?: Scope[];
8
+ name?: string;
9
+ }): SkillsProfile;
@@ -0,0 +1,109 @@
1
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
4
+ export function defaultProfilePath(projectRoot) {
5
+ return join(projectRoot, 'skills-profile.json');
6
+ }
7
+ function parseProfile(value) {
8
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
9
+ throw new Error('Profile must be a JSON object.');
10
+ }
11
+ const record = value;
12
+ if (record.schemaVersion !== 1) {
13
+ throw new Error('Unsupported skills-profile.json schemaVersion.');
14
+ }
15
+ if (typeof record.name !== 'string' || !record.name.trim()) {
16
+ throw new Error('Profile name is required.');
17
+ }
18
+ if (!Array.isArray(record.skills)) {
19
+ throw new Error('Profile skills must be an array.');
20
+ }
21
+ const skills = record.skills.map((item, index) => {
22
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
23
+ throw new Error(`Profile skill at index ${index} must be an object.`);
24
+ }
25
+ const skill = item;
26
+ if (typeof skill.name !== 'string' || !NAME_PATTERN.test(skill.name)) {
27
+ throw new Error(`Invalid skill name at index ${index}.`);
28
+ }
29
+ if (!Array.isArray(skill.agentIds) || skill.agentIds.length === 0 || skill.agentIds.some((id) => typeof id !== 'string' || !NAME_PATTERN.test(id))) {
30
+ throw new Error(`Invalid agentIds for ${skill.name}.`);
31
+ }
32
+ if (skill.scope !== 'project' && skill.scope !== 'user') {
33
+ throw new Error(`Invalid scope for ${skill.name}.`);
34
+ }
35
+ if (skill.mode !== 'symlink' && skill.mode !== 'copy') {
36
+ throw new Error(`Invalid mode for ${skill.name}.`);
37
+ }
38
+ if (skill.source !== undefined && (typeof skill.source !== 'string' || !skill.source.trim())) {
39
+ throw new Error(`Invalid source for ${skill.name}.`);
40
+ }
41
+ return {
42
+ name: skill.name,
43
+ ...(typeof skill.source === 'string' ? { source: skill.source.trim() } : {}),
44
+ agentIds: [...new Set(skill.agentIds)].sort(),
45
+ scope: skill.scope,
46
+ mode: skill.mode,
47
+ };
48
+ });
49
+ const policyRecord = record.policy && typeof record.policy === 'object' && !Array.isArray(record.policy)
50
+ ? record.policy
51
+ : {};
52
+ return {
53
+ schemaVersion: 1,
54
+ name: record.name.trim(),
55
+ ...(typeof record.description === 'string' && record.description.trim()
56
+ ? { description: record.description.trim() }
57
+ : {}),
58
+ policy: {
59
+ removeExtras: policyRecord.removeExtras === true,
60
+ manageUserScope: policyRecord.manageUserScope === true,
61
+ },
62
+ skills,
63
+ };
64
+ }
65
+ export async function loadProfile(path) {
66
+ return parseProfile(JSON.parse(await readFile(resolve(path), 'utf8')));
67
+ }
68
+ export async function saveProfile(path, profile) {
69
+ const resolvedPath = resolve(path);
70
+ await mkdir(dirname(resolvedPath), { recursive: true });
71
+ const temporaryPath = `${resolvedPath}.tmp`;
72
+ await writeFile(temporaryPath, `${JSON.stringify(profile, null, 2)}\n`, 'utf8');
73
+ await rename(temporaryPath, resolvedPath);
74
+ }
75
+ export function exportInventoryProfile(inventory, options = {}) {
76
+ const scopes = options.scopes ?? ['project'];
77
+ const mutable = inventory.installations.filter((installation) => installation.mutable && scopes.includes(installation.scope));
78
+ const grouped = new Map();
79
+ for (const installation of mutable) {
80
+ const key = [
81
+ installation.skillName,
82
+ installation.scope,
83
+ installation.source ?? '',
84
+ installation.linkKind,
85
+ ].join('\0');
86
+ grouped.set(key, [...(grouped.get(key) ?? []), installation]);
87
+ }
88
+ const skills = [...grouped.values()]
89
+ .map((installations) => {
90
+ const first = installations[0];
91
+ return {
92
+ name: first.skillName,
93
+ ...(first.source ? { source: first.source } : {}),
94
+ agentIds: [...new Set(installations.flatMap((item) => item.agentIds))].sort(),
95
+ scope: first.scope,
96
+ mode: first.linkKind === 'symlink' ? 'symlink' : 'copy',
97
+ };
98
+ })
99
+ .sort((a, b) => a.name.localeCompare(b.name) || a.scope.localeCompare(b.scope));
100
+ const projectName = basename(inventory.environment.projectRoot) || 'skills-profile';
101
+ return {
102
+ schemaVersion: 1,
103
+ name: options.name ?? projectName,
104
+ description: `Agent Skills desired state for ${projectName}.`,
105
+ policy: { removeExtras: false, manageUserScope: scopes.includes('user') },
106
+ skills,
107
+ };
108
+ }
109
+ //# sourceMappingURL=profile-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.js","sourceRoot":"","sources":["../../src/application/profile-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Inventory, EnvironmentInfo } from '../domain/types.js';
2
+ import type { OperationRecord, RestoreResult } from '../domain/operations.js';
3
+ export interface RestoreOperationResult {
4
+ restore: RestoreResult;
5
+ inventory: Inventory;
6
+ record: OperationRecord;
7
+ }
8
+ export declare function restoreHistoryOperation(record: OperationRecord, environment: EnvironmentInfo, dataRoot: string): Promise<RestoreOperationResult>;
@@ -0,0 +1,27 @@
1
+ import { loadOperationSnapshot, restoreOperationSnapshot, } from './backup-manager.js';
2
+ import { saveHistoryRecord } from './history-store.js';
3
+ import { buildInventory } from './build-inventory.js';
4
+ export async function restoreHistoryOperation(record, environment, dataRoot) {
5
+ if (record.status === 'running') {
6
+ throw new Error('Cannot restore an operation that is still marked as running.');
7
+ }
8
+ if (record.status === 'restored') {
9
+ throw new Error('This operation has already been restored.');
10
+ }
11
+ const snapshot = await loadOperationSnapshot(record.snapshotId, dataRoot);
12
+ const restore = await restoreOperationSnapshot(snapshot);
13
+ record.status = 'restored';
14
+ record.finishedAt = new Date().toISOString();
15
+ record.verificationMessages = [
16
+ ...record.verificationMessages,
17
+ `Restored ${restore.restoredEntries} backup(s) and removed ${restore.removedCreatedPaths} created path(s).`,
18
+ ...restore.fallbacks,
19
+ ];
20
+ await saveHistoryRecord(record, dataRoot);
21
+ const inventory = await buildInventory({
22
+ cwd: environment.projectRoot,
23
+ homeDir: environment.homeDir,
24
+ });
25
+ return { restore, inventory, record };
26
+ }
27
+ //# sourceMappingURL=restore-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore-operation.js","sourceRoot":"","sources":["../../src/application/restore-operation.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAQpD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAuB,EACvB,WAA4B,EAC5B,QAAgB;IAEhB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;IAC3B,MAAM,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,CAAC,oBAAoB,GAAG;QAC5B,GAAG,MAAM,CAAC,oBAAoB;QAC9B,YAAY,OAAO,CAAC,eAAe,0BAA0B,OAAO,CAAC,mBAAmB,mBAAmB;QAC3G,GAAG,OAAO,CAAC,SAAS;KACrB,CAAC;IACF,MAAM,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;QACrC,GAAG,EAAE,WAAW,CAAC,WAAW;QAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC,CAAC;IACH,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { SpawnProcess } from '../adapters/skills-cli/executor.js';
2
+ import type { CommandExecution, CommandOutput, SkillsCommandPlan, SourceSkill } from '../adapters/skills-cli/types.js';
3
+ import type { Inventory } from '../domain/types.js';
4
+ import type { OperationRecord, OperationSnapshot } from '../domain/operations.js';
5
+ export interface OperationVerification {
6
+ status: 'verified' | 'failed' | 'indeterminate';
7
+ messages: string[];
8
+ }
9
+ export interface OperationResult {
10
+ execution: CommandExecution;
11
+ inventory: Inventory;
12
+ verification: OperationVerification;
13
+ record: OperationRecord;
14
+ snapshot: OperationSnapshot;
15
+ }
16
+ export declare function previewSkillSource(plan: SkillsCommandPlan, options?: {
17
+ signal?: AbortSignal;
18
+ onOutput?: (output: CommandOutput) => void;
19
+ spawnProcess?: SpawnProcess;
20
+ }): Promise<{
21
+ execution: CommandExecution;
22
+ skills: SourceSkill[];
23
+ }>;
24
+ export declare function verifyOperation(plan: SkillsCommandPlan, inventory: Inventory): OperationVerification;
25
+ export declare function executeOperation(plan: SkillsCommandPlan, options?: {
26
+ signal?: AbortSignal;
27
+ onOutput?: (output: CommandOutput) => void;
28
+ homeDir?: string;
29
+ spawnProcess?: SpawnProcess;
30
+ inventoryBefore?: Inventory;
31
+ dataRoot?: string;
32
+ }): Promise<OperationResult>;
@@ -0,0 +1,129 @@
1
+ import { buildInventory } from './build-inventory.js';
2
+ import { executeSkillsCommand } from '../adapters/skills-cli/executor.js';
3
+ import { parseSourceSkills } from '../adapters/skills-cli/source-parser.js';
4
+ import { createOperationSnapshot, finalizeOperationSnapshot, } from './backup-manager.js';
5
+ import { createHistoryRecord, saveHistoryRecord, } from './history-store.js';
6
+ import { resolveDataRoot } from '../platform/data-paths.js';
7
+ import { redactSensitiveText } from '../platform/redaction.js';
8
+ function reportedNoop(execution) {
9
+ const output = stripControlSequences(`${execution.stdout}\n${execution.stderr}`);
10
+ const patterns = [
11
+ /No installed skills found matching:[^\n]*/i,
12
+ /No project skills to update\.?/i,
13
+ /No global skills to check\.?/i,
14
+ /No project skills can be updated in place\.?/i,
15
+ /Successfully removed 0 skill\(s\)/i,
16
+ ];
17
+ return patterns.map((pattern) => pattern.exec(output)?.[0]).find(Boolean);
18
+ }
19
+ function stripControlSequences(value) {
20
+ return value.replace(/[\u001B\u009B][[\]()#;?]*(?:(?:(?:[a-zA-Z\d]*(?:;[-a-zA-Z\d\/#&.:=?%@~_]+)*)?\u0007)|(?:(?:\d{1,4}(?:[;:]\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))/g, '');
21
+ }
22
+ export async function previewSkillSource(plan, options = {}) {
23
+ if (plan.kind !== 'preview' || plan.mutatesFilesystem) {
24
+ throw new Error('Source previews require a read-only preview plan.');
25
+ }
26
+ const execution = await executeSkillsCommand(plan, options);
27
+ if (execution.exitCode !== 0) {
28
+ return { execution, skills: [] };
29
+ }
30
+ return { execution, skills: parseSourceSkills(execution.stdout) };
31
+ }
32
+ export function verifyOperation(plan, inventory) {
33
+ if (plan.kind === 'preview') {
34
+ return { status: 'indeterminate', messages: ['Preview commands do not change inventory.'] };
35
+ }
36
+ const matching = inventory.installations.filter((installation) => plan.skillNames.includes(installation.skillName) &&
37
+ (!plan.scope || installation.scope === plan.scope) &&
38
+ (plan.agentIds.length === 0 ||
39
+ installation.agentIds.some((agentId) => plan.agentIds.includes(agentId))));
40
+ if (plan.kind === 'remove') {
41
+ const remaining = matching.filter((installation) => installation.mutable);
42
+ return remaining.length === 0
43
+ ? { status: 'verified', messages: ['Selected mutable installations are no longer present.'] }
44
+ : {
45
+ status: 'failed',
46
+ messages: [`${remaining.length} selected mutable installation(s) are still present.`],
47
+ };
48
+ }
49
+ const presentNames = new Set(matching.map((installation) => installation.skillName));
50
+ const missingNames = plan.skillNames.filter((skillName) => !presentNames.has(skillName));
51
+ if (missingNames.length > 0) {
52
+ return {
53
+ status: 'failed',
54
+ messages: [`Missing after ${plan.kind}: ${missingNames.join(', ')}`],
55
+ };
56
+ }
57
+ return {
58
+ status: plan.kind === 'install' ? 'verified' : 'indeterminate',
59
+ messages: [
60
+ plan.kind === 'install'
61
+ ? 'All selected skills were found in the requested scope.'
62
+ : 'Skills remain present; content-level update verification is not available.',
63
+ ],
64
+ };
65
+ }
66
+ export async function executeOperation(plan, options = {}) {
67
+ if (!plan.mutatesFilesystem || plan.kind === 'preview' || plan.kind === 'repair') {
68
+ throw new Error('executeOperation requires a mutating command plan.');
69
+ }
70
+ const before = options.inventoryBefore ??
71
+ (await buildInventory({
72
+ cwd: plan.cwd,
73
+ ...(options.homeDir ? { homeDir: options.homeDir } : {}),
74
+ }));
75
+ const dataRoot = resolveDataRoot(before.environment.homeDir, options.dataRoot);
76
+ const snapshot = await createOperationSnapshot(plan, before, dataRoot);
77
+ const record = await createHistoryRecord(plan, snapshot.id, dataRoot);
78
+ const logs = [];
79
+ const collectOutput = (output) => {
80
+ options.onOutput?.(output);
81
+ logs.push(...redactSensitiveText(stripControlSequences(output.text))
82
+ .split(/\r?\n/)
83
+ .filter((line) => line.trim()));
84
+ if (logs.length > 200) {
85
+ logs.splice(0, logs.length - 200);
86
+ }
87
+ };
88
+ try {
89
+ const execution = await executeSkillsCommand(plan, {
90
+ ...(options.signal ? { signal: options.signal } : {}),
91
+ ...(options.spawnProcess ? { spawnProcess: options.spawnProcess } : {}),
92
+ onOutput: collectOutput,
93
+ });
94
+ const inventory = await buildInventory({
95
+ cwd: plan.cwd,
96
+ ...(options.homeDir ? { homeDir: options.homeDir } : {}),
97
+ });
98
+ await finalizeOperationSnapshot(snapshot, plan, before, inventory);
99
+ const noopMessage = reportedNoop(execution);
100
+ const verification = noopMessage
101
+ ? {
102
+ status: 'failed',
103
+ messages: [`Upstream completed without changing anything: ${noopMessage}`],
104
+ }
105
+ : execution.exitCode === 0
106
+ ? verifyOperation(plan, inventory)
107
+ : {
108
+ status: 'failed',
109
+ messages: [`Command exited with code ${execution.exitCode}.`],
110
+ };
111
+ record.status = execution.exitCode === 0 && verification.status !== 'failed' ? 'succeeded' : 'failed';
112
+ record.finishedAt = new Date().toISOString();
113
+ record.exitCode = execution.exitCode;
114
+ record.verificationStatus = verification.status;
115
+ record.verificationMessages = verification.messages;
116
+ record.logs = logs;
117
+ await saveHistoryRecord(record, dataRoot);
118
+ return { execution, inventory, verification, record, snapshot };
119
+ }
120
+ catch (caught) {
121
+ record.status = 'failed';
122
+ record.finishedAt = new Date().toISOString();
123
+ record.logs = logs;
124
+ record.error = caught instanceof Error ? caught.message : 'Unknown operation failure.';
125
+ await saveHistoryRecord(record, dataRoot);
126
+ throw caught;
127
+ }
128
+ }
129
+ //# sourceMappingURL=skill-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-operations.js","sourceRoot":"","sources":["../../src/application/skill-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { SKILLS_CONSOLE_VERSION } from './version.js';
2
+ interface CliContext {
3
+ cwd?: string;
4
+ homeDir?: string;
5
+ writeOut?: (value: string) => void;
6
+ writeError?: (value: string) => void;
7
+ }
8
+ export declare function runCliCommand(args: string[], context?: CliContext): Promise<number | undefined>;
@@ -0,0 +1,111 @@
1
+ import { resolve } from 'node:path';
2
+ import { buildInventory } from './application/build-inventory.js';
3
+ import { diffProfile } from './application/profile-diff.js';
4
+ import { defaultProfilePath, exportInventoryProfile, loadProfile, saveProfile, } from './application/profile-store.js';
5
+ import { SKILLS_CONSOLE_VERSION } from './version.js';
6
+ export { SKILLS_CONSOLE_VERSION } from './version.js';
7
+ const help = `Skills Console ${SKILLS_CONSOLE_VERSION}
8
+
9
+ Usage:
10
+ skills-console Open the interactive TUI
11
+ skills-console inventory [--json] Print local inventory
12
+ skills-console --json Alias for inventory --json
13
+ skills-console profile diff [path] [--json]
14
+ skills-console profile export [path] [--include-user] [--json]
15
+ skills-console profile validate [path]
16
+ skills-console --version
17
+
18
+ Exit codes:
19
+ 0 Success / desired state satisfied
20
+ 1 Invalid command or runtime error
21
+ 2 Profile diff found actionable drift
22
+ `;
23
+ function positional(args) {
24
+ return args.filter((argument) => !argument.startsWith('-'));
25
+ }
26
+ export async function runCliCommand(args, context = {}) {
27
+ if (args.length === 0) {
28
+ return undefined;
29
+ }
30
+ const writeOut = context.writeOut ?? ((value) => process.stdout.write(value));
31
+ const writeError = context.writeError ?? ((value) => process.stderr.write(value));
32
+ const cwd = resolve(context.cwd ?? process.cwd());
33
+ const json = args.includes('--json');
34
+ try {
35
+ if (args[0] === '--help' || args[0] === 'help' || args[0] === '-h') {
36
+ writeOut(help);
37
+ return 0;
38
+ }
39
+ if (args[0] === '--version' || args[0] === '-v') {
40
+ writeOut(`${SKILLS_CONSOLE_VERSION}\n`);
41
+ return 0;
42
+ }
43
+ if (args[0] === '--json' || args[0] === 'inventory') {
44
+ const inventory = await buildInventory({
45
+ cwd,
46
+ ...(context.homeDir ? { homeDir: context.homeDir } : {}),
47
+ });
48
+ if (json || args[0] === '--json') {
49
+ writeOut(`${JSON.stringify(inventory, null, 2)}\n`);
50
+ }
51
+ else {
52
+ writeOut(`Skills ${inventory.stats.skillCount} · installations ${inventory.stats.installationCount} · agents ${inventory.stats.detectedAgentCount} · errors ${inventory.stats.errorCount} · warnings ${inventory.stats.warningCount}\n`);
53
+ }
54
+ return 0;
55
+ }
56
+ if (args[0] === 'profile') {
57
+ const subcommand = args[1];
58
+ const values = positional(args.slice(2));
59
+ const path = resolve(cwd, values[0] ?? defaultProfilePath(cwd));
60
+ if (subcommand === 'validate') {
61
+ const profile = await loadProfile(path);
62
+ writeOut(`Valid profile: ${profile.name} (${profile.skills.length} Skills)\n`);
63
+ return 0;
64
+ }
65
+ if (subcommand === 'export') {
66
+ const inventory = await buildInventory({
67
+ cwd,
68
+ ...(context.homeDir ? { homeDir: context.homeDir } : {}),
69
+ });
70
+ const profile = exportInventoryProfile(inventory, {
71
+ scopes: args.includes('--include-user') ? ['project', 'user'] : ['project'],
72
+ });
73
+ await saveProfile(path, profile);
74
+ if (json) {
75
+ writeOut(`${JSON.stringify({ path, profile }, null, 2)}\n`);
76
+ }
77
+ else {
78
+ writeOut(`Exported ${profile.skills.length} Skill declaration(s) to ${path}\n`);
79
+ }
80
+ return 0;
81
+ }
82
+ if (subcommand === 'diff') {
83
+ const [inventory, profile] = await Promise.all([
84
+ buildInventory({
85
+ cwd,
86
+ ...(context.homeDir ? { homeDir: context.homeDir } : {}),
87
+ }),
88
+ loadProfile(path),
89
+ ]);
90
+ const diff = diffProfile(profile, inventory);
91
+ if (json) {
92
+ writeOut(`${JSON.stringify({ path, ...diff }, null, 2)}\n`);
93
+ }
94
+ else {
95
+ writeOut(`${profile.name}: satisfied ${diff.summary.satisfied}, missing ${diff.summary.missing}, source mismatch ${diff.summary.sourceMismatch}, source unknown ${diff.summary.sourceUnknown}, extra ${diff.summary.extra}\n`);
96
+ for (const entry of diff.entries.filter((item) => item.status !== 'satisfied')) {
97
+ writeOut(`${entry.status.padEnd(16)} ${entry.scope.padEnd(7)} ${entry.skillName}: ${entry.message}\n`);
98
+ }
99
+ }
100
+ return diff.hasChanges ? 2 : 0;
101
+ }
102
+ }
103
+ writeError(`Unknown command.\n\n${help}`);
104
+ return 1;
105
+ }
106
+ catch (caught) {
107
+ writeError(`${caught instanceof Error ? caught.message : 'Unknown CLI error.'}\n`);
108
+ return 1;
109
+ }
110
+ }
111
+ //# sourceMappingURL=cli-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-commands.js","sourceRoot":"","sources":["../src/cli-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,cAAc,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAC,WAAW,EAAC,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,WAAW,GACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAC;AASpD,MAAM,IAAI,GAAG,kBAAkB,sBAAsB;;;;;;;;;;;;;;;CAepD,CAAC;AAEF,SAAS,UAAU,CAAC,IAAc;IAChC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAc,EACd,OAAO,GAAe,EAAE;IAExB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,QAAQ,CAAC,GAAG,sBAAsB,IAAI,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;gBACrC,GAAG;gBACH,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC;YACH,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,QAAQ,CACN,UAAU,SAAS,CAAC,KAAK,CAAC,UAAU,oBAAoB,SAAS,CAAC,KAAK,CAAC,iBAAiB,aAAa,SAAS,CAAC,KAAK,CAAC,kBAAkB,aAAa,SAAS,CAAC,KAAK,CAAC,UAAU,eAAe,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,CAC/N,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxC,QAAQ,CAAC,kBAAkB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;gBAC/E,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;oBACrC,GAAG;oBACH,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,sBAAsB,CAAC,SAAS,EAAE;oBAChD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;iBAC5E,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACjC,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,4BAA4B,IAAI,IAAI,CAAC,CAAC;gBAClF,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC7C,cAAc,CAAC;wBACb,GAAG;wBACH,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBACvD,CAAC;oBACF,WAAW,CAAC,IAAI,CAAC;iBAClB,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC7C,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,IAAI,EAAE,GAAG,IAAI,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,QAAQ,CACN,GAAG,OAAO,CAAC,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,SAAS,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,qBAAqB,IAAI,CAAC,OAAO,CAAC,cAAc,oBAAoB,IAAI,CAAC,OAAO,CAAC,aAAa,WAAW,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CACrN,CAAC;oBACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;wBAC/E,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;oBACzG,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,UAAU,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC;QACnF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { render } from 'ink';
5
+ import { App } from './ui/App.js';
6
+ import { runCliCommand } from './cli-commands.js';
7
+ const exitCode = await runCliCommand(process.argv.slice(2));
8
+ if (exitCode === undefined) {
9
+ const instance = render(_jsx(App, {}));
10
+ await instance.waitUntilExit();
11
+ }
12
+ else {
13
+ process.exitCode = exitCode;
14
+ }
15
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAC,GAAG,EAAC,MAAM,aAAa,CAAC;AAChC,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AACjC,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC"}