specweave 1.0.31 → 1.0.33
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/marketplace.json +1 -1
- package/CLAUDE.md +205 -148
- package/README.md +0 -2
- package/bin/specweave.js +11 -0
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/update-instructions.d.ts +16 -0
- package/dist/src/cli/commands/update-instructions.d.ts.map +1 -0
- package/dist/src/cli/commands/update-instructions.js +134 -0
- package/dist/src/cli/commands/update-instructions.js.map +1 -0
- package/dist/src/cli/helpers/init/directory-structure.d.ts +28 -1
- package/dist/src/cli/helpers/init/directory-structure.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/directory-structure.js +163 -33
- package/dist/src/cli/helpers/init/directory-structure.js.map +1 -1
- package/dist/src/cli/helpers/init/index.d.ts +2 -1
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +3 -1
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/helpers/init/instruction-file-merger.d.ts +23 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.js +243 -0
- package/dist/src/cli/helpers/init/instruction-file-merger.js.map +1 -0
- package/dist/src/cli/helpers/init/plugin-installer.js +49 -0
- package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -1
- package/dist/src/config/types.d.ts +2 -2
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts +26 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.d.ts.map +1 -1
- package/dist/src/core/living-docs/external-sync-orchestrator.js +61 -0
- package/dist/src/core/living-docs/external-sync-orchestrator.js.map +1 -1
- package/dist/src/core/living-docs/scaffolding/index.d.ts +12 -0
- package/dist/src/core/living-docs/scaffolding/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/index.js +15 -0
- package/dist/src/core/living-docs/scaffolding/index.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/merger.d.ts +183 -0
- package/dist/src/core/living-docs/scaffolding/merger.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/merger.js +523 -0
- package/dist/src/core/living-docs/scaffolding/merger.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.d.ts +102 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.js +346 -0
- package/dist/src/core/living-docs/scaffolding/scaffold.js.map +1 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.d.ts +108 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.d.ts.map +1 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.js +204 -0
- package/dist/src/core/living-docs/scaffolding/template-engine.js.map +1 -0
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts +38 -2
- package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js +65 -10
- package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -1
- package/dist/src/core/tools/index.d.ts +11 -0
- package/dist/src/core/tools/index.d.ts.map +1 -0
- package/dist/src/core/tools/index.js +10 -0
- package/dist/src/core/tools/index.js.map +1 -0
- package/dist/src/core/tools/tool-event-bus.d.ts +33 -0
- package/dist/src/core/tools/tool-event-bus.d.ts.map +1 -0
- package/dist/src/core/tools/tool-event-bus.js +84 -0
- package/dist/src/core/tools/tool-event-bus.js.map +1 -0
- package/dist/src/core/tools/tool-index-builder.d.ts +27 -0
- package/dist/src/core/tools/tool-index-builder.d.ts.map +1 -0
- package/dist/src/core/tools/tool-index-builder.js +289 -0
- package/dist/src/core/tools/tool-index-builder.js.map +1 -0
- package/dist/src/core/tools/tool-registry.d.ts +51 -0
- package/dist/src/core/tools/tool-registry.d.ts.map +1 -0
- package/dist/src/core/tools/tool-registry.js +224 -0
- package/dist/src/core/tools/tool-registry.js.map +1 -0
- package/dist/src/core/tools/tool-search-engine.d.ts +22 -0
- package/dist/src/core/tools/tool-search-engine.d.ts.map +1 -0
- package/dist/src/core/tools/tool-search-engine.js +174 -0
- package/dist/src/core/tools/tool-search-engine.js.map +1 -0
- package/dist/src/core/tools/types/tool-registry-types.d.ts +112 -0
- package/dist/src/core/tools/types/tool-registry-types.d.ts.map +1 -0
- package/dist/src/core/tools/types/tool-registry-types.js +7 -0
- package/dist/src/core/tools/types/tool-registry-types.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/hooks.json +3 -13
- package/plugins/specweave/hooks/lib/common-setup.sh +47 -321
- package/plugins/specweave/hooks/lib/migrate-increment-work.sh +5 -5
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +5 -5
- package/plugins/specweave/hooks/universal/dispatcher.mjs +4 -5
- package/plugins/specweave/hooks/universal/fail-fast-wrapper.sh +43 -296
- package/plugins/specweave/hooks/universal/hook-wrapper.sh +3 -1
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +2 -2
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +1 -10
- package/plugins/specweave/hooks/v2/guards/completion-guard.sh +12 -29
- package/plugins/specweave/hooks/v2/guards/increment-duplicate-guard.sh +27 -29
- package/plugins/specweave/hooks/v2/guards/metadata-json-guard.sh +10 -4
- package/plugins/specweave/hooks/v2/guards/spec-validation-guard.sh +139 -0
- package/plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh +4 -2
- package/plugins/specweave/hooks/v2/session-end.sh +3 -1
- package/plugins/specweave/hooks/v2/session-start.sh +3 -1
- package/plugins/specweave/skills/increment-planner/templates/plan.md +14 -0
- package/plugins/specweave/skills/update-instructions/SKILL.md +80 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh +1 -1
- package/plugins/specweave-mobile/README.md +55 -35
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +805 -329
- package/plugins/specweave-mobile/skills/expo-workflow/SKILL.md +226 -9
- package/plugins/specweave-mobile/skills/native-modules/SKILL.md +221 -20
- package/plugins/specweave-mobile/skills/performance-optimization/SKILL.md +186 -14
- package/plugins/specweave-mobile/skills/react-native-setup/SKILL.md +151 -54
- package/plugins/specweave-release/commands/npm.md +61 -17
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -3
- package/src/templates/AGENTS.md.template +34 -0
- package/src/templates/CLAUDE.md.template +121 -155
- package/plugins/specweave/hooks/config-env-separator.sh +0 -99
- package/plugins/specweave/hooks/github-metadata-guard.sh +0 -73
- package/plugins/specweave/hooks/lib/circuit-breaker.sh +0 -381
- package/plugins/specweave/hooks/lib/crash-prevention.sh +0 -336
- package/plugins/specweave/hooks/lib/logging.sh +0 -231
- package/plugins/specweave/hooks/lib/metrics.sh +0 -347
- package/plugins/specweave/hooks/lib/semaphore.sh +0 -216
- package/plugins/specweave/hooks/project-folder-guard.sh +0 -274
- package/plugins/specweave/hooks/spec-project-validator.sh +0 -210
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.sh +0 -212
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.test.sh +0 -163
- package/plugins/specweave/hooks/v2/guards/features-folder-guard.sh +0 -51
- package/plugins/specweave/hooks/v2/guards/increment-root-guard.sh +0 -63
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.sh +0 -335
- package/plugins/specweave/hooks/v2/guards/per-us-project-validator.test.sh +0 -406
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Living Docs Merger - Intelligently merges existing documentation
|
|
3
|
+
*
|
|
4
|
+
* This module scans for existing documentation in a user project and
|
|
5
|
+
* offers to merge/import it into the living docs structure.
|
|
6
|
+
*
|
|
7
|
+
* Smart features:
|
|
8
|
+
* - Detects documentation type (README, API docs, guides, etc.)
|
|
9
|
+
* - Suggests appropriate target folders
|
|
10
|
+
* - Detects similar/duplicate content
|
|
11
|
+
* - Preserves original files (copies, doesn't move)
|
|
12
|
+
*
|
|
13
|
+
* @module core/living-docs/scaffolding/merger
|
|
14
|
+
*/
|
|
15
|
+
import { Logger } from '../../../utils/logger.js';
|
|
16
|
+
/**
|
|
17
|
+
* Detected documentation file
|
|
18
|
+
*/
|
|
19
|
+
export interface DetectedDoc {
|
|
20
|
+
/** Original file path (relative to project root) */
|
|
21
|
+
sourcePath: string;
|
|
22
|
+
/** Absolute path */
|
|
23
|
+
absolutePath: string;
|
|
24
|
+
/** File name */
|
|
25
|
+
fileName: string;
|
|
26
|
+
/** Detected document type */
|
|
27
|
+
type: DocType;
|
|
28
|
+
/** Confidence score (0-1) */
|
|
29
|
+
confidence: number;
|
|
30
|
+
/** Suggested target folder in living docs */
|
|
31
|
+
suggestedTarget: string;
|
|
32
|
+
/** File size in bytes */
|
|
33
|
+
size: number;
|
|
34
|
+
/** First 500 chars of content (for preview) */
|
|
35
|
+
preview: string;
|
|
36
|
+
/** Detected keywords/themes */
|
|
37
|
+
themes: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Document types
|
|
41
|
+
*/
|
|
42
|
+
export type DocType = 'readme' | 'api' | 'guide' | 'architecture' | 'adr' | 'runbook' | 'contributing' | 'changelog' | 'spec' | 'other';
|
|
43
|
+
/**
|
|
44
|
+
* Merge options
|
|
45
|
+
*/
|
|
46
|
+
export interface MergeOptions {
|
|
47
|
+
/** Project root path */
|
|
48
|
+
projectPath: string;
|
|
49
|
+
/** Additional folders to scan (besides common locations) */
|
|
50
|
+
additionalFolders?: string[];
|
|
51
|
+
/** Whether to scan recursively */
|
|
52
|
+
recursive?: boolean;
|
|
53
|
+
/** Maximum depth for recursive scan */
|
|
54
|
+
maxDepth?: number;
|
|
55
|
+
/** Minimum confidence to include in results */
|
|
56
|
+
minConfidence?: number;
|
|
57
|
+
/** Logger instance */
|
|
58
|
+
logger?: Logger;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Merge result
|
|
62
|
+
*/
|
|
63
|
+
export interface MergeResult {
|
|
64
|
+
/** Detected documentation files */
|
|
65
|
+
detected: DetectedDoc[];
|
|
66
|
+
/** Files that were merged */
|
|
67
|
+
merged: string[];
|
|
68
|
+
/** Files that were skipped */
|
|
69
|
+
skipped: string[];
|
|
70
|
+
/** Any errors */
|
|
71
|
+
errors: string[];
|
|
72
|
+
/** Suggested merges (grouped by target folder) */
|
|
73
|
+
suggestions: Map<string, DetectedDoc[]>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Similarity result
|
|
77
|
+
*/
|
|
78
|
+
export interface SimilarityResult {
|
|
79
|
+
/** Whether files are similar */
|
|
80
|
+
isSimilar: boolean;
|
|
81
|
+
/** Similarity score (0-1) */
|
|
82
|
+
score: number;
|
|
83
|
+
/** Reason for similarity */
|
|
84
|
+
reason?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Living Docs Merger class
|
|
88
|
+
*/
|
|
89
|
+
export declare class LivingDocsMerger {
|
|
90
|
+
private projectPath;
|
|
91
|
+
private logger;
|
|
92
|
+
private recursive;
|
|
93
|
+
private maxDepth;
|
|
94
|
+
private minConfidence;
|
|
95
|
+
private additionalFolders;
|
|
96
|
+
constructor(options: MergeOptions);
|
|
97
|
+
/**
|
|
98
|
+
* Scan for existing documentation
|
|
99
|
+
*/
|
|
100
|
+
scan(): Promise<DetectedDoc[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Scan a directory for markdown files
|
|
103
|
+
*/
|
|
104
|
+
private scanDirectory;
|
|
105
|
+
/**
|
|
106
|
+
* Check if directory should be skipped
|
|
107
|
+
*/
|
|
108
|
+
private shouldSkipDir;
|
|
109
|
+
/**
|
|
110
|
+
* Check if file is a documentation file
|
|
111
|
+
*/
|
|
112
|
+
private isDocFile;
|
|
113
|
+
/**
|
|
114
|
+
* Analyze a documentation file
|
|
115
|
+
*/
|
|
116
|
+
private analyzeFile;
|
|
117
|
+
/**
|
|
118
|
+
* Detect document type from filename and content
|
|
119
|
+
*/
|
|
120
|
+
private detectType;
|
|
121
|
+
/**
|
|
122
|
+
* Extract themes/keywords from content
|
|
123
|
+
*/
|
|
124
|
+
private extractThemes;
|
|
125
|
+
/**
|
|
126
|
+
* Check similarity between two files using TF-IDF weighted cosine similarity
|
|
127
|
+
*
|
|
128
|
+
* TF-IDF (Term Frequency-Inverse Document Frequency) weights terms by:
|
|
129
|
+
* - How often they appear in a document (TF - more = more important)
|
|
130
|
+
* - How rare they are across all documents (IDF - rarer = more distinctive)
|
|
131
|
+
*/
|
|
132
|
+
checkSimilarity(doc1: DetectedDoc, doc2: DetectedDoc): SimilarityResult;
|
|
133
|
+
/**
|
|
134
|
+
* Compute TF-IDF weighted cosine similarity between two texts
|
|
135
|
+
*
|
|
136
|
+
* This is a simplified but effective TF-IDF implementation:
|
|
137
|
+
* - TF: term frequency in document (normalized)
|
|
138
|
+
* - IDF: inverse document frequency (approximated using both documents as corpus)
|
|
139
|
+
*/
|
|
140
|
+
private computeTfIdfSimilarity;
|
|
141
|
+
/**
|
|
142
|
+
* Tokenize text into meaningful terms
|
|
143
|
+
* Filters out common stop words and short tokens
|
|
144
|
+
*/
|
|
145
|
+
private tokenize;
|
|
146
|
+
/**
|
|
147
|
+
* Compute normalized term frequency
|
|
148
|
+
*/
|
|
149
|
+
private computeTermFrequency;
|
|
150
|
+
/**
|
|
151
|
+
* Compute cosine similarity between two TF-IDF vectors
|
|
152
|
+
*/
|
|
153
|
+
private cosineSimilarity;
|
|
154
|
+
/**
|
|
155
|
+
* Compute filename similarity using normalized Levenshtein distance
|
|
156
|
+
*/
|
|
157
|
+
private computeFilenameSimilarity;
|
|
158
|
+
/**
|
|
159
|
+
* Compute Levenshtein edit distance between two strings
|
|
160
|
+
*/
|
|
161
|
+
private levenshteinDistance;
|
|
162
|
+
/**
|
|
163
|
+
* Generate merge suggestions grouped by target folder
|
|
164
|
+
*/
|
|
165
|
+
generateSuggestions(detected: DetectedDoc[]): Map<string, DetectedDoc[]>;
|
|
166
|
+
/**
|
|
167
|
+
* Merge a detected document into living docs
|
|
168
|
+
*/
|
|
169
|
+
mergeDoc(doc: DetectedDoc, targetFolder?: string): Promise<{
|
|
170
|
+
success: boolean;
|
|
171
|
+
targetPath: string;
|
|
172
|
+
error?: string;
|
|
173
|
+
}>;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Scan for existing documentation (convenience function)
|
|
177
|
+
*/
|
|
178
|
+
export declare function scanExistingDocs(options: MergeOptions): Promise<DetectedDoc[]>;
|
|
179
|
+
/**
|
|
180
|
+
* Find similar documentation folders
|
|
181
|
+
*/
|
|
182
|
+
export declare function findSimilarFolders(projectPath: string, existingDocs: DetectedDoc[]): Map<string, string[]>;
|
|
183
|
+
//# sourceMappingURL=merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/scaffolding/merger.ts"],"names":[],"mappings":"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"}
|