@hunter-harness/workflow-harness 0.2.49 → 0.2.51

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 (234) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/README.md +4 -4
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +11 -3
  4. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +6 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +45 -244
  6. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +41 -112
  7. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +9 -4
  8. package/harness/bundles/general/claude-code/harness-plan/checklist.md +2 -2
  9. package/harness/bundles/general/claude-code/harness-review/SKILL.md +7 -2
  10. package/harness/bundles/general/claude-code/harness-run/SKILL.md +8 -3
  11. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +7 -2
  12. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +12 -7
  13. package/harness/bundles/general/claude-code/harness-sync/reference.md +18 -11
  14. package/harness/bundles/general/claude-code/harness-test/SKILL.md +7 -2
  15. package/harness/bundles/general/claude-code/protocols/archive-report-protocol.md +5 -7
  16. package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +17 -11
  17. package/harness/bundles/general/claude-code/scripts/harness_archive.py +769 -191
  18. package/harness/bundles/general/claude-code/scripts/harness_events_sync.py +90 -12
  19. package/harness/bundles/general/claude-code/scripts/harness_gate.py +17 -0
  20. package/harness/bundles/general/claude-code/scripts/harness_profile.py +0 -1
  21. package/harness/bundles/general/claude-code/scripts/harness_state.py +3 -5
  22. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  23. package/harness/bundles/general/codebuddy/README.md +4 -4
  24. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +11 -3
  25. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +6 -1
  26. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +42 -230
  27. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +38 -98
  28. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +9 -4
  29. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -2
  30. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +7 -2
  31. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +8 -3
  32. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +7 -2
  33. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +13 -8
  34. package/harness/bundles/general/codebuddy/harness-sync/reference.md +18 -11
  35. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +7 -2
  36. package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +5 -7
  37. package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +17 -11
  38. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +769 -191
  39. package/harness/bundles/general/codebuddy/scripts/harness_events_sync.py +90 -12
  40. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +17 -0
  41. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +0 -1
  42. package/harness/bundles/general/codebuddy/scripts/harness_state.py +3 -5
  43. package/harness/bundles/general/codex/.harness-build.json +1 -1
  44. package/harness/bundles/general/codex/README.md +4 -4
  45. package/harness/bundles/general/codex/harness-archive/SKILL.md +11 -3
  46. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +6 -1
  47. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +42 -230
  48. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +38 -98
  49. package/harness/bundles/general/codex/harness-plan/SKILL.md +9 -4
  50. package/harness/bundles/general/codex/harness-plan/checklist.md +2 -2
  51. package/harness/bundles/general/codex/harness-review/SKILL.md +7 -2
  52. package/harness/bundles/general/codex/harness-run/SKILL.md +8 -3
  53. package/harness/bundles/general/codex/harness-submit/SKILL.md +7 -2
  54. package/harness/bundles/general/codex/harness-sync/SKILL.md +13 -8
  55. package/harness/bundles/general/codex/harness-sync/reference.md +18 -11
  56. package/harness/bundles/general/codex/harness-test/SKILL.md +7 -2
  57. package/harness/bundles/general/codex/protocols/archive-report-protocol.md +5 -7
  58. package/harness/bundles/general/codex/protocols/state-layout-protocol.md +17 -11
  59. package/harness/bundles/general/codex/scripts/harness_archive.py +769 -191
  60. package/harness/bundles/general/codex/scripts/harness_events_sync.py +90 -12
  61. package/harness/bundles/general/codex/scripts/harness_gate.py +17 -0
  62. package/harness/bundles/general/codex/scripts/harness_profile.py +0 -1
  63. package/harness/bundles/general/codex/scripts/harness_state.py +3 -5
  64. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  65. package/harness/bundles/general/cursor/README.md +4 -4
  66. package/harness/bundles/general/cursor/harness-archive/SKILL.md +11 -3
  67. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +6 -1
  68. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +42 -230
  69. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +38 -98
  70. package/harness/bundles/general/cursor/harness-plan/SKILL.md +9 -4
  71. package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -2
  72. package/harness/bundles/general/cursor/harness-review/SKILL.md +7 -2
  73. package/harness/bundles/general/cursor/harness-run/SKILL.md +8 -3
  74. package/harness/bundles/general/cursor/harness-submit/SKILL.md +7 -2
  75. package/harness/bundles/general/cursor/harness-sync/SKILL.md +13 -8
  76. package/harness/bundles/general/cursor/harness-sync/reference.md +18 -11
  77. package/harness/bundles/general/cursor/harness-test/SKILL.md +7 -2
  78. package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +5 -7
  79. package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +17 -11
  80. package/harness/bundles/general/cursor/scripts/harness_archive.py +769 -191
  81. package/harness/bundles/general/cursor/scripts/harness_events_sync.py +90 -12
  82. package/harness/bundles/general/cursor/scripts/harness_gate.py +17 -0
  83. package/harness/bundles/general/cursor/scripts/harness_profile.py +0 -1
  84. package/harness/bundles/general/cursor/scripts/harness_state.py +3 -5
  85. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  86. package/harness/bundles/java/claude-code/README.md +4 -4
  87. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +7 -2
  88. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +11 -3
  89. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +6 -1
  90. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +45 -244
  91. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +41 -112
  92. package/harness/bundles/java/claude-code/harness-package/SKILL.md +7 -2
  93. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +9 -4
  94. package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -2
  95. package/harness/bundles/java/claude-code/harness-review/SKILL.md +7 -2
  96. package/harness/bundles/java/claude-code/harness-run/SKILL.md +8 -3
  97. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +7 -2
  98. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +12 -7
  99. package/harness/bundles/java/claude-code/harness-sync/reference.md +18 -11
  100. package/harness/bundles/java/claude-code/harness-test/SKILL.md +7 -2
  101. package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +5 -7
  102. package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +17 -11
  103. package/harness/bundles/java/claude-code/scripts/harness_archive.py +769 -191
  104. package/harness/bundles/java/claude-code/scripts/harness_events_sync.py +90 -12
  105. package/harness/bundles/java/claude-code/scripts/harness_gate.py +17 -0
  106. package/harness/bundles/java/claude-code/scripts/harness_profile.py +0 -1
  107. package/harness/bundles/java/claude-code/scripts/harness_state.py +3 -5
  108. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  109. package/harness/bundles/java/codebuddy/README.md +4 -4
  110. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +7 -2
  111. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +11 -3
  112. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +6 -1
  113. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +42 -230
  114. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +38 -98
  115. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +7 -2
  116. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +9 -4
  117. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -2
  118. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +7 -2
  119. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +8 -3
  120. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +7 -2
  121. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +13 -8
  122. package/harness/bundles/java/codebuddy/harness-sync/reference.md +18 -11
  123. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +7 -2
  124. package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +5 -7
  125. package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +17 -11
  126. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +769 -191
  127. package/harness/bundles/java/codebuddy/scripts/harness_events_sync.py +90 -12
  128. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +17 -0
  129. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +0 -1
  130. package/harness/bundles/java/codebuddy/scripts/harness_state.py +3 -5
  131. package/harness/bundles/java/codex/.harness-build.json +1 -1
  132. package/harness/bundles/java/codex/README.md +4 -4
  133. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +7 -2
  134. package/harness/bundles/java/codex/harness-archive/SKILL.md +11 -3
  135. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +6 -1
  136. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +42 -230
  137. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +38 -98
  138. package/harness/bundles/java/codex/harness-package/SKILL.md +7 -2
  139. package/harness/bundles/java/codex/harness-plan/SKILL.md +9 -4
  140. package/harness/bundles/java/codex/harness-plan/checklist.md +2 -2
  141. package/harness/bundles/java/codex/harness-review/SKILL.md +7 -2
  142. package/harness/bundles/java/codex/harness-run/SKILL.md +8 -3
  143. package/harness/bundles/java/codex/harness-submit/SKILL.md +7 -2
  144. package/harness/bundles/java/codex/harness-sync/SKILL.md +13 -8
  145. package/harness/bundles/java/codex/harness-sync/reference.md +18 -11
  146. package/harness/bundles/java/codex/harness-test/SKILL.md +7 -2
  147. package/harness/bundles/java/codex/protocols/archive-report-protocol.md +5 -7
  148. package/harness/bundles/java/codex/protocols/state-layout-protocol.md +17 -11
  149. package/harness/bundles/java/codex/scripts/harness_archive.py +769 -191
  150. package/harness/bundles/java/codex/scripts/harness_events_sync.py +90 -12
  151. package/harness/bundles/java/codex/scripts/harness_gate.py +17 -0
  152. package/harness/bundles/java/codex/scripts/harness_profile.py +0 -1
  153. package/harness/bundles/java/codex/scripts/harness_state.py +3 -5
  154. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  155. package/harness/bundles/java/cursor/README.md +4 -4
  156. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +7 -2
  157. package/harness/bundles/java/cursor/harness-archive/SKILL.md +11 -3
  158. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +6 -1
  159. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +42 -230
  160. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +38 -98
  161. package/harness/bundles/java/cursor/harness-package/SKILL.md +7 -2
  162. package/harness/bundles/java/cursor/harness-plan/SKILL.md +9 -4
  163. package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -2
  164. package/harness/bundles/java/cursor/harness-review/SKILL.md +7 -2
  165. package/harness/bundles/java/cursor/harness-run/SKILL.md +8 -3
  166. package/harness/bundles/java/cursor/harness-submit/SKILL.md +7 -2
  167. package/harness/bundles/java/cursor/harness-sync/SKILL.md +13 -8
  168. package/harness/bundles/java/cursor/harness-sync/reference.md +18 -11
  169. package/harness/bundles/java/cursor/harness-test/SKILL.md +7 -2
  170. package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +5 -7
  171. package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +17 -11
  172. package/harness/bundles/java/cursor/scripts/harness_archive.py +769 -191
  173. package/harness/bundles/java/cursor/scripts/harness_events_sync.py +90 -12
  174. package/harness/bundles/java/cursor/scripts/harness_gate.py +17 -0
  175. package/harness/bundles/java/cursor/scripts/harness_profile.py +0 -1
  176. package/harness/bundles/java/cursor/scripts/harness_state.py +3 -5
  177. package/harness/manifests/general/claude-code.json +23 -47
  178. package/harness/manifests/general/codebuddy.json +23 -47
  179. package/harness/manifests/general/codex.json +23 -47
  180. package/harness/manifests/general/cursor.json +23 -47
  181. package/harness/manifests/java/claude-code.json +25 -49
  182. package/harness/manifests/java/codebuddy.json +25 -49
  183. package/harness/manifests/java/codex.json +25 -49
  184. package/harness/manifests/java/cursor.json +25 -49
  185. package/hunter-workflow-family.json +4 -4
  186. package/package.json +1 -1
  187. package/harness/bundles/general/claude-code/harness-knowledge-ingest/design.md +0 -842
  188. package/harness/bundles/general/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  189. package/harness/bundles/general/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
  190. package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +0 -413
  191. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  192. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  193. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/design.md +0 -842
  194. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  195. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
  196. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +0 -413
  197. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  198. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  199. package/harness/bundles/general/codex/harness-knowledge-ingest/design.md +0 -842
  200. package/harness/bundles/general/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  201. package/harness/bundles/general/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
  202. package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +0 -413
  203. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  204. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  205. package/harness/bundles/general/cursor/harness-knowledge-ingest/design.md +0 -842
  206. package/harness/bundles/general/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  207. package/harness/bundles/general/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
  208. package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +0 -413
  209. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  210. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  211. package/harness/bundles/java/claude-code/harness-knowledge-ingest/design.md +0 -842
  212. package/harness/bundles/java/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  213. package/harness/bundles/java/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
  214. package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +0 -413
  215. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  216. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  217. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/design.md +0 -842
  218. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  219. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
  220. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +0 -413
  221. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  222. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  223. package/harness/bundles/java/codex/harness-knowledge-ingest/design.md +0 -842
  224. package/harness/bundles/java/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  225. package/harness/bundles/java/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
  226. package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +0 -413
  227. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  228. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  229. package/harness/bundles/java/cursor/harness-knowledge-ingest/design.md +0 -842
  230. package/harness/bundles/java/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  231. package/harness/bundles/java/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
  232. package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +0 -413
  233. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  234. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
@@ -1,275 +0,0 @@
1
- #!/usr/bin/env python3
2
- """MCP entry point for Harness knowledge operations."""
3
-
4
- from __future__ import annotations
5
-
6
- import argparse
7
- import json
8
- import sys
9
- from pathlib import Path
10
- from typing import Any
11
-
12
-
13
- SCRIPT_DIR = Path(__file__).resolve().parent
14
- if str(SCRIPT_DIR) not in sys.path:
15
- sys.path.insert(0, str(SCRIPT_DIR))
16
-
17
- import harness_knowledge as hk # noqa: E402
18
-
19
-
20
- TOOL_DESCRIPTIONS: list[dict[str, Any]] = [
21
- {
22
- "name": "harness_knowledge_ingest",
23
- "description": "Build or refresh a project-local .harness/knowledge index from .harness/archive.",
24
- "inputSchema": {
25
- "type": "object",
26
- "properties": {
27
- "project": {"type": "string", "description": "Project root containing .harness/archive."},
28
- "incremental": {"type": "boolean", "default": True, "description": "Reuse cached archive extraction results when valid."},
29
- },
30
- "required": ["project"],
31
- },
32
- },
33
- {
34
- "name": "harness_knowledge_sync",
35
- "description": "Check whether .harness/knowledge is current, optionally refreshing stale indexes.",
36
- "inputSchema": {
37
- "type": "object",
38
- "properties": {
39
- "project": {"type": "string", "description": "Project root containing .harness/archive."},
40
- "update": {"type": "boolean", "default": False, "description": "Refresh the index when it is out of date."},
41
- "incremental": {"type": "boolean", "default": True, "description": "Use incremental extraction when update is true."},
42
- },
43
- "required": ["project"],
44
- },
45
- },
46
- {
47
- "name": "harness_knowledge_auto",
48
- "description": "Run the default automated knowledge maintenance workflow: create config when missing, sync, suggest validators, verify, and audit.",
49
- "inputSchema": {
50
- "type": "object",
51
- "properties": {
52
- "project": {"type": "string", "description": "Project root containing .harness/archive."},
53
- "limit": {"type": "integer", "default": 20, "minimum": 1, "maximum": 100},
54
- "suggest_statuses": {"type": "array", "items": {"type": "string"}, "default": []},
55
- "apply_suggestions": {"type": "boolean", "default": True, "description": "Write validator suggestions into entry JSON files (default on)."},
56
- "incremental": {"type": "boolean", "default": True, "description": "Reuse cached archive extraction results when refreshing."},
57
- "audit_limit": {"type": "integer", "default": 10, "minimum": 1, "maximum": 100},
58
- },
59
- "required": ["project"],
60
- },
61
- },
62
- {
63
- "name": "harness_knowledge_audit",
64
- "description": "Generate review lists for candidate, stale, superseded, and conflicted knowledge.",
65
- "inputSchema": {
66
- "type": "object",
67
- "properties": {
68
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
69
- "limit": {"type": "integer", "default": 10, "minimum": 1, "maximum": 100},
70
- },
71
- "required": ["project"],
72
- },
73
- },
74
- {
75
- "name": "harness_knowledge_verify",
76
- "description": "Run configured validators against knowledge entries and refresh verification reports.",
77
- "inputSchema": {
78
- "type": "object",
79
- "properties": {
80
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
81
- },
82
- "required": ["project"],
83
- },
84
- },
85
- {
86
- "name": "harness_knowledge_suggest_validators",
87
- "description": "Suggest deterministic validators for knowledge entries, optionally applying them.",
88
- "inputSchema": {
89
- "type": "object",
90
- "properties": {
91
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
92
- "limit": {"type": "integer", "default": 20, "minimum": 1, "maximum": 100},
93
- "statuses": {"type": "array", "items": {"type": "string"}, "default": []},
94
- "apply": {"type": "boolean", "default": False, "description": "Write suggestions into entry JSON files."},
95
- },
96
- "required": ["project"],
97
- },
98
- },
99
- {
100
- "name": "harness_knowledge_query",
101
- "description": "Search .harness/knowledge and generate a context pack for planning or implementation.",
102
- "inputSchema": {
103
- "type": "object",
104
- "properties": {
105
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
106
- "query": {"type": "string", "description": "Need, question, keyword, or file path to search."},
107
- "limit": {"type": "integer", "default": 10, "minimum": 1, "maximum": 100},
108
- "files": {"type": "array", "items": {"type": "string"}, "default": []},
109
- "statuses": {"type": "array", "items": {"type": "string"}, "default": []},
110
- "types": {"type": "array", "items": {"type": "string"}, "default": []},
111
- },
112
- "required": ["project", "query"],
113
- },
114
- },
115
- {
116
- "name": "harness_knowledge_promote",
117
- "description": "Promote a candidate knowledge entry to active after manual confirmation.",
118
- "inputSchema": {
119
- "type": "object",
120
- "properties": {
121
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
122
- "entry_id": {"type": "string", "description": "Knowledge entry id to promote."},
123
- "note": {"type": "string", "default": "", "description": "Manual verification note."},
124
- "allow_stale": {"type": "boolean", "default": False, "description": "Allow promoting a stale entry after manual verification."},
125
- },
126
- "required": ["project", "entry_id"],
127
- },
128
- },
129
- {
130
- "name": "harness_knowledge_demote",
131
- "description": "Demote an active knowledge entry to stale or candidate after manual review.",
132
- "inputSchema": {
133
- "type": "object",
134
- "properties": {
135
- "project": {"type": "string", "description": "Project root containing .harness/knowledge."},
136
- "entry_id": {"type": "string", "description": "Active knowledge entry id to demote."},
137
- "status": {"type": "string", "enum": ["candidate", "stale"], "description": "Target lifecycle status."},
138
- "reason": {"type": "string", "description": "Manual demotion reason."},
139
- },
140
- "required": ["project", "entry_id", "status", "reason"],
141
- },
142
- },
143
- ]
144
-
145
-
146
- def describe_tools() -> dict[str, Any]:
147
- return {
148
- "server": "harness-knowledge",
149
- "transport": "stdio",
150
- "tools": TOOL_DESCRIPTIONS,
151
- }
152
-
153
-
154
- def create_server() -> Any:
155
- try:
156
- from mcp.server.fastmcp import FastMCP
157
- except Exception as exc: # pragma: no cover - exercised when SDK is absent
158
- raise RuntimeError(
159
- "Python package 'mcp' with FastMCP support is required to run the MCP server. "
160
- "Use --describe-tools for static tool metadata."
161
- ) from exc
162
-
163
- server = FastMCP(
164
- "harness-knowledge",
165
- instructions=(
166
- "Use these tools to maintain and query project-local Harness knowledge. "
167
- "Treat candidate and stale entries as historical context until verified."
168
- ),
169
- )
170
-
171
- @server.tool(description=TOOL_DESCRIPTIONS[0]["description"])
172
- def harness_knowledge_ingest(project: str, incremental: bool = True) -> dict[str, Any]:
173
- return hk.summarize_index(hk.build_index(Path(project), incremental=incremental))
174
-
175
- @server.tool(description=TOOL_DESCRIPTIONS[1]["description"])
176
- def harness_knowledge_sync(project: str, update: bool = False, incremental: bool = True) -> dict[str, Any]:
177
- return hk.sync_status(Path(project), update=update, incremental=incremental)
178
-
179
- @server.tool(description=TOOL_DESCRIPTIONS[2]["description"])
180
- def harness_knowledge_auto(
181
- project: str,
182
- limit: int = 20,
183
- suggest_statuses: list[str] | None = None,
184
- apply_suggestions: bool = True,
185
- incremental: bool = True,
186
- audit_limit: int = 10,
187
- ) -> dict[str, Any]:
188
- return hk.auto_knowledge(
189
- Path(project),
190
- limit=limit,
191
- suggest_statuses=suggest_statuses or [],
192
- apply_suggestions=apply_suggestions,
193
- incremental=incremental,
194
- audit_limit=audit_limit,
195
- )
196
-
197
- @server.tool(description=TOOL_DESCRIPTIONS[3]["description"])
198
- def harness_knowledge_audit(project: str, limit: int = 10) -> dict[str, Any]:
199
- return hk.audit_entries(Path(project), limit=limit)
200
-
201
- @server.tool(description=TOOL_DESCRIPTIONS[4]["description"])
202
- def harness_knowledge_verify(project: str) -> dict[str, Any]:
203
- return hk.verify_knowledge(Path(project))
204
-
205
- @server.tool(description=TOOL_DESCRIPTIONS[5]["description"])
206
- def harness_knowledge_suggest_validators(
207
- project: str,
208
- limit: int = 20,
209
- statuses: list[str] | None = None,
210
- apply: bool = False,
211
- ) -> dict[str, Any]:
212
- return hk.suggest_validators(Path(project), limit=limit, statuses=statuses or [], apply=apply)
213
-
214
- @server.tool(description=TOOL_DESCRIPTIONS[6]["description"])
215
- def harness_knowledge_query(
216
- project: str,
217
- query: str,
218
- limit: int = 10,
219
- files: list[str] | None = None,
220
- statuses: list[str] | None = None,
221
- types: list[str] | None = None,
222
- change_id: str | None = None,
223
- ) -> dict[str, Any]:
224
- return hk.query_index(
225
- Path(project),
226
- query,
227
- limit=limit,
228
- file_filters=files or [],
229
- statuses=statuses or [],
230
- types=types or [],
231
- change_id=change_id,
232
- )
233
-
234
- @server.tool(description=TOOL_DESCRIPTIONS[7]["description"])
235
- def harness_knowledge_promote(
236
- project: str,
237
- entry_id: str,
238
- note: str = "",
239
- allow_stale: bool = False,
240
- ) -> dict[str, Any]:
241
- return hk.promote_entry(Path(project), entry_id, note, allow_stale=allow_stale)
242
-
243
- @server.tool(description=TOOL_DESCRIPTIONS[8]["description"])
244
- def harness_knowledge_demote(
245
- project: str,
246
- entry_id: str,
247
- status: str,
248
- reason: str,
249
- ) -> dict[str, Any]:
250
- return hk.demote_entry(Path(project), entry_id, status, reason)
251
-
252
- return server
253
-
254
-
255
- def main(argv: list[str] | None = None) -> int:
256
- parser = argparse.ArgumentParser(description="Run the Harness knowledge MCP server.")
257
- parser.add_argument("--describe-tools", action="store_true", help="Print static MCP tool metadata as JSON and exit.")
258
- parser.add_argument("--transport", choices=["stdio", "sse", "streamable-http"], default="stdio")
259
- args = parser.parse_args(argv)
260
-
261
- if args.describe_tools:
262
- print(json.dumps(describe_tools(), ensure_ascii=False, indent=2))
263
- return 0
264
-
265
- try:
266
- server = create_server()
267
- except RuntimeError as exc:
268
- print(str(exc), file=sys.stderr)
269
- return 1
270
- server.run(transport=args.transport)
271
- return 0
272
-
273
-
274
- if __name__ == "__main__":
275
- raise SystemExit(main())