@mcptoolshop/claude-synergy 1.2.0 → 1.2.1

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/README.es.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **Datos actualizados (a partir de la versión 1.2.0):** 44 productos / 1.171 archivos de lanzamiento / 6.573 cambios / 1.260 entidades / 12 sinergias / 517 pruebas / 13 herramientas MCP / 17 comandos de línea de comandos. (La base de datos se actualizó mediante `sync_now` el 24 de mayo de 2026).
76
+ **Datos actualizados (a partir de la versión 1.2.1):** 44 productos / 1.171 archivos de lanzamiento / 6.573 cambios / 1.260 entidades / 12 sinergias / 519 pruebas / 13 herramientas MCP / 17 comandos de línea de comandos. (La base de datos se actualizó mediante `sync_now` el 24 de mayo de 2026).
77
77
 
78
78
  ---
79
79
 
@@ -91,6 +91,7 @@ claude-synergy/
91
91
  | **4d — Playwright + registro de MCP + configuración YAML** | ✅ implementado | Windsurf a través de Playwright; Smithery + registro oficial de MCP como catálogos de la etapa 4; productos consolidados en `products.yaml`. |
92
92
  | **5 — Navegación con ventanas en la versión 1.1 + integración de OpenAI** | ✅ implementado | `hk diff` / `hk breaking`, límites de fecha para todos los comandos de navegación, 3 nuevas herramientas MCP (un total de 11), proveedor de incrustación de OpenAI, dimensión de incrustación configurable, sincronización automática de `claude-code`, analizador genérico `keep-a-changelog`. |
93
93
  | **6 — Sincronización desde MCP en la versión 1.2** | ✅ implementado | `sync_status` (frescura por producto, detección de "obsoleto") y `sync_now` (obtención bajo demanda → ingestión → incrustación con vista previa de `dry_run` + bloqueo de concurrencia en el proceso). Elimina la brecha donde un agente podía consultar la base de datos pero no actualizarla. **También corrige:** el error de "limpieza de marcadores" donde `INSERT OR REPLACE INTO products` desencadenaba un DELETE en la clave externa `markers`, restableciendo silenciosamente el cursor `since` de cada producto en cada ingestión (regresión §8.20). |
94
+ | **6.1 — Centralización de marcadores en la versión 1.2.1** | ✅ implementado | Se centralizó la función `writeMarker` en `fetchOne` para que cada extracción exitosa actualice el marcador. Las estrategias que devolvían 0 elementos con fecha dentro del período especificado (especialmente el registro de cambios "raw" de `aider`) nunca escribían un marcador y volvían a descargar `HISTORY.md` en cada sincronización. Se renombró la estrategia `webfetch` no implementada a `manual` para `claude-api` y `anthropic-apps`; ahora, `sync_status` muestra los productos configurados manualmente como "manual" en lugar de "nunca" y los excluye de `stale_only` (regresión §8.21). |
94
95
 
95
96
  Hoja de ruta para la versión 0.8+: se encuentra en [URGENT_FINDINGS.md](URGENT_FINDINGS.md) y en los problemas.
96
97
 
@@ -294,7 +295,7 @@ Estrategias de recuperación: `gh-releases | rss | raw-changelog | html-scrape |
294
295
  El conjunto de pruebas Vitest cubre los niveles de unidad / integración / regresión / pruebas básicas. **[test-spec-3.md](test-spec-3.md) es la autoridad actual** a partir de la versión v0.7.0; [test-spec.md](test-spec.md) (v1) y [test-spec-2.md](test-spec-2.md) (v2) permanecen en el repositorio como registro histórico de la línea de diseño.
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
package/README.fr.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **Chiffres en direct (version 1.2.0) :** 44 produits / 1 171 fichiers de publication / 6 573 modifications / 1 260 entités / 12 synergies / 517 tests / 13 outils MCP / 17 commandes CLI. (Le corpus a été mis à jour via `sync_now` le 24 mai 2026.)
76
+ **Chiffres en direct (version v1.2.1) :** 44 produits / 1 171 fichiers de publication / 6 573 modifications / 1 260 entités / 12 synergies / 519 tests / 13 outils MCP / 17 commandes CLI. (La base de données a été actualisée via `sync_now` le 24 mai 2026.)
77
77
 
78
78
  ---
79
79
 
@@ -90,7 +90,8 @@ claude-synergy/
90
90
  | **4c — ingestion HTML→Markdown avec turndown** | ✅ réalisé | Les corps HTML (Copilot/VS Code/Cursor) génèrent désormais des lignes individuelles pour FTS5 + l'extraction d'entités. |
91
91
  | **4d — Playwright + registre MCP + configuration YAML** | ✅ réalisé | Windsurf via Playwright ; Smithery + registre MCP officiel comme catalogues de l'étape 4 ; les produits sont regroupés dans `products.yaml`. |
92
92
  | **5 — Navigation avec fenêtrage v1.1 + intégration OpenAI** | ✅ réalisé | `hk diff` / `hk breaking`, limites de date pour toutes les commandes de navigation, 3 nouveaux outils MCP (total de 11), fournisseur d'intégration OpenAI, dimension d'intégration configurable, synchronisation automatique de `claude-code`, analyseur générique `keep-a-changelog`. |
93
- | **6 — v1.2 synchronisation à partir de MCP** | ✅ réalisé | `sync_status` (fraîcheur par produit, détection de données obsolètes) et `sync_now` (récupération à la demande → ingestion → intégration avec aperçu `dry_run` + verrouillage de concurrence en cours). Comble le fossé où un agent pouvait interroger le corpus mais pas le mettre à jour. **Corrige également :** un bug lié à la suppression des marqueurs où `INSERT OR REPLACE INTO products` déclenchait une suppression en cascade sur la clé étrangère `markers`, remettant silencieusement à zéro le curseur `since` de chaque produit à chaque ingestion (régression §8.20). |
93
+ | **6 — v1.2 synchronisation à partir de MCP** | ✅ réalisé | `sync_status` (état de fraîcheur par produit, détection "jamais/obsolète") et `sync_now` (récupération à la demande → ingestion → intégration avec aperçu `dry_run` + verrouillage de concurrence en cours). Comble le fossé où un agent pouvait interroger la base de données, mais pas la mettre à jour. **Corrige également :** un bug de suppression de marqueur où `INSERT OR REPLACE INTO products` déclenchait une suppression sur la clé étrangère `markers`, remettant silencieusement à zéro le curseur `since` de chaque produit à chaque ingestion (régression §8.20). |
94
+ | **6.1 — v1.2.1 centralisation des marqueurs de récupération** | ✅ réalisé | La fonction `writeMarker` a été centralisée dans `fetchOne` afin que chaque récupération réussie mette à jour le marqueur. Les stratégies qui renvoyaient 0 éléments datés dans la plage spécifiée (notamment `aider` pour le journal des modifications brut) n'écrivaient pas de marqueur et ré-téléchargeaient `HISTORY.md` à chaque synchronisation. La stratégie `webfetch` non implémentée a été renommée en `manual` pour `claude-api` et `anthropic-apps` ; `sync_status` affiche désormais les produits "manuels" comme "manual" au lieu de "jamais" et les exclut de `stale_only` (régression §8.21). |
94
95
 
95
96
  Feuille de route pour la version 0.8+ : consultable dans [URGENT_FINDINGS.md](URGENT_FINDINGS.md) et les problèmes.
96
97
 
@@ -254,10 +255,10 @@ Outils exposés :
254
255
  | `get_changes_since` | **Nouveau.** Modifications dans une fenêtre de temps, regroupées par produit + version. Entrées : `since` (obligatoire), `until?`, `product?`, `kind?`, `limit?`. |
255
256
  | `search_breaking_changes` | **Nouveau.** Liste plate des modifications importantes — aucun terme de recherche n'est nécessaire. Entrées : `product?`, `since?`, `until?`, `limit?`. |
256
257
  | `compare_versions` | **Nouveau.** Toutes les modifications entre deux versions d'un même produit. Entrées : `product`, `from_version`, `to_version`. |
257
- | `sync_status` | **v1.2.** Fraîcheur de la synchronisation par produit : horodatage de la dernière récupération, heures écoulées depuis la récupération, nombre de publications ingérées. Paramètres : `product?`, `stale_only?`, `stale_hours?`. Utilisez ceci AVANT de faire confiance à `latest_releases` pour savoir si le corpus est obsolète. |
258
- | `sync_now` | **v1.2.** Actualisation à la demande (reproduit `hk sync`). Paramètres : `product?`, `dry_run?`, `include_ingest?`, `include_embed?`, `timeout_ms?`. Renvoie une erreur `InvalidParams` si une autre opération `sync_now` est déjà en cours. NE COMMET PAS les modifications dans Git. |
258
+ | `sync_status` | **v1.2.** Fraîcheur de la synchronisation par produit : horodatage de la dernière récupération, heures écoulées depuis la récupération, nombre de publications ingérées. Paramètres : `product?`, `stale_only?`, `stale_hours?`. Utilisez cette fonctionnalité AVANT de faire confiance à `latest_releases` pour savoir si la base de données est obsolète. |
259
+ | `sync_now` | **v1.2.** Actualisation à la demande (similaire à `hk sync`). Paramètres : `product?`, `dry_run?`, `include_ingest?`, `include_embed?`, `timeout_ms?`. Renvoie une erreur `InvalidParams` si une autre instance de `sync_now` est déjà en cours. NE COMMET PAS les modifications dans Git. |
259
260
 
260
- Les outils de la version 1.1 reproduisent `hk diff` / `hk breaking` et le flux de travail de comparaison de versions qui nécessitait auparavant des scripts. Les outils de synchronisation de la version 1.2 comblent le fossé où une session pouvait interroger le corpus mais pas le mettre à jour : `sync_status` signale l'obsolescence, `sync_now` exécute le pipeline. Consultez [le guide → serveur MCP](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/) pour les schémas de paramètres complets.
261
+ Les outils v1.1 sont similaires à `hk diff` / `hk breaking` et au flux de travail de comparaison de versions qui nécessitait auparavant des scripts. Les outils de synchronisation v1.2 comblent le fossé où une session pouvait interroger la base de données, mais pas la mettre à jour : `sync_status` signale l'obsolescence, `sync_now` exécute le pipeline. Consultez [le manuel → serveur MCP](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/) pour les schémas de paramètres complets.
261
262
 
262
263
  ---
263
264
 
@@ -294,7 +295,7 @@ Index complet dans [synergies/INDEX.md](synergies/INDEX.md).
294
295
  La suite Vitest couvre les niveaux unitaires, d'intégration, de régression et de test de base. **[test-spec-3.md](test-spec-3.md) est la référence actuelle** à partir de la version v0.7.0 ; [test-spec.md](test-spec.md) (v1) et [test-spec-2.md](test-spec-2.md) (v2) restent dans le dépôt comme enregistrement historique de l'évolution de la conception.
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
@@ -305,7 +306,7 @@ Structure :
305
306
  | Dossier | Ce qu'il couvre |
306
307
  |-----|----------------|
307
308
  | `test/unit/` | par module — extraction, ingestion, requête (incl. `until` / navigation / depuis / comparaison), base de données (incl. migration de configuration de dimension v3), intégration, hybride, récupération + tous les fournisseurs (Ollama / Voyage / **OpenAI**) + récupération-RSS/changelog (incl. analyseur **keep-a-changelog**) / HTML + récupération-registre-MCP + récupération-playwright + configuration-produits + ingestion/requête de synergies. |
308
- | `test/integration/` | de bout en bout : pipeline, synchronisation, serveur MCP (JSON-RPC standard, 13 outils dont `sync_status` / `sync_now`), CLI (dont `hk diff`, `hk breaking`). |
309
+ | `test/integration/` | de bout en bout pipeline, synchronisation, serveur MCP (JSON-RPC via stdin/stdout, 13 outils dont `sync_status` / `sync_now`), CLI (dont `hk diff`, `hk breaking`) |
309
310
  | `test/regression/` | §8.1–§8.19 — chacun protège contre un bug réel corrigé pendant le développement (§8.19 : la pagination précoce de ghReleases préserve les éléments dans la fenêtre). |
310
311
  | `test/smoke/` | Test complet sur l'ensemble des fichiers (1 143 fichiers) simulant les produits réels. |
311
312
  | `test/fixtures/` | 3 produits factices + réponses HTTP simulées (RSS / GH / Voyage / Cohere / Ollama / Anthropic / Smithery / Registre MCP officiel). |
package/README.hi.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **वर्तमान आंकड़े (v1.2.0 के अनुसार):** 44 उत्पाद / 1,171 रिलीज़ फ़ाइलें / 6,573 परिवर्तन / 1,260 इकाइयां / 12 तालमेल / 517 परीक्षण / 13 एमसीपी उपकरण / 17 सीएलआई कमांड। (डेटाबेस को `sync_now` के माध्यम से 2026-05-24 को अपडेट किया गया।)
76
+ **वर्तमान आंकड़े (v1.2.1 के अनुसार):** 44 उत्पाद / 1,171 रिलीज़ फ़ाइलें / 6,573 परिवर्तन / 1,260 इकाइयां / 12 तालमेल / 519 परीक्षण / 13 एमसीपी उपकरण / 17 सीएलआई कमांड। (डेटाबेस 2026-05-24 को `sync_now` के माध्यम से अपडेट किया गया।)
77
77
 
78
78
  ---
79
79
 
@@ -90,7 +90,8 @@ claude-synergy/
90
90
  | **4c — टर्नडाउन एचटीएमएल→मार्कडाउन इनजेस्ट** | ✅ जारी किया गया | एचटीएमएल बॉडी (कोपायलट/वीएस कोड/कर्सर) अब एफटीएस5 (FTS5) + एंटिटी एक्सट्रैक्शन के लिए प्रति-बुलेट पंक्तियाँ उत्पन्न करते हैं। |
91
91
  | **4d — प्लेराइट + एमसीपी रजिस्ट्री + YAML कॉन्फ़िगरेशन** | ✅ जारी किया गया | प्लेराइट के माध्यम से विंडसर्फ़; स्मिथरी + आधिकारिक एमसीपी रजिस्ट्री को चौथे स्तर के कैटलॉग के रूप में उपयोग किया जाता है; उत्पादों को `products.yaml` में समेकित किया गया है। |
92
92
  | **5 — v1.1 विंडो ब्राउज़िंग + ओपनएआई एम्बेड** | ✅ जारी किया गया | `hk diff` / `hk breaking`, सभी ब्राउज़िंग कमांड के लिए तारीख सीमा, 3 नए एमसीपी उपकरण (कुल 11), ओपनएआई एम्बेडिंग प्रदाता, कॉन्फ़िगर करने योग्य एम्बेडिंग आयाम, `claude-code` ऑटो-सिंक, सामान्य `keep-a-changelog` पार्सर। |
93
- | **6 — v1.2 एमसीपी से सिंक** | ✅ जारी किया गया | `sync_status` (प्रत्येक उत्पाद की ताज़ा जानकारी, कभी/पुराना पता लगाना) और `sync_now` (मांग पर डेटा प्राप्त करना → संसाधित करना → `dry_run` पूर्वावलोकन के साथ एम्बेड करना + प्रक्रिया में समवर्ती लॉक)। यह उस स्थिति को समाप्त करता है जहां कोई उपयोगकर्ता डेटाबेस से जानकारी प्राप्त कर सकता था लेकिन उसे अपडेट नहीं कर सकता था। **इसके अतिरिक्त, यह निम्नलिखित समस्या को भी ठीक करता है:** "मार्कर-वाइप" बग, जिसमें `INSERT OR REPLACE INTO products` कमांड `markers` विदेशी कुंजी पर एक DELETE ऑपरेशन चलाता था, जिसके कारण प्रत्येक उत्पाद के लिए `since` कर्सर हर बार डेटा आयात करने पर रीसेट हो जाता था (प्रतिगमन §8.20)। |
93
+ | **6 — v1.2 एमसीपी से सिंक** | ✅ जारी किया गया | `sync_status` (प्रत्येक उत्पाद की ताज़गी की स्थिति, कभी नहीं/पुरानी स्थिति का पता लगाना) और `sync_now` (मांग पर डेटा प्राप्त करना → संसाधित करना → `dry_run` पूर्वावलोकन के साथ एम्बेड करना + प्रक्रिया में समवर्ती लॉक)। यह उस स्थिति को समाप्त करता है जहां एक उपयोगकर्ता डेटाबेस से जानकारी प्राप्त कर सकता था लेकिन उसे अपडेट नहीं कर सकता था। **इसके अतिरिक्त, यह निम्नलिखित समस्या को भी ठीक करता है:** "मार्कर-वाइप" बग, जिसमें `INSERT OR REPLACE INTO products` कमांड `markers` विदेशी कुंजी पर एक DELETE ऑपरेशन चलाता था, जिसके कारण प्रत्येक उत्पाद के लिए `since` कर्सर हर बार डेटा आयात करने पर रीसेट हो जाता था (प्रतिगमन §8.20)। |
94
+ | **6.1 — v1.2.1 फ़ेचर-मार्कर केंद्रीकरण** | ✅ जारी किया गया | `writeMarker` फ़ंक्शन को `fetchOne` में केंद्रीकृत किया गया है, ताकि प्रत्येक सफल डेटा आयात के साथ मार्कर अपडेट हो जाए। पहले, उन रणनीतियों ने जो 0 इन-विंडो दिनांकित आइटम लौटाती थीं (विशेष रूप से `aider` कच्चा परिवर्तन लॉग), मार्कर नहीं लिखते थीं और हर सिंक पर `HISTORY.md` फ़ाइल को फिर से डाउनलोड करती थीं। `webfetch` रणनीति, जिसे लागू नहीं किया गया था, का नाम बदलकर `manual` कर दिया गया है, जिसका उपयोग `claude-api` और `anthropic-apps` के लिए किया जाता है; `sync_status` अब मैन्युअल उत्पादों को "never" के बजाय "manual" के रूप में प्रदर्शित करता है और उन्हें `stale_only` से बाहर रखता है (प्रतिगमन §8.21)। |
94
95
 
95
96
  v0.8+ के लिए रोडमैप: [URGENT_FINDINGS.md](URGENT_FINDINGS.md) और मुद्दों में ट्रैक किया गया है।
96
97
 
@@ -254,10 +255,10 @@ GitHub Copilot के लिए `.vscode/mcp.json` फ़ाइल में, `m
254
255
  | `get_changes_since` | **नया।** एक समय विंडो में परिवर्तन, उत्पाद+संस्करण द्वारा समूहीकृत। इनपुट: `since` (आवश्यक), `until?`, `product?`, `kind?`, `limit?`. |
255
256
  | `search_breaking_changes` | **नया।** महत्वपूर्ण परिवर्तनों की एक सपाट सूची — किसी खोज शब्द की आवश्यकता नहीं। इनपुट: `product?`, `since?`, `until?`, `limit?`. |
256
257
  | `compare_versions` | **नया।** एक उत्पाद के दो संस्करणों के बीच सभी परिवर्तन। इनपुट: `product`, `from_version`, `to_version`. |
257
- | `sync_status` | **v1.2.** प्रत्येक उत्पाद के लिए सिंक की ताज़ा जानकारी - अंतिम डेटा प्राप्त करने का समय, डेटा प्राप्त करने के बाद से घंटे, संसाधित किए गए रिलीज़ की संख्या। इनपुट: `product?`, `stale_only?`, `stale_hours?`. `latest_releases` का उपयोग करने से पहले, यह जांचना महत्वपूर्ण है कि डेटाबेस ताज़ा है या नहीं। |
258
- | `sync_now` | **v1.2.** मांग पर डेटा ताज़ा करना (यह `hk sync` के समान है)। इनपुट: `product?`, `dry_run?`, `include_ingest?`, `include_embed?`, `timeout_ms?`. यदि कोई अन्य `sync_now` प्रक्रिया चल रही है, तो यह `InvalidParams` त्रुटि प्रदर्शित करता है। यह परिवर्तन सीधे git में नहीं किए जाते हैं। |
258
+ | `sync_status` | **v1.2.** प्रत्येक उत्पाद के लिए सिंक की ताज़गी की स्थिति अंतिम डेटा आयात का समय, डेटा आयात के बाद से घंटे, संसाधित रिलीज़ की संख्या। इनपुट: `product?`, `stale_only?`, `stale_hours?`. `latest_releases` पर भरोसा करने से पहले, यह जांचना महत्वपूर्ण है कि डेटाबेस पुराना है या नहीं। |
259
+ | `sync_now` | **v1.2.** मांग पर ताज़ा करना (यह `hk sync` के समान है)। इनपुट: `product?`, `dry_run?`, `include_ingest?`, `include_embed?`, `timeout_ms?`. यदि कोई अन्य `sync_now` प्रक्रिया चल रही है, तो यह `InvalidParams` त्रुटि प्रदर्शित करता है। यह परिवर्तन सीधे git में नहीं करता है। |
259
260
 
260
- v1.1 उपकरण `hk diff` / `hk breaking` और संस्करण तुलना प्रक्रिया को प्रतिबिंबित करते हैं, जिसके लिए पहले स्क्रिप्टिंग की आवश्यकता होती थी। v1.2 सिंक उपकरण उस स्थिति को समाप्त करते हैं जहां कोई सत्र डेटाबेस से जानकारी प्राप्त कर सकता था लेकिन उसे ताज़ा नहीं कर सकता था - `sync_status` डेटाबेस की पुरानी स्थिति की रिपोर्ट करता है, और `sync_now` प्रक्रिया को चलाता है। पूर्ण इनपुट स्कीमा के लिए, [मैनुअल → एमसीपी सर्वर](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/) देखें।
261
+ v1.1 उपकरण `hk diff` / `hk breaking` और संस्करण तुलना कार्यप्रवाह को प्रतिबिंबित करते हैं, जिसके लिए पहले स्क्रिप्टिंग की आवश्यकता होती थी। v1.2 सिंक उपकरण उस स्थिति को समाप्त करते हैं जहां एक सत्र डेटाबेस से जानकारी प्राप्त कर सकता था लेकिन उसे अपडेट नहीं कर सकता था `sync_status` पुरानी स्थिति की रिपोर्ट करता है, और `sync_now` पाइपलाइन चलाता है। पूर्ण इनपुट स्कीमा के लिए, [हैंडबुक → एमसीपी सर्वर](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/) देखें।
261
262
 
262
263
  ---
263
264
 
@@ -294,7 +295,7 @@ v1.1 उपकरण `hk diff` / `hk breaking` और संस्करण त
294
295
  विटेस्ट (Vitest) में यूनिट, इंटीग्रेशन, रिग्रेशन और स्मोक परीक्षण शामिल हैं। v0.7.0 के अनुसार, "[test-spec-3.md](test-spec-3.md)" वर्तमान में आधिकारिक दस्तावेज है; [test-spec.md](test-spec.md) (v1) और [test-spec-2.md](test-spec-2.md) (v2) डिज़ाइन के ऐतिहासिक रिकॉर्ड के रूप में रिपॉजिटरी में मौजूद हैं।
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
@@ -305,7 +306,7 @@ pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
305
306
  | मुझे खेद है, लेकिन मैं इस अनुरोध को पूरा करने में असमर्थ हूं क्योंकि यह अपूर्ण है। कृपया पूरा वाक्य या पाठ प्रदान करें जिसका आप अनुवाद करवाना चाहते हैं। | यह क्या शामिल करता है। |
306
307
  |-----|----------------|
307
308
  | `test/unit/` | प्रति-मॉड्यूल — निकालें, इनजेस्ट करें, क्वेरी करें (शामिल `until` / ब्राउज़ / since / तुलना), डेटाबेस (शामिल dim-config v3 माइग्रेशन), एम्बेड, हाइब्रिड, फेच + प्रत्येक प्रदाता (Ollama / Voyage / **OpenAI**) + फेच-rss/changelog (शामिल **keep-a-changelog** पार्सर)/html + फेच-mcp-registry + फेच-playwright + उत्पादों-कॉन्फ़िग + सि synergy इनजेस्ट/क्वेरी |
308
- | `test/integration/` | एंड-टू-एंड — पाइपलाइन, सिंक, एमसीपी सर्वर (मानक इनपुट/आउटपुट JSON-RPC, 13 उपकरण, जिनमें `sync_status` / `sync_now` शामिल हैं), सीएलआई (जिनमें `hk diff`, `hk breaking` शामिल हैं)। |
309
+ | `test/integration/` | एंड-टू-एंड — पाइपलाइन, सिंक, एमसीपी सर्वर (stdio JSON-RPC, 13 उपकरण जिनमें `sync_status` / `sync_now` शामिल हैं), सीएलआई (जिनमें `hk diff`, `hk breaking` शामिल हैं)। |
309
310
  | `test/regression/` | §8.1–§8.19 — प्रत्येक एक वास्तविक बग से बचाता है जिसे विकास के दौरान ठीक किया गया था (§8.19: ghReleases शुरुआती-निकास पेजिंग विंडो में आइटम को संरक्षित करता है) |
310
311
  | `test/smoke/` | पूर्ण डेटासेट, वास्तविक `products/` (1,143 फ़ाइलें) के लिए। |
311
312
  | `test/fixtures/` | 3 नकली उत्पाद + मॉक एचटीटीपी प्रतिक्रियाएं (RSS / GH / Voyage / Cohere / Ollama / Anthropic / Smithery / आधिकारिक MCP रजिस्ट्री)। |
package/README.it.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **Dati aggiornati (alla versione v1.2.0):** 44 prodotti / 1.171 file di rilascio / 6.573 modifiche / 1.260 entità / 12 sinergie / 517 test / 13 strumenti MCP / 17 comandi CLI. (Il database è stato aggiornato tramite `sync_now` il 24 maggio 2026.)
76
+ **Dati aggiornati (alla versione 1.2.1):** 44 prodotti / 1.171 file di rilascio / 6.573 modifiche / 1.260 entità / 12 sinergie / 519 test / 13 strumenti MCP / 17 comandi CLI. (Il database è stato aggiornato tramite `sync_now` il 24 maggio 2026.)
77
77
 
78
78
  ---
79
79
 
@@ -91,6 +91,7 @@ claude-synergy/
91
91
  | **4d — Playwright + registro MCP + configurazione YAML** | ✅ implementato | Windsurf tramite Playwright; Smithery + registro ufficiale MCP come cataloghi del livello 4; prodotti consolidati in `products.yaml`. |
92
92
  | **5 — v1.1: navigazione con finestre + integrazione OpenAI** | ✅ implementato | `hk diff` / `hk breaking`, limiti di data per tutti i comandi di navigazione, 3 nuovi strumenti MCP (totale di 11), provider di embedding OpenAI, dimensione dell'embedding configurabile, sincronizzazione automatica di `claude-code`, parser generico `keep-a-changelog`. |
93
93
  | **6 — v1.2: sincronizzazione da MCP** | ✅ implementato | `sync_status` (freschezza per prodotto, rilevamento di dati obsoleti) e `sync_now` (recupero su richiesta → ingestione → embedding con anteprima `dry_run` + blocco di concorrenza in-process). Risolve il problema in cui un'applicazione poteva interrogare il database ma non aggiornarlo. **Corregge anche:** un bug che causava la cancellazione di tutti i marker quando `INSERT OR REPLACE INTO products` propagava una cancellazione sulla chiave esterna `markers`, reimpostando silenziosamente il cursore `since` di ogni prodotto ad ogni ingestione (regressione §8.20). |
94
+ | **6.1 — Centralizzazione del marcatore nel modulo fetcher (versione 1.2.1)** | ✅ implementato | La funzione `writeMarker` è stata centralizzata in `fetchOne` in modo che ogni operazione di recupero riuscita aggiorni il marcatore. Le strategie che restituivano 0 elementi datati all'interno della finestra temporale (in particolare, il registro delle modifiche "raw" di `aider`) non scrivevano mai un marcatore e scaricavano ripetutamente il file `HISTORY.md` ad ogni sincronizzazione. La strategia `webfetch` non implementata è stata rinominata in `manual` per `claude-api` e `anthropic-apps`; `sync_status` ora visualizza i prodotti configurati manualmente come "manual" invece di "mai" e li esclude da `stale_only` (regressione §8.21). |
94
95
 
95
96
  Roadmap per la versione 0.8+: disponibile in [URGENT_FINDINGS.md](URGENT_FINDINGS.md) e nella sezione issues.
96
97
 
@@ -294,7 +295,7 @@ Indice completo in [synergies/INDEX.md](synergies/INDEX.md).
294
295
  La suite di test Vitest copre i livelli di unità, integrazione, regressione e test preliminari. **[test-spec-3.md](test-spec-3.md) è la documentazione di riferimento corrente** a partire dalla versione 0.7.0; [test-spec.md](test-spec.md) (versione 1) e [test-spec-2.md](test-spec-2.md) (versione 2) rimangono nel repository come documentazione storica della progettazione.
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
package/README.ja.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **現在の数値 (v1.2.0時点):** 44製品 / 1,171リリースファイル / 6,573変更 / 1,260エンティティ / 12の相乗効果 / 517テスト / 13のMCPツール / 17のCLIコマンド。 (コーパスは2026年5月24日に`sync_now`で更新されました。)
76
+ **現在の数値 (v1.2.1時点):** 44製品 / 1,171リリースファイル / 6,573変更 / 1,260エンティティ / 12の相乗効果 / 519テスト / 13のMCPツール / 17のCLIコマンド。 (2026年5月24日に`sync_now`でコーパスを更新しました。)
77
77
 
78
78
  ---
79
79
 
@@ -90,7 +90,8 @@ claude-synergy/
90
90
  | **4c — turndown HTML→Markdownインジェスト** | ✅ リリース済み | HTMLの本文(Copilot/VS Code/Cursor)が、FTS5とエンティティ抽出のための、行ごとのリストを生成 |
91
91
  | **4d — Playwright + MCPレジストリ + YAML設定** | ✅ リリース済み | WindsurfはPlaywright経由; Smitheryと公式MCPレジストリをTier-4カタログとして使用; 製品は`products.yaml`に統合 |
92
92
  | **5 — v1.1:ウィンドウ表示機能 + OpenAIの埋め込み機能** | ✅ リリース済み | `hk diff` / `hk breaking`:すべての閲覧コマンドで日付範囲を指定可能。3つの新しいMCPツール(合計11個)、OpenAIの埋め込み機能、設定可能な埋め込み次元、`claude-code`の自動同期、汎用的な`keep-a-changelog`パーサー。 |
93
- | **6 — v1.2 MCPからの同期** | ✅ リリース済み | `sync_status`(製品ごとの鮮度、古くなったものの検出)と`sync_now`(オンデマンドでの取得→取り込み→埋め込み。`dry_run`によるプレビュー機能付き。取り込み処理中の同時実行を制限)。コーパスを問い合わせることはできるが、更新できないという問題を解決します。**また、以下の問題を修正:** `INSERT OR REPLACE INTO products`によって`markers`の外部キーにDELETEが連鎖し、各製品の`since`カーソルが取り込みのたびにリセットされていたバグ(回帰 §8.20)。 |
93
+ | **6 — v1.2 sync-from-MCP** | ✅ リリース済み | `sync_status`(製品ごとの鮮度、"never"または"stale"の状態検出)と`sync_now`(オンデマンドでの取得→取り込み→埋め込み。`dry_run`プレビューと、処理中の同時実行ロック機能付き)。 これにより、コーパスを問い合わせできるものの、更新できないという問題を解消します。 **また、以下の問題を修正:** `INSERT OR REPLACE INTO products`によって`markers`の外部キーにDELETEが連鎖し、すべての製品の`since`カーソルが、取り込みのたびにリセットされていたバグ(回帰 §8.20)。 |
94
+ | **6.1 — v1.2.1 fetcher-markerの中央管理** | ✅ リリース済み | `fetchOne`内で`writeMarker`を中央管理化し、すべての正常な取得でマーカーを更新するようにしました。 以前は、一定期間内に0件のアイテムを返した戦略(特に`aider`のraw-changelog)は、マーカーを書き込まず、`HISTORY.md`を毎回再取得していました。 実装されていない`webfetch`戦略を、`claude-api`および`anthropic-apps`向けに`manual`に改名しました。 `sync_status`では、現在、手動で設定された製品を"never"ではなく"manual"として表示し、`stale_only`から除外するようにしました(回帰 §8.21)。 |
94
95
 
95
96
  v0.8以降のロードマップ:[URGENT_FINDINGS.md](URGENT_FINDINGS.md)およびissueで追跡中。
96
97
 
@@ -254,10 +255,10 @@ GitHub Copilotの`.vscode/mcp.json`ファイルでは、`mcpServers`ではなく
254
255
  | `get_changes_since` | **新規。** 製品とバージョンごとにグループ化された、時間範囲内の変更点。入力:`since`(必須)、`until?`、`product?`、`kind?`、`limit?`。 |
255
256
  | `search_breaking_changes` | **新規。** 検索語句不要の、変更点のフラットリスト。入力:`product?`、`since?`、`until?`、`limit?`。 |
256
257
  | `compare_versions` | **新規。** 単一の製品の2つのバージョン間のすべての変更点。入力:`product`、`from_version`、`to_version`。 |
257
- | `sync_status` | **v1.2.** 製品ごとの同期鮮度:最終取得日時、取得からの経過時間、取り込んだリリース数。入力パラメータ:`product?`, `stale_only?`, `stale_hours?`。`latest_releases`を使用する前に、コーパスが最新の状態かどうかを確認するために使用してください。 |
258
- | `sync_now` | **v1.2.** オンデマンドでの更新(`hk sync`と同様)。入力パラメータ:`product?`, `dry_run?`, `include_ingest?`, `include_embed?`, `timeout_ms?`。別の`sync_now`が実行中の場合、`InvalidParams`エラーで拒否されます。Gitへのコミットは行いません。 |
258
+ | `sync_status` | **v1.2.** 製品ごとの同期の鮮度:最終取得時刻、取得からの経過時間、取り込まれたリリース数。 入力:`product?`、`stale_only?`、`stale_hours?`。 `latest_releases`を信頼する前に、コーパスが最新の状態かどうかを確認するために使用してください。 |
259
+ | `sync_now` | **v1.2.** オンデマンドでの更新(`hk sync`と同様)。 入力:`product?`、`dry_run?`、`include_ingest?`、`include_embed?`、`timeout_ms?`。 別の`sync_now`が実行中の場合、`InvalidParams`エラーで拒否されます。 Gitへのコミットは行いません。 |
259
260
 
260
- v1.1のツールは、`hk diff` / `hk breaking`および、以前はスクリプトが必要だったバージョン比較のワークフローを模倣しています。v1.2の同期ツールは、セッションがコーパスを問い合わせることはできるが、更新できないという問題を解決します。`sync_status`は鮮度を報告し、`sync_now`はパイプラインを実行します。完全な入力スキーマについては、[マニュアル → MCPサーバー](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/)を参照してください。
261
+ v1.1のツールは、`hk diff` / `hk breaking`および、以前はスクリプトが必要だったバージョン比較のワークフローを模倣しています。 v1.2の同期ツールは、セッションがコーパスを問い合わせできるものの、更新できないという問題を解消します。 `sync_status`は鮮度を報告し、`sync_now`はパイプラインを実行します。 完全な入力スキーマについては、[マニュアル → MCPサーバー](https://mcp-tool-shop-org.github.io/claude-synergy/handbook/mcp-server/)を参照してください。
261
262
 
262
263
  ---
263
264
 
@@ -294,7 +295,7 @@ v1.1のツールは、`hk diff` / `hk breaking`および、以前はスクリプ
294
295
  Vitestスイートは、ユニットテスト、統合テスト、回帰テスト、および初期動作確認(smoke)の各レベルをカバーします。**[test-spec-3.md](test-spec-3.md)が現在の仕様**です(v0.7.0時点)。[test-spec.md](test-spec.md)(v1)および[test-spec-2.md](test-spec-2.md)(v2)は、設計の経緯を示すための履歴として、リポジトリに残っています。
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
@@ -305,7 +306,7 @@ pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
305
306
  | ディレクトリ | 内容 |
306
307
  |-----|----------------|
307
308
  | `test/unit/` | モジュールごと — 抽出、取り込み、クエリ(`until` / 閲覧 / `since` / 比較を含む)、データベース(次元設定v3移行を含む)、埋め込み、ハイブリッド、取り込み + すべてのプロバイダー(Ollama / Voyage / **OpenAI**)+ RSS/変更ログの取り込み(**keep-a-changelog**パーサーを含む)/HTML + MCPレジストリの取り込み + Playwrightの取り込み + 製品設定 + 連携の取り込み/クエリ |
308
- | `test/integration/` | エンドツーエンド:パイプライン、同期、MCPサーバー(stdio JSON-RPC、13のツールを含む。`sync_status` / `sync_now`など)、CLI(`hk diff`、`hk breaking`など)。 |
309
+ | `test/integration/` | エンドツーエンド:パイプライン、同期、MCPサーバー(stdio JSON-RPC、13のツール(`sync_status` / `sync_now`を含む)、CLI(`hk diff`、`hk breaking`を含む)) |
309
310
  | `test/regression/` | §8.1–§8.19 — それぞれが、開発中に修正された実際のバグに対する対策。(§8.19:ghReleasesの早期終了ページネーションは、指定範囲内のアイテムを保持します) |
310
311
  | `test/smoke/` | 実際の`products/`ディレクトリ(1,143個のファイル)に対するフルコーパスのテスト。 |
311
312
  | `test/fixtures/` | 3つのダミー製品と、モックHTTPレスポンス(RSS / GH / Voyage / Cohere / Ollama / Anthropic / Smithery / 公式MCPレジストリ)。 |
package/README.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **Live numbers (as of v1.2.0):** 44 products / 1,171 release files / 6,573 changes / 1,260 entities / 12 synergies / 517 tests / 13 MCP tools / 17 CLI commands. (Corpus refreshed via `sync_now` on 2026-05-24.)
76
+ **Live numbers (as of v1.2.1):** 44 products / 1,171 release files / 6,573 changes / 1,260 entities / 12 synergies / 519 tests / 13 MCP tools / 17 CLI commands. (Corpus refreshed via `sync_now` on 2026-05-24.)
77
77
 
78
78
  ---
79
79
 
@@ -91,6 +91,7 @@ claude-synergy/
91
91
  | **4d — Playwright + MCP registry + YAML config** | ✅ shipped | Windsurf via Playwright; Smithery + official MCP Registry as Tier-4 catalogs; products consolidated into `products.yaml` |
92
92
  | **5 — v1.1 windowed browsing + OpenAI embed** | ✅ shipped | `hk diff` / `hk breaking`, date bounds across all browsing commands, 3 new MCP tools (11 total), OpenAI embedding provider, configurable embedding dimension, `claude-code` auto-sync, generic `keep-a-changelog` parser |
93
93
  | **6 — v1.2 sync-from-MCP** | ✅ shipped | `sync_status` (per-product freshness, never/stale detection) and `sync_now` (on-demand fetch → ingest → embed with `dry_run` preview + in-process concurrency lock). Closes the seam where a calling agent could query the corpus but not refresh it. **Also fixes:** marker-wipe bug where `INSERT OR REPLACE INTO products` cascaded a DELETE on the `markers` FK, silently resetting every product's `since` cursor on each ingest (regression §8.20). |
94
+ | **6.1 — v1.2.1 fetcher-marker centralization** | ✅ shipped | Centralized `writeMarker` in `fetchOne` so every successful fetch updates the marker — pre-fix, strategies that returned 0 in-window dated items (most notably `aider` raw-changelog) never wrote a marker and re-pulled `HISTORY.md` on every sync. Renamed unimplemented `webfetch` strategy to `manual` for `claude-api` + `anthropic-apps`; `sync_status` now renders manual products as "manual" instead of "never" and excludes them from `stale_only` (regression §8.21). |
94
95
 
95
96
  Roadmap beyond v1.2: tracked in [URGENT_FINDINGS.md](URGENT_FINDINGS.md) and issues.
96
97
 
@@ -294,7 +295,7 @@ Full index in [synergies/INDEX.md](synergies/INDEX.md).
294
295
  Vitest suite covers unit / integration / regression / smoke tiers. **[test-spec-3.md](test-spec-3.md) is the current authority** as of v0.7.0; [test-spec.md](test-spec.md) (v1) and [test-spec-2.md](test-spec-2.md) (v2) remain in the repo as historical record of the design lineage.
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
package/README.pt-BR.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **Números atualizados (versão 1.2.0):** 44 produtos / 1.171 arquivos de lançamento / 6.573 alterações / 1.260 entidades / 12 sinergias / 517 testes / 13 ferramentas MCP / 17 comandos de linha de comando. (O corpus foi atualizado via `sync_now` em 24 de maio de 2026.)
76
+ **Números atualizados (versão 1.2.1):** 44 produtos / 1.171 arquivos de lançamento / 6.573 alterações / 1.260 entidades / 12 sinergias / 519 testes / 13 ferramentas MCP / 17 comandos de linha de comando. (O corpus foi atualizado via `sync_now` em 24 de maio de 2026.)
77
77
 
78
78
  ---
79
79
 
@@ -91,6 +91,7 @@ claude-synergy/
91
91
  | **4d — Playwright + registro MCP + configuração YAML** | ✅ implementado | Windsurf via Playwright; Smithery + registro oficial MCP como catálogos da etapa 4; produtos consolidados em `products.yaml`. |
92
92
  | **5 — Navegação com janelas (v1.1) + incorporação da OpenAI** | ✅ implementado | `hk diff` / `hk breaking`, limites de data em todos os comandos de navegação, 3 novas ferramentas MCP (total de 11), provedor de incorporação da OpenAI, dimensão de incorporação configurável, sincronização automática do `claude-code`, analisador genérico `keep-a-changelog`. |
93
93
  | **6 — v1.2 sync-from-MCP** | ✅ implementado | `sync_status` (frescor por produto, detecção de "obsoleto") e `sync_now` (busca sob demanda → ingestão → incorporação com visualização "dry_run" + bloqueio de concorrência em processo). Elimina a lacuna onde um agente poderia consultar o corpus, mas não atualizá-lo. **Corrige também:** um erro em que a exclusão de marcadores, ao usar `INSERT OR REPLACE INTO products`, causava uma exclusão em cascata na chave estrangeira `markers`, reiniciando silenciosamente o cursor "since" de cada produto a cada ingestão (regressão §8.20). |
94
+ | **6.1 — Centralização do marcador de recuperação (versão 1.2.1)** | ✅ implementado | Centralizei a função `writeMarker` em `fetchOne` para que cada recuperação bem-sucedida atualize o marcador. Estratégias que retornavam 0 itens datados dentro do período especificado (principalmente o "changelog" bruto do `aider`) nunca escreviam um marcador e, portanto, baixavam o arquivo `HISTORY.md` a cada sincronização. Renomeei a estratégia `webfetch` não implementada para `manual` para as APIs `claude-api` e `anthropic-apps`. Agora, o `sync_status` exibe os produtos configurados como "manual" em vez de "nunca" e os exclui do processo `stale_only` (regressão §8.21). |
94
95
 
95
96
  Roteiro para a versão 0.8+: acompanhado em [URGENT_FINDINGS.md](URGENT_FINDINGS.md) e nas issues.
96
97
 
@@ -294,7 +295,7 @@ Estratégias de busca: `gh-releases | rss | raw-changelog | html-scrape | catalo
294
295
  O conjunto de testes Vitest cobre os níveis de unidade / integração / regressão / teste rápido. **[test-spec-3.md](test-spec-3.md) é a documentação atual** a partir da versão v0.7.0; [test-spec.md](test-spec.md) (v1) e [test-spec-2.md](test-spec-2.md) (v2) permanecem no repositório como registro histórico da linhagem do design.
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
package/README.zh.md CHANGED
@@ -73,7 +73,7 @@ claude-synergy/
73
73
  └── URGENT_FINDINGS.md # 23 actionable items surfaced from the corpus
74
74
  ```
75
75
 
76
- **实时数据 (截至 v1.2.0 版本):** 44 个产品 / 1,171 个发布文件 / 6,573 个变更 / 1,260 个实体 / 12 个协同功能 / 517 个测试 / 13 个 MCP 工具 / 17 个 CLI 命令。 (语料库已于 2026-05-24 通过 `sync_now` 命令刷新。)
76
+ **实时数据(截至 v1.2.1 版本):** 44 个产品 / 1,171 个发布文件 / 6,573 个变更 / 1,260 个实体 / 12 个协同关系 / 519 个测试 / 13 个 MCP 工具 / 17 个 CLI 命令。(语料库已于 2026-05-24 通过 `sync_now` 命令刷新。)
77
77
 
78
78
  ---
79
79
 
@@ -91,6 +91,7 @@ claude-synergy/
91
91
  | 4d — playwright + MCP 注册 + YAML 配置文件。 | ✅ 已发货。 | 使用 Playwright 进行网页抓取;Smithery + 官方 MCP 注册信息作为第四级目录;产品信息已整合到 `products.yaml` 文件中。 |
92
92
  | **5 — v1.1 版本:窗口浏览 + OpenAI 嵌入** | ✅ 已发货。 | `hk diff` / `hk breaking`,所有浏览命令都支持日期范围;3 个新的 MCP 工具 (总共 11 个);OpenAI 嵌入提供程序;可配置的嵌入维度;`claude-code` 自动同步;通用的 `keep-a-changelog` 解析器。 |
93
93
  | **6 — v1.2 版本:从 MCP 同步** | ✅ 已发货。 | `sync_status` (报告每个产品的更新状态,检测是否过时) 和 `sync_now` (按需获取 → 导入 → 嵌入,并提供 `dry_run` 预览 + 进程内并发锁定)。 解决了调用方可以查询语料库,但无法刷新的问题。 **此外,还修复了:** 标记清除错误,即 `INSERT OR REPLACE INTO products` 会级联删除 `markers` 上的外键,从而在每次导入时静默地重置每个产品的 `since` 游标 (回归 §8.20)。 |
94
+ | **6.1 — v1.2.1:Fetcher 标记集中化** | ✅ 已发货。 | 将 `writeMarker` 函数集中到 `fetchOne` 函数中,以便每次成功的获取都更新标记。之前,一些策略(特别是 `aider` 原始变更日志)返回 0 个在窗口期内的条目,因此从未写入标记,并且每次同步都会重新拉取 `HISTORY.md` 文件。已将未实现的 `webfetch` 策略重命名为 `manual`,适用于 `claude-api` 和 `anthropic-apps`。现在,`sync_status` 会将手动配置的产品显示为 "manual",而不是 "never",并且将其排除在 `stale_only` 列表中(回归问题 §8.21)。 |
94
95
 
95
96
  v0.8 及后续版本的开发计划,请参考 [URGENT_FINDINGS.md](URGENT_FINDINGS.md) 文件以及相关问题列表。
96
97
 
@@ -294,7 +295,7 @@ v1.1 版本的工具模仿了 `hk diff` / `hk breaking` 命令,以及以前需
294
295
  Vitest 测试套件覆盖单元测试、集成测试、回归测试和初步测试。 **[test-spec-3.md](test-spec-3.md) 是当前版本 (v0.7.0) 的权威文档**;[test-spec.md](test-spec.md) (v1) 和 [test-spec-2.md](test-spec-2.md) (v2) 仍然保存在代码库中,作为设计演进的历史记录。
295
296
 
296
297
  ```bash
297
- pnpm test # unit + integration + regression (~36s, 517 tests)
298
+ pnpm test # unit + integration + regression (~36s, 519 tests)
298
299
  pnpm test:watch # interactive
299
300
  pnpm test:coverage # generate coverage/index.html (thresholds: 78/75/85/78)
300
301
  pnpm test:smoke # opt-in full-corpus smoke (RUN_SMOKE=1)
@@ -123,7 +123,9 @@ function getSyncStatus(db, opts = {}) {
123
123
  const rows = db.prepare(sql).all(params);
124
124
  if (opts.staleOnly) {
125
125
  const cutoff = opts.staleHours ?? 24;
126
- return rows.filter((r) => r.hours_since_fetch === null || r.hours_since_fetch > cutoff);
126
+ return rows.filter(
127
+ (r) => r.fetch_strategy !== "manual" && (r.hours_since_fetch === null || r.hours_since_fetch > cutoff)
128
+ );
127
129
  }
128
130
  return rows;
129
131
  }
@@ -791,23 +791,31 @@ function buildSummary(results) {
791
791
  }
792
792
  async function fetchOne(db, productsRoot, target, sinceOverride, signal) {
793
793
  assertProductShape(target.product);
794
- const since = sinceOverride ?? readMarker(db, target.product) ?? "2026-01-01";
794
+ const existingMarker = readMarker(db, target.product);
795
+ const since = sinceOverride ?? existingMarker ?? "2026-01-01";
795
796
  const outDir = resolve(productsRoot, target.product, "releases");
796
797
  mkdirSync2(outDir, { recursive: true });
798
+ let stats;
797
799
  try {
798
800
  switch (target.strategy) {
799
801
  case "gh-releases":
800
- return await fetchGhReleases(db, outDir, target, since);
802
+ stats = await fetchGhReleases(db, outDir, target, since);
803
+ break;
801
804
  case "rss":
802
- return await fetchRss(db, outDir, target, since, signal);
805
+ stats = await fetchRss(db, outDir, target, since, signal);
806
+ break;
803
807
  case "raw-changelog":
804
- return await fetchRawChangelog(db, outDir, target, since, signal);
808
+ stats = await fetchRawChangelog(db, outDir, target, since, signal);
809
+ break;
805
810
  case "html-scrape":
806
- return await fetchHtmlScrape(db, outDir, target, since, signal);
811
+ stats = await fetchHtmlScrape(db, outDir, target, since, signal);
812
+ break;
807
813
  case "catalog":
808
- return await fetchCatalogStrategy(db, productsRoot, target, since, signal);
814
+ stats = await fetchCatalogStrategy(db, productsRoot, target, since, signal);
815
+ break;
809
816
  case "playwright":
810
- return await fetchPlaywrightStrategy(db, outDir, target, since);
817
+ stats = await fetchPlaywrightStrategy(db, outDir, target, since);
818
+ break;
811
819
  }
812
820
  } catch (e) {
813
821
  return {
@@ -818,6 +826,9 @@ async function fetchOne(db, productsRoot, target, sinceOverride, signal) {
818
826
  errors: [`fetch failed: ${e.message}`]
819
827
  };
820
828
  }
829
+ const markerVersion = stats.latest ?? existingMarker ?? since;
830
+ writeMarker(db, target.product, markerVersion, target.strategy);
831
+ return stats;
821
832
  }
822
833
  async function fetchGhReleases(db, outDir, target, since) {
823
834
  if (!target.repo) throw new Error(`${target.product}: gh-releases strategy requires repo`);
@@ -845,7 +856,6 @@ async function fetchGhReleases(db, outDir, target, since) {
845
856
  errors.push(`${r.tag_name}: ${e.message}`);
846
857
  }
847
858
  }
848
- if (latest) writeMarker(db, target.product, latest, target.strategy);
849
859
  return { product: target.product, fetched, newSince: since, latest, errors };
850
860
  }
851
861
  function ghReleases(repo, sinceIso) {
@@ -959,7 +969,6 @@ async function fetchRss(db, outDir, target, since, signal) {
959
969
  errors.push(`${item.slug}: ${e.message}`);
960
970
  }
961
971
  }
962
- if (latest) writeMarker(db, target.product, latest, target.strategy);
963
972
  return { product: target.product, fetched, newSince: since, latest, errors };
964
973
  }
965
974
  async function fetchRawChangelog(db, outDir, target, since, signal) {
@@ -1008,7 +1017,6 @@ async function fetchRawChangelog(db, outDir, target, since, signal) {
1008
1017
  errors.push(`${item.version}: ${e.message}`);
1009
1018
  }
1010
1019
  }
1011
- if (latest) writeMarker(db, target.product, latest, target.strategy);
1012
1020
  return { product: target.product, fetched, newSince: since, latest, errors };
1013
1021
  }
1014
1022
  async function fetchHtmlScrape(db, outDir, target, since, signal) {
@@ -1048,7 +1056,6 @@ async function fetchHtmlScrape(db, outDir, target, since, signal) {
1048
1056
  errors.push(`${item.slug}: ${e.message}`);
1049
1057
  }
1050
1058
  }
1051
- if (latest) writeMarker(db, target.product, latest, target.strategy);
1052
1059
  return { product: target.product, fetched, newSince: since, latest, errors };
1053
1060
  }
1054
1061
  async function fetchPlaywrightStrategy(db, outDir, target, since) {
@@ -1088,7 +1095,6 @@ async function fetchPlaywrightStrategy(db, outDir, target, since) {
1088
1095
  errors.push(`${item.slug}: ${e.message}`);
1089
1096
  }
1090
1097
  }
1091
- if (latest) writeMarker(db, target.product, latest, target.strategy);
1092
1098
  return { product: target.product, fetched, newSince: since, latest, errors };
1093
1099
  }
1094
1100
  async function fetchCatalogStrategy(db, productsRoot, target, since, signal) {
@@ -1097,7 +1103,6 @@ async function fetchCatalogStrategy(db, productsRoot, target, since, signal) {
1097
1103
  const productDir = resolve(productsRoot, target.product);
1098
1104
  writeCatalog(productDir, target.product, entries);
1099
1105
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
1100
- writeMarker(db, target.product, nowIso, target.strategy);
1101
1106
  return {
1102
1107
  product: target.product,
1103
1108
  fetched: entries.length,
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  lookupEntity,
9
9
  recentReleases,
10
10
  searchChanges
11
- } from "./chunk-MTW6UZBF.js";
11
+ } from "./chunk-2J45LIMO.js";
12
12
  import {
13
13
  ingestAll
14
14
  } from "./chunk-KFAQPOGV.js";
@@ -22,7 +22,7 @@ import {
22
22
  import {
23
23
  fetchAll,
24
24
  seedMarkersFromDb
25
- } from "./chunk-X25ZTSCJ.js";
25
+ } from "./chunk-6MUY565T.js";
26
26
  import "./chunk-MZLFGICO.js";
27
27
 
28
28
  // src/cli.ts
@@ -2,7 +2,7 @@ import {
2
2
  fetchAll,
3
3
  listFetchTargets,
4
4
  seedMarkersFromDb
5
- } from "./chunk-X25ZTSCJ.js";
5
+ } from "./chunk-6MUY565T.js";
6
6
  import "./chunk-MZLFGICO.js";
7
7
  export {
8
8
  fetchAll,
@@ -12,7 +12,7 @@ import {
12
12
  lookupEntity,
13
13
  recentReleases,
14
14
  searchChanges
15
- } from "./chunk-MTW6UZBF.js";
15
+ } from "./chunk-2J45LIMO.js";
16
16
  import {
17
17
  openDb
18
18
  } from "./chunk-CEIOLMDT.js";
@@ -781,14 +781,15 @@ function handleSyncStatus(args) {
781
781
  return args.staleOnly ? `(no stale products \u2014 threshold ${args.staleHours ?? 24}h)` : "(no products in DB \u2014 run `hk ingest` first)";
782
782
  }
783
783
  const lines = [
784
- "Product Strategy Last fetch Hours Ingested Latest release",
785
- "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
784
+ "Product Strategy Last fetch Hours Ingested Latest release",
785
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
786
786
  ];
787
787
  for (const r of rows) {
788
+ const isManual = r.fetch_strategy === "manual";
788
789
  const product = (r.product ?? "").padEnd(36);
789
790
  const strategy = (r.fetch_strategy ?? "\u2014").padEnd(14);
790
- const lastFetch = r.last_fetch_attempt ? r.last_fetch_attempt.split("T")[0] : "never ";
791
- const hours = formatHours(r.hours_since_fetch).padStart(5);
791
+ const lastFetch = r.last_fetch_attempt ? r.last_fetch_attempt.split("T")[0] : isManual ? "manual " : "never ";
792
+ const hours = (isManual && r.hours_since_fetch == null ? "manual" : formatHours(r.hours_since_fetch)).padStart(6);
792
793
  const ingested = String(r.releases_ingested).padStart(8);
793
794
  const latest = r.last_release_at ? r.last_release_at.split("T")[0] : "\u2014";
794
795
  lines.push(`${product} ${strategy} ${lastFetch} ${hours} ${ingested} ${latest}`);
@@ -809,7 +810,7 @@ async function handleSyncNow(args) {
809
810
  const includeIngest = args.includeIngest ?? true;
810
811
  const includeEmbed = args.includeEmbed ?? true;
811
812
  const timeoutMs = args.timeoutMs ?? 3e5;
812
- const { fetchAll, listFetchTargets } = await import("./fetch-XS3IETWW.js");
813
+ const { fetchAll, listFetchTargets } = await import("./fetch-CRO7KXFP.js");
813
814
  if (dryRun) {
814
815
  const targets = args.product ? listFetchTargets().filter((t) => t.product === args.product) : listFetchTargets();
815
816
  if (targets.length === 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcptoolshop/claude-synergy",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Local mirror of Anthropic product changelogs + curated cross-product synergies. So the LLM agent inside the harness knows what the harness can do.",
5
5
  "type": "module",
6
6
  "exports": {
package/products.yaml CHANGED
@@ -77,19 +77,24 @@ products:
77
77
  type: gh-releases
78
78
  repo: anthropics/claude-code
79
79
 
80
- # ── Tier 3 / HTML feeds ──────────────────────────────────────────────────
80
+ # ── Tier 3 / manual-seed (no automated fetcher yet) ──────────────────────
81
+ # Renamed from `webfetch` to `manual` in v1.2.1 — the original label suggested
82
+ # an automated WebFetch-based fetcher that was never implemented. These two
83
+ # corpora are still seeded by hand (the initial study-swarm pulled them via
84
+ # WebFetch one-shot, but `sync_now` does not refresh them). `sync_status`
85
+ # renders the strategy as "manual" instead of "never" so callers can
86
+ # distinguish "needs implementation" from "stale gh-releases."
81
87
  - name: claude-api
82
88
  display_name: Claude API / Platform
83
89
  tier: 3
84
90
  source_url: https://platform.claude.com/docs/en/release-notes/overview
85
- fetch_strategy: webfetch
86
- # WebFetch-based; corpus seeded by initial swarm.
91
+ fetch_strategy: manual
87
92
 
88
93
  - name: anthropic-apps
89
94
  display_name: Anthropic Apps (Design / Cowork / Chat / Mobile)
90
95
  tier: 3
91
96
  source_url: https://support.claude.com/en/articles/12138966-release-notes
92
- fetch_strategy: webfetch
97
+ fetch_strategy: manual
93
98
 
94
99
  # ── Tier 1 / GitHub Releases — Anthropic SDKs ────────────────────────────
95
100
  - name: claude-agent-sdk-python