@holmes-lab/holmes-kit 0.1.3 โ†’ 0.1.4

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/CHANGELOG.md CHANGED
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.4] - 2026-08-18
9
+
10
+ ### Documentation
11
+ - **Supported Languages & Environments Matrix**: Added comprehensive compatibility tables in `README.md` covering 7 AST/CPG supported languages (TypeScript/JS, Python, Go, Rust, Java, C/C++, C#) and tier-based OS environments (macOS, Linux, Windows/WSL2).
12
+
8
13
  ## [0.1.3] - 2026-08-18
9
14
 
10
15
  ### Added
package/README.md CHANGED
@@ -88,6 +88,33 @@ If you prefer to configure MCP manually or integrate with other IDEs, add the fo
88
88
 
89
89
  ---
90
90
 
91
+ ## ๐ŸŒ Supported Languages & Environments
92
+
93
+ Holmes-Kit embeds native AST & Code Property Graph (D-CPG) analyzers to track causal relationships and anchor implementations across diverse technology stacks.
94
+
95
+ ### ๐Ÿ’ป Supported Programming Languages
96
+ | Language | CPG Parser | Anchor Syntax | Dataflow Taint & RTM |
97
+ | :--- | :--- | :--- | :---: |
98
+ | **TypeScript / JavaScript** | Tree-sitter TypeScript/JS | `// @implements A-SPEC-XXX` | โœ… Full Support |
99
+ | **Python** | Tree-sitter Python | `# @implements A-SPEC-XXX` | โœ… Full Support |
100
+ | **Go** | Tree-sitter Go | `// @implements A-SPEC-XXX` | โœ… Full Support |
101
+ | **Rust** | Tree-sitter Rust | `// @implements A-SPEC-XXX` | โœ… Full Support |
102
+ | **Java** | Tree-sitter Java | `// @implements A-SPEC-XXX` | โœ… Full Support |
103
+ | **C / C++** | Tree-sitter C/C++ | `// @implements A-SPEC-XXX` | โœ… Full Support |
104
+ | **C# (.NET)** | Tree-sitter C# | `// @implements A-SPEC-XXX` | โœ… Full Support |
105
+
106
+ ### ๐Ÿ–ฅ๏ธ Supported Operating Systems & Runtimes
107
+ | OS / Platform | Architecture | Status | Notes |
108
+ | :--- | :--- | :---: | :--- |
109
+ | **macOS** | Apple Silicon (arm64) / Intel (x64) | โœ… Tier 1 | macOS 12+ (Full hook enforcement) |
110
+ | **Linux** | x86_64 / arm64 | โœ… Tier 1 | Ubuntu, Debian, Fedora, Arch, RHEL |
111
+ | **Windows (WSL2)** | x86_64 | โœ… Tier 1 | WSL2 Ubuntu/Debian recommended |
112
+ | **Windows Native** | x86_64 | โœ… Tier 2 | Windows 10/11 (Node.js 20+ with C++ build tools) |
113
+
114
+ > **Runtime Requirement**: Node.js `>= 20.0.0` (LTS recommended)
115
+
116
+ ---
117
+
91
118
  ## ๐Ÿ›๏ธ Key Capabilities
92
119
 
93
120
  - **Deterministic Hook Enforcement**: Gating is enforced via OS-level PreToolUse & Stop hooks, not easily bypassed prompts.
package/dist/.build-id CHANGED
@@ -1 +1 @@
1
- 09e6af7-msxtsdgq
1
+ acd8a7b-msxveq6c
@@ -51,6 +51,7 @@ const test_evidence_1 = require("../review/test-evidence");
51
51
  const pre_tool_use_1 = require("./pre-tool-use");
52
52
  const governance_history_1 = require("../guardrail/governance-history");
53
53
  const constitution_debt_1 = require("../governance/constitution-debt");
54
+ const root_1 = require("../project/root");
54
55
  /**
55
56
  * @implements A-SPEC-175
56
57
  * The turn-boundary answer to "this project is governed but its specs are gone".
@@ -339,7 +340,7 @@ if (require.main === module) {
339
340
  // stale record can never vouch for changed code. Absent/stale -> syntactic fallback.
340
341
  let executedByAspec;
341
342
  try {
342
- const head = (0, node_child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], { cwd: stopProjectRoot(), stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
343
+ const head = (0, node_child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], { cwd: stopProjectRoot(), stdio: ['ignore', 'pipe', 'ignore'], env: (0, root_1.cleanSubprocessEnv)() }).toString().trim();
343
344
  const ev = (0, test_evidence_1.readTestEvidence)(stopProjectRoot());
344
345
  if ((0, test_evidence_1.isFresh)(ev, head))
345
346
  executedByAspec = ev.executedByAspec;
@@ -53,6 +53,7 @@ const spec_types_1 = require("../spec/spec-types");
53
53
  const legacy_format_1 = require("../spec/legacy-format");
54
54
  const cpg_scanner_1 = require("../cpg/cpg-scanner");
55
55
  const scan_cache_1 = require("../cpg/scan-cache");
56
+ const root_1 = require("../project/root");
56
57
  // N7: every whole-tree scan goes through the file-key incremental cache under the PROJECT root's
57
58
  // .ax/cpg_cache โ€” unchanged files (content-hash hit) skip the tree-sitter parse entirely.
58
59
  // The cache lives under the RESOLVED project root, not the raw scan root: scanning a SUBDIRECTORY
@@ -65,7 +66,7 @@ const scan_cache_1 = require("../cpg/scan-cache");
65
66
  // left open on the scan path. When the store is bound, the cache is the bound project's; otherwise
66
67
  // only an anchored answer may be written to, and an unanchored one falls back to a temp cache.
67
68
  const cacheDirFor = (root) => {
68
- const r = (0, root_1.resolveProjectRoot)(root);
69
+ const r = (0, root_2.resolveProjectRoot)(root);
69
70
  if (r.marker !== 'given')
70
71
  return path.join(r.root, '.ax', 'cpg_cache');
71
72
  if (fs.existsSync(path.join(r.root, '.ax')))
@@ -126,7 +127,7 @@ function isHandlerRefusal(e) {
126
127
  return !!e && typeof e === 'object' && e.holmesRefusal === true;
127
128
  }
128
129
  // @implements A-SPEC-128
129
- const root_1 = require("../project/root");
130
+ const root_2 = require("../project/root");
130
131
  const change_source_1 = require("../project/change-source");
131
132
  const baseline_1 = require("../project/baseline");
132
133
  const ignore_1 = require("../project/ignore");
@@ -146,7 +147,7 @@ const anchor_1 = require("../reverse/anchor");
146
147
  // yields top-level-relative paths while scan(root, root) tags root-relative ones, so a disagreement
147
148
  // silently produces wrong impact sets. `GitChangeSource` now enforces exactly that, and only there.
148
149
  function projectRootOf(root) {
149
- return (0, root_1.resolveProjectRoot)(root).root;
150
+ return (0, root_2.resolveProjectRoot)(root).root;
150
151
  }
151
152
  // @implements A-SPEC-191 ยง10 โ€” WHERE a single-use approval is spent must not be a caller's choice.
152
153
  // r8 measured all three escapes at once: a second `root`, a `root` naming a subdirectory, and an
@@ -1190,7 +1191,7 @@ function makeRawHandlers(store) {
1190
1191
  const executedByAspec = (0, test_evidence_1.computeExecutedByAspec)(result.executedByFile ?? {}, anchors);
1191
1192
  let head = '';
1192
1193
  try {
1193
- head = (0, node_child_process_1.execFileSync)('git', ['-C', root, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).trim();
1194
+ head = (0, node_child_process_1.execFileSync)('git', ['-C', root, 'rev-parse', 'HEAD'], { encoding: 'utf8', env: (0, root_1.cleanSubprocessEnv)() }).trim();
1194
1195
  }
1195
1196
  catch { /* non-git */ }
1196
1197
  // Record ONLY an actually-executed, GREEN run (review C4/C7): a red suite must not stand as
@@ -1828,7 +1829,7 @@ function makeRawHandlers(store) {
1828
1829
  return { ...plan, ...applied, blockers };
1829
1830
  },
1830
1831
  async spec_slice_init(a) {
1831
- const root = a.root ? (0, root_1.resolveProjectRoot)(a.root).root : process.cwd();
1832
+ const root = a.root ? (0, root_2.resolveProjectRoot)(a.root).root : process.cwd();
1832
1833
  const specsDir = path.join(root, '.ax', 'specs');
1833
1834
  const existing = await store.list();
1834
1835
  let maxId = 200;
@@ -1990,7 +1991,7 @@ depends_on:
1990
1991
  return { ok: true, specsCreated: [reqId, hspecId, aspecId, tspecId] };
1991
1992
  },
1992
1993
  async spec_slice_approve(a) {
1993
- const root = a.root ? (0, root_1.resolveProjectRoot)(a.root).root : process.cwd();
1994
+ const root = a.root ? (0, root_2.resolveProjectRoot)(a.root).root : process.cwd();
1994
1995
  const rawStore = new spec_store_1.LocalMarkdownRepository(path.join(root, '.ax', 'specs'));
1995
1996
  const specs = await rawStore.list();
1996
1997
  const inSlice = specs.filter((s) => {
@@ -2030,7 +2031,7 @@ depends_on:
2030
2031
  return { ok: true, approvedSpecs };
2031
2032
  },
2032
2033
  async spec_remediate(a) {
2033
- const root = a.root ? (0, root_1.resolveProjectRoot)(a.root).root : process.cwd();
2034
+ const root = a.root ? (0, root_2.resolveProjectRoot)(a.root).root : process.cwd();
2034
2035
  const actionsTaken = [];
2035
2036
  if (a.targetFile && a.aspecId) {
2036
2037
  const fullPath = path.isAbsolute(a.targetFile) ? a.targetFile : path.join(root, a.targetFile);
@@ -36,15 +36,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.MARKER = void 0;
37
37
  exports.cleanSubprocessEnv = cleanSubprocessEnv;
38
38
  exports.resolveProjectRoot = resolveProjectRoot;
39
+ // @implements A-SPEC-205
39
40
  // @implements A-SPEC-128
40
41
  const fs = __importStar(require("node:fs"));
41
42
  const path = __importStar(require("node:path"));
42
43
  const node_child_process_1 = require("node:child_process");
43
44
  // @implements A-SPEC-194
44
45
  // @implements A-SPEC-196
46
+ // @implements A-SPEC-205
45
47
  function cleanSubprocessEnv(env = process.env) {
46
48
  const cleaned = { ...env };
47
- const SCRUB_KEYS = new Set(['HOLMES_APPROVAL', 'HOLMES_LEDGER_KEY']);
49
+ const SCRUB_KEYS = new Set(['HOLMES_APPROVAL', 'HOLMES_LEDGER_KEY', 'HOLMES_ROLE', 'HOLMES_ENV_CHANNEL']);
48
50
  for (const k of Object.keys(cleaned)) {
49
51
  if (SCRUB_KEYS.has(k.toUpperCase())) {
50
52
  delete cleaned[k];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holmes-lab/holmes-kit",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Holmes-Kit โ€” deterministic Agentic Software Engineering (ASE) harness with causal traceability (spec chain + D-CPG + RTM + phase guardrail)",
5
5
  "main": "dist/holmes/mcp/server.js",
6
6
  "bin": {