jfox-cli 1.4.0__tar.gz → 1.5.0__tar.gz

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.
Files changed (333) hide show
  1. jfox_cli-1.5.0/.claude/skills/release-cc-plugin/SKILL.md +104 -0
  2. jfox_cli-1.5.0/.claude/skills/release-cc-plugin/release_cc_plugin_helper.py +238 -0
  3. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/AGENTS.md +1 -1
  4. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/CHANGELOG.md +17 -0
  5. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/CLAUDE.md +6 -3
  6. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/PKG-INFO +2 -2
  7. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/README.md +1 -1
  8. jfox_cli-1.5.0/docs/superpowers/plans/2026-07-12-release-cc-plugin-skill.md +681 -0
  9. jfox_cli-1.5.0/docs/superpowers/plans/2026-07-12-show-json.md +393 -0
  10. jfox_cli-1.5.0/docs/superpowers/plans/2026-07-17-fix-candidate-dual-h1.md +266 -0
  11. jfox_cli-1.5.0/docs/superpowers/plans/2026-07-18-dedup-lifecycle-decouple.md +736 -0
  12. jfox_cli-1.5.0/docs/superpowers/plans/2026-07-19-promote-skill-three-modes.md +354 -0
  13. jfox_cli-1.5.0/docs/superpowers/specs/2026-07-12-release-cc-plugin-skill-design.md +91 -0
  14. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-07-12-show-json-design.md +8 -3
  15. jfox_cli-1.5.0/docs/superpowers/specs/2026-07-18-dedup-lifecycle-decouple-design.md +119 -0
  16. jfox_cli-1.5.0/docs/superpowers/specs/2026-07-19-promote-skill-three-modes-design.md +94 -0
  17. jfox_cli-1.5.0/jfox/__init__.py +15 -0
  18. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/cli.py +33 -7
  19. jfox_cli-1.5.0/jfox/gem_synth/lifecycle.py +86 -0
  20. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/synthesizer.py +41 -3
  21. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/models.py +52 -0
  22. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/note.py +57 -51
  23. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/manage/SKILL.md +3 -3
  24. jfox_cli-1.5.0/packages/cc-plugin/skills/promote/SKILL.md +225 -0
  25. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-manage/SKILL.md +3 -3
  26. jfox_cli-1.5.0/packages/kimi-plugin/skills/jfox-promote/SKILL.md +315 -0
  27. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/using-jfox/SKILL.md +1 -1
  28. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/pyproject.toml +1 -1
  29. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-common/SKILL.md +3 -3
  30. jfox_cli-1.5.0/tests/unit/conftest.py +18 -0
  31. jfox_cli-1.5.0/tests/unit/test_gem_synth_lifecycle.py +108 -0
  32. jfox_cli-1.5.0/tests/unit/test_gem_synth_synthesizer.py +256 -0
  33. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_dedup_sync.py +14 -0
  34. jfox_cli-1.5.0/tests/unit/test_note_lifecycle_hooks.py +81 -0
  35. jfox_cli-1.5.0/tests/unit/test_release_cc_plugin_helper.py +215 -0
  36. jfox_cli-1.5.0/tests/unit/test_show.py +200 -0
  37. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/uv.lock +1 -1
  38. jfox_cli-1.4.0/jfox/__init__.py +0 -5
  39. jfox_cli-1.4.0/packages/cc-plugin/skills/promote/SKILL.md +0 -40
  40. jfox_cli-1.4.0/packages/kimi-plugin/skills/jfox-promote/SKILL.md +0 -154
  41. jfox_cli-1.4.0/tests/unit/test_gem_synth_synthesizer.py +0 -133
  42. jfox_cli-1.4.0/tests/unit/test_show.py +0 -73
  43. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.claude/skills/ci/SKILL.md +0 -0
  44. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.claude/skills/release/SKILL.md +0 -0
  45. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.claude/skills/release/release_helper.py +0 -0
  46. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.claude-plugin/marketplace.json +0 -0
  47. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.githooks/pre-push +0 -0
  48. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  49. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  50. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/ISSUE_TEMPLATE/docs_improvement.yml +0 -0
  51. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  53. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/workflows/integration-test.yml +0 -0
  54. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.github/workflows/publish.yml +0 -0
  55. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.gitignore +0 -0
  56. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/.python-version +0 -0
  57. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/DEVELOPMENT_PLAN.md +0 -0
  58. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/SESSION.md +0 -0
  59. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/SESSION_SUMMARY.md +0 -0
  60. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/claude-code-plugin-guide.md +0 -0
  61. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/installation.md +0 -0
  62. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-11-bulk-import-bm25-fix.md +0 -0
  63. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-11-edit-command.md +0 -0
  64. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-11-unify-format-option.md +0 -0
  65. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-ci-coverage-optimization.md +0 -0
  66. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-edit-content-file.md +0 -0
  67. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-fix-index-rebuild-clear.md +0 -0
  68. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-fix-index-verify-id-mismatch.md +0 -0
  69. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-fix-jfox-health-skill-kb-param.md +0 -0
  70. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-index-kb-param.md +0 -0
  71. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-lazy-import-perf.md +0 -0
  72. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-12-skill-redesign.md +0 -0
  73. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-add-content-file.md +0 -0
  74. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-bulk-import-vectorstore-init.md +0 -0
  75. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-ingest-log-command.md +0 -0
  76. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-ingest-skill-sync.md +0 -0
  77. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-suppress-third-party-logging.md +0 -0
  78. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-13-sync-skills-with-cli.md +0 -0
  79. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-14-sync-docs-daemon-show.md +0 -0
  80. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-15-gpu-embedding.md +0 -0
  81. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-15-make-daemon-deps-required.md +0 -0
  82. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-15-session-summary-confirmation.md +0 -0
  83. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-16-fix-windows-daemon-console-window.md +0 -0
  84. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-18-daemon-timeout-and-index-rebuild.md +0 -0
  85. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-22-release-skill.md +0 -0
  86. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-26-fix-daemon-deprecation-warnings.md +0 -0
  87. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-27-intranet-model-download.md +0 -0
  88. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-28-tag-filtering.md +0 -0
  89. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-04-29-daemon-stop-fix.md +0 -0
  90. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-03-jfox-check.md +0 -0
  91. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-03-list-notes-skip-summary.md +0 -0
  92. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-03-log-level-fix.md +0 -0
  93. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-04-list-notes-index.md +0 -0
  94. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-06-atomic-write.md +0 -0
  95. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-09-session-note-type.md +0 -0
  96. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-10-jfox-plugin.md +0 -0
  97. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-19-fix-last-used-never.md +0 -0
  98. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-05-20-modelscope-migration.md +0 -0
  99. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-02-todo-note-type.md +0 -0
  100. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-16-kimi-code-auto-summary.md +0 -0
  101. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-17-index-rebuild-backlinks.md +0 -0
  102. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-17-using-jfox-skill.md +0 -0
  103. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-18-self-update-command.md +0 -0
  104. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-21-fragment-capture.md +0 -0
  105. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-21-gem-synthesis.md +0 -0
  106. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-06-25-gem-synth-throttle-ledger.md +0 -0
  107. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-07-08-auto-summary-schedule-window.md +0 -0
  108. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-07-08-candidate-promote.md +0 -0
  109. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-07-12-gem-synth-dedup.md +0 -0
  110. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/plans/2026-07-12-session-summary-streamline.md +0 -0
  111. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-03-bugfixes-design.md +0 -0
  112. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-12-skill-redesign-design.md +0 -0
  113. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-13-pr-auto-code-review-design.md +0 -0
  114. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-14-show-command-design.md +0 -0
  115. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-15-gpu-embedding-design.md +0 -0
  116. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-15-session-summary-confirmation-design.md +0 -0
  117. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-21-release-skill-design.md +0 -0
  118. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-26-fix-daemon-deprecation-warnings-design.md +0 -0
  119. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-27-intranet-model-download-design.md +0 -0
  120. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-28-tag-filtering-design.md +0 -0
  121. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-29-daemon-stop-fix-design.md +0 -0
  122. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-04-30-jfox-kb-env-var-design.md +0 -0
  123. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-03-jfox-check-design.md +0 -0
  124. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-03-list-notes-skip-summary-design.md +0 -0
  125. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-03-log-level-fix-design.md +0 -0
  126. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-04-list-notes-index-design.md +0 -0
  127. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-06-atomic-write-design.md +0 -0
  128. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-09-jfox-plugin-design.md +0 -0
  129. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-09-session-note-type-design.md +0 -0
  130. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-05-20-modelscope-migration-design.md +0 -0
  131. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-02-todo-note-type-design.md +0 -0
  132. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-16-kimi-code-auto-summary-design.md +0 -0
  133. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-17-index-rebuild-backlinks-design.md +0 -0
  134. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-17-using-jfox-skill-design.md +0 -0
  135. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-18-archive-soft-delete-design.md +0 -0
  136. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-18-self-update-command-design.md +0 -0
  137. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-21-fragment-capture-design.md +0 -0
  138. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-21-gem-synthesis-design.md +0 -0
  139. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-06-25-gem-synth-throttle-ledger-design.md +0 -0
  140. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-07-08-candidate-promote-design.md +0 -0
  141. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-07-12-gem-synth-dedup-design.md +0 -0
  142. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/superpowers/specs/2026-07-12-session-summary-streamline-design.md +0 -0
  143. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/docs/troubleshooting.md +0 -0
  144. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jessica-jones-static-cable.md +0 -0
  145. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/__main__.py +0 -0
  146. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/__init__.py +0 -0
  147. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/cli.py +0 -0
  148. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/extractor.py +0 -0
  149. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/kimi_source.py +0 -0
  150. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/ledger.py +0 -0
  151. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/loop.py +0 -0
  152. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/runner.py +0 -0
  153. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/scanner.py +0 -0
  154. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/schedule.py +0 -0
  155. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/auto_summary/sources.py +0 -0
  156. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/bm25_index.py +0 -0
  157. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/config.py +0 -0
  158. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/daemon/__init__.py +0 -0
  159. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/daemon/__main__.py +0 -0
  160. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/daemon/client.py +0 -0
  161. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/daemon/process.py +0 -0
  162. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/daemon/server.py +0 -0
  163. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/embedding_backend.py +0 -0
  164. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/formatters.py +0 -0
  165. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/__init__.py +0 -0
  166. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/cli.py +0 -0
  167. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/detector.py +0 -0
  168. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/internal_sources.py +0 -0
  169. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/service.py +0 -0
  170. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/fragment/store.py +0 -0
  171. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/__init__.py +0 -0
  172. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/anchors.py +0 -0
  173. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/cli.py +0 -0
  174. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/dedup.py +0 -0
  175. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/grounding.py +0 -0
  176. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/llm.py +0 -0
  177. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/loop.py +0 -0
  178. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/paths.py +0 -0
  179. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/store.py +0 -0
  180. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/gem_synth/transcript.py +0 -0
  181. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/git_extractor.py +0 -0
  182. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/global_config.py +0 -0
  183. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/graph.py +0 -0
  184. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/indexer.py +0 -0
  185. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/kb_manager.py +0 -0
  186. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/model_downloader.py +0 -0
  187. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/note_index.py +0 -0
  188. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/performance.py +0 -0
  189. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/search_engine.py +0 -0
  190. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/template.py +0 -0
  191. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/template_cli.py +0 -0
  192. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/utils.py +0 -0
  193. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/jfox/vector_store.py +0 -0
  194. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/package.json +0 -0
  195. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/.claude-plugin/plugin.json +0 -0
  196. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/hooks/fragment-capture.sh +0 -0
  197. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/hooks/hooks.json +0 -0
  198. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/ingest/SKILL.md +0 -0
  199. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/organize/SKILL.md +0 -0
  200. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/search/SKILL.md +0 -0
  201. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/session-summary/SKILL.md +0 -0
  202. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/cc-plugin/skills/using-jfox/SKILL.md +0 -0
  203. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/README.md +0 -0
  204. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/kimi.plugin.json +0 -0
  205. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-admin/SKILL.md +0 -0
  206. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-auto-summary/SKILL.md +0 -0
  207. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-ingest/SKILL.md +0 -0
  208. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-organize/SKILL.md +0 -0
  209. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-search/SKILL.md +0 -0
  210. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-session-summary/SKILL.md +0 -0
  211. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/packages/kimi-plugin/skills/jfox-template/SKILL.md +0 -0
  212. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/pytest.ini +0 -0
  213. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/run_full_test.ps1 +0 -0
  214. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/scripts/download-model-intranet.sh +0 -0
  215. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/README.md +0 -0
  216. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/kimi-cli/jfox-common/SKILL.md +0 -0
  217. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/kimi-cli/jfox-ingest/SKILL.md +0 -0
  218. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/kimi-cli/jfox-organize/SKILL.md +0 -0
  219. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/kimi-cli/jfox-search/SKILL.md +0 -0
  220. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/kimi-cli/jfox-session-summary/SKILL.md +0 -0
  221. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-ci/SKILL.md +0 -0
  222. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-ingest/SKILL.md +0 -0
  223. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-organize/SKILL.md +0 -0
  224. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-release/SKILL.md +0 -0
  225. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-search/SKILL.md +0 -0
  226. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/skills-recommend/pi/jfox-session-summary/SKILL.md +0 -0
  227. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/COVERAGE_PLAN.md +0 -0
  228. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/MIGRATION.md +0 -0
  229. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/TESTS.md +0 -0
  230. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/conftest.py +0 -0
  231. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/__init__.py +0 -0
  232. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_auto_summary_kimi.py +0 -0
  233. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_backlinks.py +0 -0
  234. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_candidate_promote_flow.py +0 -0
  235. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_fragment_capture_flow.py +0 -0
  236. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_gem_synth_flow.py +0 -0
  237. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_index_rebuild_backlinks.py +0 -0
  238. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_model_download.py +0 -0
  239. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/integration/test_tag_filter_cli.py +0 -0
  240. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/performance/__init__.py +0 -0
  241. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/performance/test_performance.py +0 -0
  242. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_advanced_features.py +0 -0
  243. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_cli_format.py +0 -0
  244. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_config_set_unit.py +0 -0
  245. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_config_unit.py +0 -0
  246. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_core_workflow.py +0 -0
  247. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_embedding_device.py +0 -0
  248. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_hybrid_search.py +0 -0
  249. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_integration.py +0 -0
  250. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_kb_current.py +0 -0
  251. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/test_suggest_links.py +0 -0
  252. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/__init__.py +0 -0
  253. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_add_backfill_links.py +0 -0
  254. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_archive.py +0 -0
  255. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_atomic_write.py +0 -0
  256. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_cli.py +0 -0
  257. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_config_sources.py +0 -0
  258. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_defaults.py +0 -0
  259. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_extractor.py +0 -0
  260. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_ledger.py +0 -0
  261. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_loop.py +0 -0
  262. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_runner.py +0 -0
  263. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_scanner.py +0 -0
  264. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_schedule.py +0 -0
  265. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_auto_summary_status.py +0 -0
  266. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_bm25_batch.py +0 -0
  267. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_check.py +0 -0
  268. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_content_file.py +0 -0
  269. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_daemon_cli.py +0 -0
  270. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_daemon_process.py +0 -0
  271. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_edit.py +0 -0
  272. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_embedding_local_load.py +0 -0
  273. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_format_unify.py +0 -0
  274. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_formatters.py +0 -0
  275. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_cli.py +0 -0
  276. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_config.py +0 -0
  277. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_detector.py +0 -0
  278. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_hook.py +0 -0
  279. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_internal_sources.py +0 -0
  280. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_service.py +0 -0
  281. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_fragment_store.py +0 -0
  282. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_anchors.py +0 -0
  283. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_backfill.py +0 -0
  284. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_cli.py +0 -0
  285. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_config.py +0 -0
  286. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_config_dedup.py +0 -0
  287. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_dedup.py +0 -0
  288. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_grounding.py +0 -0
  289. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_llm.py +0 -0
  290. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_loop.py +0 -0
  291. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_store.py +0 -0
  292. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_store_duplicate.py +0 -0
  293. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_gem_synth_transcript.py +0 -0
  294. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_git_extractor.py +0 -0
  295. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_global_config.py +0 -0
  296. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_index_kb_param.py +0 -0
  297. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_indexer_clear_before_rebuild.py +0 -0
  298. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_indexer_verify.py +0 -0
  299. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_kb_manager.py +0 -0
  300. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_kimi_extractor.py +0 -0
  301. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_kimi_plugin_skills.py +0 -0
  302. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_kimi_scanner.py +0 -0
  303. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_lazy_import.py +0 -0
  304. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_ledger_migration.py +0 -0
  305. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_list_notes_skip.py +0 -0
  306. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_logging_config.py +0 -0
  307. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_model_downloader.py +0 -0
  308. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_candidate_fields.py +0 -0
  309. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_candidate_filename.py +0 -0
  310. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_index.py +0 -0
  311. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_promote.py +0 -0
  312. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_note_type_candidate.py +0 -0
  313. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_rebuild_backlinks_impl.py +0 -0
  314. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_release_helper.py +0 -0
  315. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_runner_multi_source.py +0 -0
  316. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_scanner_list.py +0 -0
  317. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_session_file_source.py +0 -0
  318. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_session_note.py +0 -0
  319. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_session_source.py +0 -0
  320. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_synthesizer_dedup.py +0 -0
  321. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_system_prompt_sections.py +0 -0
  322. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_tag_filter.py +0 -0
  323. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_template.py +0 -0
  324. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_template_cli.py +0 -0
  325. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_update.py +0 -0
  326. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_use_kb_env_var.py +0 -0
  327. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_using_jfox_skill.py +0 -0
  328. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/unit/test_vector_store_clear.py +0 -0
  329. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/utils/__init__.py +0 -0
  330. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/utils/assertions.py +0 -0
  331. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/utils/jfox_cli.py +0 -0
  332. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/utils/note_generator.py +0 -0
  333. {jfox_cli-1.4.0 → jfox_cli-1.5.0}/tests/utils/temp_kb.py +0 -0
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: release-cc-plugin
3
+ description: Release a new version of the cc-plugin (Claude Code marketplace). Bumps the three version fields in lockstep, opens a PR. Triggers on "发 cc-plugin", "plugin 发版", "release cc plugin", "bump plugin version", "发布 cc 插件".
4
+ ---
5
+
6
+ # Release cc-plugin Skill
7
+
8
+ 把 cc-plugin 发版流程固化:三处版本号同步 bump → PR 合 main。**不打 tag、不发 PyPI**
9
+ (`.claude-plugin/marketplace.json` 的 `source` 指向仓库内 `./packages/cc-plugin`,合 main 后用户 `/plugin update` 自动拉新)。
10
+
11
+ ⚠️ 这是 **cc-plugin** 发版(marketplace,0.5.x)。CLI/PyPI 发版(1.x.x)用 `/release`。
12
+ kimi-plugin 是另一条轨道,本 skill 不管。
13
+
14
+ ## 用法
15
+
16
+ ```
17
+ /release-cc-plugin patch # bump patch: 0.5.1 → 0.5.2
18
+ /release-cc-plugin minor # bump minor: 0.5.1 → 0.6.0
19
+ /release-cc-plugin major # bump major: 0.5.1 → 1.0.0
20
+ /release-cc-plugin 0.7.0 # 指定版本
21
+ ```
22
+
23
+ 默认建议 patch(无新 skill/command → semver patch)。
24
+
25
+ ## 执行流程
26
+
27
+ 严格按步,每步完成才进下一步。
28
+
29
+ ### Step 1: 前置校验
30
+
31
+ 任一不符即停并告知原因。
32
+
33
+ ```bash
34
+ git branch --show-current # 期望 main
35
+ git status --porcelain # 期望 空
36
+ git branch --list 'chore/bump-cc-plugin-*' # 期望 空
37
+ gh pr list --state open --head "chore/bump-cc-plugin-*" # 期望 空
38
+ ```
39
+
40
+ ### Step 2: dry-run 预览
41
+
42
+ ```bash
43
+ uv run python .claude/skills/release-cc-plugin/release_cc_plugin_helper.py <version> --dry-run
44
+ ```
45
+
46
+ 解析 JSON:`current_version` / `new_version` / `files_to_change` / `changelog_summary`。
47
+
48
+ ### Step 3: 展示并等确认
49
+
50
+ 向用户展示:
51
+
52
+ ```
53
+ 📦 cc-plugin Release 预览:
54
+ 当前版本: {current_version}
55
+ 新版本号: {new_version}
56
+ changelog:
57
+ {changelog_summary 逐行}
58
+
59
+ 将修改(三处同步,由 helper 原子 bump):
60
+ - packages/cc-plugin/.claude-plugin/plugin.json
61
+ - .claude-plugin/marketplace.json(metadata.version + plugins[0].version)
62
+ ```
63
+
64
+ **必须等用户明确确认。** 拒绝或要改则停。
65
+
66
+ ### Step 4: 正式 bump
67
+
68
+ ```bash
69
+ uv run python .claude/skills/release-cc-plugin/release_cc_plugin_helper.py <version>
70
+ ```
71
+
72
+ 退出码非 0 → 读 error JSON,告知用户,停。
73
+
74
+ ### Step 5: 分支 / commit / push
75
+
76
+ ```bash
77
+ git checkout -b chore/bump-cc-plugin-{new_version}
78
+ git add packages/cc-plugin/.claude-plugin/plugin.json .claude-plugin/marketplace.json
79
+ git commit -m "chore(cc-plugin): bump version {current_version} → {new_version}"
80
+ git push -u origin chore/bump-cc-plugin-{new_version}
81
+ ```
82
+
83
+ ### Step 6: 开 PR
84
+
85
+ ```bash
86
+ gh pr create --title "chore(cc-plugin): bump version {current_version} → {new_version}" --body "<changelog>"
87
+ ```
88
+
89
+ PR body 用 `changelog_summary` 作 release notes,并注明「合 main 后 `/plugin update` 自动拉新,无需 tag/PyPI」。
90
+
91
+ ### Step 7: 告知用户合并
92
+
93
+ ```
94
+ PR 已创建: {URL}
95
+ 合并即生效(用户 /plugin update 拉新)。不打 tag、不发 Release。
96
+ ```
97
+
98
+ 等用户手动合并。**不自动创建 tag / GitHub Release。**
99
+
100
+ ## 注意
101
+
102
+ - 三处版本号由 helper 原子 bump(命中数不符报错不写),堵 CLAUDE.md 点名的「漏改任一处」坑。
103
+ - 不要用 `/release`(那是 CLI/PyPI)。
104
+ - 合 main 即发布;如需追溯可手动 `gh release create cc-plugin-v<x>`,但非默认。
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ cc-plugin release 辅助脚本
4
+
5
+ 处理版本号计算、三处版本号同步 bump、changelog 生成。
6
+ 输出 JSON 供 Claude 解析。
7
+
8
+ 用法:
9
+ python release_cc_plugin_helper.py patch # bump patch
10
+ python release_cc_plugin_helper.py minor # bump minor
11
+ python release_cc_plugin_helper.py major # bump major
12
+ python release_cc_plugin_helper.py 0.6.0 # 指定版本
13
+ python release_cc_plugin_helper.py ... --dry-run # 只计算不修改文件
14
+ """
15
+
16
+ import argparse
17
+ import json
18
+ import re
19
+ import subprocess
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ # 项目根目录(脚本位于 .claude/skills/release-cc-plugin/,向上 3 级)
24
+ PROJECT_ROOT = Path(__file__).resolve().parents[3]
25
+ PLUGIN_JSON_REL = "packages/cc-plugin/.claude-plugin/plugin.json"
26
+ MARKETPLACE_JSON_REL = ".claude-plugin/marketplace.json"
27
+ VERSION_RE = re.compile(r"^\d+\.\d+\.\d+$")
28
+
29
+
30
+ def output_json(data: dict) -> None:
31
+ print(json.dumps(data, ensure_ascii=False))
32
+
33
+
34
+ def output_error(msg: str) -> None:
35
+ output_json({"error": msg})
36
+ sys.exit(1)
37
+
38
+
39
+ def _version_tuple(v: str) -> tuple[int, ...]:
40
+ return tuple(int(x) for x in v.split("."))
41
+
42
+
43
+ def read_current_version(root: Path) -> str:
44
+ """从 plugin.json 读当前版本号(单一真相源)。"""
45
+ data = json.loads((root / PLUGIN_JSON_REL).read_text(encoding="utf-8"))
46
+ return data["version"]
47
+
48
+
49
+ def compute_new_version(current: str, spec: str) -> str:
50
+ """patch/minor/major 递增或 explicit x.y.z;结果必须 > current,否则 raise ValueError。"""
51
+ if not VERSION_RE.match(current):
52
+ raise ValueError(f"非法当前版本号: {current!r}")
53
+ if spec in ("patch", "minor", "major"):
54
+ major, minor, patch = _version_tuple(current)
55
+ if spec == "patch":
56
+ new = f"{major}.{minor}.{patch + 1}"
57
+ elif spec == "minor":
58
+ new = f"{major}.{minor + 1}.0"
59
+ else:
60
+ new = f"{major + 1}.0.0"
61
+ elif VERSION_RE.match(spec):
62
+ new = spec
63
+ else:
64
+ raise ValueError(f"非法版本号规格: {spec!r}(需 patch/minor/major 或 x.y.z)")
65
+ if _version_tuple(new) <= _version_tuple(current):
66
+ raise ValueError(f"新版本 {new} 须大于当前 {current}(不允许降级/同号)")
67
+ return new
68
+
69
+
70
+ def find_last_bump_commit(root: Path, current_version: str) -> str | None:
71
+ """定位上次发版提交:引入 current_version 的提交;降级为最近改 marketplace.json 的提交。"""
72
+ rel = MARKETPLACE_JSON_REL
73
+ for args in (
74
+ ["git", "log", "-S", f'"version": "{current_version}"', "--format=%H", "--", rel],
75
+ ["git", "log", "--format=%H", "-1", "--", rel],
76
+ ):
77
+ try:
78
+ out = subprocess.run(
79
+ args,
80
+ cwd=root,
81
+ capture_output=True,
82
+ text=True,
83
+ encoding="utf-8",
84
+ errors="replace",
85
+ check=True,
86
+ )
87
+ except subprocess.CalledProcessError:
88
+ continue
89
+ hits = [ln for ln in out.stdout.splitlines() if ln.strip()]
90
+ if hits:
91
+ return hits[0]
92
+ return None
93
+
94
+
95
+ def get_changelog(root: Path, current_version: str) -> list[str]:
96
+ """自上次发版以来 packages/cc-plugin/ 的 oneline 提交摘要;无基线时取最近 30 条。"""
97
+ last = find_last_bump_commit(root, current_version)
98
+ if last:
99
+ args = ["git", "log", "--oneline", f"{last}..HEAD", "--", "packages/cc-plugin/"]
100
+ else:
101
+ # 无基线:用 --max-count 避免 HEAD~30 在浅克隆/小仓报 bad revision
102
+ args = ["git", "log", "--oneline", "--max-count=30", "--", "packages/cc-plugin/"]
103
+ try:
104
+ out = subprocess.run(
105
+ args,
106
+ cwd=root,
107
+ capture_output=True,
108
+ text=True,
109
+ encoding="utf-8",
110
+ errors="replace",
111
+ check=True,
112
+ )
113
+ except subprocess.CalledProcessError:
114
+ return []
115
+ return [ln for ln in out.stdout.splitlines() if ln.strip()]
116
+
117
+
118
+ def assert_versions(root: Path, expected: str) -> None:
119
+ """断言三处版本号都 == expected,否则 raise AssertionError。"""
120
+ plugin = json.loads((root / PLUGIN_JSON_REL).read_text(encoding="utf-8"))
121
+ market = json.loads((root / MARKETPLACE_JSON_REL).read_text(encoding="utf-8"))
122
+ actuals = [
123
+ plugin["version"],
124
+ market["metadata"]["version"],
125
+ market["plugins"][0]["version"],
126
+ ]
127
+ if any(a != expected for a in actuals):
128
+ raise AssertionError(f"写后版本号校验失败: 期望 {expected},实际 {actuals}")
129
+
130
+
131
+ def _read_raw(path: Path) -> str:
132
+ """读原始文本(不做换行转换),保留文件原换行。"""
133
+ return path.read_bytes().decode("utf-8")
134
+
135
+
136
+ def _write_raw(path: Path, text: str) -> None:
137
+ """写文本,newline='' 避免 Windows 把 LF 转 CRLF 污染 diff。"""
138
+ path.write_text(text, encoding="utf-8", newline="")
139
+
140
+
141
+ def bump_version_files(root: Path, old: str, new: str) -> list[str]:
142
+ """原子 bump 三处版本号:计数预校验 + 落盘失败回滚已写文件 + 写后断言。"""
143
+ targets = [
144
+ (root / PLUGIN_JSON_REL, 1),
145
+ (root / MARKETPLACE_JSON_REL, 2),
146
+ ]
147
+ needle = f'"version": "{old}"'
148
+ replacement = f'"version": "{new}"'
149
+ # 预校验:读原文 + 计数,全过才准备落盘
150
+ pending = [] # (path, original_text, new_text, rel)
151
+ for path, expected_count in targets:
152
+ original = _read_raw(path)
153
+ count = original.count(needle)
154
+ if count != expected_count:
155
+ raise ValueError(
156
+ f"{path.relative_to(root)} 命中 {count} 次(期望 {expected_count}),"
157
+ f"版本号 {old}。中止,未写任何文件。"
158
+ )
159
+ pending.append(
160
+ (path, original, original.replace(needle, replacement), path.relative_to(root))
161
+ )
162
+ # 落盘:先记账再写,任一写/断言失败则回滚已写文件(尽力,堵 CLAUDE.md 版本不一致坑)
163
+ written: list[tuple[Path, str]] = []
164
+ try:
165
+ for path, original, new_text, _ in pending:
166
+ written.append((path, original)) # 先记账:写中途失败也回滚此文件
167
+ _write_raw(path, new_text)
168
+ assert_versions(root, new) # 写后兜底断言;失败也走回滚
169
+ except Exception:
170
+ for path, original in written:
171
+ try:
172
+ _write_raw(path, original)
173
+ except OSError:
174
+ pass # 回滚失败只能尽力而为
175
+ raise
176
+ return [str(rel) for _, _, _, rel in pending]
177
+
178
+
179
+ def main() -> None:
180
+ parser = argparse.ArgumentParser(description="cc-plugin release helper")
181
+ parser.add_argument("version", help="patch | minor | major | x.y.z")
182
+ parser.add_argument("--dry-run", action="store_true", help="只计算不修改文件")
183
+ args = parser.parse_args()
184
+
185
+ try:
186
+ current = read_current_version(PROJECT_ROOT)
187
+ except (
188
+ json.JSONDecodeError,
189
+ UnicodeDecodeError,
190
+ KeyError,
191
+ FileNotFoundError,
192
+ PermissionError,
193
+ OSError,
194
+ ) as e:
195
+ output_error(f"读取当前版本失败: {e}") # output_error 会 sys.exit(1)
196
+
197
+ try:
198
+ new = compute_new_version(current, args.version)
199
+ except ValueError as e:
200
+ output_error(str(e))
201
+
202
+ changelog = get_changelog(PROJECT_ROOT, current)
203
+
204
+ if args.dry_run:
205
+ output_json(
206
+ {
207
+ "current_version": current,
208
+ "new_version": new,
209
+ "files_to_change": [PLUGIN_JSON_REL, MARKETPLACE_JSON_REL],
210
+ "changelog_summary": changelog,
211
+ }
212
+ )
213
+ return
214
+
215
+ try:
216
+ changed = bump_version_files(PROJECT_ROOT, current, new)
217
+ except (
218
+ ValueError,
219
+ AssertionError,
220
+ KeyError,
221
+ IndexError,
222
+ OSError,
223
+ json.JSONDecodeError,
224
+ ) as e:
225
+ output_error(str(e))
226
+
227
+ output_json(
228
+ {
229
+ "current_version": current,
230
+ "new_version": new,
231
+ "changed_files": changed,
232
+ "changelog_summary": changelog,
233
+ }
234
+ )
235
+
236
+
237
+ if __name__ == "__main__":
238
+ main()
@@ -476,7 +476,7 @@ class OutputFormatter:
476
476
 
477
477
  - `pytest.ini` 的 `addopts` 已包含 `-v`,手动再加 `-v` 是冗余的
478
478
  - 测试目录重组已基本完成,根级 `test_config_unit.py` 和 `test_config_set_unit.py` 与 `tests/unit/` 中对应文件测试内容不同,不是重复
479
- - `jfox show <id_or_title>` 复用 `find_note_id_by_title_or_id` 定位笔记,只读输出完整 Markdown
479
+ - `jfox show <id_or_title>` 复用 `find_note_id_by_title_or_id` 定位笔记,默认输出完整 Markdown(`--json` / `--format json` 输出结构化字段)
480
480
 
481
481
  ---
482
482
 
@@ -2,6 +2,23 @@
2
2
 
3
3
  All notable changes to jfox-cli will be documented in this file.
4
4
 
5
+ ## [1.5.0] - 2026-07-25
6
+
7
+ ### Features
8
+ - **promote-skill**: #319 三模式过审重写(cc+kimi) (#324)
9
+ - **release-cc-plugin**: 新增 cc-plugin 发版 skill (#316)
10
+ - **cli**: jfox show 支持 --json 输出 (#278) (#315)
11
+
12
+ ### Fixes
13
+ - **gem-synth**: candidate 双 H1 标题,strip content 开头冗余 H1 (#320)
14
+
15
+ ### Changes
16
+ - **gem-synth**: dedup 生命周期解耦——消除核心层反向依赖 (#310) (#322)
17
+ - **claude.md**: 补 auto_summary 模块、gem_synth dedup,修正 cc-plugin 版本 (#323)
18
+ - **claude.md**: 补 note 生命周期事件 + numpy lazy-import gotcha (#322) (#326)
19
+
20
+ [1.5.0]: https://github.com/zhuxixi/jfox/compare/v1.4.0...v1.5.0
21
+
5
22
  ## [1.4.0] - 2026-07-12
6
23
 
7
24
  ### Features
@@ -72,7 +72,8 @@ Notes are Markdown files with YAML frontmatter stored under `~/.zettelkasten/<kb
72
72
  | `embedding_backend.py` | Sentence-transformers embedding backend(支持 daemon 代理) |
73
73
  | `daemon/` | Embedding 模型 HTTP 守护进程 (`server.py`/`client.py`/`process.py`),`jfox daemon start/stop/status` |
74
74
  | `fragment/` | 碎片采集:detector 分类 + store SQLite(WAL) + service 编排 |
75
- | `gem_synth/` | L3 宝石合成:daemon 循环围绕锚点用 transcript + 永久笔记基准合成 candidate 笔记 |
75
+ | `gem_synth/` | L3 宝石合成:daemon 循环围绕锚点用 transcript + 永久笔记基准合成 candidate 笔记;存盘前 `dedup.py` 正文余弦查重;`lifecycle.py` 订阅 note 的 delete/archive/promote/reject 事件同步 dedup 表 |
76
+ | `auto_summary/` | 自动总结子系统:daemon 内扫描 `~/.claude/projects/` 已结束的 Claude Code session,经 `claude -p` 生成摘要写入 `session` 笔记;CLI `jfox auto-summary run/scan/status/enable/disable`,ledger 去重 + schedule time window |
76
77
  | `vector_store.py` | ChromaDB vector store for semantic search |
77
78
  | `graph.py` | NetworkX knowledge graph from links/backlinks |
78
79
  | `template.py` / `template_cli.py` | Jinja2 template system for structured note creation |
@@ -103,7 +104,8 @@ Notes are Markdown files with YAML frontmatter stored under `~/.zettelkasten/<kb
103
104
  - **Adding a CLI command**: Add `@app.command()` in `cli.py`, implement `_xxx_impl()` helper, add `--kb` and `--format json` support
104
105
  - **Adding a search mode**: Add to `SearchMode` enum in `search_engine.py`, implement in `HybridSearchEngine.search()`, update CLI `--mode` help text
105
106
  - **Modifying data models**: Update `Note` class in `models.py`, update `to_markdown()`/`from_markdown()`, consider backward compat
106
- - **Viewing note content**: `jfox show <id_or_title>` 复用 `find_note_id_by_title_or_id` 定位笔记,只读输出完整 Markdown
107
+ - **Viewing note content**: `jfox show <id_or_title>` 复用 `find_note_id_by_title_or_id` 定位笔记,默认输出完整 Markdown(`--json` / `--format json` 输出结构化字段)
108
+ - **笔记生命周期事件**: `note.py` 只广播 `post_delete`/`post_archive`/`post_promote`/`post_reject`(`register_lifecycle_hook` + `_dispatch`),绝不 import 特性层;特性层订阅做副作用(如 `gem_synth/lifecycle.py` 同步 dedup 表)。`register` 在 `jfox/__init__.py` 接线,任何 `import jfox.*` 即订阅就位,库式调用方零成本
107
109
 
108
110
  ## Test Infrastructure
109
111
 
@@ -142,7 +144,7 @@ JFox ships as a Claude Code plugin. Two-tier structure:
142
144
  - `packages/cc-plugin/.claude-plugin/plugin.json` — plugin source metadata
143
145
  - `packages/cc-plugin/skills/` — 7 skills: `search`, `ingest`, `manage`, `organize`, `promote`, `session-summary`, `using-jfox`
144
146
 
145
- **Plugin versioning**: bump version in **three** places together — `packages/cc-plugin/.claude-plugin/plugin.json` (`version`) and both version fields in `.claude-plugin/marketplace.json` (`metadata.version` + `plugins[0].version`). 漏改任一处都会导致 marketplace 与 plugin 版本不一致。Current: 0.5.0.
147
+ **Plugin versioning**: bump version in **three** places together — `packages/cc-plugin/.claude-plugin/plugin.json` (`version`) and both version fields in `.claude-plugin/marketplace.json` (`metadata.version` + `plugins[0].version`). 漏改任一处都会导致 marketplace 与 plugin 版本不一致。Current: 0.5.1.
146
148
  **Skill rename history**: `kb` → `manage` (v0.2.0) — "manage" is the canonical KB lifecycle + CRUD skill.
147
149
 
148
150
  ## Branch Rules
@@ -153,3 +155,4 @@ JFox ships as a Claude Code plugin. Two-tier structure:
153
155
 
154
156
  - `pytest.ini` `addopts` includes `-v`, so `pytest tests/` already runs verbose — adding `-v` manually is redundant
155
157
  - Test directory migration mostly complete; root-level `test_config_unit.py` and `test_config_set_unit.py` remain but test different things from `tests/unit/`
158
+ - 生命周期订阅模块的重依赖(numpy 等)必须 lazy import 进回调体,不能顶层 import——`jfox/__init__.py` 每次启动都 import 订阅模块,顶层会令 `--version`/`search` 等不相关命令多付 ~70-100ms eager 加载。参考 `gem_synth/lifecycle.py`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jfox-cli
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: JFox - Zettelkasten 知识管理 CLI 工具
5
5
  Project-URL: Homepage, https://github.com/zhuxixi/jfox
6
6
  Project-URL: Repository, https://github.com/zhuxixi/jfox
@@ -314,7 +314,7 @@ jfox query "Luhmann's methodology" --depth 2
314
314
  | `jfox suggest-links "content"` | Suggest notes to link from content |
315
315
  | `jfox bulk-import notes.json` | Bulk import from JSON (optimized) |
316
316
  | `jfox ingest-log` | Import git commit history as notes |
317
- | `jfox show NOTE_ID` | View full note content in terminal |
317
+ | `jfox show NOTE_ID` | View full note content (`--json` for structured fields) |
318
318
 
319
319
  ### Search & Analysis
320
320
 
@@ -274,7 +274,7 @@ jfox query "Luhmann's methodology" --depth 2
274
274
  | `jfox suggest-links "content"` | Suggest notes to link from content |
275
275
  | `jfox bulk-import notes.json` | Bulk import from JSON (optimized) |
276
276
  | `jfox ingest-log` | Import git commit history as notes |
277
- | `jfox show NOTE_ID` | View full note content in terminal |
277
+ | `jfox show NOTE_ID` | View full note content (`--json` for structured fields) |
278
278
 
279
279
  ### Search & Analysis
280
280