specweave 1.0.439 → 1.0.441
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-plugin/README.md +1 -1
- package/CLAUDE.md +1 -1
- package/README.md +28 -10
- package/bin/specweave.js +2 -2
- package/dist/src/adapters/codex/README.md +1 -1
- package/dist/src/adapters/gemini/README.md +1 -1
- package/dist/src/cli/helpers/init/claude-settings-lsp.js +1 -1
- package/dist/src/cli/helpers/init/claude-settings-lsp.js.map +1 -1
- package/dist/src/core/doctor/checkers/plugins-checker.d.ts.map +1 -1
- package/dist/src/core/doctor/checkers/plugins-checker.js +71 -35
- package/dist/src/core/doctor/checkers/plugins-checker.js.map +1 -1
- package/dist/src/core/repo-structure/setup-summary.js +1 -1
- package/dist/src/core/repo-structure/setup-summary.js.map +1 -1
- package/dist/src/core/tdd/index.d.ts +1 -1
- package/dist/src/core/tdd/index.js +1 -1
- package/dist/src/core/tdd/task-template-generator.d.ts +1 -1
- package/dist/src/core/tdd/task-template-generator.js +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +1 -1
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/locales/de/cli.json +1 -1
- package/dist/src/locales/en/cli.json +1 -1
- package/dist/src/locales/es/cli.json +1 -1
- package/dist/src/locales/fr/cli.json +1 -1
- package/dist/src/locales/ja/cli.json +1 -1
- package/dist/src/locales/ko/cli.json +1 -1
- package/dist/src/locales/pt/cli.json +1 -1
- package/dist/src/locales/ru/cli.json +1 -1
- package/dist/src/locales/zh/cli.json +1 -1
- package/dist/src/utils/plugin-copier.d.ts.map +1 -1
- package/dist/src/utils/plugin-copier.js +14 -3
- package/dist/src/utils/plugin-copier.js.map +1 -1
- package/package.json +2 -2
- package/plugins/specweave/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave/commands/import-external.md +4 -4
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/skills/pr/SKILL.md +1 -1
- package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +1 -0
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-github/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-jira/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-media/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-release/README.md +1 -1
- package/scripts/check-node-version.js +1 -1
- package/src/templates/AGENTS.md.template +1 -1
- package/src/templates/CLAUDE.md.template +1 -1
- package/src/templates/README.md.template +1 -1
- package/src/templates/config.json.template +1 -1
- package/src/templates/lsp-plugin/plugin.json +1 -1
- package/plugins/specweave/hooks/.specweave/logs/auto-iterations.log +0 -1
- package/plugins/specweave/hooks/.specweave/logs/auto-stop-reasons.log +0 -1
- package/plugins/specweave/skills/.specweave/logs/reflect/auto-reflect.log +0 -15
- package/plugins/specweave/skills/.specweave/logs/reflect/reflect.log +0 -3
- package/plugins/specweave/skills/.specweave/logs/stop-auto.log +0 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -180
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -1266
- package/plugins/specweave-github/lib/enhanced-github-sync.js +0 -249
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -150
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -1260
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
|
-
"url": "https://
|
|
7
|
+
"url": "https://verified-skill.com"
|
|
8
8
|
},
|
|
9
|
-
"homepage": "https://
|
|
9
|
+
"homepage": "https://verified-skill.com",
|
|
10
10
|
"repository": "https://github.com/anton-abyzov/specweave",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"keywords": [
|
|
@@ -499,7 +499,7 @@ See `/examples` directory for:
|
|
|
499
499
|
|
|
500
500
|
- **Issues**: https://github.com/anton-abyzov/specweave/issues
|
|
501
501
|
- **Discussions**: https://github.com/anton-abyzov/specweave/discussions
|
|
502
|
-
- **Website**: https://
|
|
502
|
+
- **Website**: https://verified-skill.com
|
|
503
503
|
|
|
504
504
|
---
|
|
505
505
|
|
|
@@ -116,7 +116,7 @@ if (!isVersionSatisfied(CURRENT_NODE_VERSION, MIN_NODE_VERSION)) {
|
|
|
116
116
|
console.error(getUpgradeInstructions());
|
|
117
117
|
console.error('');
|
|
118
118
|
console.error(`${BOLD}Full guide:${RESET}`);
|
|
119
|
-
console.error(` ${CYAN}${UNDERLINE}https://
|
|
119
|
+
console.error(` ${CYAN}${UNDERLINE}https://verified-skill.com/docs/guides/troubleshooting/common-errors#node-version-error${RESET}`);
|
|
120
120
|
console.error('');
|
|
121
121
|
console.error(`${DIM}After upgrading, run: npm install -g specweave${RESET}`);
|
|
122
122
|
console.error('');
|
|
@@ -425,7 +425,7 @@ specweave context projects
|
|
|
425
425
|
|----------|---------|
|
|
426
426
|
| CLAUDE.md | Quick reference (Claude Code) |
|
|
427
427
|
| AGENTS.md | This file (all AI tools) |
|
|
428
|
-
|
|
|
428
|
+
| verified-skill.com | Official documentation |
|
|
429
429
|
| .specweave/docs/ | Project-specific docs |
|
|
430
430
|
<!-- /SECTION -->
|
|
431
431
|
|
|
@@ -313,7 +313,7 @@ Pattern: IMPLEMENT → TEST → FAIL? → FIX → PASS → NEXT. STOP & ASK if s
|
|
|
313
313
|
<!-- SECTION:docs -->
|
|
314
314
|
## Docs
|
|
315
315
|
|
|
316
|
-
[
|
|
316
|
+
[verified-skill.com](https://verified-skill.com)
|
|
317
317
|
<!-- /SECTION -->
|
|
318
318
|
|
|
319
319
|
<!-- SECTION:non-claude -->
|
|
@@ -142,7 +142,7 @@ SpecWeave works with:
|
|
|
142
142
|
|
|
143
143
|
## 📚 Learn More
|
|
144
144
|
|
|
145
|
-
- **Documentation**: https://
|
|
145
|
+
- **Documentation**: https://verified-skill.com
|
|
146
146
|
- **GitHub**: https://github.com/anton-abyzov/specweave
|
|
147
147
|
- **Quick Reference**: See `CLAUDE.md` in your project
|
|
148
148
|
- **Examples**: Check `.specweave/docs/` after creating your first increment
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "Auto-configured LSP servers for code intelligence (go-to-definition, find-references, hover)",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave",
|
|
7
|
-
"url": "https://
|
|
7
|
+
"url": "https://verified-skill.com"
|
|
8
8
|
},
|
|
9
9
|
"keywords": ["lsp", "typescript", "python", "code-intelligence"]
|
|
10
10
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"timestamp":"2026-01-04T16:11:43Z","event":"session_stop","reason":"No auto session active","details":"approve_called:main","success":false,"iteration":0,"increment":"none"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"timestamp":"2026-01-04T16:11:43Z","sessionId":"unknown","reason":"No auto session active","details":"approve_called:main","success":false,"iteration":0,"increment":"none","testsRun":false,"testsPassed":0,"testsFailed":0}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ran": false,
|
|
3
|
-
"inputSummary": {
|
|
4
|
-
"transcriptLines": 266
|
|
5
|
-
},
|
|
6
|
-
"extracted": {
|
|
7
|
-
"skillLearnings": []
|
|
8
|
-
},
|
|
9
|
-
"written": {
|
|
10
|
-
"learningsAdded": 0,
|
|
11
|
-
"learningsSkippedDuplicate": 0
|
|
12
|
-
},
|
|
13
|
-
"durationMs": 1.4448749999999997,
|
|
14
|
-
"reason": "CLAUDE.md not found in project"
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[2026-02-03T22:03:06Z] APPROVE: No increments directory
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { AdoClientV2 } from "./ado-client-v2.js";
|
|
2
|
-
import { EnhancedContentBuilder } from "../../../src/core/sync/enhanced-content-builder.js";
|
|
3
|
-
import { SpecIncrementMapper } from "../../../src/core/sync/spec-increment-mapper.js";
|
|
4
|
-
import { parseSpecContent } from "../../../src/core/spec-content-sync.js";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import fs from "fs/promises";
|
|
7
|
-
async function syncSpecToAdoWithEnhancedContent(options) {
|
|
8
|
-
const { specPath, organization, project, dryRun = false, verbose = false } = options;
|
|
9
|
-
try {
|
|
10
|
-
const baseSpec = await parseSpecContent(specPath);
|
|
11
|
-
if (!baseSpec) {
|
|
12
|
-
return {
|
|
13
|
-
success: false,
|
|
14
|
-
action: "error",
|
|
15
|
-
error: "Failed to parse spec content"
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
if (verbose) {
|
|
19
|
-
console.log(`\u{1F4C4} Parsed spec: ${baseSpec.identifier.compact}`);
|
|
20
|
-
}
|
|
21
|
-
const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
|
|
22
|
-
const rootDir = await findSpecWeaveRoot(specPath);
|
|
23
|
-
const mapper = new SpecIncrementMapper(rootDir);
|
|
24
|
-
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
25
|
-
if (verbose) {
|
|
26
|
-
console.log(`\u{1F517} Found ${mapping.increments.length} related increments`);
|
|
27
|
-
}
|
|
28
|
-
const taskMapping = buildTaskMapping(mapping.increments, organization, project);
|
|
29
|
-
const architectureDocs = await findArchitectureDocs(rootDir, specId);
|
|
30
|
-
const enhancedSpec = {
|
|
31
|
-
...baseSpec,
|
|
32
|
-
summary: baseSpec.description,
|
|
33
|
-
taskMapping,
|
|
34
|
-
architectureDocs
|
|
35
|
-
};
|
|
36
|
-
const builder = new EnhancedContentBuilder();
|
|
37
|
-
const description = builder.buildExternalDescription(enhancedSpec);
|
|
38
|
-
if (verbose) {
|
|
39
|
-
console.log(`\u{1F4DD} Generated description: ${description.length} characters`);
|
|
40
|
-
}
|
|
41
|
-
if (dryRun) {
|
|
42
|
-
console.log("\u{1F50D} DRY RUN - Would create/update feature with:");
|
|
43
|
-
console.log(` Title: ${baseSpec.title}`);
|
|
44
|
-
console.log(` Description length: ${description.length}`);
|
|
45
|
-
return {
|
|
46
|
-
success: true,
|
|
47
|
-
action: "no-change",
|
|
48
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
if (!organization || !project) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
action: "error",
|
|
55
|
-
error: "Azure DevOps organization/project not specified"
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const profile = {
|
|
59
|
-
provider: "ado",
|
|
60
|
-
displayName: `${organization}/${project}`,
|
|
61
|
-
config: {
|
|
62
|
-
organization,
|
|
63
|
-
project
|
|
64
|
-
},
|
|
65
|
-
timeRange: { default: "1M", max: "6M" }
|
|
66
|
-
};
|
|
67
|
-
const pat = process.env.AZURE_DEVOPS_PAT || "";
|
|
68
|
-
const client = new AdoClientV2(profile, pat);
|
|
69
|
-
const existingFeature = await findExistingFeature(client, baseSpec.identifier.compact);
|
|
70
|
-
let result;
|
|
71
|
-
if (existingFeature) {
|
|
72
|
-
await client.updateWorkItem(existingFeature.id, {
|
|
73
|
-
title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
|
|
74
|
-
description
|
|
75
|
-
});
|
|
76
|
-
result = {
|
|
77
|
-
success: true,
|
|
78
|
-
action: "updated",
|
|
79
|
-
featureId: existingFeature.id,
|
|
80
|
-
featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${existingFeature.id}`,
|
|
81
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
82
|
-
};
|
|
83
|
-
} else {
|
|
84
|
-
const feature = await client.createEpic({
|
|
85
|
-
title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
|
|
86
|
-
description,
|
|
87
|
-
tags: ["spec", "external-tool-sync"]
|
|
88
|
-
});
|
|
89
|
-
result = {
|
|
90
|
-
success: true,
|
|
91
|
-
action: "created",
|
|
92
|
-
featureId: feature.id,
|
|
93
|
-
featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${feature.id}`,
|
|
94
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
if (verbose) {
|
|
98
|
-
console.log(`\u2705 ${result.action === "created" ? "Created" : "Updated"} feature #${result.featureId}`);
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
} catch (error) {
|
|
102
|
-
return {
|
|
103
|
-
success: false,
|
|
104
|
-
action: "error",
|
|
105
|
-
error: error.message
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
async function findSpecWeaveRoot(specPath) {
|
|
110
|
-
let currentDir = path.dirname(specPath);
|
|
111
|
-
while (true) {
|
|
112
|
-
const specweaveDir = path.join(currentDir, ".specweave");
|
|
113
|
-
try {
|
|
114
|
-
await fs.access(specweaveDir);
|
|
115
|
-
return currentDir;
|
|
116
|
-
} catch {
|
|
117
|
-
const parentDir = path.dirname(currentDir);
|
|
118
|
-
if (parentDir === currentDir) {
|
|
119
|
-
throw new Error(".specweave directory not found");
|
|
120
|
-
}
|
|
121
|
-
currentDir = parentDir;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
function buildTaskMapping(increments, organization, project) {
|
|
126
|
-
if (increments.length === 0) return void 0;
|
|
127
|
-
const firstIncrement = increments[0];
|
|
128
|
-
const tasks = firstIncrement.tasks.map((task) => ({
|
|
129
|
-
id: task.id,
|
|
130
|
-
title: task.title,
|
|
131
|
-
userStories: task.userStories
|
|
132
|
-
}));
|
|
133
|
-
// Derive repository name from git remote or fall back to project name
|
|
134
|
-
let repoName = project;
|
|
135
|
-
try {
|
|
136
|
-
const { execSync } = require("child_process");
|
|
137
|
-
const remoteUrl = execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
138
|
-
const match = remoteUrl.match(/\/([^/]+?)(?:\.git)?$/);
|
|
139
|
-
if (match) repoName = match[1];
|
|
140
|
-
} catch {
|
|
141
|
-
// Fallback to project name if git is unavailable
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
incrementId: firstIncrement.id,
|
|
145
|
-
tasks,
|
|
146
|
-
tasksUrl: `https://dev.azure.com/${organization}/${project}/_git/${repoName}?path=/.specweave/increments/${firstIncrement.id}/tasks.md`
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
async function findArchitectureDocs(rootDir, specId) {
|
|
150
|
-
const docs = [];
|
|
151
|
-
const archDir = path.join(rootDir, ".specweave/docs/internal/architecture");
|
|
152
|
-
try {
|
|
153
|
-
const adrDir = path.join(archDir, "adr");
|
|
154
|
-
try {
|
|
155
|
-
const adrs = await fs.readdir(adrDir);
|
|
156
|
-
const relatedAdrs = adrs.filter((file) => file.includes(specId.replace("spec-", "")));
|
|
157
|
-
for (const adr of relatedAdrs) {
|
|
158
|
-
docs.push({
|
|
159
|
-
type: "adr",
|
|
160
|
-
path: path.join(adrDir, adr),
|
|
161
|
-
title: adr.replace(".md", "").replace(/-/g, " ")
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
} catch {
|
|
165
|
-
}
|
|
166
|
-
} catch {
|
|
167
|
-
}
|
|
168
|
-
return docs;
|
|
169
|
-
}
|
|
170
|
-
async function findExistingFeature(client, specId) {
|
|
171
|
-
try {
|
|
172
|
-
const features = await client.queryWorkItems(`[System.Title] Contains '[${specId}]' AND [System.WorkItemType] = 'Feature'`);
|
|
173
|
-
return features[0] || null;
|
|
174
|
-
} catch {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
export {
|
|
179
|
-
syncSpecToAdoWithEnhancedContent
|
|
180
|
-
};
|