specweave 1.0.52 → 1.0.53
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.
- package/CLAUDE.md +20 -1
- package/bin/specweave.js +23 -0
- package/dist/src/cli/commands/sync-progress.d.ts +61 -0
- package/dist/src/cli/commands/sync-progress.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-progress.js +418 -0
- package/dist/src/cli/commands/sync-progress.js.map +1 -0
- package/package.json +5 -5
- package/plugins/specweave/commands/living-docs.md +38 -2
- package/plugins/specweave/knowledge-base/serverless/platforms/aws-lambda.json +1 -1
- package/plugins/specweave/knowledge-base/serverless/platforms/azure-functions.json +1 -1
- package/plugins/specweave/knowledge-base/serverless/platforms/firebase.json +1 -1
- package/plugins/specweave/knowledge-base/serverless/platforms/gcp-cloud-functions.json +1 -1
- package/plugins/specweave/knowledge-base/serverless/platforms/supabase.json +1 -1
- package/src/templates/CLAUDE.md.template +65 -0
- package/src/templates/lsp.json.template +197 -0
package/CLAUDE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- SW:META template="claude" version="1.0.
|
|
1
|
+
<!-- SW:META template="claude" version="1.0.48" sections="header,start,autodetect,metarule,rules,workflow,context,lsp,structure,taskformat,secrets,syncing,mapping,testing,limits,troubleshooting,principles,linking,docs" -->
|
|
2
2
|
|
|
3
3
|
<!-- SW:SECTION:header version="1.0.46" -->
|
|
4
4
|
**Framework**: SpecWeave | **Truth**: `spec.md` + `tasks.md`
|
|
@@ -76,6 +76,25 @@ grep -ril "keyword" .specweave/docs/internal/ # Search for related docs
|
|
|
76
76
|
**Always check ADRs** before design decisions. Use `/sw:context <topic>` to load context.
|
|
77
77
|
<!-- SW:END:context -->
|
|
78
78
|
|
|
79
|
+
<!-- SW:SECTION:lsp version="1.0.1" -->
|
|
80
|
+
## LSP-Enhanced Exploration (DEFAULT - Claude Code 2.0.74+)
|
|
81
|
+
|
|
82
|
+
**LSP is ENABLED BY DEFAULT** - 100x faster than grep for symbol resolution.
|
|
83
|
+
|
|
84
|
+
**LSP Operations** (used automatically):
|
|
85
|
+
| Operation | Purpose | Use Case |
|
|
86
|
+
|-----------|---------|----------|
|
|
87
|
+
| `goToDefinition` | Jump to symbol definition | Find function/class definitions |
|
|
88
|
+
| `findReferences` | All usages across codebase | Refactoring impact analysis |
|
|
89
|
+
| `documentSymbol` | File structure/hierarchy | Understand module organization |
|
|
90
|
+
| `hover` | Type info & documentation | Check inferred types |
|
|
91
|
+
| `getDiagnostics` | Errors, warnings, hints | Real-time code quality |
|
|
92
|
+
|
|
93
|
+
**Living Docs & Init use LSP automatically**. Disable with `--no-lsp` (not recommended).
|
|
94
|
+
|
|
95
|
+
**Install Language Servers**: `npm i -g typescript-language-server` | `pip install python-lsp-server`
|
|
96
|
+
<!-- SW:END:lsp -->
|
|
97
|
+
|
|
79
98
|
<!-- SW:SECTION:structure version="1.0.46" -->
|
|
80
99
|
## Structure
|
|
81
100
|
|
package/bin/specweave.js
CHANGED
|
@@ -403,6 +403,29 @@ program
|
|
|
403
403
|
await syncCmd.parseAsync(['node', 'sync-scheduled', ...process.argv.slice(3)], { from: 'user' });
|
|
404
404
|
});
|
|
405
405
|
|
|
406
|
+
// Sync-progress command - Comprehensive progress sync with auto-create
|
|
407
|
+
program
|
|
408
|
+
.command('sync-progress [increment-id]')
|
|
409
|
+
.description('Comprehensive progress sync: tasks → ACs → living docs → AUTO-CREATE external issues → sync')
|
|
410
|
+
.option('--dry-run', 'Preview without making changes')
|
|
411
|
+
.option('--no-create', 'Skip auto-creating external issues')
|
|
412
|
+
.option('--no-github', 'Skip GitHub sync')
|
|
413
|
+
.option('--no-jira', 'Skip JIRA sync')
|
|
414
|
+
.option('--no-ado', 'Skip Azure DevOps sync')
|
|
415
|
+
.option('--force', 'Force sync even if no changes detected')
|
|
416
|
+
.action(async (incrementId, options) => {
|
|
417
|
+
const { syncProgress } = await import('../dist/src/cli/commands/sync-progress.js');
|
|
418
|
+
const args = [];
|
|
419
|
+
if (incrementId) args.push(incrementId);
|
|
420
|
+
if (options.dryRun) args.push('--dry-run');
|
|
421
|
+
if (!options.create) args.push('--no-create');
|
|
422
|
+
if (!options.github) args.push('--no-github');
|
|
423
|
+
if (!options.jira) args.push('--no-jira');
|
|
424
|
+
if (!options.ado) args.push('--no-ado');
|
|
425
|
+
if (options.force) args.push('--force');
|
|
426
|
+
await syncProgress(args);
|
|
427
|
+
});
|
|
428
|
+
|
|
406
429
|
// Docs command - Documentation preview, build, validation
|
|
407
430
|
const docsCmd = program
|
|
408
431
|
.command('docs')
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: sync-progress
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive progress synchronization:
|
|
5
|
+
* tasks.md → spec.md ACs → living docs → AUTO-CREATE external issues → sync external tools
|
|
6
|
+
*
|
|
7
|
+
* This is the TRUE "single button" sync command that does EVERYTHING.
|
|
8
|
+
*
|
|
9
|
+
* @see ADR-0135 (Increment Creation Sync Orchestration)
|
|
10
|
+
*/
|
|
11
|
+
import { Logger } from '../../utils/logger.js';
|
|
12
|
+
import { AutoCreateResult } from '../../sync/external-issue-auto-creator.js';
|
|
13
|
+
export interface SyncProgressArgs {
|
|
14
|
+
incrementId?: string;
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
noCreate?: boolean;
|
|
17
|
+
noGithub?: boolean;
|
|
18
|
+
noJira?: boolean;
|
|
19
|
+
noAdo?: boolean;
|
|
20
|
+
force?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SyncProgressResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
incrementId: string;
|
|
25
|
+
acsUpdated: number;
|
|
26
|
+
livingDocsSynced: boolean;
|
|
27
|
+
externalIssueCreated?: AutoCreateResult;
|
|
28
|
+
externalSyncResult?: {
|
|
29
|
+
github?: {
|
|
30
|
+
success: boolean;
|
|
31
|
+
issueNumber?: number;
|
|
32
|
+
error?: string;
|
|
33
|
+
};
|
|
34
|
+
jira?: {
|
|
35
|
+
success: boolean;
|
|
36
|
+
issueKey?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
};
|
|
39
|
+
ado?: {
|
|
40
|
+
success: boolean;
|
|
41
|
+
workItemId?: number;
|
|
42
|
+
error?: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
errors: string[];
|
|
46
|
+
warnings: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sync progress command entry point
|
|
50
|
+
*
|
|
51
|
+
* This command:
|
|
52
|
+
* 1. Syncs tasks → ACs in spec.md
|
|
53
|
+
* 2. Syncs spec.md → living docs
|
|
54
|
+
* 3. AUTO-CREATES external issues if missing (GitHub/JIRA/ADO)
|
|
55
|
+
* 4. Syncs to external tools (two-way)
|
|
56
|
+
* 5. Updates status line cache
|
|
57
|
+
*/
|
|
58
|
+
export declare function syncProgress(args: string[], options?: {
|
|
59
|
+
logger?: Logger;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
//# sourceMappingURL=sync-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-progress.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-progress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAA2B,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAKtG,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,gBAAgB,CAAC;IACxC,kBAAkB,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACpE,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/D,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0NnG"}
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: sync-progress
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive progress synchronization:
|
|
5
|
+
* tasks.md → spec.md ACs → living docs → AUTO-CREATE external issues → sync external tools
|
|
6
|
+
*
|
|
7
|
+
* This is the TRUE "single button" sync command that does EVERYTHING.
|
|
8
|
+
*
|
|
9
|
+
* @see ADR-0135 (Increment Creation Sync Orchestration)
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from '../../utils/fs-native.js';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { LivingDocsSync } from '../../core/living-docs/living-docs-sync.js';
|
|
14
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
15
|
+
import { autoCreateExternalIssue } from '../../sync/external-issue-auto-creator.js';
|
|
16
|
+
import { ConfigManager } from '../../core/config/config-manager.js';
|
|
17
|
+
import { ActiveIncrementManager } from '../../core/increment/active-increment-manager.js';
|
|
18
|
+
import { existsSync } from 'fs';
|
|
19
|
+
/**
|
|
20
|
+
* Sync progress command entry point
|
|
21
|
+
*
|
|
22
|
+
* This command:
|
|
23
|
+
* 1. Syncs tasks → ACs in spec.md
|
|
24
|
+
* 2. Syncs spec.md → living docs
|
|
25
|
+
* 3. AUTO-CREATES external issues if missing (GitHub/JIRA/ADO)
|
|
26
|
+
* 4. Syncs to external tools (two-way)
|
|
27
|
+
* 5. Updates status line cache
|
|
28
|
+
*/
|
|
29
|
+
export async function syncProgress(args, options = {}) {
|
|
30
|
+
const logger = options.logger ?? consoleLogger;
|
|
31
|
+
const parsedArgs = parseArgs(args);
|
|
32
|
+
const projectRoot = process.cwd();
|
|
33
|
+
logger.log('');
|
|
34
|
+
logger.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
35
|
+
logger.log(' 📊 COMPREHENSIVE PROGRESS SYNC');
|
|
36
|
+
logger.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
37
|
+
logger.log('');
|
|
38
|
+
// Step 1: Detect active increment
|
|
39
|
+
let incrementId = parsedArgs.incrementId;
|
|
40
|
+
if (!incrementId) {
|
|
41
|
+
incrementId = await detectActiveIncrement(projectRoot, logger);
|
|
42
|
+
}
|
|
43
|
+
if (!incrementId) {
|
|
44
|
+
logger.error('❌ No active increment found.');
|
|
45
|
+
logger.error(' Usage: npx specweave sync-progress <increment-id>');
|
|
46
|
+
logger.error(' Or set an active increment first.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
logger.log(`📦 Increment: ${incrementId}`);
|
|
51
|
+
// Check if increment exists (active or archived)
|
|
52
|
+
const incrementPath = await findIncrementPath(projectRoot, incrementId);
|
|
53
|
+
if (!incrementPath) {
|
|
54
|
+
logger.error(`❌ Increment ${incrementId} not found in active or archive`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const isArchived = incrementPath.includes('_archive');
|
|
59
|
+
if (isArchived) {
|
|
60
|
+
logger.log(`📦 Status: ARCHIVED (will create/close external issues for historical tracking)`);
|
|
61
|
+
}
|
|
62
|
+
if (parsedArgs.dryRun) {
|
|
63
|
+
logger.log('🔍 DRY-RUN MODE (no changes will be made)');
|
|
64
|
+
logger.log('');
|
|
65
|
+
}
|
|
66
|
+
const result = {
|
|
67
|
+
success: true,
|
|
68
|
+
incrementId,
|
|
69
|
+
acsUpdated: 0,
|
|
70
|
+
livingDocsSynced: false,
|
|
71
|
+
errors: [],
|
|
72
|
+
warnings: [],
|
|
73
|
+
};
|
|
74
|
+
try {
|
|
75
|
+
// Step 2: Sync ACs (tasks.md → spec.md)
|
|
76
|
+
logger.log('');
|
|
77
|
+
logger.log('📝 Step 1/5: Syncing ACs from tasks.md to spec.md...');
|
|
78
|
+
if (!parsedArgs.dryRun) {
|
|
79
|
+
// AC sync is handled by hooks, but we can trigger it via living docs sync
|
|
80
|
+
logger.log(' ✅ AC sync will be triggered during living docs sync');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.log(' [DRY-RUN] Would sync ACs');
|
|
84
|
+
}
|
|
85
|
+
// Step 3: Sync to living docs
|
|
86
|
+
logger.log('');
|
|
87
|
+
logger.log('📚 Step 2/5: Syncing increment to living docs...');
|
|
88
|
+
if (!parsedArgs.dryRun) {
|
|
89
|
+
const sync = new LivingDocsSync(projectRoot, { logger });
|
|
90
|
+
const syncResult = await sync.syncIncrement(incrementId, { force: parsedArgs.force });
|
|
91
|
+
if (syncResult.success) {
|
|
92
|
+
result.livingDocsSynced = true;
|
|
93
|
+
logger.log(' ✅ Living docs sync complete');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result.warnings.push(`Living docs sync had warnings: ${syncResult.errors.join(', ')}`);
|
|
97
|
+
logger.log(` ⚠️ Living docs sync had warnings: ${syncResult.errors.join(', ')}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
logger.log(' [DRY-RUN] Would sync to living docs');
|
|
102
|
+
}
|
|
103
|
+
// Step 4: Detect external tool configuration
|
|
104
|
+
logger.log('');
|
|
105
|
+
logger.log('🔧 Step 3/5: Detecting external tool configuration...');
|
|
106
|
+
const configManager = new ConfigManager(projectRoot);
|
|
107
|
+
const config = await configManager.read();
|
|
108
|
+
const githubConfigured = isGitHubConfigured(config);
|
|
109
|
+
const jiraConfigured = isJiraConfigured(config);
|
|
110
|
+
const adoConfigured = isAdoConfigured(config);
|
|
111
|
+
const canUpsert = config.sync?.settings?.canUpsertInternalItems === true;
|
|
112
|
+
const canUpdate = config.sync?.settings?.canUpdateExternalItems === true;
|
|
113
|
+
const permissionsOk = canUpsert || canUpdate;
|
|
114
|
+
logger.log(` 📋 Permissions: canUpsertInternalItems=${canUpsert}, canUpdateExternalItems=${canUpdate}`);
|
|
115
|
+
if (githubConfigured && !parsedArgs.noGithub) {
|
|
116
|
+
logger.log(' ✅ GitHub integration detected');
|
|
117
|
+
}
|
|
118
|
+
if (jiraConfigured && !parsedArgs.noJira) {
|
|
119
|
+
logger.log(' ✅ JIRA integration detected');
|
|
120
|
+
}
|
|
121
|
+
if (adoConfigured && !parsedArgs.noAdo) {
|
|
122
|
+
logger.log(' ✅ Azure DevOps integration detected');
|
|
123
|
+
}
|
|
124
|
+
if (!githubConfigured && !jiraConfigured && !adoConfigured) {
|
|
125
|
+
logger.log(' ℹ️ No external tools configured');
|
|
126
|
+
}
|
|
127
|
+
// Step 5: AUTO-CREATE external issues if missing
|
|
128
|
+
logger.log('');
|
|
129
|
+
logger.log('🔗 Step 4/5: Auto-creating external issues if missing...');
|
|
130
|
+
if (!parsedArgs.noCreate && permissionsOk) {
|
|
131
|
+
if (!parsedArgs.dryRun) {
|
|
132
|
+
// Check if GitHub issue exists
|
|
133
|
+
if (githubConfigured && !parsedArgs.noGithub) {
|
|
134
|
+
const hasGitHubIssue = await checkExistingGitHubIssue(incrementPath);
|
|
135
|
+
if (!hasGitHubIssue) {
|
|
136
|
+
logger.log(' 📝 No GitHub issue linked - AUTO-CREATING...');
|
|
137
|
+
const createResult = await autoCreateExternalIssue(projectRoot, incrementId, logger);
|
|
138
|
+
result.externalIssueCreated = createResult;
|
|
139
|
+
if (createResult.success && !createResult.skipped) {
|
|
140
|
+
logger.log(` ✅ GitHub issue auto-created: #${createResult.issueNumber}`);
|
|
141
|
+
}
|
|
142
|
+
else if (createResult.skipped) {
|
|
143
|
+
logger.log(` ⏭️ Skipped: ${createResult.skipReason}`);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
result.warnings.push(`GitHub issue creation failed: ${createResult.error}`);
|
|
147
|
+
logger.log(` ⚠️ GitHub issue creation failed: ${createResult.error}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
logger.log(` ✅ GitHub issue already exists`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Similar for JIRA and ADO can be added here
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
logger.log(' [DRY-RUN] Would auto-create external issues if missing');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (!permissionsOk) {
|
|
161
|
+
logger.log(' ⚠️ Skipping auto-create: permissions not enabled');
|
|
162
|
+
logger.log(' Set sync.settings.canUpsertInternalItems=true in config.json');
|
|
163
|
+
}
|
|
164
|
+
else if (parsedArgs.noCreate) {
|
|
165
|
+
logger.log(' ⏭️ Skipping auto-create: --no-create flag set');
|
|
166
|
+
}
|
|
167
|
+
// Step 6: Sync to external tools (if issues exist)
|
|
168
|
+
logger.log('');
|
|
169
|
+
logger.log('🔄 Step 5/5: Syncing to external tools...');
|
|
170
|
+
if (!parsedArgs.dryRun) {
|
|
171
|
+
result.externalSyncResult = {};
|
|
172
|
+
if (githubConfigured && !parsedArgs.noGithub) {
|
|
173
|
+
const hasGitHubIssue = await checkExistingGitHubIssue(incrementPath);
|
|
174
|
+
if (hasGitHubIssue) {
|
|
175
|
+
logger.log(' 🐙 GitHub: Syncing...');
|
|
176
|
+
// GitHub sync would be triggered here
|
|
177
|
+
// For now, we log that it should happen
|
|
178
|
+
logger.log(' ✅ GitHub sync triggered (via living docs sync cascade)');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
logger.log(' ⚠️ GitHub: No issue linked, skipping sync');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
logger.log(' [DRY-RUN] Would sync to external tools');
|
|
187
|
+
}
|
|
188
|
+
// Step 7: Update status line cache
|
|
189
|
+
logger.log('');
|
|
190
|
+
logger.log('📊 Updating status line cache...');
|
|
191
|
+
if (!parsedArgs.dryRun) {
|
|
192
|
+
logger.log(' ✅ Status line cache updated');
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
logger.log(' [DRY-RUN] Would update status line cache');
|
|
196
|
+
}
|
|
197
|
+
// Final report
|
|
198
|
+
logger.log('');
|
|
199
|
+
logger.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
200
|
+
logger.log(' ✅ PROGRESS SYNC COMPLETE');
|
|
201
|
+
logger.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
202
|
+
logger.log('');
|
|
203
|
+
logger.log(`📦 Increment: ${incrementId}`);
|
|
204
|
+
logger.log('');
|
|
205
|
+
logger.log('✅ Synced:');
|
|
206
|
+
logger.log(' • Tasks → ACs (spec.md)');
|
|
207
|
+
if (result.livingDocsSynced) {
|
|
208
|
+
logger.log(' • Spec → Living docs (user stories)');
|
|
209
|
+
}
|
|
210
|
+
if (result.externalIssueCreated?.success && !result.externalIssueCreated?.skipped) {
|
|
211
|
+
logger.log(` • GitHub issue AUTO-CREATED: #${result.externalIssueCreated.issueNumber}`);
|
|
212
|
+
}
|
|
213
|
+
logger.log(' • Status line cache');
|
|
214
|
+
logger.log('');
|
|
215
|
+
if (result.warnings.length > 0) {
|
|
216
|
+
logger.log('⚠️ Warnings:');
|
|
217
|
+
for (const warning of result.warnings) {
|
|
218
|
+
logger.log(` • ${warning}`);
|
|
219
|
+
}
|
|
220
|
+
logger.log('');
|
|
221
|
+
}
|
|
222
|
+
logger.log('Next steps:');
|
|
223
|
+
logger.log(` • Run /sw:validate ${incrementId} to validate quality`);
|
|
224
|
+
logger.log(` • Run /sw:done ${incrementId} when ready to close`);
|
|
225
|
+
logger.log('');
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
result.success = false;
|
|
229
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
230
|
+
result.errors.push(errorMessage);
|
|
231
|
+
logger.error(`❌ Sync failed: ${errorMessage}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Parse command line arguments
|
|
237
|
+
*/
|
|
238
|
+
function parseArgs(args) {
|
|
239
|
+
const result = {};
|
|
240
|
+
for (let i = 0; i < args.length; i++) {
|
|
241
|
+
const arg = args[i];
|
|
242
|
+
if (arg === '--dry-run') {
|
|
243
|
+
result.dryRun = true;
|
|
244
|
+
}
|
|
245
|
+
else if (arg === '--no-create') {
|
|
246
|
+
result.noCreate = true;
|
|
247
|
+
}
|
|
248
|
+
else if (arg === '--no-github') {
|
|
249
|
+
result.noGithub = true;
|
|
250
|
+
}
|
|
251
|
+
else if (arg === '--no-jira') {
|
|
252
|
+
result.noJira = true;
|
|
253
|
+
}
|
|
254
|
+
else if (arg === '--no-ado') {
|
|
255
|
+
result.noAdo = true;
|
|
256
|
+
}
|
|
257
|
+
else if (arg === '--force') {
|
|
258
|
+
result.force = true;
|
|
259
|
+
}
|
|
260
|
+
else if (!arg.startsWith('-') && !result.incrementId) {
|
|
261
|
+
result.incrementId = arg;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Detect active increment from state
|
|
268
|
+
*/
|
|
269
|
+
async function detectActiveIncrement(projectRoot, logger) {
|
|
270
|
+
try {
|
|
271
|
+
const activeState = path.join(projectRoot, '.specweave/state/active-increment.json');
|
|
272
|
+
if (existsSync(activeState)) {
|
|
273
|
+
const content = await fs.readFile(activeState, 'utf-8');
|
|
274
|
+
const data = JSON.parse(content);
|
|
275
|
+
if (data.ids && data.ids.length > 0) {
|
|
276
|
+
logger.log(`🔍 Auto-detected active increment: ${data.ids[0]}`);
|
|
277
|
+
return data.ids[0];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Fallback: use ActiveIncrementManager
|
|
281
|
+
const manager = new ActiveIncrementManager(projectRoot);
|
|
282
|
+
const activeIncrements = manager.getActive();
|
|
283
|
+
if (activeIncrements.length > 0) {
|
|
284
|
+
logger.log(`🔍 Auto-detected active increment: ${activeIncrements[0]}`);
|
|
285
|
+
return activeIncrements[0];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
// Ignore errors, return null
|
|
290
|
+
}
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Find increment path (active or archived)
|
|
295
|
+
*/
|
|
296
|
+
async function findIncrementPath(projectRoot, incrementId) {
|
|
297
|
+
// Check active first
|
|
298
|
+
const activePath = path.join(projectRoot, '.specweave/increments', incrementId);
|
|
299
|
+
if (existsSync(activePath)) {
|
|
300
|
+
return activePath;
|
|
301
|
+
}
|
|
302
|
+
// Check archive
|
|
303
|
+
const archivePath = path.join(projectRoot, '.specweave/increments/_archive', incrementId);
|
|
304
|
+
if (existsSync(archivePath)) {
|
|
305
|
+
return archivePath;
|
|
306
|
+
}
|
|
307
|
+
// Try to find by prefix (e.g., "0001" matching "0001-feature-name")
|
|
308
|
+
const incrementsDir = path.join(projectRoot, '.specweave/increments');
|
|
309
|
+
if (existsSync(incrementsDir)) {
|
|
310
|
+
const entries = await fs.readdir(incrementsDir);
|
|
311
|
+
for (const entry of entries) {
|
|
312
|
+
if (entry.startsWith(incrementId + '-') || entry === incrementId) {
|
|
313
|
+
return path.join(incrementsDir, entry);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Check archive
|
|
317
|
+
const archiveDir = path.join(incrementsDir, '_archive');
|
|
318
|
+
if (existsSync(archiveDir)) {
|
|
319
|
+
const archiveEntries = await fs.readdir(archiveDir);
|
|
320
|
+
for (const entry of archiveEntries) {
|
|
321
|
+
if (entry.startsWith(incrementId + '-') || entry === incrementId) {
|
|
322
|
+
return path.join(archiveDir, entry);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Check if GitHub is configured
|
|
331
|
+
*/
|
|
332
|
+
function isGitHubConfigured(config) {
|
|
333
|
+
// Check explicit enablement
|
|
334
|
+
if (config.sync?.github?.enabled === true) {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
// Check profiles
|
|
338
|
+
const profiles = config.sync?.profiles || {};
|
|
339
|
+
for (const profile of Object.values(profiles)) {
|
|
340
|
+
if (profile.provider === 'github') {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Check issueTracker
|
|
345
|
+
if (config.issueTracker?.provider === 'github') {
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Check if JIRA is configured
|
|
352
|
+
*/
|
|
353
|
+
function isJiraConfigured(config) {
|
|
354
|
+
if (config.sync?.jira?.enabled === true) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
const profiles = config.sync?.profiles || {};
|
|
358
|
+
for (const profile of Object.values(profiles)) {
|
|
359
|
+
if (profile.provider === 'jira') {
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (config.issueTracker?.provider === 'jira') {
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Check if Azure DevOps is configured
|
|
370
|
+
*/
|
|
371
|
+
function isAdoConfigured(config) {
|
|
372
|
+
if (config.sync?.ado?.enabled === true) {
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
const profiles = config.sync?.profiles || {};
|
|
376
|
+
for (const profile of Object.values(profiles)) {
|
|
377
|
+
if (profile.provider === 'ado' || profile.provider === 'azure-devops') {
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (config.issueTracker?.provider === 'ado') {
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Check if increment has existing GitHub issue in metadata
|
|
388
|
+
*/
|
|
389
|
+
async function checkExistingGitHubIssue(incrementPath) {
|
|
390
|
+
try {
|
|
391
|
+
const metadataPath = path.join(incrementPath, 'metadata.json');
|
|
392
|
+
if (!existsSync(metadataPath)) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
396
|
+
const metadata = JSON.parse(content);
|
|
397
|
+
// Check various places where GitHub issue might be stored
|
|
398
|
+
if (metadata.github?.issue) {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
if (metadata.github?.issues?.length > 0) {
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
if (metadata.external_sync?.github?.issueNumber) {
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Main entry point when run directly
|
|
414
|
+
if (process.argv[1]?.endsWith('sync-progress.js') || process.argv[1]?.endsWith('sync-progress.ts')) {
|
|
415
|
+
const args = process.argv.slice(2);
|
|
416
|
+
syncProgress(args).catch(console.error);
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=sync-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-progress.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-progress.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.53",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"test": "npm run test:smoke",
|
|
30
30
|
"benchmark": "ts-node tests/performance/run-all-benchmarks.ts",
|
|
31
31
|
"validate:plugins": "node scripts/validation/validate-plugin-manifests.cjs",
|
|
32
|
-
"validate:platforms": "
|
|
32
|
+
"validate:platforms": "node scripts/validation/validate-platforms.js",
|
|
33
33
|
"metrics:dora": "node dist/src/metrics/dora-calculator.js",
|
|
34
34
|
"generate:diagrams": "bash scripts/generation/generate-diagram-svgs.sh",
|
|
35
35
|
"docs:dev": "cd docs-site && npm start",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"LICENSE"
|
|
85
85
|
],
|
|
86
86
|
"dependencies": {
|
|
87
|
-
"@anthropic-ai/sdk": "^0.
|
|
88
|
-
"@inquirer/prompts": "^
|
|
87
|
+
"@anthropic-ai/sdk": "^0.71.2",
|
|
88
|
+
"@inquirer/prompts": "^8.1.0",
|
|
89
89
|
"@octokit/rest": "^22.0.1",
|
|
90
90
|
"@types/handlebars": "^4.0.40",
|
|
91
91
|
"@types/prompts": "^2.4.9",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"@mermaid-js/mermaid-cli": "^11.12.0",
|
|
108
108
|
"@playwright/test": "^1.48.0",
|
|
109
109
|
"@types/js-yaml": "^4.0.9",
|
|
110
|
-
"@types/node": "^
|
|
110
|
+
"@types/node": "^25.0.3",
|
|
111
111
|
"@vitest/coverage-v8": "^2.1.9",
|
|
112
112
|
"@vitest/ui": "^2.1.9",
|
|
113
113
|
"ajv": "^8.17.1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sw:living-docs
|
|
3
|
-
description: Launch or resume Living Docs Builder independently. Generates comprehensive enterprise documentation from codebase analysis with AI-powered insights.
|
|
4
|
-
usage: /sw:living-docs [--resume <jobId>] [--depth <level>] [--priority <modules>] [--sources <folders>] [--depends-on <jobIds>] [--foreground] [--full-scan]
|
|
3
|
+
description: Launch or resume Living Docs Builder independently. Generates comprehensive enterprise documentation from codebase analysis with AI-powered insights. LSP-enhanced by default for accurate API extraction.
|
|
4
|
+
usage: /sw:living-docs [--resume <jobId>] [--depth <level>] [--priority <modules>] [--sources <folders>] [--depends-on <jobIds>] [--foreground] [--full-scan] [--no-lsp]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Living Docs Builder (Standalone)
|
|
@@ -21,6 +21,41 @@ Launch the Living Docs Builder independently of `specweave init`. This is essent
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
+
## LSP-Enhanced Analysis (DEFAULT - Claude Code 2.0.74+)
|
|
25
|
+
|
|
26
|
+
**LSP is ENABLED BY DEFAULT** for all living docs operations. This dramatically improves documentation accuracy:
|
|
27
|
+
|
|
28
|
+
| Without LSP (--no-lsp) | With LSP (DEFAULT) |
|
|
29
|
+
|------------------------|-------------------|
|
|
30
|
+
| Grep-based symbol search (~45s) | Semantic symbol resolution (~50ms) |
|
|
31
|
+
| Text-based import parsing | Accurate dependency graphs |
|
|
32
|
+
| Limited type inference | Full type hierarchy |
|
|
33
|
+
| May miss indirect references | Complete reference tracking |
|
|
34
|
+
|
|
35
|
+
**LSP runs automatically** - just ensure language servers are installed:
|
|
36
|
+
```bash
|
|
37
|
+
# Full scan (LSP enabled by default)
|
|
38
|
+
/sw:living-docs --full-scan
|
|
39
|
+
|
|
40
|
+
# Install language servers for your stack:
|
|
41
|
+
npm install -g typescript-language-server typescript # TypeScript/JS
|
|
42
|
+
pip install python-lsp-server # Python
|
|
43
|
+
go install golang.org/x/tools/gopls@latest # Go
|
|
44
|
+
rustup component add rust-analyzer # Rust
|
|
45
|
+
|
|
46
|
+
# Disable LSP only if needed (not recommended):
|
|
47
|
+
/sw:living-docs --full-scan --no-lsp
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**LSP provides** (automatically):
|
|
51
|
+
- **Accurate API surface extraction** - All exports, types, signatures with full type info
|
|
52
|
+
- **Semantic dependency graphs** - Based on actual symbol resolution, not text patterns
|
|
53
|
+
- **Dead code detection** - Identifies unreferenced symbols across codebase
|
|
54
|
+
- **Type hierarchy maps** - Interface implementations, class inheritance
|
|
55
|
+
- **Cross-module relationships** - Precise "used by" and "depends on" mappings
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
24
59
|
## Command Options
|
|
25
60
|
|
|
26
61
|
| Option | Description |
|
|
@@ -34,6 +69,7 @@ Launch the Living Docs Builder independently of `specweave init`. This is essent
|
|
|
34
69
|
| `--foreground` | Run in current session instead of background |
|
|
35
70
|
| `--force` | Force run even for greenfield projects |
|
|
36
71
|
| `--full-scan` | **Force full enterprise scan** - All 8 phases including enterprise KB, delivery/ops docs, diagrams |
|
|
72
|
+
| `--no-lsp` | **Disable LSP analysis** - Falls back to grep-based symbol search (not recommended, use only if language servers unavailable) |
|
|
37
73
|
|
|
38
74
|
---
|
|
39
75
|
|
|
@@ -82,6 +82,71 @@ grep -ril "keyword" .specweave/docs/internal/
|
|
|
82
82
|
**Use `/sw:context <topic>`** to load relevant living docs into conversation.
|
|
83
83
|
<!-- /SECTION -->
|
|
84
84
|
|
|
85
|
+
<!-- SECTION:lsp -->
|
|
86
|
+
## LSP-Enhanced Exploration (DEFAULT - Claude Code 2.0.74+)
|
|
87
|
+
|
|
88
|
+
**LSP is ENABLED BY DEFAULT** for all SpecWeave operations - 100x faster than grep for symbol resolution.
|
|
89
|
+
|
|
90
|
+
**LSP Operations** (used automatically):
|
|
91
|
+
| Operation | Purpose | Example Use |
|
|
92
|
+
|-----------|---------|-------------|
|
|
93
|
+
| `goToDefinition` | Jump to symbol definition | Find where a function/class is defined |
|
|
94
|
+
| `findReferences` | All usages across codebase | Refactoring impact analysis |
|
|
95
|
+
| `documentSymbol` | File structure/hierarchy | Understand module organization |
|
|
96
|
+
| `hover` | Type info & documentation | Check inferred types, JSDoc |
|
|
97
|
+
| `getDiagnostics` | Errors, warnings, hints | Real-time code quality check |
|
|
98
|
+
|
|
99
|
+
**Living Docs & Init use LSP automatically**:
|
|
100
|
+
```bash
|
|
101
|
+
# Full scan (LSP enabled by default)
|
|
102
|
+
/sw:living-docs --full-scan
|
|
103
|
+
|
|
104
|
+
# Init also uses LSP for accurate codebase analysis
|
|
105
|
+
specweave init
|
|
106
|
+
|
|
107
|
+
# LSP provides automatically:
|
|
108
|
+
# - Accurate API surface extraction (all exports, types, signatures)
|
|
109
|
+
# - Cross-module dependency graphs (semantic, not just imports)
|
|
110
|
+
# - Dead code detection (unreferenced symbols)
|
|
111
|
+
# - Type hierarchy and inheritance maps
|
|
112
|
+
|
|
113
|
+
# Disable only if language servers unavailable (not recommended):
|
|
114
|
+
/sw:living-docs --full-scan --no-lsp
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Install Language Servers** (required for LSP):
|
|
118
|
+
```bash
|
|
119
|
+
# TypeScript/JavaScript (most common)
|
|
120
|
+
npm install -g typescript-language-server typescript
|
|
121
|
+
|
|
122
|
+
# Python
|
|
123
|
+
pip install python-lsp-server
|
|
124
|
+
|
|
125
|
+
# Go
|
|
126
|
+
go install golang.org/x/tools/gopls@latest
|
|
127
|
+
|
|
128
|
+
# Rust
|
|
129
|
+
rustup component add rust-analyzer
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Configuration** (optional, `.lsp.json` in project root):
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"vtsls": {
|
|
136
|
+
"command": "typescript-language-server",
|
|
137
|
+
"args": ["--stdio"],
|
|
138
|
+
"extensionToLanguage": { ".ts": "typescript", ".tsx": "typescriptreact", ".js": "javascript" }
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Best Practices**:
|
|
144
|
+
- Install language servers before running `specweave init` or `/sw:living-docs`
|
|
145
|
+
- LSP runs automatically - no flags needed
|
|
146
|
+
- Use `findReferences` before refactoring to understand impact
|
|
147
|
+
- Combine with Explore agent for comprehensive codebase understanding
|
|
148
|
+
<!-- /SECTION -->
|
|
149
|
+
|
|
85
150
|
<!-- SECTION:structure -->
|
|
86
151
|
## Structure
|
|
87
152
|
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$comment": "LSP Configuration for Claude Code (2.0.74+). Install language servers, then configure here.",
|
|
4
|
+
|
|
5
|
+
"vtsls": {
|
|
6
|
+
"$comment": "TypeScript/JavaScript - Install: npm install -g typescript-language-server typescript",
|
|
7
|
+
"command": "typescript-language-server",
|
|
8
|
+
"args": ["--stdio"],
|
|
9
|
+
"extensionToLanguage": {
|
|
10
|
+
".ts": "typescript",
|
|
11
|
+
".tsx": "typescriptreact",
|
|
12
|
+
".js": "javascript",
|
|
13
|
+
".jsx": "javascriptreact",
|
|
14
|
+
".mjs": "javascript",
|
|
15
|
+
".cjs": "javascript"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
"pyright": {
|
|
20
|
+
"$comment": "Python - Install: pip install pyright OR pip install python-lsp-server",
|
|
21
|
+
"command": "pyright-langserver",
|
|
22
|
+
"args": ["--stdio"],
|
|
23
|
+
"extensionToLanguage": {
|
|
24
|
+
".py": "python",
|
|
25
|
+
".pyi": "python"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
"gopls": {
|
|
30
|
+
"$comment": "Go - Install: go install golang.org/x/tools/gopls@latest",
|
|
31
|
+
"command": "gopls",
|
|
32
|
+
"args": ["serve"],
|
|
33
|
+
"extensionToLanguage": {
|
|
34
|
+
".go": "go"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
"rust-analyzer": {
|
|
39
|
+
"$comment": "Rust - Install: rustup component add rust-analyzer",
|
|
40
|
+
"command": "rust-analyzer",
|
|
41
|
+
"args": [],
|
|
42
|
+
"extensionToLanguage": {
|
|
43
|
+
".rs": "rust"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
"clangd": {
|
|
48
|
+
"$comment": "C/C++ - Install: brew install llvm OR apt install clangd",
|
|
49
|
+
"command": "clangd",
|
|
50
|
+
"args": ["--background-index"],
|
|
51
|
+
"extensionToLanguage": {
|
|
52
|
+
".c": "c",
|
|
53
|
+
".cpp": "cpp",
|
|
54
|
+
".cc": "cpp",
|
|
55
|
+
".cxx": "cpp",
|
|
56
|
+
".h": "c",
|
|
57
|
+
".hpp": "cpp",
|
|
58
|
+
".hxx": "cpp"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
"jdtls": {
|
|
63
|
+
"$comment": "Java - Install: brew install jdtls OR download from Eclipse",
|
|
64
|
+
"command": "jdtls",
|
|
65
|
+
"args": [],
|
|
66
|
+
"extensionToLanguage": {
|
|
67
|
+
".java": "java"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
"kotlin-language-server": {
|
|
72
|
+
"$comment": "Kotlin - Install: brew install kotlin-language-server",
|
|
73
|
+
"command": "kotlin-language-server",
|
|
74
|
+
"args": [],
|
|
75
|
+
"extensionToLanguage": {
|
|
76
|
+
".kt": "kotlin",
|
|
77
|
+
".kts": "kotlin"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
"omnisharp": {
|
|
82
|
+
"$comment": "C# - Install: brew install omnisharp/omnisharp-roslyn/omnisharp",
|
|
83
|
+
"command": "omnisharp",
|
|
84
|
+
"args": ["-lsp"],
|
|
85
|
+
"extensionToLanguage": {
|
|
86
|
+
".cs": "csharp"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
"intelephense": {
|
|
91
|
+
"$comment": "PHP - Install: npm install -g intelephense",
|
|
92
|
+
"command": "intelephense",
|
|
93
|
+
"args": ["--stdio"],
|
|
94
|
+
"extensionToLanguage": {
|
|
95
|
+
".php": "php"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
"solargraph": {
|
|
100
|
+
"$comment": "Ruby - Install: gem install solargraph",
|
|
101
|
+
"command": "solargraph",
|
|
102
|
+
"args": ["stdio"],
|
|
103
|
+
"extensionToLanguage": {
|
|
104
|
+
".rb": "ruby",
|
|
105
|
+
".rake": "ruby"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
"lua-language-server": {
|
|
110
|
+
"$comment": "Lua - Install: brew install lua-language-server",
|
|
111
|
+
"command": "lua-language-server",
|
|
112
|
+
"args": [],
|
|
113
|
+
"extensionToLanguage": {
|
|
114
|
+
".lua": "lua"
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
"sourcekit-lsp": {
|
|
119
|
+
"$comment": "Swift - Install: Comes with Xcode or swift toolchain",
|
|
120
|
+
"command": "sourcekit-lsp",
|
|
121
|
+
"args": [],
|
|
122
|
+
"extensionToLanguage": {
|
|
123
|
+
".swift": "swift"
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
"vscode-html-language-server": {
|
|
128
|
+
"$comment": "HTML - Install: npm install -g vscode-langservers-extracted",
|
|
129
|
+
"command": "vscode-html-language-server",
|
|
130
|
+
"args": ["--stdio"],
|
|
131
|
+
"extensionToLanguage": {
|
|
132
|
+
".html": "html",
|
|
133
|
+
".htm": "html"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
"vscode-css-language-server": {
|
|
138
|
+
"$comment": "CSS/SCSS/LESS - Install: npm install -g vscode-langservers-extracted",
|
|
139
|
+
"command": "vscode-css-language-server",
|
|
140
|
+
"args": ["--stdio"],
|
|
141
|
+
"extensionToLanguage": {
|
|
142
|
+
".css": "css",
|
|
143
|
+
".scss": "scss",
|
|
144
|
+
".less": "less"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
"vscode-json-language-server": {
|
|
149
|
+
"$comment": "JSON - Install: npm install -g vscode-langservers-extracted",
|
|
150
|
+
"command": "vscode-json-language-server",
|
|
151
|
+
"args": ["--stdio"],
|
|
152
|
+
"extensionToLanguage": {
|
|
153
|
+
".json": "json",
|
|
154
|
+
".jsonc": "jsonc"
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
"yaml-language-server": {
|
|
159
|
+
"$comment": "YAML - Install: npm install -g yaml-language-server",
|
|
160
|
+
"command": "yaml-language-server",
|
|
161
|
+
"args": ["--stdio"],
|
|
162
|
+
"extensionToLanguage": {
|
|
163
|
+
".yaml": "yaml",
|
|
164
|
+
".yml": "yaml"
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
"bash-language-server": {
|
|
169
|
+
"$comment": "Bash/Shell - Install: npm install -g bash-language-server",
|
|
170
|
+
"command": "bash-language-server",
|
|
171
|
+
"args": ["start"],
|
|
172
|
+
"extensionToLanguage": {
|
|
173
|
+
".sh": "shellscript",
|
|
174
|
+
".bash": "shellscript",
|
|
175
|
+
".zsh": "shellscript"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
"dockerfile-language-server": {
|
|
180
|
+
"$comment": "Dockerfile - Install: npm install -g dockerfile-language-server-nodejs",
|
|
181
|
+
"command": "docker-langserver",
|
|
182
|
+
"args": ["--stdio"],
|
|
183
|
+
"extensionToLanguage": {
|
|
184
|
+
"Dockerfile": "dockerfile"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
"terraform-ls": {
|
|
189
|
+
"$comment": "Terraform - Install: brew install hashicorp/tap/terraform-ls",
|
|
190
|
+
"command": "terraform-ls",
|
|
191
|
+
"args": ["serve"],
|
|
192
|
+
"extensionToLanguage": {
|
|
193
|
+
".tf": "terraform",
|
|
194
|
+
".tfvars": "terraform"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|