euthyna 0.9.0 → 0.9.1
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.
|
@@ -99,7 +99,7 @@ node <euthyna 仓库>/bin/euthyna.js history --base <改前版本> --no-origins
|
|
|
99
99
|
### 输出长什么样(真实捕获)
|
|
100
100
|
|
|
101
101
|
```
|
|
102
|
-
euthyna
|
|
102
|
+
euthyna-history — 被删除代码的来源归属与安全分类
|
|
103
103
|
目标: D:/axe-core/axe-core
|
|
104
104
|
范围: 8390a5a9…..397f5fce…
|
|
105
105
|
|
|
@@ -243,7 +243,7 @@ node <euthyna 仓库>/bin/euthyna.js coverage `
|
|
|
243
243
|
### 输出长什么样(真实捕获,一次查询命中两种结果)
|
|
244
244
|
|
|
245
245
|
```
|
|
246
|
-
euthyna
|
|
246
|
+
euthyna-coverage — 符号调用计数(只能证伪)
|
|
247
247
|
|
|
248
248
|
已确证 (1)
|
|
249
249
|
• 符号 cleanup 在本次测试运行中一次都没有被调用(调用计数为 0)
|
|
@@ -89,7 +89,7 @@ When the fork point is uncertain, use the result of `git merge-base <target bran
|
|
|
89
89
|
### What the output looks like (real capture)
|
|
90
90
|
|
|
91
91
|
```
|
|
92
|
-
euthyna
|
|
92
|
+
euthyna-history — attribution and security classification of deleted code
|
|
93
93
|
Target: D:/axe-core/axe-core
|
|
94
94
|
Range: 8390a5a9…..397f5fce…
|
|
95
95
|
|
|
@@ -217,7 +217,7 @@ node <euthyna repo>/bin/euthyna.js coverage `
|
|
|
217
217
|
### What the output looks like (real capture; one query hitting both result kinds)
|
|
218
218
|
|
|
219
219
|
```
|
|
220
|
-
euthyna
|
|
220
|
+
euthyna-coverage — symbol invocation counts (can only falsify)
|
|
221
221
|
|
|
222
222
|
Established (1)
|
|
223
223
|
• Symbol cleanup was never invoked in this test run (invocation count 0) — any behavior depending on it was never exercised
|
package/__init__.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The CLI (``bin/euthyna.js``, installed by ``npm install -g euthyna``) produces
|
|
4
4
|
the deterministic facts; this plugin registers ``/euthyna`` so a user can invoke
|
|
5
|
-
the
|
|
5
|
+
the CLI's subcommands from inside a Hermes session without leaving chat. The
|
|
6
6
|
handler shells out to the real CLI and returns its output verbatim — it does not
|
|
7
7
|
reimplement any measurement, and it injects nothing into the conversation.
|
|
8
8
|
|
|
@@ -15,19 +15,27 @@ CLI prints comes back as the command result.
|
|
|
15
15
|
import shutil
|
|
16
16
|
import subprocess
|
|
17
17
|
|
|
18
|
-
#
|
|
19
|
-
#
|
|
18
|
+
# The subcommands /euthyna reaches. This is the single source the guard in
|
|
19
|
+
# test/hermes-plugin.test.js compares against the CLI's own dispatch, so a new
|
|
20
|
+
# command there is red here until it is wired — which is how `audit` (the
|
|
21
|
+
# entry point since 0.4.0) went seven releases unnoticed behind a hand-written
|
|
22
|
+
# list of four.
|
|
23
|
+
_FORWARDS = ("audit", "coverage", "deps", "gate", "help", "history")
|
|
24
|
+
|
|
20
25
|
_USAGE = """euthyna slash command — usage:
|
|
21
26
|
|
|
27
|
+
/euthyna audit <path> [<path>...] history + dependency surface in one run
|
|
22
28
|
/euthyna history <path> [<path> <rev>...] deleted-code provenance & security classification
|
|
23
29
|
/euthyna coverage <path> symbol invocation counts from a coverage run
|
|
24
30
|
/euthyna deps <path> dependency pinned versions from lockfiles
|
|
25
31
|
/euthyna gate <report> [--verify] validate an audit report against the six gates
|
|
32
|
+
/euthyna help the CLI's own usage, with every flag
|
|
26
33
|
|
|
27
34
|
Args after the subcommand are passed to the CLI unchanged. Requires the CLI:
|
|
28
35
|
npm install -g euthyna (Node >= 20)."""
|
|
29
36
|
|
|
30
37
|
|
|
38
|
+
|
|
31
39
|
def _find_cli():
|
|
32
40
|
"""Return the absolute path of the euthyna CLI, or None if not installed."""
|
|
33
41
|
for name in ("euthyna", "euthyna.cmd", "euthyna.exe"):
|
|
@@ -40,10 +48,13 @@ def _find_cli():
|
|
|
40
48
|
def _run(raw_args: str):
|
|
41
49
|
"""Handle /euthyna: forward <subcommand> <args...> to the CLI, return its output."""
|
|
42
50
|
argv = raw_args.split()
|
|
43
|
-
|
|
51
|
+
# `-h`/`--help` print this command's own quick usage; bare `help` is forwarded
|
|
52
|
+
# so the flag list has exactly one owner — the CLI's help, which the skill and
|
|
53
|
+
# the docs both quote.
|
|
54
|
+
if not argv or argv[0] in ("-h", "--help"):
|
|
44
55
|
return _USAGE
|
|
45
56
|
sub, rest = argv[0], argv[1:]
|
|
46
|
-
if sub not in
|
|
57
|
+
if sub not in _FORWARDS:
|
|
47
58
|
return f"unknown subcommand: {sub}\n\n{_USAGE}"
|
|
48
59
|
|
|
49
60
|
cli = _find_cli()
|
|
@@ -73,8 +84,8 @@ def register(ctx):
|
|
|
73
84
|
ctx.register_command(
|
|
74
85
|
"euthyna",
|
|
75
86
|
handler=_run,
|
|
76
|
-
description="euthyna security audit:
|
|
77
|
-
args_hint="<history|coverage|deps|gate> <args…>",
|
|
87
|
+
description="euthyna security audit: drive the fact-producing CLI (audit is the single entry point)",
|
|
88
|
+
args_hint="<audit|history|coverage|deps|gate|help> <args…>",
|
|
78
89
|
)
|
|
79
90
|
|
|
80
91
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "euthyna",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.9.1",
|
|
4
|
+
"description": "Audit framework for AI coding agents: produces the deterministic facts a model cannot compute — deleted-code provenance, symbol invocations, dependency pins — and adjudicates every claim against six gates, downgrading what cannot produce evidence to an observation. Not a scanner.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./plugin/index.js",
|
|
7
7
|
"bin": {
|
package/plugin.yaml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
name: euthyna
|
|
2
|
-
version: 0.9.
|
|
3
|
-
description: euthyna audit discipline — slash
|
|
2
|
+
version: 0.9.1
|
|
3
|
+
description: euthyna audit discipline — the /euthyna slash command driving the euthyna CLI, whose single entry point is `euthyna audit`
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
homepage: https://github.com/slow-stack/euthyna
|
|
6
6
|
tags:
|
package/src/contract.js
CHANGED
|
@@ -203,7 +203,10 @@ export function renderReport(report, { write: rawWrite = console.log, lang = DEF
|
|
|
203
203
|
const unknown = facts.filter(f => f.status === STATUS.UNKNOWN);
|
|
204
204
|
|
|
205
205
|
write('');
|
|
206
|
-
|
|
206
|
+
// The producer name is `euthyna-history`, `euthyna-audit`, …: it already names
|
|
207
|
+
// the tool, so the header prints it as the contract emits it — the same string
|
|
208
|
+
// the `--json` `producer` field carries.
|
|
209
|
+
write(`${producer.name} — ${producer.purpose || ''}`.trim());
|
|
207
210
|
write(`${t('目标: ', 'Target: ')}${subject.repo ?? subject.coverageFile ?? t('(未指定)', '(unspecified)')}`);
|
|
208
211
|
if (subject.base || subject.head) {
|
|
209
212
|
write(
|