@hunter-harness/workflow-harness 0.2.50 → 0.2.52

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 (218) 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 +6 -6
  4. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +42 -258
  6. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +38 -120
  7. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +4 -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 +2 -2
  10. package/harness/bundles/general/claude-code/harness-run/SKILL.md +2 -2
  11. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +2 -2
  12. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +7 -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 +2 -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 +748 -200
  18. package/harness/bundles/general/claude-code/scripts/harness_profile.py +0 -1
  19. package/harness/bundles/general/claude-code/scripts/harness_state.py +3 -5
  20. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  21. package/harness/bundles/general/codebuddy/README.md +4 -4
  22. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +6 -6
  23. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  24. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +39 -244
  25. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +35 -106
  26. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +4 -4
  27. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -2
  28. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +2 -2
  29. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +2 -2
  30. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +2 -2
  31. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +8 -8
  32. package/harness/bundles/general/codebuddy/harness-sync/reference.md +18 -11
  33. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +2 -2
  34. package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +5 -7
  35. package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +17 -11
  36. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +748 -200
  37. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +0 -1
  38. package/harness/bundles/general/codebuddy/scripts/harness_state.py +3 -5
  39. package/harness/bundles/general/codex/.harness-build.json +1 -1
  40. package/harness/bundles/general/codex/README.md +4 -4
  41. package/harness/bundles/general/codex/harness-archive/SKILL.md +6 -6
  42. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  43. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +39 -244
  44. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +35 -106
  45. package/harness/bundles/general/codex/harness-plan/SKILL.md +4 -4
  46. package/harness/bundles/general/codex/harness-plan/checklist.md +2 -2
  47. package/harness/bundles/general/codex/harness-review/SKILL.md +2 -2
  48. package/harness/bundles/general/codex/harness-run/SKILL.md +2 -2
  49. package/harness/bundles/general/codex/harness-submit/SKILL.md +2 -2
  50. package/harness/bundles/general/codex/harness-sync/SKILL.md +8 -8
  51. package/harness/bundles/general/codex/harness-sync/reference.md +18 -11
  52. package/harness/bundles/general/codex/harness-test/SKILL.md +2 -2
  53. package/harness/bundles/general/codex/protocols/archive-report-protocol.md +5 -7
  54. package/harness/bundles/general/codex/protocols/state-layout-protocol.md +17 -11
  55. package/harness/bundles/general/codex/scripts/harness_archive.py +748 -200
  56. package/harness/bundles/general/codex/scripts/harness_profile.py +0 -1
  57. package/harness/bundles/general/codex/scripts/harness_state.py +3 -5
  58. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  59. package/harness/bundles/general/cursor/README.md +4 -4
  60. package/harness/bundles/general/cursor/harness-archive/SKILL.md +6 -6
  61. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  62. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +39 -244
  63. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +35 -106
  64. package/harness/bundles/general/cursor/harness-plan/SKILL.md +4 -4
  65. package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -2
  66. package/harness/bundles/general/cursor/harness-review/SKILL.md +2 -2
  67. package/harness/bundles/general/cursor/harness-run/SKILL.md +2 -2
  68. package/harness/bundles/general/cursor/harness-submit/SKILL.md +2 -2
  69. package/harness/bundles/general/cursor/harness-sync/SKILL.md +8 -8
  70. package/harness/bundles/general/cursor/harness-sync/reference.md +18 -11
  71. package/harness/bundles/general/cursor/harness-test/SKILL.md +2 -2
  72. package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +5 -7
  73. package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +17 -11
  74. package/harness/bundles/general/cursor/scripts/harness_archive.py +748 -200
  75. package/harness/bundles/general/cursor/scripts/harness_profile.py +0 -1
  76. package/harness/bundles/general/cursor/scripts/harness_state.py +3 -5
  77. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  78. package/harness/bundles/java/claude-code/README.md +4 -4
  79. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +2 -2
  80. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +6 -6
  81. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  82. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +42 -258
  83. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +38 -120
  84. package/harness/bundles/java/claude-code/harness-package/SKILL.md +2 -2
  85. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +4 -4
  86. package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -2
  87. package/harness/bundles/java/claude-code/harness-review/SKILL.md +2 -2
  88. package/harness/bundles/java/claude-code/harness-run/SKILL.md +2 -2
  89. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +2 -2
  90. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +7 -7
  91. package/harness/bundles/java/claude-code/harness-sync/reference.md +18 -11
  92. package/harness/bundles/java/claude-code/harness-test/SKILL.md +2 -2
  93. package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +5 -7
  94. package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +17 -11
  95. package/harness/bundles/java/claude-code/scripts/harness_archive.py +748 -200
  96. package/harness/bundles/java/claude-code/scripts/harness_profile.py +0 -1
  97. package/harness/bundles/java/claude-code/scripts/harness_state.py +3 -5
  98. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  99. package/harness/bundles/java/codebuddy/README.md +4 -4
  100. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +2 -2
  101. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +6 -6
  102. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  103. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +39 -244
  104. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +35 -106
  105. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +2 -2
  106. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +4 -4
  107. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -2
  108. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +2 -2
  109. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +2 -2
  110. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +2 -2
  111. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +8 -8
  112. package/harness/bundles/java/codebuddy/harness-sync/reference.md +18 -11
  113. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +2 -2
  114. package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +5 -7
  115. package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +17 -11
  116. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +748 -200
  117. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +0 -1
  118. package/harness/bundles/java/codebuddy/scripts/harness_state.py +3 -5
  119. package/harness/bundles/java/codex/.harness-build.json +1 -1
  120. package/harness/bundles/java/codex/README.md +4 -4
  121. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +2 -2
  122. package/harness/bundles/java/codex/harness-archive/SKILL.md +6 -6
  123. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  124. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +39 -244
  125. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +35 -106
  126. package/harness/bundles/java/codex/harness-package/SKILL.md +2 -2
  127. package/harness/bundles/java/codex/harness-plan/SKILL.md +4 -4
  128. package/harness/bundles/java/codex/harness-plan/checklist.md +2 -2
  129. package/harness/bundles/java/codex/harness-review/SKILL.md +2 -2
  130. package/harness/bundles/java/codex/harness-run/SKILL.md +2 -2
  131. package/harness/bundles/java/codex/harness-submit/SKILL.md +2 -2
  132. package/harness/bundles/java/codex/harness-sync/SKILL.md +8 -8
  133. package/harness/bundles/java/codex/harness-sync/reference.md +18 -11
  134. package/harness/bundles/java/codex/harness-test/SKILL.md +2 -2
  135. package/harness/bundles/java/codex/protocols/archive-report-protocol.md +5 -7
  136. package/harness/bundles/java/codex/protocols/state-layout-protocol.md +17 -11
  137. package/harness/bundles/java/codex/scripts/harness_archive.py +748 -200
  138. package/harness/bundles/java/codex/scripts/harness_profile.py +0 -1
  139. package/harness/bundles/java/codex/scripts/harness_state.py +3 -5
  140. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  141. package/harness/bundles/java/cursor/README.md +4 -4
  142. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +2 -2
  143. package/harness/bundles/java/cursor/harness-archive/SKILL.md +6 -6
  144. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  145. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +39 -244
  146. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +35 -106
  147. package/harness/bundles/java/cursor/harness-package/SKILL.md +2 -2
  148. package/harness/bundles/java/cursor/harness-plan/SKILL.md +4 -4
  149. package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -2
  150. package/harness/bundles/java/cursor/harness-review/SKILL.md +2 -2
  151. package/harness/bundles/java/cursor/harness-run/SKILL.md +2 -2
  152. package/harness/bundles/java/cursor/harness-submit/SKILL.md +2 -2
  153. package/harness/bundles/java/cursor/harness-sync/SKILL.md +8 -8
  154. package/harness/bundles/java/cursor/harness-sync/reference.md +18 -11
  155. package/harness/bundles/java/cursor/harness-test/SKILL.md +2 -2
  156. package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +5 -7
  157. package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +17 -11
  158. package/harness/bundles/java/cursor/scripts/harness_archive.py +748 -200
  159. package/harness/bundles/java/cursor/scripts/harness_profile.py +0 -1
  160. package/harness/bundles/java/cursor/scripts/harness_state.py +3 -5
  161. package/harness/manifests/general/claude-code.json +21 -45
  162. package/harness/manifests/general/codebuddy.json +21 -45
  163. package/harness/manifests/general/codex.json +21 -45
  164. package/harness/manifests/general/cursor.json +21 -45
  165. package/harness/manifests/java/claude-code.json +23 -47
  166. package/harness/manifests/java/codebuddy.json +23 -47
  167. package/harness/manifests/java/codex.json +23 -47
  168. package/harness/manifests/java/cursor.json +23 -47
  169. package/hunter-workflow-family.json +4 -4
  170. package/package.json +1 -1
  171. package/harness/bundles/general/claude-code/harness-knowledge-ingest/design.md +0 -842
  172. package/harness/bundles/general/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  173. package/harness/bundles/general/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
  174. package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +0 -413
  175. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  176. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  177. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/design.md +0 -842
  178. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  179. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
  180. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +0 -413
  181. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  182. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  183. package/harness/bundles/general/codex/harness-knowledge-ingest/design.md +0 -842
  184. package/harness/bundles/general/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  185. package/harness/bundles/general/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
  186. package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +0 -413
  187. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  188. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  189. package/harness/bundles/general/cursor/harness-knowledge-ingest/design.md +0 -842
  190. package/harness/bundles/general/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  191. package/harness/bundles/general/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
  192. package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +0 -413
  193. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  194. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  195. package/harness/bundles/java/claude-code/harness-knowledge-ingest/design.md +0 -842
  196. package/harness/bundles/java/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  197. package/harness/bundles/java/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
  198. package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +0 -413
  199. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  200. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  201. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/design.md +0 -842
  202. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  203. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
  204. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +0 -413
  205. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  206. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  207. package/harness/bundles/java/codex/harness-knowledge-ingest/design.md +0 -842
  208. package/harness/bundles/java/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  209. package/harness/bundles/java/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
  210. package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +0 -413
  211. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  212. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
  213. package/harness/bundles/java/cursor/harness-knowledge-ingest/design.md +0 -842
  214. package/harness/bundles/java/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
  215. package/harness/bundles/java/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
  216. package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +0 -413
  217. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
  218. 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())