harveyz-skill 0.29.0 → 0.29.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.
Files changed (107) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/bin/cli.js +19 -0
  3. package/lib/version-check.js +29 -0
  4. package/package.json +1 -1
  5. package/skills/feed/manage-roster/scripts/__pycache__/roster_locate.cpython-314.pyc +0 -0
  6. package/skills/feed/manage-roster/tests/__pycache__/test_roster_locate.cpython-314-pytest-9.1.1.pyc +0 -0
  7. package/skills/feed/sync-xtimeline/scripts/__pycache__/archive_tweets.cpython-314.pyc +0 -0
  8. package/skills/feed/sync-xtimeline/scripts/__pycache__/browser_fetch_cli.cpython-314.pyc +0 -0
  9. package/skills/feed/sync-xtimeline/scripts/__pycache__/browser_fetch_locate.cpython-314.pyc +0 -0
  10. package/skills/feed/sync-xtimeline/scripts/__pycache__/config.cpython-314.pyc +0 -0
  11. package/skills/feed/sync-xtimeline/scripts/__pycache__/cursor.cpython-314.pyc +0 -0
  12. package/skills/feed/sync-xtimeline/scripts/__pycache__/fetch_new_tweets.cpython-314.pyc +0 -0
  13. package/skills/feed/sync-xtimeline/scripts/__pycache__/mcp_timeline_client.cpython-314.pyc +0 -0
  14. package/skills/feed/sync-xtimeline/scripts/__pycache__/render_digest.cpython-314.pyc +0 -0
  15. package/skills/feed/sync-xtimeline/scripts/__pycache__/render_view.cpython-314.pyc +0 -0
  16. package/skills/feed/sync-xtimeline/scripts/__pycache__/roster_client.cpython-314.pyc +0 -0
  17. package/skills/feed/sync-xtimeline/scripts/__pycache__/roster_locate.cpython-314.pyc +0 -0
  18. package/skills/feed/sync-xtimeline/tests/__pycache__/conftest.cpython-314-pytest-9.1.1.pyc +0 -0
  19. package/skills/feed/sync-xtimeline/tests/__pycache__/test_archive_tweets.cpython-314-pytest-9.1.1.pyc +0 -0
  20. package/skills/feed/sync-xtimeline/tests/__pycache__/test_browser_fetch_locate.cpython-314-pytest-9.1.1.pyc +0 -0
  21. package/skills/feed/sync-xtimeline/tests/__pycache__/test_cursor.cpython-314-pytest-9.1.1.pyc +0 -0
  22. package/skills/feed/sync-xtimeline/tests/__pycache__/test_fetch_new_tweets.cpython-314-pytest-9.1.1.pyc +0 -0
  23. package/skills/feed/sync-xtimeline/tests/__pycache__/test_mcp_timeline_client.cpython-314-pytest-9.1.1.pyc +0 -0
  24. package/skills/feed/sync-xtimeline/tests/__pycache__/test_render_digest.cpython-314-pytest-9.1.1.pyc +0 -0
  25. package/skills/feed/sync-xtimeline/tests/__pycache__/test_render_view.cpython-314-pytest-9.1.1.pyc +0 -0
  26. package/skills/feed/sync-xtimeline/tests/__pycache__/test_roster_client.cpython-314-pytest-9.1.1.pyc +0 -0
  27. package/skills/feed/sync-ytchannel/scripts/__pycache__/browser_fetch_cli.cpython-314.pyc +0 -0
  28. package/skills/feed/sync-ytchannel/scripts/__pycache__/browser_fetch_locate.cpython-314.pyc +0 -0
  29. package/skills/feed/sync-ytchannel/scripts/__pycache__/config.cpython-314.pyc +0 -0
  30. package/skills/feed/sync-ytchannel/scripts/__pycache__/cursor.cpython-314.pyc +0 -0
  31. package/skills/feed/sync-ytchannel/scripts/__pycache__/digest.cpython-314.pyc +0 -0
  32. package/skills/feed/sync-ytchannel/scripts/__pycache__/mcp_channel_client.cpython-314.pyc +0 -0
  33. package/skills/feed/sync-ytchannel/scripts/__pycache__/roster_client.cpython-314.pyc +0 -0
  34. package/skills/feed/sync-ytchannel/scripts/__pycache__/roster_locate.cpython-314.pyc +0 -0
  35. package/skills/feed/sync-ytchannel/scripts/__pycache__/sync_channels.cpython-314.pyc +0 -0
  36. package/skills/feed/sync-ytchannel/tests/__pycache__/conftest.cpython-314-pytest-9.1.1.pyc +0 -0
  37. package/skills/feed/sync-ytchannel/tests/__pycache__/test_browser_fetch_locate.cpython-314-pytest-9.1.1.pyc +0 -0
  38. package/skills/feed/sync-ytchannel/tests/__pycache__/test_cursor.cpython-314-pytest-9.1.1.pyc +0 -0
  39. package/skills/feed/sync-ytchannel/tests/__pycache__/test_digest.cpython-314-pytest-9.1.1.pyc +0 -0
  40. package/skills/feed/sync-ytchannel/tests/__pycache__/test_mcp_channel_client.cpython-314-pytest-9.1.1.pyc +0 -0
  41. package/skills/feed/sync-ytchannel/tests/__pycache__/test_roster_client.cpython-314-pytest-9.1.1.pyc +0 -0
  42. package/skills/feed/sync-ytchannel/tests/__pycache__/test_sync_channels.cpython-314-pytest-9.1.1.pyc +0 -0
  43. package/skills/research/clip-url/scripts/__pycache__/browser_fetch_cli.cpython-314.pyc +0 -0
  44. package/skills/research/clip-url/scripts/__pycache__/browser_fetch_locate.cpython-314.pyc +0 -0
  45. package/skills/research/clip-url/scripts/__pycache__/mcp_debug_client.cpython-314.pyc +0 -0
  46. package/skills/research/clip-url/scripts/__pycache__/mcp_fetch_client.cpython-314.pyc +0 -0
  47. package/skills/research/clip-url/scripts/__pycache__/vault_config.cpython-314.pyc +0 -0
  48. package/skills/research/clip-url/tests/__pycache__/test_browser_fetch_locate.cpython-314-pytest-9.1.1.pyc +0 -0
  49. package/skills/research/clip-url/tests/__pycache__/test_chrome_profile_config.cpython-314-pytest-9.1.1.pyc +0 -0
  50. package/skills/research/clip-url/tests/__pycache__/test_detect_xcom_chrome_profile.cpython-314-pytest-9.1.1.pyc +0 -0
  51. package/skills/research/clip-url/tests/__pycache__/test_mcp_debug_client.cpython-314-pytest-9.1.1.pyc +0 -0
  52. package/skills/research/clip-url/tests/__pycache__/test_mcp_fetch_client.cpython-314-pytest-9.1.1.pyc +0 -0
  53. package/skills/research/clip-url/tests/__pycache__/test_vault_config.cpython-314-pytest-9.1.1.pyc +0 -0
  54. package/tools/browser-fetch/browser_fetch/__pycache__/__init__.cpython-314.pyc +0 -0
  55. package/tools/browser-fetch/browser_fetch/__pycache__/cli.cpython-314.pyc +0 -0
  56. package/tools/browser-fetch/browser_fetch/__pycache__/config.cpython-314.pyc +0 -0
  57. package/tools/browser-fetch/browser_fetch/__pycache__/cookies.cpython-314.pyc +0 -0
  58. package/tools/browser-fetch/browser_fetch/__pycache__/core.cpython-314.pyc +0 -0
  59. package/tools/browser-fetch/browser_fetch/__pycache__/extractors.cpython-314.pyc +0 -0
  60. package/tools/browser-fetch/browser_fetch/__pycache__/images.cpython-314.pyc +0 -0
  61. package/tools/browser-fetch/browser_fetch/__pycache__/markdown.cpython-314.pyc +0 -0
  62. package/tools/browser-fetch/browser_fetch/__pycache__/pacing.cpython-314.pyc +0 -0
  63. package/tools/browser-fetch/browser_fetch/__pycache__/pacing_log.cpython-314.pyc +0 -0
  64. package/tools/browser-fetch/browser_fetch/__pycache__/profiles.cpython-314.pyc +0 -0
  65. package/tools/browser-fetch/tests/__pycache__/conftest.cpython-314-pytest-9.1.1.pyc +0 -0
  66. package/tools/browser-fetch/tests/__pycache__/test_cli.cpython-314-pytest-9.1.1.pyc +0 -0
  67. package/tools/browser-fetch/tests/__pycache__/test_cli_fetch.cpython-314-pytest-9.1.1.pyc +0 -0
  68. package/tools/browser-fetch/tests/__pycache__/test_cli_page_eval.cpython-314-pytest-9.1.1.pyc +0 -0
  69. package/tools/browser-fetch/tests/__pycache__/test_config.cpython-314-pytest-9.1.1.pyc +0 -0
  70. package/tools/browser-fetch/tests/__pycache__/test_cookies.cpython-314-pytest-9.1.1.pyc +0 -0
  71. package/tools/browser-fetch/tests/__pycache__/test_core_import.cpython-314-pytest-9.1.1.pyc +0 -0
  72. package/tools/browser-fetch/tests/__pycache__/test_data_dir_migration.cpython-314-pytest-9.1.1.pyc +0 -0
  73. package/tools/browser-fetch/tests/__pycache__/test_evaluate_js.cpython-314-pytest-9.1.1.pyc +0 -0
  74. package/tools/browser-fetch/tests/__pycache__/test_extractors.cpython-314-pytest-9.1.1.pyc +0 -0
  75. package/tools/browser-fetch/tests/__pycache__/test_extractors_timeline.cpython-314-pytest-9.1.1.pyc +0 -0
  76. package/tools/browser-fetch/tests/__pycache__/test_extractors_youtube.cpython-314-pytest-9.1.1.pyc +0 -0
  77. package/tools/browser-fetch/tests/__pycache__/test_fetch_article.cpython-314-pytest-9.1.1.pyc +0 -0
  78. package/tools/browser-fetch/tests/__pycache__/test_fetch_channel_videos.cpython-314-pytest-9.1.1.pyc +0 -0
  79. package/tools/browser-fetch/tests/__pycache__/test_fetch_user_timeline.cpython-314-pytest-9.1.1.pyc +0 -0
  80. package/tools/browser-fetch/tests/__pycache__/test_images.cpython-314-pytest-9.1.1.pyc +0 -0
  81. package/tools/browser-fetch/tests/__pycache__/test_launcher_python_version.cpython-314-pytest-9.1.1.pyc +0 -0
  82. package/tools/browser-fetch/tests/__pycache__/test_launcher_stdout_contract.cpython-314-pytest-9.1.1.pyc +0 -0
  83. package/tools/browser-fetch/tests/__pycache__/test_markdown.cpython-314-pytest-9.1.1.pyc +0 -0
  84. package/tools/browser-fetch/tests/__pycache__/test_pacing.cpython-314-pytest-9.1.1.pyc +0 -0
  85. package/tools/browser-fetch/tests/__pycache__/test_pacing_log.cpython-314-pytest-9.1.1.pyc +0 -0
  86. package/tools/browser-fetch/tests/__pycache__/test_profiles.cpython-314-pytest-9.1.1.pyc +0 -0
  87. package/tools/hub/tests/__pycache__/test_launcher_python_version.cpython-314-pytest-9.1.0.pyc +0 -0
  88. package/tools/roster/roster/__pycache__/__init__.cpython-314.pyc +0 -0
  89. package/tools/roster/roster/__pycache__/__main__.cpython-314.pyc +0 -0
  90. package/tools/roster/roster/__pycache__/config.cpython-314.pyc +0 -0
  91. package/tools/roster/roster/__pycache__/migrate.cpython-314.pyc +0 -0
  92. package/tools/roster/roster/__pycache__/profiles.cpython-314.pyc +0 -0
  93. package/tools/roster/roster/__pycache__/registry.cpython-314.pyc +0 -0
  94. package/tools/roster/roster/__pycache__/state.cpython-314.pyc +0 -0
  95. package/tools/roster/roster/__pycache__/urls.cpython-314.pyc +0 -0
  96. package/tools/roster/tests/__pycache__/conftest.cpython-314-pytest-9.1.1.pyc +0 -0
  97. package/tools/roster/tests/__pycache__/test_cli.cpython-314-pytest-9.1.1.pyc +0 -0
  98. package/tools/roster/tests/__pycache__/test_config.cpython-314-pytest-9.1.1.pyc +0 -0
  99. package/tools/roster/tests/__pycache__/test_launcher_python_version.cpython-314-pytest-9.1.1.pyc +0 -0
  100. package/tools/roster/tests/__pycache__/test_launcher_stdout_contract.cpython-314-pytest-9.1.1.pyc +0 -0
  101. package/tools/roster/tests/__pycache__/test_migrate.cpython-314-pytest-9.1.1.pyc +0 -0
  102. package/tools/roster/tests/__pycache__/test_profiles.cpython-314-pytest-9.1.1.pyc +0 -0
  103. package/tools/roster/tests/__pycache__/test_registry.cpython-314-pytest-9.1.1.pyc +0 -0
  104. package/tools/roster/tests/__pycache__/test_registry_merge.cpython-314-pytest-9.1.1.pyc +0 -0
  105. package/tools/roster/tests/__pycache__/test_state.cpython-314-pytest-9.1.1.pyc +0 -0
  106. package/tools/roster/tests/__pycache__/test_urls.cpython-314-pytest-9.1.1.pyc +0 -0
  107. package/tools/sync-agent/tests/__pycache__/test_launcher_python_version.cpython-314-pytest-9.1.1.pyc +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.29.1] - 2026-08-28
11
+
12
+ ### Added
13
+ - `hskill version --check`:检查 npm registry 上的最新版本并与本地版本比对,只报告不安装。支持 `--json`;网络/registry 请求失败时非零退出
14
+
10
15
  ## [0.29.0] - 2026-08-28
11
16
 
12
17
  ### Added
package/bin/cli.js CHANGED
@@ -53,6 +53,7 @@ function printHelp() {
53
53
  hskill update update hskill to the latest version
54
54
  hskill mcp start an MCP server (stdio) exposing hskill's tools to MCP-capable agent hosts
55
55
  hskill version show version
56
+ hskill version --check compare local version against npm registry (no install)
56
57
  hskill --help show this help
57
58
 
58
59
  ${chalk.cyan('Examples:')}
@@ -156,6 +157,24 @@ if (args[0] === '--help' || args[0] === '-h') {
156
157
  }
157
158
 
158
159
  if (args[0] === '--version' || args[0] === '-v' || subcommand === 'version') {
160
+ if (subcommand === 'version' && args.includes('--check')) {
161
+ try {
162
+ const { checkNpmVersion } = await import('../lib/version-check.js')
163
+ const { current, latest, upToDate } = await checkNpmVersion('harveyz-skill', version)
164
+ if (jsonFlag) {
165
+ console.log(JSON.stringify({ current, latest, upToDate }, null, 2))
166
+ } else if (upToDate) {
167
+ console.log(chalk.green(` ✔ hskill v${current} is up to date`))
168
+ } else {
169
+ console.log(chalk.yellow(` ⚠ hskill v${current} → v${latest} available`))
170
+ console.log(chalk.dim(' Run: npm install -g harveyz-skill@latest'))
171
+ }
172
+ } catch (err) {
173
+ console.error(chalk.red(` ✗ Could not check npm registry: ${err.message}`))
174
+ process.exit(1)
175
+ }
176
+ process.exit(0)
177
+ }
159
178
  console.log(version)
160
179
  process.exit(0)
161
180
  }
@@ -0,0 +1,29 @@
1
+ const DEFAULT_REGISTRY = 'https://registry.npmjs.org'
2
+ const REGISTRY_TIMEOUT_MS = 5000
3
+
4
+ export function compareVersions(a, b) {
5
+ const pa = a.split('.').map(Number)
6
+ const pb = b.split('.').map(Number)
7
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
8
+ const diff = (pa[i] || 0) - (pb[i] || 0)
9
+ if (diff !== 0) return diff
10
+ }
11
+ return 0
12
+ }
13
+
14
+ export async function checkNpmVersion(pkgName, currentVersion) {
15
+ const registryUrl = process.env.HSKILL_NPM_REGISTRY || DEFAULT_REGISTRY
16
+ const controller = new AbortController()
17
+ const timer = setTimeout(() => controller.abort(), REGISTRY_TIMEOUT_MS)
18
+ let res
19
+ try {
20
+ res = await fetch(`${registryUrl}/${pkgName}/latest`, { signal: controller.signal })
21
+ } finally {
22
+ clearTimeout(timer)
23
+ }
24
+ if (!res.ok) {
25
+ throw new Error(`npm registry returned ${res.status} for ${pkgName}`)
26
+ }
27
+ const { version: latest } = await res.json()
28
+ return { current: currentVersion, latest, upToDate: compareVersions(currentVersion, latest) >= 0 }
29
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harveyz-skill",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Skill manager for Claude Code, Cursor, Codex, OpenClaw, Hermes, OpenCode, and Pi",
5
5
  "type": "module",
6
6
  "bin": {