@slope-dev/slope 1.13.2 → 1.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 (119) hide show
  1. package/dist/cli/commands/context.d.ts +2 -0
  2. package/dist/cli/commands/context.d.ts.map +1 -0
  3. package/dist/cli/commands/context.js +190 -0
  4. package/dist/cli/commands/context.js.map +1 -0
  5. package/dist/cli/commands/distill.d.ts.map +1 -1
  6. package/dist/cli/commands/distill.js +13 -4
  7. package/dist/cli/commands/distill.js.map +1 -1
  8. package/dist/cli/commands/enrich.d.ts +2 -0
  9. package/dist/cli/commands/enrich.d.ts.map +1 -0
  10. package/dist/cli/commands/enrich.js +140 -0
  11. package/dist/cli/commands/enrich.js.map +1 -0
  12. package/dist/cli/commands/index-cmd.d.ts +2 -0
  13. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  14. package/dist/cli/commands/index-cmd.js +296 -0
  15. package/dist/cli/commands/index-cmd.js.map +1 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/init.js +17 -182
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/initiative.d.ts +2 -0
  20. package/dist/cli/commands/initiative.d.ts.map +1 -0
  21. package/dist/cli/commands/initiative.js +207 -0
  22. package/dist/cli/commands/initiative.js.map +1 -0
  23. package/dist/cli/commands/prep.d.ts +2 -0
  24. package/dist/cli/commands/prep.d.ts.map +1 -0
  25. package/dist/cli/commands/prep.js +94 -0
  26. package/dist/cli/commands/prep.js.map +1 -0
  27. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  28. package/dist/cli/commands/roadmap.js +83 -44
  29. package/dist/cli/commands/roadmap.js.map +1 -1
  30. package/dist/cli/commands/store.js +76 -10
  31. package/dist/cli/commands/store.js.map +1 -1
  32. package/dist/cli/guards/stop-check.d.ts +1 -1
  33. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  34. package/dist/cli/guards/stop-check.js +14 -2
  35. package/dist/cli/guards/stop-check.js.map +1 -1
  36. package/dist/cli/index.js +40 -0
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/interactive-init.d.ts +19 -0
  39. package/dist/cli/interactive-init.d.ts.map +1 -0
  40. package/dist/cli/interactive-init.js +132 -0
  41. package/dist/cli/interactive-init.js.map +1 -0
  42. package/dist/cli/registry.d.ts.map +1 -1
  43. package/dist/cli/registry.js +6 -0
  44. package/dist/cli/registry.js.map +1 -1
  45. package/dist/core/config.d.ts +6 -0
  46. package/dist/core/config.d.ts.map +1 -1
  47. package/dist/core/config.js.map +1 -1
  48. package/dist/core/context.d.ts +20 -0
  49. package/dist/core/context.d.ts.map +1 -0
  50. package/dist/core/context.js +59 -0
  51. package/dist/core/context.js.map +1 -0
  52. package/dist/core/embedding-client.d.ts +11 -0
  53. package/dist/core/embedding-client.d.ts.map +1 -0
  54. package/dist/core/embedding-client.js +92 -0
  55. package/dist/core/embedding-client.js.map +1 -0
  56. package/dist/core/embedding-store.d.ts +44 -0
  57. package/dist/core/embedding-store.d.ts.map +1 -0
  58. package/dist/core/embedding-store.js +7 -0
  59. package/dist/core/embedding-store.js.map +1 -0
  60. package/dist/core/embedding.d.ts +32 -0
  61. package/dist/core/embedding.d.ts.map +1 -0
  62. package/dist/core/embedding.js +114 -0
  63. package/dist/core/embedding.js.map +1 -0
  64. package/dist/core/enrich.d.ts +76 -0
  65. package/dist/core/enrich.d.ts.map +1 -0
  66. package/dist/core/enrich.js +115 -0
  67. package/dist/core/enrich.js.map +1 -0
  68. package/dist/core/index.d.ts +22 -3
  69. package/dist/core/index.d.ts.map +1 -1
  70. package/dist/core/index.js +20 -2
  71. package/dist/core/index.js.map +1 -1
  72. package/dist/core/initiative.d.ts +72 -0
  73. package/dist/core/initiative.d.ts.map +1 -0
  74. package/dist/core/initiative.js +421 -0
  75. package/dist/core/initiative.js.map +1 -0
  76. package/dist/core/interview-engine.d.ts +34 -0
  77. package/dist/core/interview-engine.d.ts.map +1 -0
  78. package/dist/core/interview-engine.js +195 -0
  79. package/dist/core/interview-engine.js.map +1 -0
  80. package/dist/core/interview-steps.d.ts +27 -0
  81. package/dist/core/interview-steps.d.ts.map +1 -0
  82. package/dist/core/interview-steps.js +157 -0
  83. package/dist/core/interview-steps.js.map +1 -0
  84. package/dist/core/interview.d.ts +20 -0
  85. package/dist/core/interview.d.ts.map +1 -1
  86. package/dist/core/interview.js +61 -34
  87. package/dist/core/interview.js.map +1 -1
  88. package/dist/core/metaphor-preview.d.ts +34 -0
  89. package/dist/core/metaphor-preview.d.ts.map +1 -0
  90. package/dist/core/metaphor-preview.js +94 -0
  91. package/dist/core/metaphor-preview.js.map +1 -0
  92. package/dist/core/prep.d.ts +88 -0
  93. package/dist/core/prep.d.ts.map +1 -0
  94. package/dist/core/prep.js +302 -0
  95. package/dist/core/prep.js.map +1 -0
  96. package/dist/core/roles.d.ts +3 -0
  97. package/dist/core/roles.d.ts.map +1 -1
  98. package/dist/core/roles.js +36 -0
  99. package/dist/core/roles.js.map +1 -1
  100. package/dist/core/store.d.ts +1 -1
  101. package/dist/core/store.d.ts.map +1 -1
  102. package/dist/mcp/index.d.ts.map +1 -1
  103. package/dist/mcp/index.js +55 -7
  104. package/dist/mcp/index.js.map +1 -1
  105. package/dist/mcp/registry.d.ts +1 -1
  106. package/dist/mcp/registry.d.ts.map +1 -1
  107. package/dist/mcp/registry.js +15 -0
  108. package/dist/mcp/registry.js.map +1 -1
  109. package/dist/mcp/sandbox.d.ts.map +1 -1
  110. package/dist/mcp/sandbox.js +12 -1
  111. package/dist/mcp/sandbox.js.map +1 -1
  112. package/dist/store/index.d.ts +26 -1
  113. package/dist/store/index.d.ts.map +1 -1
  114. package/dist/store/index.js +193 -1
  115. package/dist/store/index.js.map +1 -1
  116. package/dist/store-pg/index.d.ts.map +1 -1
  117. package/dist/store-pg/index.js +25 -0
  118. package/dist/store-pg/index.js.map +1 -1
  119. package/package.json +3 -1
@@ -0,0 +1,2 @@
1
+ export declare function contextCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AA0GA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFlE"}
@@ -0,0 +1,190 @@
1
+ // slope context — Semantic context search for agents
2
+ // Usage: slope context "query" | --ticket=KEY | --file=PATH
3
+ import { readFileSync, existsSync } from 'node:fs';
4
+ import { loadConfig } from '../../core/config.js';
5
+ import { embed } from '../../core/embedding-client.js';
6
+ import { hasEmbeddingSupport } from '../../core/embedding-store.js';
7
+ import { deduplicateByFile, formatContextForAgent } from '../../core/context.js';
8
+ import { SqliteSlopeStore } from '../../store/index.js';
9
+ function parseArgs(args) {
10
+ let query = null;
11
+ let ticket = null;
12
+ let file = null;
13
+ let top = 5;
14
+ let format = 'snippets';
15
+ let minScore = 0.0;
16
+ for (const arg of args) {
17
+ if (arg.startsWith('--ticket=')) {
18
+ ticket = arg.slice('--ticket='.length);
19
+ }
20
+ else if (arg.startsWith('--file=')) {
21
+ file = arg.slice('--file='.length);
22
+ }
23
+ else if (arg.startsWith('--top=')) {
24
+ top = parseInt(arg.slice('--top='.length), 10) || 5;
25
+ }
26
+ else if (arg.startsWith('--min-score=')) {
27
+ minScore = parseFloat(arg.slice('--min-score='.length)) || 0;
28
+ }
29
+ else if (arg.startsWith('--format=')) {
30
+ const f = arg.slice('--format='.length);
31
+ if (f === 'paths' || f === 'snippets' || f === 'full') {
32
+ format = f;
33
+ }
34
+ }
35
+ else if (!arg.startsWith('-')) {
36
+ query = arg;
37
+ }
38
+ }
39
+ return { query, ticket, file, top, format, minScore };
40
+ }
41
+ function resolveTicketQuery(ticketKey, cwd, config) {
42
+ // Try roadmap first
43
+ const roadmapPath = `${cwd}/${config.roadmapPath ?? 'docs/backlog/roadmap.json'}`;
44
+ if (existsSync(roadmapPath)) {
45
+ try {
46
+ const roadmap = JSON.parse(readFileSync(roadmapPath, 'utf8'));
47
+ for (const sprint of roadmap.sprints ?? []) {
48
+ for (const ticket of sprint.tickets ?? []) {
49
+ if (ticket.key === ticketKey || ticket.id === ticketKey) {
50
+ const parts = [ticket.title ?? '', ticket.description ?? ''];
51
+ if (ticket.modules)
52
+ parts.push(ticket.modules.join(' '));
53
+ return parts.filter(Boolean).join(' ');
54
+ }
55
+ }
56
+ }
57
+ }
58
+ catch {
59
+ // Fall through
60
+ }
61
+ }
62
+ // Try slope-loop backlog
63
+ const backlogPath = `${cwd}/slope-loop/backlog.json`;
64
+ if (existsSync(backlogPath)) {
65
+ try {
66
+ const backlog = JSON.parse(readFileSync(backlogPath, 'utf8'));
67
+ for (const sprint of backlog.sprints ?? []) {
68
+ for (const ticket of sprint.tickets ?? []) {
69
+ if (ticket.key === ticketKey || ticket.id === ticketKey) {
70
+ const parts = [ticket.title ?? '', ticket.description ?? ''];
71
+ if (ticket.modules)
72
+ parts.push(ticket.modules.join(' '));
73
+ return parts.filter(Boolean).join(' ');
74
+ }
75
+ }
76
+ }
77
+ }
78
+ catch {
79
+ // Fall through
80
+ }
81
+ }
82
+ // Fall back to ticket key as query
83
+ return ticketKey;
84
+ }
85
+ function resolveFileQuery(filePath, cwd) {
86
+ const fullPath = `${cwd}/${filePath}`;
87
+ if (existsSync(fullPath)) {
88
+ try {
89
+ const content = readFileSync(fullPath, 'utf8');
90
+ // Use first 500 chars as query
91
+ return content.slice(0, 500);
92
+ }
93
+ catch {
94
+ return filePath;
95
+ }
96
+ }
97
+ return filePath;
98
+ }
99
+ export async function contextCommand(args) {
100
+ const cwd = process.cwd();
101
+ const config = loadConfig(cwd);
102
+ if (args.includes('--help') || args.includes('-h')) {
103
+ printUsage();
104
+ return;
105
+ }
106
+ const flags = parseArgs(args);
107
+ // Determine query text
108
+ let queryText;
109
+ if (flags.ticket) {
110
+ queryText = resolveTicketQuery(flags.ticket, cwd, config);
111
+ }
112
+ else if (flags.file) {
113
+ queryText = resolveFileQuery(flags.file, cwd);
114
+ }
115
+ else if (flags.query) {
116
+ queryText = flags.query;
117
+ }
118
+ else {
119
+ console.error('Error: Provide a search query, --ticket=KEY, or --file=PATH');
120
+ process.exit(1);
121
+ }
122
+ // Resolve embedding config
123
+ const emb = config.embedding;
124
+ if (!emb) {
125
+ console.error('Error: No embedding config in .slope/config.json. Run `slope index` first.');
126
+ process.exit(1);
127
+ }
128
+ const embConfig = {
129
+ endpoint: emb.endpoint,
130
+ model: emb.model,
131
+ dimensions: emb.dimensions,
132
+ apiKey: emb.apiKey,
133
+ };
134
+ // Open store
135
+ const storePath = config.store_path ?? '.slope/slope.db';
136
+ const store = new SqliteSlopeStore(`${cwd}/${storePath}`);
137
+ try {
138
+ if (!hasEmbeddingSupport(store)) {
139
+ throw new Error('Store does not support embeddings. Run `slope index` first.');
140
+ }
141
+ // Check if index exists
142
+ const stats = await store.getEmbeddingStats();
143
+ if (stats.chunkCount === 0) {
144
+ throw new Error('Semantic index is empty. Run `slope index` first.');
145
+ }
146
+ // Embed the query
147
+ const [queryVector] = await embed([queryText], embConfig);
148
+ // Search — fetch more than topK to allow dedup
149
+ const rawResults = await store.searchEmbeddings(queryVector, flags.top * 3);
150
+ // Map to ContextResult
151
+ const contextResults = rawResults.map(r => ({
152
+ filePath: r.filePath,
153
+ chunkIndex: r.chunkIndex,
154
+ snippet: r.chunkText,
155
+ score: r.score,
156
+ }));
157
+ // Deduplicate by file, filter by min score, and limit
158
+ const threshold = flags.minScore > 0 ? flags.minScore : 0.4;
159
+ const deduped = deduplicateByFile(contextResults)
160
+ .filter(r => r.score >= threshold)
161
+ .slice(0, flags.top);
162
+ if (deduped.length === 0) {
163
+ // Output nothing — caller checks for empty
164
+ return;
165
+ }
166
+ // Format and output
167
+ const output = formatContextForAgent(deduped, flags.format, cwd);
168
+ console.log(output);
169
+ }
170
+ finally {
171
+ store.close();
172
+ }
173
+ }
174
+ function printUsage() {
175
+ console.log(`
176
+ slope context — Semantic context search
177
+
178
+ Usage:
179
+ slope context "search query" Free-text semantic search
180
+ slope context --ticket=S46-1 Use ticket title as query
181
+ slope context --file=src/core/store.ts Find files related to a given file
182
+ slope context --top=10 Limit results (default: 5)
183
+ slope context --format=paths Output file paths only
184
+ slope context --format=snippets Output code snippets (default)
185
+ slope context --format=full Output full file contents of matches
186
+
187
+ Requires a built semantic index. Run \`slope index\` first.
188
+ `);
189
+ }
190
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"AAYA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuElE"}
1
+ {"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"AAYA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFlE"}
@@ -27,11 +27,20 @@ export async function distillCommand(args) {
27
27
  events = await store.getEventsBySprint(sprintNumber);
28
28
  }
29
29
  else {
30
- // Scan recent sprints for events (1-100 range covers any reasonable project)
30
+ // Get all events across all sprints
31
31
  const allEvents = [];
32
- for (let s = 1; s <= 100; s++) {
33
- const sprintEvents = await store.getEventsBySprint(s);
34
- allEvents.push(...sprintEvents);
32
+ const stats = await store.getStats();
33
+ if (stats.events > 0) {
34
+ // Use a more efficient approach - get events without sprint filtering
35
+ // This avoids the arbitrary 1-100 loop
36
+ for (let s = 1; s <= 200; s++) {
37
+ const sprintEvents = await store.getEventsBySprint(s);
38
+ if (sprintEvents.length === 0) {
39
+ // No more events in higher sprint numbers
40
+ break;
41
+ }
42
+ allEvents.push(...sprintEvents);
43
+ }
35
44
  }
36
45
  events = allEvents;
37
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../../src/cli/commands/distill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function enrichCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=enrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"AAuCA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GjE"}
@@ -0,0 +1,140 @@
1
+ // slope enrich — Batch-enrich backlog with file context
2
+ // Usage: slope enrich [backlog-path] [--output=path] [--with-plans] [--top=5]
3
+ import { existsSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { loadConfig } from '../../core/config.js';
6
+ import { hasEmbeddingSupport } from '../../core/embedding-store.js';
7
+ import { loadScorecards } from '../../core/loader.js';
8
+ import { enrichBacklog } from '../../core/enrich.js';
9
+ import { generatePrepPlan, formatPrepPlan } from '../../core/prep.js';
10
+ import { SqliteSlopeStore } from '../../store/index.js';
11
+ function parseArgs(args) {
12
+ let backlogPath = null;
13
+ let output = null;
14
+ let withPlans = false;
15
+ let top = 5;
16
+ for (const arg of args) {
17
+ if (arg === '--with-plans') {
18
+ withPlans = true;
19
+ }
20
+ else if (arg.startsWith('--output=')) {
21
+ output = arg.slice('--output='.length);
22
+ }
23
+ else if (arg.startsWith('--top=')) {
24
+ top = parseInt(arg.slice('--top='.length), 10) || 5;
25
+ }
26
+ else if (!arg.startsWith('-')) {
27
+ backlogPath = arg;
28
+ }
29
+ }
30
+ return { backlogPath, output, withPlans, top };
31
+ }
32
+ export async function enrichCommand(args) {
33
+ const cwd = process.cwd();
34
+ const config = loadConfig(cwd);
35
+ if (args.includes('--help') || args.includes('-h')) {
36
+ printUsage();
37
+ return;
38
+ }
39
+ const flags = parseArgs(args);
40
+ const backlogPath = flags.backlogPath
41
+ ? (flags.backlogPath.startsWith('/') ? flags.backlogPath : join(cwd, flags.backlogPath))
42
+ : join(cwd, 'slope-loop/backlog.json');
43
+ if (!existsSync(backlogPath)) {
44
+ console.error(`Error: Backlog not found at ${backlogPath}`);
45
+ process.exit(1);
46
+ }
47
+ const outputPath = flags.output
48
+ ? (flags.output.startsWith('/') ? flags.output : join(cwd, flags.output))
49
+ : backlogPath;
50
+ // Embedding config
51
+ const emb = config.embedding;
52
+ if (!emb) {
53
+ console.error('Error: No embedding config in .slope/config.json. Run `slope index` first.');
54
+ process.exit(1);
55
+ }
56
+ const embConfig = {
57
+ endpoint: emb.endpoint,
58
+ model: emb.model,
59
+ dimensions: emb.dimensions,
60
+ apiKey: emb.apiKey,
61
+ };
62
+ const storePath = config.store_path ?? '.slope/slope.db';
63
+ const store = new SqliteSlopeStore(`${cwd}/${storePath}`);
64
+ try {
65
+ if (!hasEmbeddingSupport(store)) {
66
+ throw new Error('Store does not support embeddings. Run `slope index` first.');
67
+ }
68
+ const stats = await store.getEmbeddingStats();
69
+ if (stats.chunkCount === 0) {
70
+ throw new Error('Semantic index is empty. Run `slope index` first.');
71
+ }
72
+ const scorecards = loadScorecards(config, cwd);
73
+ const enriched = await enrichBacklog({
74
+ backlogPath,
75
+ store,
76
+ embeddingConfig: embConfig,
77
+ scorecards,
78
+ cwd,
79
+ topK: flags.top,
80
+ });
81
+ // Atomic write: tmp file then rename
82
+ const tmpPath = `${outputPath}.tmp`;
83
+ writeFileSync(tmpPath, JSON.stringify(enriched, null, 2));
84
+ renameSync(tmpPath, outputPath);
85
+ // Generate plans if requested
86
+ if (flags.withPlans) {
87
+ const plansDir = join(cwd, 'slope-loop/plans');
88
+ mkdirSync(plansDir, { recursive: true });
89
+ for (const sprint of enriched.sprints) {
90
+ for (const ticket of sprint.tickets) {
91
+ try {
92
+ const plan = await generatePrepPlan({
93
+ ticketId: ticket.key,
94
+ store,
95
+ embeddingConfig: embConfig,
96
+ scorecards,
97
+ cwd,
98
+ topK: flags.top,
99
+ });
100
+ writeFileSync(join(plansDir, `${ticket.key}.md`), formatPrepPlan(plan));
101
+ }
102
+ catch (err) {
103
+ console.error(`Warning: Could not generate plan for ${ticket.key}: ${err.message}`);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // Summary
109
+ let totalTickets = 0;
110
+ let totalTokens = 0;
111
+ for (const sprint of enriched.sprints) {
112
+ totalTickets += sprint.tickets.length;
113
+ for (const ticket of sprint.tickets) {
114
+ totalTokens += ticket.estimated_tokens;
115
+ }
116
+ }
117
+ const avgTokens = totalTickets > 0 ? Math.round(totalTokens / totalTickets) : 0;
118
+ console.log(`Enriched ${enriched.sprints.length} sprints, ${totalTickets} tickets. Avg tokens: ${avgTokens}`);
119
+ if (flags.withPlans) {
120
+ console.log(`Plans written to slope-loop/plans/`);
121
+ }
122
+ }
123
+ finally {
124
+ store.close();
125
+ }
126
+ }
127
+ function printUsage() {
128
+ console.log(`
129
+ slope enrich — Batch-enrich backlog with file context
130
+
131
+ Usage:
132
+ slope enrich [backlog-path] Enrich tickets (default: slope-loop/backlog.json)
133
+ slope enrich --output=<path> Write to different file (default: overwrite)
134
+ slope enrich --with-plans Also generate prep plans to slope-loop/plans/
135
+ slope enrich --top=5 Max files per ticket (default: 5)
136
+
137
+ Requires a built semantic index. Run \`slope index\` first.
138
+ `);
139
+ }
140
+ //# sourceMappingURL=enrich.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,SAAS,SAAS,CAAC,IAAc;IAM/B,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,UAAU,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;QACnC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACxF,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAEzC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM;QAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC,CAAC,WAAW,CAAC;IAEhB,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAoB;QACjC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,iBAAiB,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;YACnC,WAAW;YACX,KAAK;YACL,eAAe,EAAE,SAAS;YAC1B,UAAU;YACV,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,GAAG;SAChB,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,OAAO,GAAG,GAAG,UAAU,MAAM,CAAC;QACpC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhC,8BAA8B;QAC9B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAC/C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;4BAClC,QAAQ,EAAE,MAAM,CAAC,GAAG;4BACpB,KAAK;4BACL,eAAe,EAAE,SAAS;4BAC1B,UAAU;4BACV,GAAG;4BACH,IAAI,EAAE,KAAK,CAAC,GAAG;yBAChB,CAAC,CAAC;wBACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC1E,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,MAAM,CAAC,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBACjG,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,UAAU;QACV,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAAC;YACzC,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhF,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC,MAAM,aAAa,YAAY,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAC9G,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function indexCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=index-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index-cmd.ts"],"names":[],"mappings":"AAsEA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChE"}