@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
|
-
|
|
1
|
+
acd8a7b-msxveq6c
|
|
Binary file
|
|
@@ -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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
+
"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": {
|