@dotdotgod/hermes 0.6.5 → 0.6.6

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.
package/mcp/tools.json CHANGED
@@ -60,10 +60,6 @@
60
60
  "project"
61
61
  ]
62
62
  },
63
- "ttlMs": {
64
- "type": "integer",
65
- "minimum": 0
66
- },
67
63
  "env": {
68
64
  "type": "object",
69
65
  "additionalProperties": {
@@ -104,6 +100,10 @@
104
100
  "timeoutMs": {
105
101
  "type": "integer",
106
102
  "exclusiveMinimum": 0
103
+ },
104
+ "contextSessionId": {
105
+ "type": "string",
106
+ "description": "Host session identity; adapters supply this for shared MCP connections."
107
107
  }
108
108
  },
109
109
  "required": [
@@ -191,10 +191,6 @@
191
191
  "project"
192
192
  ]
193
193
  },
194
- "ttlMs": {
195
- "type": "integer",
196
- "minimum": 0
197
- },
198
194
  "env": {
199
195
  "type": "object",
200
196
  "additionalProperties": {
@@ -217,6 +213,10 @@
217
213
  "type": "string"
218
214
  },
219
215
  "maxItems": 100
216
+ },
217
+ "contextSessionId": {
218
+ "type": "string",
219
+ "description": "Host session identity; adapters supply this for shared MCP connections."
220
220
  }
221
221
  },
222
222
  "required": [
@@ -257,10 +257,6 @@
257
257
  "project"
258
258
  ]
259
259
  },
260
- "ttlMs": {
261
- "type": "integer",
262
- "minimum": 0
263
- },
264
260
  "maxBytes": {
265
261
  "type": "integer",
266
262
  "exclusiveMinimum": 0
@@ -297,6 +293,10 @@
297
293
  "maxAggregateBytes": {
298
294
  "type": "integer",
299
295
  "minimum": 0
296
+ },
297
+ "contextSessionId": {
298
+ "type": "string",
299
+ "description": "Host session identity; adapters supply this for shared MCP connections."
300
300
  }
301
301
  },
302
302
  "required": [
@@ -340,6 +340,10 @@
340
340
  },
341
341
  "sessionOnly": {
342
342
  "type": "boolean"
343
+ },
344
+ "contextSessionId": {
345
+ "type": "string",
346
+ "description": "Host session identity; adapters supply this for shared MCP connections."
343
347
  }
344
348
  },
345
349
  "required": [
@@ -376,10 +380,6 @@
376
380
  "project"
377
381
  ]
378
382
  },
379
- "ttlMs": {
380
- "type": "integer",
381
- "minimum": 0
382
- },
383
383
  "timeoutMs": {
384
384
  "type": "integer",
385
385
  "exclusiveMinimum": 0
@@ -390,6 +390,10 @@
390
390
  },
391
391
  "browser": {
392
392
  "type": "boolean"
393
+ },
394
+ "contextSessionId": {
395
+ "type": "string",
396
+ "description": "Host session identity; adapters supply this for shared MCP connections."
393
397
  }
394
398
  },
395
399
  "required": [
@@ -408,7 +412,7 @@
408
412
  },
409
413
  {
410
414
  "name": "session_resume",
411
- "description": "Use an explicit opaque session ID for subsequent context operations; historical sessions are not listed.",
415
+ "description": "Use an explicit opaque session ID for subsequent context operations on a dedicated connection; historical sessions are not listed. Shared connections should supply contextSessionId per call instead.",
412
416
  "inputSchema": {
413
417
  "type": "object",
414
418
  "properties": {
@@ -417,6 +421,10 @@
417
421
  "minLength": 1,
418
422
  "maxLength": 128,
419
423
  "pattern": "^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$"
424
+ },
425
+ "contextSessionId": {
426
+ "type": "string",
427
+ "description": "Host session identity; adapters supply this for shared MCP connections."
420
428
  }
421
429
  },
422
430
  "required": [
@@ -445,6 +453,10 @@
445
453
  "input": {
446
454
  "type": "object",
447
455
  "additionalProperties": {}
456
+ },
457
+ "contextSessionId": {
458
+ "type": "string",
459
+ "description": "Host session identity; adapters supply this for shared MCP connections."
448
460
  }
449
461
  },
450
462
  "required": [
@@ -467,6 +479,10 @@
467
479
  "id": {
468
480
  "type": "string",
469
481
  "format": "uuid"
482
+ },
483
+ "contextSessionId": {
484
+ "type": "string",
485
+ "description": "Host session identity; adapters supply this for shared MCP connections."
470
486
  }
471
487
  },
472
488
  "required": [
@@ -491,6 +507,10 @@
491
507
  "id": {
492
508
  "type": "string",
493
509
  "format": "uuid"
510
+ },
511
+ "contextSessionId": {
512
+ "type": "string",
513
+ "description": "Host session identity; adapters supply this for shared MCP connections."
494
514
  }
495
515
  },
496
516
  "required": [
@@ -515,6 +535,10 @@
515
535
  "confirm": {
516
536
  "type": "boolean",
517
537
  "const": true
538
+ },
539
+ "contextSessionId": {
540
+ "type": "string",
541
+ "description": "Host session identity; adapters supply this for shared MCP connections."
518
542
  }
519
543
  },
520
544
  "required": [
@@ -535,7 +559,13 @@
535
559
  "description": "Report local context store counts and location.",
536
560
  "inputSchema": {
537
561
  "type": "object",
538
- "properties": {},
562
+ "properties": {
563
+ "contextSessionId": {
564
+ "type": "string",
565
+ "description": "Host session identity; adapters supply this for shared MCP connections."
566
+ }
567
+ },
568
+ "additionalProperties": false,
539
569
  "$schema": "http://json-schema.org/draft-07/schema#"
540
570
  },
541
571
  "annotations": {
@@ -550,7 +580,13 @@
550
580
  "description": "Run local read-only Node.js, SQLite FTS5, storage, schema, and fetch-policy checks without network or repair actions.",
551
581
  "inputSchema": {
552
582
  "type": "object",
553
- "properties": {},
583
+ "properties": {
584
+ "contextSessionId": {
585
+ "type": "string",
586
+ "description": "Host session identity; adapters supply this for shared MCP connections."
587
+ }
588
+ },
589
+ "additionalProperties": false,
554
590
  "$schema": "http://json-schema.org/draft-07/schema#"
555
591
  },
556
592
  "annotations": {
@@ -583,6 +619,10 @@
583
619
  },
584
620
  "sourceId": {
585
621
  "type": "string"
622
+ },
623
+ "contextSessionId": {
624
+ "type": "string",
625
+ "description": "Host session identity; adapters supply this for shared MCP connections."
586
626
  }
587
627
  },
588
628
  "required": [
@@ -599,7 +639,7 @@
599
639
  }
600
640
  },
601
641
  {
602
- "name": "dotdotgod_project_load",
642
+ "name": "project_load",
603
643
  "description": "Load a bounded documentation map and optional semantic project query.",
604
644
  "inputSchema": {
605
645
  "type": "object",
@@ -620,6 +660,10 @@
620
660
  "type": "integer",
621
661
  "minimum": 1,
622
662
  "maximum": 5
663
+ },
664
+ "contextSessionId": {
665
+ "type": "string",
666
+ "description": "Host session identity; adapters supply this for shared MCP connections."
623
667
  }
624
668
  },
625
669
  "additionalProperties": false,
@@ -633,13 +677,17 @@
633
677
  }
634
678
  },
635
679
  {
636
- "name": "dotdotgod_embedding_status",
680
+ "name": "embedding_status",
637
681
  "description": "Inspect the optional persistent embedding runtime without installing or contacting a registry.",
638
682
  "inputSchema": {
639
683
  "type": "object",
640
684
  "properties": {
641
685
  "root": {
642
686
  "type": "string"
687
+ },
688
+ "contextSessionId": {
689
+ "type": "string",
690
+ "description": "Host session identity; adapters supply this for shared MCP connections."
643
691
  }
644
692
  },
645
693
  "additionalProperties": false,
@@ -653,7 +701,7 @@
653
701
  }
654
702
  },
655
703
  {
656
- "name": "dotdotgod_embedding_install",
704
+ "name": "embedding_install",
657
705
  "description": "After explicit user approval, install the fixed optional embedding runtime persistently. Uses network and dependency install scripts.",
658
706
  "inputSchema": {
659
707
  "type": "object",
@@ -664,6 +712,10 @@
664
712
  "confirm": {
665
713
  "type": "boolean",
666
714
  "const": true
715
+ },
716
+ "contextSessionId": {
717
+ "type": "string",
718
+ "description": "Host session identity; adapters supply this for shared MCP connections."
667
719
  }
668
720
  },
669
721
  "required": [
@@ -681,7 +733,7 @@
681
733
  }
682
734
  },
683
735
  {
684
- "name": "dotdotgod_project_impact",
736
+ "name": "project_impact",
685
737
  "description": "Run bounded graph impact for up to 20 changed paths.",
686
738
  "inputSchema": {
687
739
  "type": "object",
@@ -696,6 +748,10 @@
696
748
  },
697
749
  "minItems": 1,
698
750
  "maxItems": 20
751
+ },
752
+ "contextSessionId": {
753
+ "type": "string",
754
+ "description": "Host session identity; adapters supply this for shared MCP connections."
699
755
  }
700
756
  },
701
757
  "required": [
@@ -712,7 +768,33 @@
712
768
  }
713
769
  },
714
770
  {
715
- "name": "dotdotgod_project_initialize",
771
+ "name": "impact_status",
772
+ "description": "Read this host session's advisory pending impact paths. Does not run reviews or clear pending state.",
773
+ "inputSchema": {
774
+ "type": "object",
775
+ "properties": {
776
+ "limit": {
777
+ "type": "integer",
778
+ "minimum": 1,
779
+ "maximum": 50
780
+ },
781
+ "contextSessionId": {
782
+ "type": "string",
783
+ "description": "Host session identity; adapters supply this for shared MCP connections."
784
+ }
785
+ },
786
+ "additionalProperties": false,
787
+ "$schema": "http://json-schema.org/draft-07/schema#"
788
+ },
789
+ "annotations": {
790
+ "readOnlyHint": true
791
+ },
792
+ "execution": {
793
+ "taskSupport": "forbidden"
794
+ }
795
+ },
796
+ {
797
+ "name": "project_initialize",
716
798
  "description": "Initialize project memory; dry-run is default and writes require explicit confirmation.",
717
799
  "inputSchema": {
718
800
  "type": "object",
@@ -734,6 +816,10 @@
734
816
  },
735
817
  "dotdotSetting": {
736
818
  "type": "boolean"
819
+ },
820
+ "contextSessionId": {
821
+ "type": "string",
822
+ "description": "Host session identity; adapters supply this for shared MCP connections."
737
823
  }
738
824
  },
739
825
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotdotgod/hermes",
3
- "version": "0.6.5",
3
+ "version": "0.6.6",
4
4
  "description": "Hermes CLI and messaging-gateway adapter without Plan Mode.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -13,7 +13,7 @@
13
13
  "devDependencies": {
14
14
  "@modelcontextprotocol/sdk": "^1.25.2",
15
15
  "esbuild": "0.27.3",
16
- "@dotdotgod/context": "0.6.5"
16
+ "@dotdotgod/context": "0.6.6"
17
17
  },
18
18
  "files": [
19
19
  "plugin.yaml",
package/plugin.yaml CHANGED
@@ -1,8 +1,40 @@
1
1
  name: dotdotgod
2
- version: 0.6.5
2
+ version: 0.6.6
3
3
  description: Project memory, isolated context tools and impact checks for Hermes CLI and messaging gateway; no Plan Mode.
4
4
  author: dotdotgod
5
5
  license: Elastic-2.0
6
+ provides_tools:
7
+ - doctor
8
+ - context_heal
9
+ - index
10
+ - purge
11
+ - search
12
+ - session_resume
13
+ - stats
14
+ - embedding_install
15
+ - embedding_status
16
+ - execute
17
+ - execute_file
18
+ - fetch_and_index
19
+ - impact_status
20
+ - ingestion_job_cancel
21
+ - ingestion_job_start
22
+ - ingestion_job_status
23
+ - project_impact
24
+ - project_initialize
25
+ - project_load
26
+ - select_root
27
+ provides_hooks:
28
+ - pre_llm_call
29
+ - pre_tool_call
30
+ - on_session_finalize
31
+ - on_session_reset
32
+ - on_session_end
33
+ provides_skills:
34
+ - project-initializer
35
+ - project-load
36
+ - impact-review
37
+ - document-clarify
6
38
  config_schema:
7
39
  roots:
8
40
  type: dict
package/policy.py CHANGED
@@ -55,7 +55,7 @@ def gate(name, args, pending):
55
55
  return None
56
56
  opaque = name.endswith("execute_file") or (name == "process" and args.get("action") in {"write", "submit"})
57
57
  if opaque or any(GATE.search(text) for text in commands(name, args)):
58
- return "Run dotdotgod_project_impact for pending paths before verification/commit/push/publish: " + ", ".join(sorted(pending)[:8])
58
+ return "Run project_impact for pending paths before verification/commit/push/publish: " + ", ".join(sorted(pending)[:8])
59
59
  return None
60
60
 
61
61
 
package/runtime.py CHANGED
@@ -120,9 +120,9 @@ class Runtime:
120
120
 
121
121
  def call_with_session(self, name, args, session):
122
122
  with self.lock:
123
- if name == "dotdotgod_select_root":
123
+ if name == "select_root":
124
124
  return self.select(session, args.get("label"))
125
- if session.root is None and not session.parent_id and name == "dotdotgod_project_initialize":
125
+ if session.root is None and not session.parent_id and name == "project_initialize":
126
126
  target = args.get("root")
127
127
  if not isinstance(target, str) or not Path(target).is_absolute():
128
128
  raise ValueError("Initialization without selection requires an explicit absolute root directory")
@@ -134,7 +134,7 @@ class Runtime:
134
134
  return proxy.call(name, {**args, "root": str(root)})
135
135
  finally:
136
136
  proxy.close()
137
- if name == "dotdotgod_project_load" and args.get("root"):
137
+ if name == "project_load" and args.get("root"):
138
138
  base = session.root or self.launch_root
139
139
  target = contained(base, args["root"])
140
140
  if target != session.root:
@@ -143,9 +143,9 @@ class Runtime:
143
143
  session.root = Path(self.ctx.get_config("cli_root", "") or self.launch_root).resolve(strict=True)
144
144
  if not session.root.is_dir():
145
145
  raise ValueError("Project root must be a directory")
146
- if name == "dotdotgod_impact_status":
146
+ if name == "impact_status":
147
147
  return envelope({"ok": True, "pending": list(self.pending(session))})
148
- if name == "dotdotgod_project_load":
148
+ if name == "project_load":
149
149
  if contained(session.root, args.get("root") or ".") != session.root:
150
150
  self.select(session, str(contained(session.root, args["root"])))
151
151
  return self.load(session, args)
@@ -153,12 +153,12 @@ class Runtime:
153
153
  reason = self.check(session, name, args)
154
154
  if reason:
155
155
  raise PermissionError(reason)
156
- if name == "dotdotgod_project_impact":
156
+ if name == "project_impact":
157
157
  before = self.pending(session)
158
158
  paths = [os.path.relpath(contained(session.root, path), session.root) for path in args.get("paths", [])]
159
159
  args = {**args, "paths": paths}
160
160
  value = self.client(session).call(name, args)
161
- if name == "dotdotgod_project_impact" and not value.get("isError") and value.get("structuredContent", {}).get("ok") is True:
161
+ if name == "project_impact" and not value.get("isError") and value.get("structuredContent", {}).get("ok") is True:
162
162
  with self.lock:
163
163
  after = self.pending(session)
164
164
  key = "impact:" + digest(str(session.root))
@@ -183,7 +183,7 @@ class Runtime:
183
183
  return None
184
184
  if session.root is None:
185
185
  return None
186
- if tool_name == "dotdotgod_select_root":
186
+ if tool_name == "select_root":
187
187
  return None
188
188
  reason = self.check(session, tool_name, args)
189
189
  if reason:
@@ -214,7 +214,7 @@ class Runtime:
214
214
  session.root = Path(self.ctx.get_config("cli_root", "") or self.launch_root).resolve(strict=True)
215
215
  if session.root is None:
216
216
  labels = list(self.allowed(session))
217
- context = "dotdotgod is inactive; ordinary host tools remain available. Select a project using dotdotgod_select_root with a configured label or absolute directory path, or initialize an explicit absolute directory with existing write confirmation. Initialization does not select a project."
217
+ context = "dotdotgod is inactive; ordinary host tools remain available. Select a project using select_root with a configured label or absolute directory path, or initialize an explicit absolute directory with existing write confirmation. Initialization does not select a project."
218
218
  if labels:
219
219
  context += " Configured project labels: " + json.dumps(labels)
220
220
  return {"context": context}
@@ -222,7 +222,7 @@ class Runtime:
222
222
  parts = []
223
223
  text = user_message if isinstance(user_message, str) else " ".join(p.get("text", "") for p in user_message if isinstance(p, dict))
224
224
  if not session.loaded and not re.search(r"(?:^|\s)/?dd:no-load\b|(?:^|\s)/no-load\b", text):
225
- parts.append("Call dotdotgod_project_load once with an agent-selected focus, then continue the original request. Read AGENTS.md and maintained README indexes selectively.")
225
+ parts.append("Call project_load once with an agent-selected focus, then continue the original request. Read AGENTS.md and maintained README indexes selectively.")
226
226
  if text.strip():
227
227
  try:
228
228
  expanded = self.cli(session, ["expand", str(session.root), text, "--json", "--with-impact", "--fuzzy"])
@@ -233,7 +233,7 @@ class Runtime:
233
233
  parts.append("Reference expansion unavailable; use README routing and explicit targeted reads.")
234
234
  pending = self.pending(session)
235
235
  if pending:
236
- parts.append("Impact pending: " + ", ".join(list(pending)[:8]) + ". Run dotdotgod_project_impact before broad tests or release commands.")
236
+ parts.append("Impact pending: " + ", ".join(list(pending)[:8]) + ". Run project_impact before broad tests or release commands.")
237
237
  return {"context": "\n\n".join(parts)} if parts else None
238
238
  except Exception as error:
239
239
  return {"context": "dotdotgod context unavailable: " + str(error) + "; do not bypass root/impact checks."}
@@ -7,7 +7,7 @@ description: Document Clarify for dotdotgod project memory in Hermes CLI and mes
7
7
 
8
8
  # Document Clarify
9
9
 
10
- Use the operator-authorized selected repository. Prefer the native dotdotgod_project_initialize, dotdotgod_project_load and dotdotgod_project_impact tools for their respective workflows. Context tools use dotdotgod_ names; results contain content and structuredContent, not Pi codemode objects. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
10
+ Use the operator-authorized selected repository. Prefer project_initialize, project_load and project_impact from the dotdotgod toolset for their respective workflows. Context tools use the shared MCP catalog names without adapter aliases; inspect content, structuredContent and isError. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
11
11
 
12
12
  ## Memory-Area Context
13
13
 
@@ -7,7 +7,7 @@ description: Impact Review for dotdotgod project memory in Hermes CLI and messag
7
7
 
8
8
  # Impact Review
9
9
 
10
- Use the operator-authorized selected repository. Prefer the native dotdotgod_project_initialize, dotdotgod_project_load and dotdotgod_project_impact tools for their respective workflows. Context tools use dotdotgod_ names; results contain content and structuredContent, not Pi codemode objects. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
10
+ Use the operator-authorized selected repository. Prefer project_initialize, project_load and project_impact from the dotdotgod toolset for their respective workflows. Context tools use the shared MCP catalog names without adapter aliases; inspect content, structuredContent and isError. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
11
11
 
12
12
  ## Goal
13
13
 
@@ -7,7 +7,7 @@ description: Project Initializer for dotdotgod project memory in Hermes CLI and
7
7
 
8
8
  # Project Initializer
9
9
 
10
- Use the operator-authorized selected repository. Prefer the native dotdotgod_project_initialize, dotdotgod_project_load and dotdotgod_project_impact tools for their respective workflows. Context tools use dotdotgod_ names; results contain content and structuredContent, not Pi codemode objects. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
10
+ Use the operator-authorized selected repository. Prefer project_initialize, project_load and project_impact from the dotdotgod toolset for their respective workflows. Context tools use the shared MCP catalog names without adapter aliases; inspect content, structuredContent and isError. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
11
11
 
12
12
  ## Goal
13
13
 
@@ -7,6 +7,7 @@ Use `AGENTS.md` as the canonical shared instruction file.
7
7
  - `AGENTS.md`: preferred shared file name. OpenAI Codex recognizes this convention, and the community `agents.md` convention uses the plural form.
8
8
  - `CLAUDE.md`: Claude Code's project memory file. Keep it thin and import `AGENTS.md` with `@AGENTS.md`.
9
9
  - `CODEX.md`: project-local Codex pointer. Keep it thin and link to `AGENTS.md`.
10
+ - OpenCode reads `AGENTS.md` natively; do not create an `OPENCODE.md` copy.
10
11
  - `.github/copilot-instructions.md`: optional Copilot surface. If present, route to `AGENTS.md`, `docs/README.md`, and project commands instead of copying the full rules body.
11
12
  - `.cursor/rules/*.md`: optional Cursor path-scoped rules. If present, keep Cursor-specific scoping there and route durable project rules to shared docs.
12
13
  - `llms.txt`: optional documentation discovery surface. If present, point to README indexes and bounded docs entrypoints instead of embedding large docs bodies.
@@ -7,7 +7,7 @@ description: Project Load for dotdotgod project memory in Hermes CLI and messagi
7
7
 
8
8
  # Project Load
9
9
 
10
- Use the operator-authorized selected repository. Prefer the native dotdotgod_project_initialize, dotdotgod_project_load and dotdotgod_project_impact tools for their respective workflows. Context tools use dotdotgod_ names; results contain content and structuredContent, not Pi codemode objects. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
10
+ Use the operator-authorized selected repository. Prefer project_initialize, project_load and project_impact from the dotdotgod toolset for their respective workflows. Context tools use the shared MCP catalog names without adapter aliases; inspect content, structuredContent and isError. Do not bypass host permissions or pending impact gates. Hermes native delegate_task handles delegation; this adapter has no Plan Mode.
11
11
 
12
12
  ## CLI Context
13
13