@grimoire-cc/cli 0.14.0 → 0.15.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 (53) hide show
  1. package/dist/bin.js +15 -5
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/agent-paths.d.ts +11 -0
  4. package/dist/commands/agent-paths.d.ts.map +1 -0
  5. package/dist/commands/agent-paths.js +69 -0
  6. package/dist/commands/agent-paths.js.map +1 -0
  7. package/dist/commands/agent-skills.d.ts +10 -0
  8. package/dist/commands/agent-skills.d.ts.map +1 -0
  9. package/dist/commands/agent-skills.js +159 -0
  10. package/dist/commands/agent-skills.js.map +1 -0
  11. package/dist/commands/config.d.ts +7 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +62 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/list.d.ts.map +1 -1
  16. package/dist/commands/list.js +237 -75
  17. package/dist/commands/list.js.map +1 -1
  18. package/dist/commands/update.d.ts +1 -2
  19. package/dist/commands/update.d.ts.map +1 -1
  20. package/dist/commands/update.js +12 -8
  21. package/dist/commands/update.js.map +1 -1
  22. package/dist/enforce.d.ts +8 -10
  23. package/dist/enforce.d.ts.map +1 -1
  24. package/dist/enforce.js +38 -17
  25. package/dist/enforce.js.map +1 -1
  26. package/dist/frontmatter.d.ts +16 -0
  27. package/dist/frontmatter.d.ts.map +1 -0
  28. package/dist/frontmatter.js +74 -0
  29. package/dist/frontmatter.js.map +1 -0
  30. package/dist/grimoire-config.d.ts +6 -0
  31. package/dist/grimoire-config.d.ts.map +1 -0
  32. package/dist/grimoire-config.js +23 -0
  33. package/dist/grimoire-config.js.map +1 -0
  34. package/dist/prompt.d.ts.map +1 -1
  35. package/dist/prompt.js +13 -8
  36. package/dist/prompt.js.map +1 -1
  37. package/dist/remove.d.ts +4 -0
  38. package/dist/remove.d.ts.map +1 -1
  39. package/dist/remove.js +8 -0
  40. package/dist/remove.js.map +1 -1
  41. package/dist/resolve.d.ts.map +1 -1
  42. package/dist/resolve.js +12 -5
  43. package/dist/resolve.js.map +1 -1
  44. package/dist/setup.d.ts.map +1 -1
  45. package/dist/setup.js +4 -8
  46. package/dist/setup.js.map +1 -1
  47. package/package.json +1 -1
  48. package/packs/frontend-pack/agents/grimoire.angular-coder.md +193 -0
  49. package/packs/frontend-pack/grimoire.json +7 -0
  50. package/dist/commands/enforce-agent.d.ts +0 -5
  51. package/dist/commands/enforce-agent.d.ts.map +0 -1
  52. package/dist/commands/enforce-agent.js +0 -94
  53. package/dist/commands/enforce-agent.js.map +0 -1
package/dist/bin.js CHANGED
@@ -5,7 +5,8 @@ import { runAdd } from './commands/add.js';
5
5
  import { runRemoveInteractive } from './commands/remove.js';
6
6
  import { runUpdate } from './commands/update.js';
7
7
  import { runLogs } from './commands/logs.js';
8
- import { runEnforceAgent } from './commands/enforce-agent.js';
8
+ import { runConfig } from './commands/config.js';
9
+ import { runAgentSkills } from './commands/agent-skills.js';
9
10
  import { runList } from './commands/list.js';
10
11
  const require = createRequire(import.meta.url);
11
12
  const { version } = require('../package.json');
@@ -87,13 +88,22 @@ const main = defineCommand({
87
88
  await runList(process.cwd());
88
89
  },
89
90
  }),
90
- 'enforce-agent': defineCommand({
91
+ config: defineCommand({
91
92
  meta: {
92
- name: 'enforce-agent',
93
- description: 'Toggle agent enforcement — delegate file edits to specialist agents',
93
+ name: 'config',
94
+ description: 'Configure global Grimoire settings',
94
95
  },
95
96
  async run() {
96
- await runEnforceAgent(process.cwd());
97
+ await runConfig(process.cwd());
98
+ },
99
+ }),
100
+ 'agent-skills': defineCommand({
101
+ meta: {
102
+ name: 'agent-skills',
103
+ description: 'Manage skill assignments for agents',
104
+ },
105
+ async run() {
106
+ await runAgentSkills(process.cwd());
97
107
  },
98
108
  }),
99
109
  },
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `runAgentPathsFor` — manage enforcement file patterns for a specific agent.
3
+ * Reads/writes patterns in skills-manifest.json.
4
+ * Hook re-sync is the caller's responsibility.
5
+ */
6
+ /**
7
+ * Runs the path add/remove action for a specific agent.
8
+ * Used by the unified `list` flow.
9
+ */
10
+ export declare function runAgentPathsFor(projectDir: string, agentName: string): Promise<void>;
11
+ //# sourceMappingURL=agent-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-paths.d.ts","sourceRoot":"","sources":["../../src/commands/agent-paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D3F"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `runAgentPathsFor` — manage enforcement file patterns for a specific agent.
3
+ * Reads/writes patterns in skills-manifest.json.
4
+ * Hook re-sync is the caller's responsibility.
5
+ */
6
+ import * as clack from '@clack/prompts';
7
+ import { readManifest, writeManifest } from '../enforce.js';
8
+ /**
9
+ * Runs the path add/remove action for a specific agent.
10
+ * Used by the unified `list` flow.
11
+ */
12
+ export async function runAgentPathsFor(projectDir, agentName) {
13
+ const manifest = readManifest(projectDir);
14
+ const entry = manifest.agents[agentName];
15
+ const currentPaths = entry?.file_patterns ?? [];
16
+ if (currentPaths.length > 0) {
17
+ clack.log.info(`Current paths: ${currentPaths.join(', ')}`);
18
+ }
19
+ else {
20
+ clack.log.info('No enforcement paths configured.');
21
+ }
22
+ const action = await clack.select({
23
+ message: 'What would you like to do?',
24
+ options: [
25
+ { value: 'add', label: 'Add path', hint: 'e.g. *.ts, *.cs, **/*.vue, src/api/**' },
26
+ { value: 'remove', label: 'Remove paths', ...(currentPaths.length === 0 && { hint: 'none to remove' }) },
27
+ { value: 'done', label: 'Done' },
28
+ ],
29
+ });
30
+ if (clack.isCancel(action) || action === 'done')
31
+ return;
32
+ if (action === 'add') {
33
+ const pattern = await clack.text({
34
+ message: 'Enter a glob pattern (e.g. *.ts, **/*.vue):',
35
+ });
36
+ if (clack.isCancel(pattern))
37
+ return;
38
+ const trimmed = pattern.trim();
39
+ if (trimmed) {
40
+ if (!manifest.agents[agentName]) {
41
+ manifest.agents[agentName] = {};
42
+ }
43
+ manifest.agents[agentName].file_patterns = [...currentPaths, trimmed];
44
+ writeManifest(projectDir, manifest);
45
+ clack.log.success(`Added pattern: ${trimmed}`);
46
+ }
47
+ }
48
+ if (action === 'remove') {
49
+ if (currentPaths.length === 0) {
50
+ clack.log.warn('No paths to remove.');
51
+ return;
52
+ }
53
+ const selected = await clack.multiselect({
54
+ message: 'Select paths to remove:',
55
+ options: currentPaths.map((p) => ({ value: p, label: p })),
56
+ required: false,
57
+ });
58
+ if (clack.isCancel(selected))
59
+ return;
60
+ const toRemove = new Set(selected);
61
+ if (toRemove.size > 0) {
62
+ const remaining = currentPaths.filter((p) => !toRemove.has(p));
63
+ manifest.agents[agentName].file_patterns = remaining;
64
+ writeManifest(projectDir, manifest);
65
+ clack.log.success(`Removed ${toRemove.size} path(s).`);
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=agent-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-paths.js","sourceRoot":"","sources":["../../src/commands/agent-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `grimoire agent-skills` — manage skill assignments for agents.
3
+ */
4
+ export declare function runAgentSkills(projectDir: string): Promise<void>;
5
+ /**
6
+ * Runs the skill add/remove action loop for a specific agent.
7
+ * Used by both the standalone `agent-skills` command and the unified `list` flow.
8
+ */
9
+ export declare function runAgentSkillsFor(projectDir: string, agentName: string): Promise<void>;
10
+ //# sourceMappingURL=agent-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-skills.d.ts","sourceRoot":"","sources":["../../src/commands/agent-skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqCH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DtE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E5F"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * `grimoire agent-skills` — manage skill assignments for agents.
3
+ */
4
+ import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
5
+ import { join, basename } from 'path';
6
+ import * as clack from '@clack/prompts';
7
+ import { readManifest, readAgentMeta } from '../enforce.js';
8
+ import { parseAgentSkills, updateAgentSkills } from '../frontmatter.js';
9
+ function readSkillDescription(skillMdPath) {
10
+ try {
11
+ const content = readFileSync(skillMdPath, 'utf-8');
12
+ const fm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
13
+ if (!fm?.[1])
14
+ return '';
15
+ return fm[1].match(/^description:\s*(.+)$/m)?.[1]?.trim().replace(/^["']|["']$/g, '') ?? '';
16
+ }
17
+ catch {
18
+ return '';
19
+ }
20
+ }
21
+ function scanAvailableSkills(projectDir) {
22
+ const skillsDir = join(projectDir, '.claude', 'skills');
23
+ if (!existsSync(skillsDir))
24
+ return [];
25
+ return readdirSync(skillsDir)
26
+ .filter((f) => {
27
+ const full = join(skillsDir, f);
28
+ return statSync(full).isDirectory() && existsSync(join(full, 'SKILL.md'));
29
+ })
30
+ .sort()
31
+ .map((name) => ({
32
+ name,
33
+ description: readSkillDescription(join(skillsDir, name, 'SKILL.md')),
34
+ }));
35
+ }
36
+ export async function runAgentSkills(projectDir) {
37
+ // Load manifest to filter to grimoire-managed agents
38
+ let manifest;
39
+ try {
40
+ manifest = readManifest(projectDir);
41
+ }
42
+ catch {
43
+ clack.log.error('No skills-manifest.json found. Run `grimoire add` first.');
44
+ process.exit(1);
45
+ }
46
+ const agentsDir = join(projectDir, '.claude', 'agents');
47
+ if (!existsSync(agentsDir)) {
48
+ clack.log.error('No agents installed. Run `grimoire add` first.');
49
+ process.exit(1);
50
+ }
51
+ // Build list of grimoire-managed agents
52
+ const managedNames = new Set(Object.keys(manifest.agents));
53
+ const agentFiles = readdirSync(agentsDir)
54
+ .filter((f) => f.endsWith('.md'))
55
+ .filter((f) => {
56
+ const fsName = f.replace(/\.md$/, '');
57
+ return managedNames.has(fsName) ||
58
+ [...managedNames].some((key) => key.endsWith(`.${fsName}`));
59
+ })
60
+ .sort();
61
+ if (agentFiles.length === 0) {
62
+ console.log('No grimoire-managed agents found. Run `grimoire add` to install agents.');
63
+ return;
64
+ }
65
+ clack.intro('Agent Skills');
66
+ // Select an agent
67
+ const agentOptions = agentFiles.map((f) => {
68
+ const fsName = f.replace(/\.md$/, '');
69
+ const meta = readAgentMeta(join(agentsDir, f));
70
+ return {
71
+ value: fsName,
72
+ label: fsName,
73
+ hint: meta.description.length > 80 ? meta.description.slice(0, 80) + '…' : meta.description,
74
+ };
75
+ });
76
+ const selectedAgent = await clack.select({
77
+ message: 'Select an agent to manage skills:',
78
+ options: agentOptions,
79
+ });
80
+ if (clack.isCancel(selectedAgent)) {
81
+ clack.cancel('Cancelled.');
82
+ return;
83
+ }
84
+ const agentName = selectedAgent;
85
+ await runAgentSkillsFor(projectDir, agentName);
86
+ clack.outro('Done.');
87
+ }
88
+ /**
89
+ * Runs the skill add/remove action loop for a specific agent.
90
+ * Used by both the standalone `agent-skills` command and the unified `list` flow.
91
+ */
92
+ export async function runAgentSkillsFor(projectDir, agentName) {
93
+ const agentPath = join(projectDir, '.claude', 'agents', `${agentName}.md`);
94
+ const content = readFileSync(agentPath, 'utf-8');
95
+ const currentSkills = parseAgentSkills(content);
96
+ if (currentSkills.length > 0) {
97
+ clack.log.info(`Current skills: ${currentSkills.join(', ')}`);
98
+ }
99
+ else {
100
+ clack.log.info('No skills assigned.');
101
+ }
102
+ const action = await clack.select({
103
+ message: 'What would you like to do?',
104
+ options: [
105
+ { value: 'add', label: 'Add skills' },
106
+ { value: 'remove', label: 'Remove skills', ...(currentSkills.length === 0 && { hint: 'none to remove' }) },
107
+ { value: 'done', label: 'Done' },
108
+ ],
109
+ });
110
+ if (clack.isCancel(action) || action === 'done')
111
+ return;
112
+ if (action === 'add') {
113
+ const available = scanAvailableSkills(projectDir);
114
+ const currentSet = new Set(currentSkills);
115
+ const addable = available.filter((s) => !currentSet.has(s.name));
116
+ if (addable.length === 0) {
117
+ clack.log.warn('No additional skills available to add.');
118
+ return;
119
+ }
120
+ const selected = await clack.multiselect({
121
+ message: 'Select skills to add:',
122
+ options: addable.map((s) => ({
123
+ value: s.name,
124
+ label: s.name,
125
+ hint: s.description.length > 80 ? s.description.slice(0, 80) + '…' : s.description,
126
+ })),
127
+ required: false,
128
+ });
129
+ if (clack.isCancel(selected))
130
+ return;
131
+ const toAdd = selected;
132
+ if (toAdd.length > 0) {
133
+ const updated = updateAgentSkills(content, [...currentSkills, ...toAdd]);
134
+ writeFileSync(agentPath, updated);
135
+ clack.log.success(`Added ${toAdd.length} skill(s).`);
136
+ }
137
+ }
138
+ if (action === 'remove') {
139
+ if (currentSkills.length === 0) {
140
+ clack.log.warn('No skills to remove.');
141
+ return;
142
+ }
143
+ const selected = await clack.multiselect({
144
+ message: 'Select skills to remove:',
145
+ options: currentSkills.map((s) => ({ value: s, label: s })),
146
+ required: false,
147
+ });
148
+ if (clack.isCancel(selected))
149
+ return;
150
+ const toRemove = new Set(selected);
151
+ if (toRemove.size > 0) {
152
+ const remaining = currentSkills.filter((s) => !toRemove.has(s));
153
+ const updated = updateAgentSkills(content, remaining);
154
+ writeFileSync(agentPath, updated);
155
+ clack.log.success(`Removed ${toRemove.size} skill(s).`);
156
+ }
157
+ }
158
+ }
159
+ //# sourceMappingURL=agent-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-skills.js","sourceRoot":"","sources":["../../src/commands/agent-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `grimoire config` — interactive menu for global Grimoire settings.
3
+ */
4
+ export declare function runConfig(projectDir: string, options?: {
5
+ quiet?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DhG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * `grimoire config` — interactive menu for global Grimoire settings.
3
+ */
4
+ import * as clack from '@clack/prompts';
5
+ import { readGrimoireConfig, writeGrimoireConfig } from '../grimoire-config.js';
6
+ import { readManifest, ensureEnforceHooks, removeEnforceHooks } from '../enforce.js';
7
+ export async function runConfig(projectDir, options) {
8
+ if (!options?.quiet)
9
+ clack.intro('Grimoire configuration');
10
+ const config = readGrimoireConfig(projectDir);
11
+ // Collect agents with file_patterns for enforcement info
12
+ let agentsWithPatterns = [];
13
+ try {
14
+ const manifest = readManifest(projectDir);
15
+ agentsWithPatterns = Object.entries(manifest.agents)
16
+ .filter(([, entry]) => entry.file_patterns && entry.file_patterns.length > 0)
17
+ .map(([name]) => name);
18
+ }
19
+ catch {
20
+ // No manifest — enforcement won't list any agents
21
+ }
22
+ const enforcementHint = agentsWithPatterns.length > 0
23
+ ? `${agentsWithPatterns.length} agent(s) with file patterns`
24
+ : 'no agents with file patterns';
25
+ const selected = await clack.multiselect({
26
+ message: 'Toggle features',
27
+ options: [
28
+ {
29
+ value: 'enforcement',
30
+ label: 'Agent enforcement',
31
+ hint: enforcementHint,
32
+ },
33
+ ],
34
+ initialValues: config.enforcement ? ['enforcement'] : [],
35
+ required: false,
36
+ });
37
+ if (clack.isCancel(selected)) {
38
+ if (!options?.quiet)
39
+ clack.outro('Cancelled.');
40
+ return;
41
+ }
42
+ const enforcementEnabled = selected.includes('enforcement');
43
+ const changed = enforcementEnabled !== (config.enforcement ?? false);
44
+ if (!changed) {
45
+ if (!options?.quiet)
46
+ clack.outro('No changes.');
47
+ return;
48
+ }
49
+ config.enforcement = enforcementEnabled;
50
+ writeGrimoireConfig(projectDir, config);
51
+ if (enforcementEnabled) {
52
+ ensureEnforceHooks(projectDir, agentsWithPatterns);
53
+ clack.log.success('Enforcement enabled.');
54
+ }
55
+ else {
56
+ removeEnforceHooks(projectDir);
57
+ clack.log.success('Enforcement disabled.');
58
+ }
59
+ if (!options?.quiet)
60
+ clack.outro('Configuration saved.');
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,OAA6B;IAC/E,IAAI,CAAC,OAAO,EAAE,KAAK;QAAE,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE9C,yDAAyD;IACzD,IAAI,kBAAkB,GAAa,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1C,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;aACjD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;aAC5E,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC;QACnD,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,8BAA8B;QAC5D,CAAC,CAAC,8BAA8B,CAAC;IAEnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACvC,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,aAAsB;gBAC7B,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,eAAe;aACtB;SACF;QACD,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAsB,CAAC,CAAC,CAAC,CAAC,EAAE;QACjE,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,kBAAkB,GAAI,QAAqB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,kBAAkB,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IAErE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAC;IACxC,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,kBAAkB,EAAE,CAAC;QACvB,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,KAAK;QAAE,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC3D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAgGA,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgI/D"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAsKA,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsM/D"}