@nebulacomponents/citable 1.1.0 → 1.2.0

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 (30) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +8 -2
  3. package/dist/universal/.agents/skills/citable/VERSION +1 -1
  4. package/dist/universal/.agents/skills/citable/manifest.json +4 -4
  5. package/dist/universal/.claude/skills/citable/VERSION +1 -1
  6. package/dist/universal/.claude/skills/citable/manifest.json +4 -4
  7. package/dist/universal/.cursor/skills/citable/VERSION +1 -1
  8. package/dist/universal/.cursor/skills/citable/manifest.json +4 -4
  9. package/dist/universal/.gemini/skills/citable/VERSION +1 -1
  10. package/dist/universal/.gemini/skills/citable/manifest.json +4 -4
  11. package/dist/universal/.github/skills/citable/VERSION +1 -1
  12. package/dist/universal/.github/skills/citable/manifest.json +4 -4
  13. package/dist/universal/.kiro/skills/citable/VERSION +1 -1
  14. package/dist/universal/.kiro/skills/citable/manifest.json +4 -4
  15. package/dist/universal/.opencode/skills/citable/VERSION +1 -1
  16. package/dist/universal/.opencode/skills/citable/manifest.json +4 -4
  17. package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
  18. package/dist/universal/.pi/agent/skills/citable/manifest.json +4 -4
  19. package/dist/universal/.qoder/skills/citable/VERSION +1 -1
  20. package/dist/universal/.qoder/skills/citable/manifest.json +4 -4
  21. package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
  22. package/dist/universal/.rovodev/skills/citable/manifest.json +4 -4
  23. package/dist/universal/.trae/skills/citable/VERSION +1 -1
  24. package/dist/universal/.trae/skills/citable/manifest.json +4 -4
  25. package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
  26. package/dist/universal/.trae-cn/skills/citable/manifest.json +4 -4
  27. package/dist/universal/manifest.json +39 -39
  28. package/package.json +1 -1
  29. package/src/cli/index.js +7 -0
  30. package/src/commands/selfUpgrade.js +146 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 — 2026-07-18
4
+
5
+ ### Added
6
+
7
+ - **`self-upgrade` command** — checks npm registry for the latest version and upgrades the npx cache if a newer version is available:
8
+ - `npx @nebulacomponents/citable self-upgrade` — check and upgrade
9
+ - `npx @nebulacomponents/citable self-upgrade --check` — check only, no upgrade
10
+ - `npx @nebulacomponents/citable self-upgrade --json` — machine-readable output
11
+ - Uses Node's built-in `fetch` (no extra deps), 10s timeout, graceful offline error
12
+ - **6 new tests** for self-upgrade (current, update-available, registry failure × 2 each for human/JSON output)
13
+
14
+ ### Changed
15
+
16
+ - Test count: 84 → 90
17
+
3
18
  ## 1.1.0 — 2026-07-18
4
19
 
5
20
  ### Added
@@ -21,7 +36,7 @@
21
36
 
22
37
  ### Changed
23
38
 
24
- - Detector count: 109 → 119 across 18 namespaces
39
+ - Detector count: 102/15 namespaces (0.1.0) → 109/17 (1.0.0) **119/18 namespaces** (this release)
25
40
  - Test count: 46 → 84
26
41
 
27
42
  ## 1.0.0 — 2026-07-18
@@ -38,6 +53,9 @@
38
53
  - CWV-001: LCP potential blockers (render-blocking scripts, images without dimensions)
39
54
  - CWV-002: preconnect hints for fonts
40
55
  - CWV-003: image optimization checks (format, dimensions, lazy loading)
56
+
57
+ > **Limitation:** no field or lab data collection; the CWV detectors check
58
+ > infrastructure readiness, not performance.
41
59
  - **URL fetch resilience** — retry with exponential backoff + jitter, 5xx handling
42
60
  - **CI workflow** — GitHub Actions for Node 22 matrix testing
43
61
 
package/README.md CHANGED
@@ -16,8 +16,8 @@ generator, not a Lighthouse wrapper, not an "AI visibility score".
16
16
  - **Persistent registries** (`.citable/`): queries, prompts, entities, claims,
17
17
  evidence, pages, crawler policies, competitors, experiments — all
18
18
  JSON-Schema validated with referential integrity and history-preserving saves.
19
- - **109 detectors** across 17 namespaces (TECH, CRAWL, ARCH, PAGE, ANS,
20
- ENTITY, CLAIM, EVD, SCHEMA, LINK, EXT, GEO, RECO, LIFE, MEAS, HREFLANG, CWV), each with
19
+ - **119 detectors** across 18 namespaces (TECH, CRAWL, ARCH, PAGE, ANS,
20
+ ENTITY, CLAIM, EVD, SCHEMA, LINK, EXT, GEO, RECO, LIFE, MEAS, HREFLANG, CWV, AGENT), each with
21
21
  remediation, verification, severity, and determinism declared.
22
22
  - **Evidence packages** for every run: manifest, findings, report, captured
23
23
  robots/sitemaps/headers/schema/link graph, checksums.
@@ -28,6 +28,12 @@ generator, not a Lighthouse wrapper, not an "AI visibility score".
28
28
  mandatory human-review conditions.
29
29
  - **Multi-agent distribution**: Claude Code, Codex-compatible, Cursor, Gemini,
30
30
  generic — generated from one canonical `skill/` source.
31
+ - **Agent-readiness detectors** (AGENT namespace): agents are both readers
32
+ and writers of your site — `llms.txt` and Markdown content negotiation shape
33
+ what they consume; MCP Server Cards and A2A Agent Cards expose what they can
34
+ invoke; Content-Signals and Web Bot Auth govern the permissions they receive.
35
+ Citable checks all of these in one pass alongside the rest of your
36
+ SEO/AEO/GEO signal surface.
31
37
 
32
38
  ## Install
33
39
 
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "codex",
6
6
  "providerName": "OpenAI Codex",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".agents/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "claude",
6
6
  "providerName": "Claude Code",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".claude/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "cursor",
6
6
  "providerName": "Cursor",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".cursor/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "gemini",
6
6
  "providerName": "Gemini CLI",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".gemini/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "github",
6
6
  "providerName": "GitHub Copilot",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".github/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "kiro",
6
6
  "providerName": "Kiro",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".kiro/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "opencode",
6
6
  "providerName": "OpenCode",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".opencode/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "pi",
6
6
  "providerName": "Pi",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".pi/agent/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "qoder",
6
6
  "providerName": "Qoder",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".qoder/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "rovodev",
6
6
  "providerName": "Rovo Dev",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".rovodev/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "trae",
6
6
  "providerName": "Trae",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".trae/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "trae-cn",
6
6
  "providerName": "Trae CN",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
9
9
  "variantPath": ".trae-cn/skills/citable",
10
10
  "files": {
11
11
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
@@ -48,7 +48,7 @@
48
48
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
49
  "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
50
50
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
51
+ "VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
52
52
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  }
@@ -1,91 +1,91 @@
1
1
  {
2
2
  "name": "citable-universal-bundle",
3
- "version": "1.1.0",
4
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
3
+ "version": "1.2.0",
4
+ "sourcePackage": "@nebulacomponents/citable@1.2.0",
5
5
  "providers": {
6
6
  "claude": {
7
7
  "provider": "claude",
8
8
  "providerName": "Claude Code",
9
9
  "path": ".claude/skills/citable",
10
10
  "files": 41,
11
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
11
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
12
12
  },
13
13
  "codex": {
14
14
  "provider": "codex",
15
15
  "providerName": "OpenAI Codex",
16
16
  "path": ".agents/skills/citable",
17
17
  "files": 41,
18
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
18
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
19
19
  },
20
20
  "cursor": {
21
21
  "provider": "cursor",
22
22
  "providerName": "Cursor",
23
23
  "path": ".cursor/skills/citable",
24
24
  "files": 41,
25
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
25
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
26
26
  },
27
27
  "gemini": {
28
28
  "provider": "gemini",
29
29
  "providerName": "Gemini CLI",
30
30
  "path": ".gemini/skills/citable",
31
31
  "files": 41,
32
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
32
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
33
33
  },
34
34
  "github": {
35
35
  "provider": "github",
36
36
  "providerName": "GitHub Copilot",
37
37
  "path": ".github/skills/citable",
38
38
  "files": 41,
39
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
39
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
40
40
  },
41
41
  "opencode": {
42
42
  "provider": "opencode",
43
43
  "providerName": "OpenCode",
44
44
  "path": ".opencode/skills/citable",
45
45
  "files": 41,
46
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
46
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
47
47
  },
48
48
  "kiro": {
49
49
  "provider": "kiro",
50
50
  "providerName": "Kiro",
51
51
  "path": ".kiro/skills/citable",
52
52
  "files": 41,
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
53
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
54
54
  },
55
55
  "pi": {
56
56
  "provider": "pi",
57
57
  "providerName": "Pi",
58
58
  "path": ".pi/agent/skills/citable",
59
59
  "files": 41,
60
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
60
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
61
61
  },
62
62
  "qoder": {
63
63
  "provider": "qoder",
64
64
  "providerName": "Qoder",
65
65
  "path": ".qoder/skills/citable",
66
66
  "files": 41,
67
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
67
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
68
68
  },
69
69
  "trae": {
70
70
  "provider": "trae",
71
71
  "providerName": "Trae",
72
72
  "path": ".trae/skills/citable",
73
73
  "files": 41,
74
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
74
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
75
75
  },
76
76
  "trae-cn": {
77
77
  "provider": "trae-cn",
78
78
  "providerName": "Trae CN",
79
79
  "path": ".trae-cn/skills/citable",
80
80
  "files": 41,
81
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
81
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
82
82
  },
83
83
  "rovodev": {
84
84
  "provider": "rovodev",
85
85
  "providerName": "Rovo Dev",
86
86
  "path": ".rovodev/skills/citable",
87
87
  "files": 41,
88
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
88
+ "treeHash": "sha256:ced29038005c4b29321f3ddb6c77cd8749a917b96983da422ed5677443be395a"
89
89
  }
90
90
  },
91
91
  "files": {
@@ -95,7 +95,7 @@
95
95
  ".agents/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
96
96
  ".agents/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
97
97
  ".agents/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
98
- ".agents/skills/citable/manifest.json": "sha256:5b3f7bad44bde24e1680a4063d97d026e0ecafd6296923c5b7fa858c369f56ca",
98
+ ".agents/skills/citable/manifest.json": "sha256:a9eeec6575b54f7f368ddd98368ab5ed7481b44e030c0fbf4d3e19e86c9749e7",
99
99
  ".agents/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
100
100
  ".agents/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
101
101
  ".agents/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -130,14 +130,14 @@
130
130
  ".agents/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
131
131
  ".agents/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
132
132
  ".agents/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
133
- ".agents/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
133
+ ".agents/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
134
134
  ".claude/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
135
135
  ".claude/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
136
136
  ".claude/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
137
137
  ".claude/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
138
138
  ".claude/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
139
139
  ".claude/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
140
- ".claude/skills/citable/manifest.json": "sha256:3490c9f2d9b06912b62d23856f6278722ac0b98134b6a32b4f3b2d57327ba505",
140
+ ".claude/skills/citable/manifest.json": "sha256:e7693ec5da03105de78062b078bfc3ec1a20395e43a04e8188cf19f494de760b",
141
141
  ".claude/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
142
142
  ".claude/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
143
143
  ".claude/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -172,14 +172,14 @@
172
172
  ".claude/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
173
173
  ".claude/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
174
174
  ".claude/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
175
- ".claude/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
175
+ ".claude/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
176
176
  ".cursor/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
177
177
  ".cursor/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
178
178
  ".cursor/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
179
179
  ".cursor/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
180
180
  ".cursor/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
181
181
  ".cursor/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
182
- ".cursor/skills/citable/manifest.json": "sha256:006135549fa7af6c01248c7e814ad18d15b38c3dd9796b12f139288400583719",
182
+ ".cursor/skills/citable/manifest.json": "sha256:a3f8555c3b9a487cb2a50aab66c5f1a385aaec1eb979b01d2a99ad68a92a1c03",
183
183
  ".cursor/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
184
184
  ".cursor/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
185
185
  ".cursor/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -214,14 +214,14 @@
214
214
  ".cursor/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
215
215
  ".cursor/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
216
216
  ".cursor/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
217
- ".cursor/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
217
+ ".cursor/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
218
218
  ".gemini/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
219
219
  ".gemini/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
220
220
  ".gemini/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
221
221
  ".gemini/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
222
222
  ".gemini/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
223
223
  ".gemini/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
224
- ".gemini/skills/citable/manifest.json": "sha256:0fe1f29a73e3f9ad060656d9d76161ed72295b49777149c51ad4b2be7ca8ece9",
224
+ ".gemini/skills/citable/manifest.json": "sha256:f8b2c1a4f283891eebbd97750e81a58fb7c100b21643a5c56b5a3855489e1d56",
225
225
  ".gemini/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
226
226
  ".gemini/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
227
227
  ".gemini/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -256,14 +256,14 @@
256
256
  ".gemini/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
257
257
  ".gemini/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
258
258
  ".gemini/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
259
- ".gemini/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
259
+ ".gemini/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
260
260
  ".github/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
261
261
  ".github/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
262
262
  ".github/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
263
263
  ".github/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
264
264
  ".github/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
265
265
  ".github/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
266
- ".github/skills/citable/manifest.json": "sha256:4ff3d7d6728d86b90c0588d1dda8635073413b8db162e21c19b219c5d0299996",
266
+ ".github/skills/citable/manifest.json": "sha256:07aff8604bddd46333b8503e746b12e9e562d315961e429226e28902d13c9ad2",
267
267
  ".github/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
268
268
  ".github/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
269
269
  ".github/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -298,14 +298,14 @@
298
298
  ".github/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
299
299
  ".github/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
300
300
  ".github/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
301
- ".github/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
301
+ ".github/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
302
302
  ".kiro/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
303
303
  ".kiro/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
304
304
  ".kiro/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
305
305
  ".kiro/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
306
306
  ".kiro/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
307
307
  ".kiro/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
308
- ".kiro/skills/citable/manifest.json": "sha256:328b61c9718cbfee8229d9c701cc389facfc59d27d97f025213df57aefa02f26",
308
+ ".kiro/skills/citable/manifest.json": "sha256:44dd4d345f743b8b0965a72b35d07cce3194604c1d7849cb1a371d0016a5aebe",
309
309
  ".kiro/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
310
310
  ".kiro/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
311
311
  ".kiro/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -340,14 +340,14 @@
340
340
  ".kiro/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
341
341
  ".kiro/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
342
342
  ".kiro/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
343
- ".kiro/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
343
+ ".kiro/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
344
344
  ".opencode/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
345
345
  ".opencode/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
346
346
  ".opencode/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
347
347
  ".opencode/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
348
348
  ".opencode/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
349
349
  ".opencode/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
350
- ".opencode/skills/citable/manifest.json": "sha256:59482ce8292822b40ebf75c875cb9462e4ba9be3e8dc2b969dac6b1e37befc4c",
350
+ ".opencode/skills/citable/manifest.json": "sha256:e947fd81ad4f5d58facc74d33dd8a50a5e085b9713f287f635f86055fa34483e",
351
351
  ".opencode/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
352
352
  ".opencode/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
353
353
  ".opencode/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -382,14 +382,14 @@
382
382
  ".opencode/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
383
383
  ".opencode/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
384
384
  ".opencode/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
385
- ".opencode/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
385
+ ".opencode/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
386
386
  ".pi/agent/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
387
387
  ".pi/agent/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
388
388
  ".pi/agent/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
389
389
  ".pi/agent/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
390
390
  ".pi/agent/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
391
391
  ".pi/agent/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
392
- ".pi/agent/skills/citable/manifest.json": "sha256:85b85d153764d4beb91ecccec334ff36dc6cb3b6510f67472d16e175a8a7ef3f",
392
+ ".pi/agent/skills/citable/manifest.json": "sha256:92c167d2ce73d3d38b4d9a1fec5d6dbaddb354c8b32e272ac734a40cba53736c",
393
393
  ".pi/agent/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
394
394
  ".pi/agent/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
395
395
  ".pi/agent/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -424,14 +424,14 @@
424
424
  ".pi/agent/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
425
425
  ".pi/agent/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
426
426
  ".pi/agent/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
427
- ".pi/agent/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
427
+ ".pi/agent/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
428
428
  ".qoder/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
429
429
  ".qoder/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
430
430
  ".qoder/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
431
431
  ".qoder/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
432
432
  ".qoder/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
433
433
  ".qoder/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
434
- ".qoder/skills/citable/manifest.json": "sha256:938772f4444964951521f182e0b93b3077329d2a6cf9d5d176e3a7df5f1d07a6",
434
+ ".qoder/skills/citable/manifest.json": "sha256:58b006ebc7e2557697cc3dd5115f5c2e49d5aa4ee31a11f33cd10bdcac81b25b",
435
435
  ".qoder/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
436
436
  ".qoder/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
437
437
  ".qoder/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -466,14 +466,14 @@
466
466
  ".qoder/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
467
467
  ".qoder/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
468
468
  ".qoder/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
469
- ".qoder/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
469
+ ".qoder/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
470
470
  ".rovodev/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
471
471
  ".rovodev/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
472
472
  ".rovodev/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
473
473
  ".rovodev/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
474
474
  ".rovodev/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
475
475
  ".rovodev/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
476
- ".rovodev/skills/citable/manifest.json": "sha256:26f92b3ddef93b4bf4d77d228a62eaa1d9225e3e04150fb45ca66b7993a956a5",
476
+ ".rovodev/skills/citable/manifest.json": "sha256:c73b941f72f8ebae866dff618519f2a2b33018c85d97be7190e05fa8d22a4bb6",
477
477
  ".rovodev/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
478
478
  ".rovodev/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
479
479
  ".rovodev/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -508,14 +508,14 @@
508
508
  ".rovodev/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
509
509
  ".rovodev/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
510
510
  ".rovodev/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
511
- ".rovodev/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
511
+ ".rovodev/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
512
512
  ".trae/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
513
513
  ".trae/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
514
514
  ".trae/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
515
515
  ".trae/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
516
516
  ".trae/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
517
517
  ".trae/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
518
- ".trae/skills/citable/manifest.json": "sha256:980ecaafc46fefb8e0e6827c716ebbab878519f1e089400d4b7edb7bdf29475c",
518
+ ".trae/skills/citable/manifest.json": "sha256:2dfe2d7395fde76192ff6572ab65e52e5dab9913478337f98d58cf1b383d15bc",
519
519
  ".trae/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
520
520
  ".trae/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
521
521
  ".trae/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -550,14 +550,14 @@
550
550
  ".trae/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
551
551
  ".trae/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
552
552
  ".trae/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
553
- ".trae/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8",
553
+ ".trae/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d",
554
554
  ".trae-cn/skills/citable/commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
555
555
  ".trae-cn/skills/citable/commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
556
556
  ".trae-cn/skills/citable/commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
557
557
  ".trae-cn/skills/citable/commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
558
558
  ".trae-cn/skills/citable/commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
559
559
  ".trae-cn/skills/citable/commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
560
- ".trae-cn/skills/citable/manifest.json": "sha256:0d0797589a5e7ea20fd6059563fef72ceb5c4c40132a0028527793750b3f9964",
560
+ ".trae-cn/skills/citable/manifest.json": "sha256:fce06ef59d18d66574bee29d19afa897474904fb9e96b0b4db54b0bea491fdbe",
561
561
  ".trae-cn/skills/citable/policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
562
562
  ".trae-cn/skills/citable/references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
563
563
  ".trae-cn/skills/citable/rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
@@ -592,7 +592,7 @@
592
592
  ".trae-cn/skills/citable/scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
593
593
  ".trae-cn/skills/citable/SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
594
594
  ".trae-cn/skills/citable/templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
595
- ".trae-cn/skills/citable/VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
595
+ ".trae-cn/skills/citable/VERSION": "sha256:1e5b51cde515396a9fa762909cf8ca6584ccc564b325d2eebeea76175fe95c4d"
596
596
  },
597
- "treeHash": "sha256:24d4c6fdeb89a1de4b394d5809dc0a40632fb041a7b0ad7caa6263400ed5bfec"
597
+ "treeHash": "sha256:7ce6cc98bcd8131188e1751d46080b637f4d527f895a745fa62f7f17570655f3"
598
598
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebulacomponents/citable",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Production-grade SEO, AEO, and GEO agent skill with auditable detection, claim governance, evidence validation, and multi-agent installation.",
5
5
  "keywords": [
6
6
  "seo",
package/src/cli/index.js CHANGED
@@ -10,6 +10,7 @@ import { inspect } from '../commands/inspect.js';
10
10
  import { schemaCommand } from '../commands/schemaCmd.js';
11
11
  import { compareSnapshots } from '../commands/compareSnapshots.js';
12
12
  import { isInstallerCommand, runInstallerCommand } from '../installer/index.js';
13
+ import { selfUpgradeCommand } from '../commands/selfUpgrade.js';
13
14
 
14
15
  const HELP = `citable — SEO / AEO / GEO audit, remediation, validation, and governance
15
16
 
@@ -31,6 +32,7 @@ Commands
31
32
  schema Validate deployed JSON-LD and propose registry-derived schema
32
33
  validate [mode] registries (default) | claims | evidence | schema | links
33
34
  compare-snapshots [a b] Regression diff between two audit runs
35
+ self-upgrade Check for a newer version and upgrade the npx cache
34
36
 
35
37
  Options
36
38
  --target <dir|url> Built output directory or deployed URL to audit
@@ -115,6 +117,11 @@ export async function main(argv = process.argv.slice(2), options = {}) {
115
117
  if (r.summary.regression_critical_or_high > 0) process.exitCode = 1;
116
118
  break;
117
119
  }
120
+ case 'self-upgrade': {
121
+ const output = await selfUpgradeCommand(argv.slice(1));
122
+ console.log(output);
123
+ break;
124
+ }
118
125
  case undefined:
119
126
  console.log(HELP);
120
127
  break;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * self-upgrade command
3
+ *
4
+ * Checks npm for the latest @nebulacomponents/citable version and upgrades
5
+ * the running npx cache if a newer version is available.
6
+ *
7
+ * Usage:
8
+ * npx @nebulacomponents/citable self-upgrade
9
+ * npx @nebulacomponents/citable self-upgrade --check (check only, no upgrade)
10
+ * npx @nebulacomponents/citable self-upgrade --json (machine-readable output)
11
+ */
12
+
13
+ import { execFileSync, spawnSync } from 'node:child_process';
14
+ import { createRequire } from 'node:module';
15
+ import { fileURLToPath } from 'node:url';
16
+ import path from 'node:path';
17
+
18
+ const PACKAGE_NAME = '@nebulacomponents/citable';
19
+ const REGISTRY = 'https://registry.npmjs.org';
20
+ const FETCH_TIMEOUT_MS = 10_000;
21
+
22
+ /**
23
+ * Fetch the latest published version from the npm registry.
24
+ * Uses Node's built-in fetch (Node 22+); no extra dependencies.
25
+ *
26
+ * @returns {Promise<string>} latest semver string
27
+ */
28
+ async function fetchLatestVersion() {
29
+ const url = `${REGISTRY}/${encodeURIComponent(PACKAGE_NAME)}/latest`;
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
32
+ try {
33
+ const res = await fetch(url, {
34
+ headers: { Accept: 'application/json' },
35
+ signal: controller.signal,
36
+ });
37
+ if (!res.ok) throw new Error(`registry returned ${res.status}`);
38
+ const data = await res.json();
39
+ if (!data.version) throw new Error('no version field in registry response');
40
+ return data.version;
41
+ } finally {
42
+ clearTimeout(timer);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Compare two semver strings. Returns:
48
+ * 1 if a > b
49
+ * 0 if a === b
50
+ * -1 if a < b
51
+ */
52
+ function compareSemver(a, b) {
53
+ const parse = (v) => v.replace(/^v/, '').split('.').map(Number);
54
+ const [aMaj, aMin, aPatch] = parse(a);
55
+ const [bMaj, bMin, bPatch] = parse(b);
56
+ if (aMaj !== bMaj) return aMaj > bMaj ? 1 : -1;
57
+ if (aMin !== bMin) return aMin > bMin ? 1 : -1;
58
+ if (aPatch !== bPatch) return aPatch > bPatch ? 1 : -1;
59
+ return 0;
60
+ }
61
+
62
+ /**
63
+ * Re-execute the current command via npx at the new version.
64
+ * Used to trigger the npx cache refresh as a side-effect.
65
+ */
66
+ function triggerNpxRefresh(latestVersion) {
67
+ // npx --yes ensures no prompt; @version pins to latest
68
+ const result = spawnSync(
69
+ 'npx',
70
+ ['--yes', `${PACKAGE_NAME}@${latestVersion}`, '--version'],
71
+ { stdio: 'pipe', timeout: 60_000 },
72
+ );
73
+ return result.status === 0;
74
+ }
75
+
76
+ export async function selfUpgradeCommand(args) {
77
+ const checkOnly = args.includes('--check');
78
+ const jsonOutput = args.includes('--json');
79
+
80
+ // Resolve current version from our own package.json
81
+ let currentVersion;
82
+ try {
83
+ const req = createRequire(import.meta.url);
84
+ const pkgPath = path.resolve(fileURLToPath(import.meta.url), '../../../package.json');
85
+ currentVersion = req(pkgPath).version;
86
+ } catch {
87
+ const err = { ok: false, error: 'could not read local package.json version' };
88
+ if (jsonOutput) return JSON.stringify(err, null, 2);
89
+ return `error: ${err.error}`;
90
+ }
91
+
92
+ // Fetch latest from registry
93
+ let latestVersion;
94
+ try {
95
+ latestVersion = await fetchLatestVersion();
96
+ } catch (err) {
97
+ const result = { ok: false, current: currentVersion, error: `registry fetch failed: ${err.message}` };
98
+ if (jsonOutput) return JSON.stringify(result, null, 2);
99
+ return `error: ${result.error}\nCurrent version: ${currentVersion}`;
100
+ }
101
+
102
+ const cmp = compareSemver(latestVersion, currentVersion);
103
+
104
+ if (cmp <= 0) {
105
+ // Already current or ahead (local dev)
106
+ const result = { ok: true, current: currentVersion, latest: latestVersion, status: 'current' };
107
+ if (jsonOutput) return JSON.stringify(result, null, 2);
108
+ return `citable ${currentVersion} is already up to date (latest: ${latestVersion})`;
109
+ }
110
+
111
+ // Update available
112
+ if (checkOnly) {
113
+ const result = { ok: true, current: currentVersion, latest: latestVersion, status: 'update-available' };
114
+ if (jsonOutput) return JSON.stringify(result, null, 2);
115
+ return [
116
+ `Update available: ${currentVersion} → ${latestVersion}`,
117
+ `Run: npx ${PACKAGE_NAME}@latest self-upgrade`,
118
+ ].join('\n');
119
+ }
120
+
121
+ // Perform upgrade: warm the npx cache at the new version
122
+ const refreshed = triggerNpxRefresh(latestVersion);
123
+
124
+ const result = {
125
+ ok: refreshed,
126
+ current: currentVersion,
127
+ latest: latestVersion,
128
+ status: refreshed ? 'upgraded' : 'upgrade-failed',
129
+ };
130
+
131
+ if (jsonOutput) return JSON.stringify(result, null, 2);
132
+
133
+ if (refreshed) {
134
+ return [
135
+ `citable upgraded: ${currentVersion} → ${latestVersion}`,
136
+ `Run your next command with: npx ${PACKAGE_NAME}@latest <command>`,
137
+ `Or pin globally: npm install -g ${PACKAGE_NAME}@latest`,
138
+ ].join('\n');
139
+ }
140
+
141
+ return [
142
+ `Upgrade attempt failed (npx returned non-zero).`,
143
+ `Current: ${currentVersion} Latest: ${latestVersion}`,
144
+ `Manual upgrade: npx ${PACKAGE_NAME}@${latestVersion} <command>`,
145
+ ].join('\n');
146
+ }