specweave 0.17.2 â 0.17.4
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 +2 -2
- package/.claude-plugin/marketplace.json +22 -22
- package/dist/src/cli/commands/init.js +10 -10
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +18 -15
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/core/spec-task-mapper.d.ts.map +1 -1
- package/dist/src/core/spec-task-mapper.js +7 -12
- package/dist/src/core/spec-task-mapper.js.map +1 -1
- package/dist/src/locales/de/.gitkeep +0 -0
- package/dist/src/locales/de/cli.json +108 -0
- package/dist/src/locales/en/cli.json +287 -0
- package/dist/src/locales/en/errors.json +7 -0
- package/dist/src/locales/en/templates.json +6 -0
- package/dist/src/locales/es/.gitkeep +0 -0
- package/dist/src/locales/es/cli.json +41 -0
- package/dist/src/locales/fr/.gitkeep +0 -0
- package/dist/src/locales/fr/cli.json +108 -0
- package/dist/src/locales/ja/.gitkeep +0 -0
- package/dist/src/locales/ja/cli.json +108 -0
- package/dist/src/locales/ko/.gitkeep +0 -0
- package/dist/src/locales/ko/cli.json +108 -0
- package/dist/src/locales/pt/.gitkeep +0 -0
- package/dist/src/locales/pt/cli.json +108 -0
- package/dist/src/locales/ru/.gitkeep +0 -0
- package/dist/src/locales/ru/cli.json +269 -0
- package/dist/src/locales/zh/.gitkeep +0 -0
- package/dist/src/locales/zh/cli.json +108 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/post-task-completion.sh +72 -12
- package/plugins/specweave/skills/increment-planner/SKILL.md +4 -4
- package/plugins/specweave-github/hooks/post-task-completion.sh +35 -15
- package/plugins/specweave-ui/.claude-plugin/plugin.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"init": {
|
|
3
|
+
"welcome": "đ SpecWeave Initialization",
|
|
4
|
+
"projectName": "Project name:",
|
|
5
|
+
"projectNamePrompt": "Project name (for templates):",
|
|
6
|
+
"projectNameDefault": "my-saas",
|
|
7
|
+
"detectingTool": "Detecting AI tool...",
|
|
8
|
+
"foundClaude": "â
Found Claude Code",
|
|
9
|
+
"foundCursor": "â
Found Cursor",
|
|
10
|
+
"foundCopilot": "â
Found GitHub Copilot",
|
|
11
|
+
"noToolDetected": "No AI tool detected, using Generic adapter",
|
|
12
|
+
"complete": "⨠Initialization complete!",
|
|
13
|
+
"claudeNativeComplete": "⨠Claude Code native installation complete!",
|
|
14
|
+
"claudeNativeBenefits": "â
Native skills, agents, hooks work out of the box",
|
|
15
|
+
"projectSuccess": "SpecWeave project created successfully!",
|
|
16
|
+
"readyToBuild": "đ Ready to build with SpecWeave!",
|
|
17
|
+
"errors": {
|
|
18
|
+
"invalidName": "Project name must contain only lowercase letters, numbers, and hyphens",
|
|
19
|
+
"alreadyExists": ".specweave directory already exists",
|
|
20
|
+
"cancelled": "â Initialization cancelled",
|
|
21
|
+
"invalidLanguage": "â Invalid language: {{language}}",
|
|
22
|
+
"supportedLanguages": "Supported languages: {{languages}}",
|
|
23
|
+
"nestedNotSupported": "â Nested .specweave/ folders are NOT supported!",
|
|
24
|
+
"parentFound": "Found parent .specweave/ at:",
|
|
25
|
+
"projectCreationFailed": "Failed to create project",
|
|
26
|
+
"commandsCopyFailed": "â Commands copy failed: {{error}}",
|
|
27
|
+
"agentsCopyFailed": "â Agents copy failed: {{error}}",
|
|
28
|
+
"skillsCopyFailed": "â Skills copy failed: {{error}}",
|
|
29
|
+
"hooksCopyFailed": "â Hooks copy failed: {{error}}"
|
|
30
|
+
},
|
|
31
|
+
"warnings": {
|
|
32
|
+
"invalidDirName": "â ī¸ Current directory name '{{dirName}}' contains invalid characters.",
|
|
33
|
+
"directoryNotEmpty": "â ī¸ Current directory contains {{count}} file{{plural}}.",
|
|
34
|
+
"skillsIndexWarning": "â ī¸ Warning: Could not generate skills index: {{error}}",
|
|
35
|
+
"skillsIndexNote": "Skills will still work, but manual indexing may be needed."
|
|
36
|
+
},
|
|
37
|
+
"prompts": {
|
|
38
|
+
"confirmInitInCurrent": "Initialize SpecWeave in current directory?",
|
|
39
|
+
"overwriteSpecweave": ".specweave directory already exists. Overwrite?",
|
|
40
|
+
"overwriteDirectory": "Directory {{projectName}} already exists. Overwrite?",
|
|
41
|
+
"enablePlugins": "Enable suggested plugins now?"
|
|
42
|
+
},
|
|
43
|
+
"info": {
|
|
44
|
+
"nestedEnforcement": "SpecWeave enforces a single source of truth:",
|
|
45
|
+
"nestedBullet1": "âĸ Use the parent folder for all increments",
|
|
46
|
+
"nestedBullet2": "âĸ Increments can span multiple subdirectories",
|
|
47
|
+
"nestedBullet3": "âĸ See CLAUDE.md section \"Root-Level .specweave/ Folder\"",
|
|
48
|
+
"nestedToFix": "To fix:",
|
|
49
|
+
"suggestedPlugins": "đĄ Suggested Plugins:",
|
|
50
|
+
"copiedFiles": "â Copied {{count}} command files",
|
|
51
|
+
"copiedAgents": "â Copied {{count}} agent directories",
|
|
52
|
+
"copiedSkills": "â Copied {{count}} skill directories",
|
|
53
|
+
"copiedHooks": "â Copied {{count}} hook files"
|
|
54
|
+
},
|
|
55
|
+
"progress": {
|
|
56
|
+
"creatingProject": "Creating SpecWeave project...",
|
|
57
|
+
"detected": "Detected {{tool}}...",
|
|
58
|
+
"usingTool": "Using {{tool}}...",
|
|
59
|
+
"directoryCreated": "Directory structure created...",
|
|
60
|
+
"templatesCopied": "Base templates copied...",
|
|
61
|
+
"installingComponents": "Installing Claude Code components...",
|
|
62
|
+
"commandsInstalled": "Slash commands installed...",
|
|
63
|
+
"agentsInstalled": "Agents installed...",
|
|
64
|
+
"skillsInstalled": "Skills installed...",
|
|
65
|
+
"hooksInstalled": "Hooks installed...",
|
|
66
|
+
"generatingIndex": "Generating skills index...",
|
|
67
|
+
"indexGenerated": "Skills index generated...",
|
|
68
|
+
"installingAdapter": "Installing {{tool}} adapter...",
|
|
69
|
+
"projectSuccess": "SpecWeave project created successfully!",
|
|
70
|
+
"detectingPlugins": "Detecting plugins...",
|
|
71
|
+
"detectedPlugins": "Detected {{count}} suggested plugins",
|
|
72
|
+
"enablingPlugins": "Enabling plugins...",
|
|
73
|
+
"enabledPlugin": "Enabled {{plugin}}",
|
|
74
|
+
"pluginsEnabled": "Plugins enabled"
|
|
75
|
+
},
|
|
76
|
+
"nextSteps": {
|
|
77
|
+
"header": "đ¯ Next steps:",
|
|
78
|
+
"cd": "cd {{projectName}}",
|
|
79
|
+
"footer": "đ Ready to build with SpecWeave!",
|
|
80
|
+
"docsLink": "Documentation: https://spec-weave.com",
|
|
81
|
+
"githubLink": "GitHub: https://github.com/anton-abyzov/specweave"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"increment": {
|
|
85
|
+
"creating": "đ Creating increment: {name}",
|
|
86
|
+
"created": "â
Increment {id} created successfully!",
|
|
87
|
+
"nextStepDo": "Next: Run /specweave.do to start implementation",
|
|
88
|
+
"errors": {
|
|
89
|
+
"incompleteFound": "Cannot create new increment! Previous increments incomplete"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"progress": {
|
|
93
|
+
"currentIncrement": "Current Increment: {id}",
|
|
94
|
+
"status": "Status: {status}",
|
|
95
|
+
"completion": "Completion: {percent}%"
|
|
96
|
+
},
|
|
97
|
+
"translate": {
|
|
98
|
+
"translating": "đ Translating content to {language}...",
|
|
99
|
+
"complete": "â
Translation complete!"
|
|
100
|
+
},
|
|
101
|
+
"version": {
|
|
102
|
+
"current": "SpecWeave version: {version}"
|
|
103
|
+
},
|
|
104
|
+
"errors": {
|
|
105
|
+
"fileNotFound": "â File not found: {path}",
|
|
106
|
+
"invalidConfig": "â Invalid configuration: {error}"
|
|
107
|
+
}
|
|
108
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.4",
|
|
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",
|
|
@@ -202,10 +202,30 @@ if command -v node &> /dev/null; then
|
|
|
202
202
|
if [ -n "$CURRENT_INCREMENT" ]; then
|
|
203
203
|
echo "[$(date)] đ Checking living docs sync for $CURRENT_INCREMENT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
204
204
|
|
|
205
|
-
#
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
205
|
+
# Determine which sync script to use (project local or global)
|
|
206
|
+
SYNC_SCRIPT=""
|
|
207
|
+
if [ -f "$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/sync-living-docs.js" ]; then
|
|
208
|
+
# Development: Use project's compiled files (has node_modules)
|
|
209
|
+
SYNC_SCRIPT="$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/sync-living-docs.js"
|
|
210
|
+
echo "[$(date)] Using local dist: $SYNC_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
211
|
+
elif [ -f "$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/sync-living-docs.js" ]; then
|
|
212
|
+
# Installed as dependency: Use node_modules version
|
|
213
|
+
SYNC_SCRIPT="$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/sync-living-docs.js"
|
|
214
|
+
echo "[$(date)] Using node_modules: $SYNC_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
215
|
+
elif [ -n "${CLAUDE_PLUGIN_ROOT}" ] && [ -f "${CLAUDE_PLUGIN_ROOT}/lib/hooks/sync-living-docs.js" ]; then
|
|
216
|
+
# Fallback: Plugin marketplace (may fail if deps missing)
|
|
217
|
+
SYNC_SCRIPT="${CLAUDE_PLUGIN_ROOT}/lib/hooks/sync-living-docs.js"
|
|
218
|
+
echo "[$(date)] Using plugin marketplace: $SYNC_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
if [ -n "$SYNC_SCRIPT" ]; then
|
|
222
|
+
# Run living docs sync (non-blocking, best-effort)
|
|
223
|
+
(cd "$PROJECT_ROOT" && node "$SYNC_SCRIPT" "$CURRENT_INCREMENT") 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || {
|
|
224
|
+
echo "[$(date)] â ī¸ Failed to sync living docs (non-blocking)" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
225
|
+
}
|
|
226
|
+
else
|
|
227
|
+
echo "[$(date)] â ī¸ sync-living-docs.js not found in any location" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
228
|
+
fi
|
|
209
229
|
fi
|
|
210
230
|
fi
|
|
211
231
|
|
|
@@ -217,10 +237,30 @@ if command -v node &> /dev/null; then
|
|
|
217
237
|
if [ -n "$CURRENT_INCREMENT" ]; then
|
|
218
238
|
echo "[$(date)] đ Checking if living docs translation is needed for $CURRENT_INCREMENT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
219
239
|
|
|
220
|
-
#
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
240
|
+
# Determine which translation script to use (project local or global)
|
|
241
|
+
TRANSLATE_SCRIPT=""
|
|
242
|
+
if [ -f "$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/translate-living-docs.js" ]; then
|
|
243
|
+
# Development: Use project's compiled files (has node_modules)
|
|
244
|
+
TRANSLATE_SCRIPT="$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/translate-living-docs.js"
|
|
245
|
+
echo "[$(date)] Using local dist: $TRANSLATE_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
246
|
+
elif [ -f "$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/translate-living-docs.js" ]; then
|
|
247
|
+
# Installed as dependency: Use node_modules version
|
|
248
|
+
TRANSLATE_SCRIPT="$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/translate-living-docs.js"
|
|
249
|
+
echo "[$(date)] Using node_modules: $TRANSLATE_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
250
|
+
elif [ -n "${CLAUDE_PLUGIN_ROOT}" ] && [ -f "${CLAUDE_PLUGIN_ROOT}/lib/hooks/translate-living-docs.js" ]; then
|
|
251
|
+
# Fallback: Plugin marketplace (may fail if deps missing)
|
|
252
|
+
TRANSLATE_SCRIPT="${CLAUDE_PLUGIN_ROOT}/lib/hooks/translate-living-docs.js"
|
|
253
|
+
echo "[$(date)] Using plugin marketplace: $TRANSLATE_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
254
|
+
fi
|
|
255
|
+
|
|
256
|
+
if [ -n "$TRANSLATE_SCRIPT" ]; then
|
|
257
|
+
# Run living docs translation (non-blocking, best-effort)
|
|
258
|
+
(cd "$PROJECT_ROOT" && node "$TRANSLATE_SCRIPT" "$CURRENT_INCREMENT") 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || {
|
|
259
|
+
echo "[$(date)] â ī¸ Failed to translate living docs (non-blocking)" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
260
|
+
}
|
|
261
|
+
else
|
|
262
|
+
echo "[$(date)] â ī¸ translate-living-docs.js not found in any location" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
263
|
+
fi
|
|
224
264
|
fi
|
|
225
265
|
fi
|
|
226
266
|
|
|
@@ -256,10 +296,30 @@ if command -v node &> /dev/null; then
|
|
|
256
296
|
LATEST_TASK=$(grep "^## T-[0-9]" ".specweave/increments/$CURRENT_INCREMENT/tasks.md" 2>/dev/null | tail -1 | awk '{print $2}' | sed 's/://')
|
|
257
297
|
|
|
258
298
|
if [ -n "$LATEST_TASK" ]; then
|
|
259
|
-
#
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
299
|
+
# Determine which reflection script to use (project local or global)
|
|
300
|
+
REFLECTION_SCRIPT=""
|
|
301
|
+
if [ -f "$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js" ]; then
|
|
302
|
+
# Development: Use project's compiled files (has node_modules)
|
|
303
|
+
REFLECTION_SCRIPT="$PROJECT_ROOT/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js"
|
|
304
|
+
echo "[$(date)] Using local dist: $REFLECTION_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
305
|
+
elif [ -f "$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js" ]; then
|
|
306
|
+
# Installed as dependency: Use node_modules version
|
|
307
|
+
REFLECTION_SCRIPT="$PROJECT_ROOT/node_modules/specweave/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js"
|
|
308
|
+
echo "[$(date)] Using node_modules: $REFLECTION_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
309
|
+
elif [ -n "${CLAUDE_PLUGIN_ROOT}" ] && [ -f "${CLAUDE_PLUGIN_ROOT}/lib/hooks/prepare-reflection-context.js" ]; then
|
|
310
|
+
# Fallback: Plugin marketplace (may fail if deps missing)
|
|
311
|
+
REFLECTION_SCRIPT="${CLAUDE_PLUGIN_ROOT}/lib/hooks/prepare-reflection-context.js"
|
|
312
|
+
echo "[$(date)] Using plugin marketplace: $REFLECTION_SCRIPT" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
if [ -n "$REFLECTION_SCRIPT" ]; then
|
|
316
|
+
# Prepare reflection context (non-blocking, best-effort)
|
|
317
|
+
(cd "$PROJECT_ROOT" && node "$REFLECTION_SCRIPT" "$CURRENT_INCREMENT" "$LATEST_TASK") 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || {
|
|
318
|
+
echo "[$(date)] â ī¸ Failed to prepare reflection context (non-blocking)" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
319
|
+
}
|
|
320
|
+
else
|
|
321
|
+
echo "[$(date)] â ī¸ prepare-reflection-context.js not found in any location" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
322
|
+
fi
|
|
263
323
|
else
|
|
264
324
|
echo "[$(date)] âšī¸ No tasks found in tasks.md, skipping reflection" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
265
325
|
fi
|
|
@@ -125,10 +125,10 @@ import { ProjectManager } from '../../core/project-manager';
|
|
|
125
125
|
const projectManager = new ProjectManager(projectRoot);
|
|
126
126
|
const activeProject = projectManager.getActiveProject();
|
|
127
127
|
|
|
128
|
-
// Get correct paths for active project
|
|
129
|
-
const specsPath = projectManager.getSpecsPath(); //
|
|
130
|
-
const modulesPath = projectManager.getModulesPath(); //
|
|
131
|
-
const teamPath = projectManager.getTeamPath(); //
|
|
128
|
+
// Get correct paths for active project (flattened structure v0.16.11+)
|
|
129
|
+
const specsPath = projectManager.getSpecsPath(); // specs/{activeProject.id}/
|
|
130
|
+
const modulesPath = projectManager.getModulesPath(); // modules/{activeProject.id}/
|
|
131
|
+
const teamPath = projectManager.getTeamPath(); // team/{activeProject.id}/
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
**In PM Agent Instructions**:
|
|
@@ -71,10 +71,10 @@ EOF
|
|
|
71
71
|
exit 0
|
|
72
72
|
fi
|
|
73
73
|
|
|
74
|
-
# Check if github-spec-sync CLI exists
|
|
75
|
-
SYNC_CLI="$PROJECT_ROOT/dist/cli/commands/sync-
|
|
74
|
+
# Check if github-spec-content-sync CLI exists
|
|
75
|
+
SYNC_CLI="$PROJECT_ROOT/dist/src/cli/commands/sync-spec-content.js"
|
|
76
76
|
if [ ! -f "$SYNC_CLI" ]; then
|
|
77
|
-
echo "[$(date)] [GitHub] â ī¸
|
|
77
|
+
echo "[$(date)] [GitHub] â ī¸ sync-spec-content CLI not found at $SYNC_CLI, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
78
78
|
cat <<EOF
|
|
79
79
|
{
|
|
80
80
|
"continue": true
|
|
@@ -131,23 +131,43 @@ fi
|
|
|
131
131
|
# ============================================================================
|
|
132
132
|
|
|
133
133
|
if [ -n "$SPEC_ID" ]; then
|
|
134
|
-
#
|
|
135
|
-
|
|
134
|
+
# Convert SPEC_ID to spec file path
|
|
135
|
+
SPEC_FILE=$(find .specweave/docs/internal/specs -name "${SPEC_ID}*.md" -o -name "${SPEC_ID}.md" 2>/dev/null | head -1)
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
if [ -n "$SPEC_FILE" ]; then
|
|
138
|
+
# Sync specific spec
|
|
139
|
+
echo "[$(date)] [GitHub] đ Syncing spec $SPEC_ID ($SPEC_FILE) to GitHub..." >> "$DEBUG_LOG" 2>/dev/null || true
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
(cd "$PROJECT_ROOT" && node "$SYNC_CLI" --spec "$SPEC_FILE" --provider github) 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || {
|
|
142
|
+
echo "[$(date)] [GitHub] â ī¸ Spec sync failed for $SPEC_ID (non-blocking)" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
echo "[$(date)] [GitHub] â
Spec sync complete for $SPEC_ID" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
146
|
+
else
|
|
147
|
+
echo "[$(date)] [GitHub] â ī¸ Spec file not found for $SPEC_ID" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
148
|
+
fi
|
|
142
149
|
else
|
|
143
|
-
# Sync all
|
|
144
|
-
echo "[$(date)] [GitHub] đ
|
|
150
|
+
# Sync all modified specs (check git diff)
|
|
151
|
+
echo "[$(date)] [GitHub] đ Checking for modified specs..." >> "$DEBUG_LOG" 2>/dev/null || true
|
|
152
|
+
|
|
153
|
+
MODIFIED_SPECS=$(git diff --name-only HEAD .specweave/docs/internal/specs/*.md 2>/dev/null || echo "")
|
|
145
154
|
|
|
146
|
-
|
|
147
|
-
echo "[$(date)] [GitHub]
|
|
148
|
-
|
|
155
|
+
if [ -n "$MODIFIED_SPECS" ]; then
|
|
156
|
+
echo "[$(date)] [GitHub] đ Found modified specs:" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
157
|
+
echo "$MODIFIED_SPECS" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
149
158
|
|
|
150
|
-
|
|
159
|
+
# Sync each modified spec
|
|
160
|
+
echo "$MODIFIED_SPECS" | while read -r SPEC_FILE; do
|
|
161
|
+
if [ -n "$SPEC_FILE" ]; then
|
|
162
|
+
echo "[$(date)] [GitHub] đ Syncing $SPEC_FILE..." >> "$DEBUG_LOG" 2>/dev/null || true
|
|
163
|
+
(cd "$PROJECT_ROOT" && node "$SYNC_CLI" --spec "$SPEC_FILE" --provider github) 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || true
|
|
164
|
+
fi
|
|
165
|
+
done
|
|
166
|
+
|
|
167
|
+
echo "[$(date)] [GitHub] â
Batch spec sync complete" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
168
|
+
else
|
|
169
|
+
echo "[$(date)] [GitHub] âšī¸ No modified specs found, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
|
|
170
|
+
fi
|
|
151
171
|
fi
|
|
152
172
|
|
|
153
173
|
# ============================================================================
|