agentic-engineering-harness 0.6.29 → 0.8.0

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 (128) hide show
  1. package/dist/agents/permissions.js +4 -3
  2. package/dist/agents/permissions.js.map +1 -1
  3. package/dist/cli.js +34 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/context/compression/headroom.d.ts +6 -1
  6. package/dist/context/compression/headroom.js +60 -15
  7. package/dist/context/compression/headroom.js.map +1 -1
  8. package/dist/context/compression/types.d.ts +1 -0
  9. package/dist/context/gateway.d.ts +1 -0
  10. package/dist/context/gateway.js +58 -44
  11. package/dist/context/gateway.js.map +1 -1
  12. package/dist/context/repository/serena.d.ts +1 -1
  13. package/dist/context/repository/serena.js +2 -1
  14. package/dist/context/repository/serena.js.map +1 -1
  15. package/dist/context/transport.d.ts +33 -0
  16. package/dist/context/transport.js +63 -0
  17. package/dist/context/transport.js.map +1 -0
  18. package/dist/core/config.js +5 -5
  19. package/dist/core/config.js.map +1 -1
  20. package/dist/core/init.js +2 -1
  21. package/dist/core/init.js.map +1 -1
  22. package/dist/core/run.js +6 -2
  23. package/dist/core/run.js.map +1 -1
  24. package/dist/core/sdd.js +2 -2
  25. package/dist/core/sdd.js.map +1 -1
  26. package/dist/core/types.d.ts +53 -1
  27. package/dist/core/verify.js +2 -1
  28. package/dist/core/verify.js.map +1 -1
  29. package/dist/delivery/finalize.d.ts +1 -1
  30. package/dist/delivery/finalize.js +6 -1
  31. package/dist/delivery/finalize.js.map +1 -1
  32. package/dist/evals/fullStack.d.ts +10 -7
  33. package/dist/evals/fullStack.js +132 -36
  34. package/dist/evals/fullStack.js.map +1 -1
  35. package/dist/evidence/graph.d.ts +1 -0
  36. package/dist/evidence/graph.js +28 -11
  37. package/dist/evidence/graph.js.map +1 -1
  38. package/dist/issues/intake.d.ts +1 -1
  39. package/dist/maturity/inventory.d.ts +30 -0
  40. package/dist/maturity/inventory.js +53 -0
  41. package/dist/maturity/inventory.js.map +1 -0
  42. package/dist/memory/candidates.d.ts +29 -0
  43. package/dist/memory/candidates.js +31 -0
  44. package/dist/memory/candidates.js.map +1 -0
  45. package/dist/paseo/launchSpec.js +4 -4
  46. package/dist/paseo/launchSpec.js.map +1 -1
  47. package/dist/provenance/generate.d.ts +27 -1
  48. package/dist/provenance/generate.js +233 -75
  49. package/dist/provenance/generate.js.map +1 -1
  50. package/dist/providers/engram.d.ts +1 -0
  51. package/dist/providers/engram.js +40 -8
  52. package/dist/providers/engram.js.map +1 -1
  53. package/dist/providers/graphify.d.ts +20 -1
  54. package/dist/providers/graphify.js +106 -26
  55. package/dist/providers/graphify.js.map +1 -1
  56. package/dist/providers/serenaMcp.d.ts +7 -0
  57. package/dist/providers/serenaMcp.js +77 -0
  58. package/dist/providers/serenaMcp.js.map +1 -0
  59. package/dist/providers/validation/bddExecution.d.ts +15 -0
  60. package/dist/providers/validation/bddExecution.js +107 -0
  61. package/dist/providers/validation/bddExecution.js.map +1 -0
  62. package/dist/providers/validation/integrationEnvironment.d.ts +12 -0
  63. package/dist/providers/validation/integrationEnvironment.js +101 -0
  64. package/dist/providers/validation/integrationEnvironment.js.map +1 -0
  65. package/dist/providers/validation/pact.d.ts +15 -0
  66. package/dist/providers/validation/pact.js +79 -0
  67. package/dist/providers/validation/pact.js.map +1 -0
  68. package/dist/providers/validation/protocol.d.ts +7 -0
  69. package/dist/providers/validation/protocol.js +35 -0
  70. package/dist/providers/validation/protocol.js.map +1 -0
  71. package/dist/providers/validation/providerUtils.d.ts +18 -0
  72. package/dist/providers/validation/providerUtils.js +40 -0
  73. package/dist/providers/validation/providerUtils.js.map +1 -0
  74. package/dist/providers/validation/registry.d.ts +21 -0
  75. package/dist/providers/validation/registry.js +59 -0
  76. package/dist/providers/validation/registry.js.map +1 -0
  77. package/dist/providers/validation/reqnroll.d.ts +7 -0
  78. package/dist/providers/validation/reqnroll.js +50 -0
  79. package/dist/providers/validation/reqnroll.js.map +1 -0
  80. package/dist/providers/validation/testExecution.d.ts +15 -0
  81. package/dist/providers/validation/testExecution.js +122 -0
  82. package/dist/providers/validation/testExecution.js.map +1 -0
  83. package/dist/providers/validation/types.d.ts +158 -0
  84. package/dist/providers/validation/types.js +2 -0
  85. package/dist/providers/validation/types.js.map +1 -0
  86. package/dist/providers/versions.d.ts +10 -0
  87. package/dist/providers/versions.js +3 -0
  88. package/dist/providers/versions.js.map +1 -0
  89. package/dist/spec/openspec.js +12 -7
  90. package/dist/spec/openspec.js.map +1 -1
  91. package/dist/telemetry/events.js +36 -37
  92. package/dist/telemetry/events.js.map +1 -1
  93. package/dist/telemetry/otlp.d.ts +2 -1
  94. package/dist/telemetry/otlp.js +20 -41
  95. package/dist/telemetry/otlp.js.map +1 -1
  96. package/dist/telemetry/tracing.d.ts +19 -0
  97. package/dist/telemetry/tracing.js +141 -0
  98. package/dist/telemetry/tracing.js.map +1 -0
  99. package/dist/toolchain/config.js +3 -2
  100. package/dist/toolchain/config.js.map +1 -1
  101. package/dist/validators/external.js +6 -5
  102. package/dist/validators/external.js.map +1 -1
  103. package/dist/validators/gherkin.js +5 -56
  104. package/dist/validators/gherkin.js.map +1 -1
  105. package/dist/validators/registry.js +42 -3
  106. package/dist/validators/registry.js.map +1 -1
  107. package/dist/validators/toolEvidence.d.ts +2 -22
  108. package/dist/validators/toolEvidence.js +38 -5
  109. package/dist/validators/toolEvidence.js.map +1 -1
  110. package/dist/validators/types.d.ts +2 -1
  111. package/dist/workers/agentPrompt.js +5 -3
  112. package/dist/workers/agentPrompt.js.map +1 -1
  113. package/docs/ARCHITECTURE.md +60 -2
  114. package/docs/COMPONENT_MATURITY.md +19 -15
  115. package/docs/OSS_STACK.md +5 -4
  116. package/docs/V0.2.md +4 -1
  117. package/docs/VALIDATION.md +54 -3
  118. package/docs/VALIDATION_COMPATIBILITY.md +19 -0
  119. package/docs/component-maturity.json +34 -0
  120. package/maturity/components.yaml +59 -0
  121. package/package.json +8 -1
  122. package/schemas/project.schema.json +3 -3
  123. package/schemas/validation-report.schema.json +2 -1
  124. package/schemas/validation-result.schema.json +84 -0
  125. package/scripts/headroom-bridge.py +88 -0
  126. package/templates/project.yaml +1 -0
  127. package/templates/provider-versions.json +10 -0
  128. package/templates/toolchain.yaml +12 -4
@@ -47,7 +47,7 @@
47
47
  } },
48
48
  "delivery": { "type": "object", "properties": { "stateDir": { "type": "string" }, "github": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "tokenEnv": { "type": "string", "minLength": 1 }, "repository": { "type": "string", "pattern": "^[^/]+/[^/]+$" }, "apiBaseUrl": { "type": "string", "format": "uri" }, "assignTokenOwner": { "type": "boolean" }, "labels": { "type": "array", "items": { "type": "string" } }, "branchPattern": { "type": "string", "minLength": 1 }, "finalizeOnAcceptance": { "type": "boolean" }, "pullRequestDraft": { "type": "boolean" } } }, "paseo": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "createWorkspace": { "type": "boolean" }, "autoUseWorkspace": { "type": "boolean" }, "worktreeSlugPattern": { "type": "string", "minLength": 1 } } } } },
49
49
  "memory": { "type": "object" },
50
- "codeIntelligence": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "graphPath": { "type": "string" }, "snapshotDir": { "type": "string" }, "refreshCommand": { "type": "string" }, "scheduling": { "type": "object", "properties": { "useEdges": { "type": "boolean" }, "maxGraphHops": { "type": "integer", "minimum": 1 }, "maxSharedNodes": { "type": "integer", "minimum": 0 }, "centralityConflictThreshold": { "type": "number", "minimum": 0 } } } } },
50
+ "codeIntelligence": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "graphPath": { "type": "string" }, "snapshotDir": { "type": "string" }, "codeOnly": { "type": "boolean" }, "refreshCommand": { "type": "string" }, "scheduling": { "type": "object", "properties": { "useEdges": { "type": "boolean" }, "maxGraphHops": { "type": "integer", "minimum": 1 }, "maxSharedNodes": { "type": "integer", "minimum": 0 }, "centralityConflictThreshold": { "type": "number", "minimum": 0 } } } } },
51
51
  "context": { "type": "object", "properties": {
52
52
  "mode": { "enum": ["observe", "enforce"] },
53
53
  "budgets": { "type": "object", "properties": {
@@ -65,11 +65,11 @@
65
65
  "organization": { "type": "object", "properties": { "policyBundles": { "type": "object", "properties": { "cacheDir": { "type": "string" }, "required": { "type": "boolean" }, "sources": { "type": "array", "items": { "$ref": "#/$defs/policyBundleSource" } } } } } },
66
66
  "distributed": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "provider": { "type": "string" }, "queueDir": { "type": "string" }, "endpoint": { "type": "string", "format": "uri" }, "tokenEnv": { "type": "string" }, "pollIntervalMs": { "type": "integer", "minimum": 1 }, "leaseSeconds": { "type": "integer", "minimum": 1 }, "workerId": { "type": "string" } } },
67
67
  "sdd": { "type": "object", "properties": { "specsDir": { "type": "string" }, "contractsDir": { "type": "string" }, "reportsDir": { "type": "string" }, "repairsDir": { "type": "string" }, "runsDir": { "type": "string" }, "authoring": { "type": "object", "properties": { "provider": { "type": "string", "minLength": 1 }, "schema": { "type": "string", "minLength": 1 }, "managerAgent": { "type": "string", "minLength": 1 } } } } },
68
- "validation": { "type": "object" },
68
+ "validation": { "type": "object", "properties": { "baseRef": { "type": "string" }, "commands": { "type": "array" }, "validators": { "type": "array" }, "providers": { "type": "array", "items": { "type": "object", "required": ["id", "capability", "provider"], "properties": { "id": { "type": "string", "minLength": 1 }, "capability": { "type": "string", "minLength": 1 }, "provider": { "type": "string", "minLength": 1 }, "command": { "type": "string" }, "required": { "type": "boolean" }, "timeoutSeconds": { "type": "integer", "minimum": 1 }, "workingDirectory": { "type": "string" }, "options": { "type": "object" } } } }, "frozenPaths": { "type": "array" }, "requireSeal": { "type": "boolean" } } },
69
69
  "security": { "type": "object", "properties": { "sandbox": { "type": "object", "properties": { "provider": { "type": "string" }, "required": { "type": "boolean" }, "image": { "type": "string" }, "imageDigest": { "type": "string" }, "network": { "type": "boolean" }, "extraArgs": { "type": "array", "items": { "type": "string" } }, "readOnlyRoot": { "type": "boolean" }, "ephemeralHome": { "type": "boolean" }, "noNewPrivileges": { "type": "boolean" }, "capDropAll": { "type": "boolean" }, "pidsLimit": { "type": "integer", "minimum": 1 }, "memory": { "type": "string" }, "cpus": { "type": "number", "exclusiveMinimum": 0 }, "tmpfs": { "type": "array", "items": { "type": "string" } }, "forceForRisks": { "type": "array", "items": { "enum": ["low", "medium", "high"] } }, "environmentAllowlist": { "type": "array", "items": { "type": "string" } }, "credentialEnvAllowlist": { "type": "array", "items": { "type": "string" } } } }, "tools": { "type": "array", "items": { "type": "string" } } } },
70
70
  "telemetry": { "type": "object" },
71
71
  "evals": { "type": "object", "properties": { "corpusDir": { "type": "string" }, "resultsDir": { "type": "string" }, "workspacesDir": { "type": "string" }, "defaultRuns": { "type": "integer", "minimum": 1 }, "confidenceLevel": { "type": "number", "exclusiveMinimum": 0, "exclusiveMaximum": 1 } } },
72
- "provenance": { "type": "object" }
72
+ "provenance": { "type": "object", "properties": { "outputDir": { "type": "string" }, "buildType": { "type": "string" }, "cosignKey": { "type": "string" }, "required": { "type": "boolean" }, "sbom": { "type": "object", "properties": { "required": { "type": "boolean" }, "command": { "type": "string" } } }, "signing": { "type": "object", "properties": { "required": { "type": "boolean" }, "key": { "type": "string" } } }, "verification": { "type": "object", "properties": { "required": { "type": "boolean" }, "publicKey": { "type": "string" } } } } }
73
73
  },
74
74
  "$defs": {
75
75
  "severityNumbers": { "type": "object", "properties": { "critical": { "type": "integer", "minimum": 0 }, "high": { "type": "integer", "minimum": 0 }, "medium": { "type": "integer", "minimum": 0 }, "low": { "type": "integer", "minimum": 0 }, "note": { "type": "integer", "minimum": 0 } } },
@@ -9,7 +9,8 @@
9
9
  "taskId": { "type": "string" },
10
10
  "status": { "enum": ["PASS", "FAIL"] },
11
11
  "checks": { "type": "array" },
12
- "changedFiles": { "type": "array", "items": { "type": "string" } }
12
+ "changedFiles": { "type": "array", "items": { "type": "string" } },
13
+ "findings": { "type": "array", "items": { "type": "object", "required": ["fingerprint", "tool", "kind"], "properties": { "fingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "tool": { "type": "string" }, "kind": { "type": "string" }, "rule": { "type": "string" }, "severity": { "type": "string" }, "file": { "type": "string" }, "line": { "type": "integer", "minimum": 1 }, "message": { "type": "string" }, "artifact": { "type": "string" } }, "additionalProperties": true } }
13
14
  },
14
15
  "additionalProperties": true
15
16
  }
@@ -0,0 +1,84 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/JamesMorales04/agentic-engineering-harness/schemas/validation-result.schema.json",
4
+ "title": "AEH normalized validation result",
5
+ "oneOf": [
6
+ {
7
+ "title": "TestExecutionResult",
8
+ "type": "object",
9
+ "required": ["version", "provider", "capability", "command", "status", "summary", "failures", "requirements", "rawArtifact"],
10
+ "properties": {
11
+ "version": { "const": 1 },
12
+ "provider": { "type": "string" },
13
+ "capability": { "enum": ["unit-test", "integration-test", "bdd", "contract-test"] },
14
+ "command": { "type": "string" },
15
+ "runtime": { "type": "string" },
16
+ "status": { "enum": ["PASS", "FAIL", "SKIP"] },
17
+ "summary": { "$ref": "#/$defs/testSummary" },
18
+ "failures": { "type": "array", "items": { "$ref": "#/$defs/failure" } },
19
+ "requirements": { "type": "array", "items": { "type": "string" } },
20
+ "rawArtifact": { "type": "string" }
21
+ }
22
+ },
23
+ {
24
+ "title": "BddExecutionResult",
25
+ "type": "object",
26
+ "required": ["version", "provider", "capability", "command", "status", "scenarios", "summary", "rawArtifact"],
27
+ "properties": {
28
+ "version": { "const": 1 },
29
+ "provider": { "type": "string" },
30
+ "capability": { "const": "bdd" },
31
+ "command": { "type": "string" },
32
+ "runtime": { "type": "string" },
33
+ "status": { "enum": ["PASS", "FAIL", "SKIP"] },
34
+ "scenarios": { "type": "array" },
35
+ "summary": { "$ref": "#/$defs/testSummary" },
36
+ "rawArtifact": { "type": "string" }
37
+ }
38
+ },
39
+ {
40
+ "title": "IntegrationEnvironmentResult",
41
+ "type": "object",
42
+ "required": ["version", "provider", "capability", "status", "requirements", "lifecycle", "rawArtifact"],
43
+ "properties": {
44
+ "version": { "const": 1 },
45
+ "provider": { "type": "string" },
46
+ "capability": { "const": "integration-test" },
47
+ "status": { "enum": ["PASS", "FAIL", "SKIP"] },
48
+ "requirements": { "type": "array" },
49
+ "lifecycle": { "type": "object", "required": ["provisioned", "ready", "tested", "cleaned", "durationMs"] },
50
+ "rawArtifact": { "type": "string" }
51
+ }
52
+ },
53
+ {
54
+ "title": "ContractVerificationResult",
55
+ "type": "object",
56
+ "required": ["version", "provider", "capability", "status", "verifierCommand", "summary", "failures", "requirements", "rawArtifact"],
57
+ "properties": {
58
+ "version": { "const": 1 },
59
+ "provider": { "type": "string" },
60
+ "capability": { "const": "contract-test" },
61
+ "status": { "enum": ["PASS", "FAIL", "SKIP"] },
62
+ "verifierCommand": { "type": "string" },
63
+ "pactFile": { "type": "string" },
64
+ "providerUrl": { "type": "string" },
65
+ "summary": { "type": "object", "required": ["total", "passed", "failed", "durationMs"] },
66
+ "failures": { "type": "array", "items": { "$ref": "#/$defs/failure" } },
67
+ "requirements": { "type": "array", "items": { "type": "string" } },
68
+ "rawArtifact": { "type": "string" }
69
+ }
70
+ }
71
+ ],
72
+ "$defs": {
73
+ "testSummary": {
74
+ "type": "object",
75
+ "required": ["total", "passed", "failed", "skipped", "durationMs"],
76
+ "properties": { "total": { "type": "integer", "minimum": 0 }, "passed": { "type": "integer", "minimum": 0 }, "failed": { "type": "integer", "minimum": 0 }, "skipped": { "type": "integer", "minimum": 0 }, "durationMs": { "type": "number", "minimum": 0 } }
77
+ },
78
+ "failure": {
79
+ "type": "object",
80
+ "required": ["message"],
81
+ "properties": { "id": { "type": "string" }, "message": { "type": "string" }, "source": { "type": "object" } }
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env python3
2
+ """Small, line-oriented JSON bridge for the pinned Headroom SDK.
3
+
4
+ The bridge deliberately uses Headroom's public ``headroom.compression`` API,
5
+ never its agent wrappers or memory store. stdout is reserved for one JSON
6
+ response; diagnostics belong on stderr so the Node adapter can reject framing
7
+ corruption deterministically.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ import sys
15
+ from typing import Any
16
+
17
+
18
+ def fail(message: str, code: str = "HEADROOM_BRIDGE_ERROR") -> None:
19
+ print(json.dumps({"version": 1, "error": {"code": code, "message": message}}), flush=True)
20
+
21
+
22
+ def main() -> int:
23
+ try:
24
+ raw = sys.stdin.read()
25
+ request = json.loads(raw)
26
+ if not isinstance(request, dict) or request.get("version") != 1:
27
+ fail("request version must be 1", "INVALID_REQUEST")
28
+ return 2
29
+ operation = request.get("operation", "compress")
30
+ from headroom import __version__
31
+
32
+ if operation == "doctor":
33
+ print(json.dumps({"version": 1, "providerVersion": __version__}), flush=True)
34
+ return 0
35
+ if operation != "compress":
36
+ fail(f"unsupported operation: {operation}", "INVALID_REQUEST")
37
+ return 2
38
+
39
+ content = request.get("content")
40
+ source_sha256 = request.get("sourceSha256")
41
+ max_tokens = request.get("maxTokens")
42
+ if not isinstance(content, str) or not content:
43
+ fail("content must be a non-empty string", "INVALID_REQUEST")
44
+ return 2
45
+ if not isinstance(source_sha256, str) or hashlib.sha256(content.encode()).hexdigest() != source_sha256:
46
+ fail("sourceSha256 does not match content", "SOURCE_HASH_MISMATCH")
47
+ return 2
48
+ if not isinstance(max_tokens, int) or max_tokens < 1:
49
+ fail("maxTokens must be a positive integer", "INVALID_REQUEST")
50
+ return 2
51
+
52
+ # UniversalCompressor is the documented local SDK entry point. Keep
53
+ # Kompress enabled: AEH provisions headroom-ai[all] and this contract
54
+ # must exercise the intended compression stack, not the fallback-only
55
+ # path. CCR remains disabled because AEH persists and authorizes the
56
+ # original fragment itself.
57
+ from headroom.compression import UniversalCompressor, UniversalCompressorConfig
58
+
59
+ original_tokens = max(1, len(content) // 4)
60
+ target_ratio = min(1.0, max_tokens / original_tokens)
61
+ compressor = UniversalCompressor(
62
+ UniversalCompressorConfig(
63
+ use_magika=True,
64
+ use_kompress=True,
65
+ ccr_enabled=False,
66
+ compression_ratio_target=target_ratio,
67
+ )
68
+ )
69
+ result = compressor.compress(content)
70
+ response: dict[str, Any] = {
71
+ "version": 1,
72
+ "content": result.compressed,
73
+ "originalTokens": result.tokens_before,
74
+ "compressedTokens": result.tokens_after,
75
+ "reversible": False,
76
+ "providerVersion": __version__,
77
+ "sourceSha256": source_sha256,
78
+ }
79
+ print(json.dumps(response, separators=(",", ":")), flush=True)
80
+ return 0
81
+ except Exception as error: # pragma: no cover - exercised by contract tests
82
+ print(f"headroom bridge failure: {error}", file=sys.stderr, flush=True)
83
+ fail(str(error), "SDK_RUNTIME_FAILURE")
84
+ return 1
85
+
86
+
87
+ if __name__ == "__main__":
88
+ raise SystemExit(main())
@@ -272,6 +272,7 @@ validation:
272
272
  - tests/acceptance/frozen/**
273
273
  commands: []
274
274
  validators: []
275
+ providers: []
275
276
  opa:
276
277
  enabled: false
277
278
  policyDirs:
@@ -0,0 +1,10 @@
1
+ {
2
+ "headroom": "0.28.0",
3
+ "graphify": "0.9.43",
4
+ "engram": "0.4.1",
5
+ "serena": "1.6.1",
6
+ "trivy": "0.70.0",
7
+ "opengrep": "1.22.0",
8
+ "playwright": "1.62.1",
9
+ "pnpm": "10.15.0"
10
+ }
@@ -106,7 +106,7 @@ tools:
106
106
  kind: mise
107
107
  command: graphify
108
108
  source: "pipx:graphifyy"
109
- version: latest
109
+ version: "0.9.43"
110
110
  dependsOn: [uv]
111
111
  activateWhen: [code-intelligence:graphify]
112
112
 
@@ -132,7 +132,8 @@ tools:
132
132
  kind: mise
133
133
  command: engram
134
134
  source: "npm:@engram-ai-memory/cli"
135
- version: latest
135
+ version: "0.4.1"
136
+ dependsOn: [pnpm]
136
137
  activateWhen: [memory:engram]
137
138
 
138
139
  opa:
@@ -148,14 +149,14 @@ tools:
148
149
  kind: mise
149
150
  command: opengrep
150
151
  source: "aqua:opengrep/opengrep"
151
- version: latest
152
+ version: "1.22.0"
152
153
  activateWhen: [security-tool:opengrep, validator:opengrep]
153
154
 
154
155
  trivy:
155
156
  kind: mise
156
157
  command: trivy
157
158
  source: "aqua:aquasecurity/trivy"
158
- version: latest
159
+ version: "0.70.0"
159
160
  activateWhen: [security-tool:trivy, validator:trivy]
160
161
  container:
161
162
  image: ghcr.io/aquasecurity/trivy:latest
@@ -172,6 +173,13 @@ tools:
172
173
  command: podman
173
174
  activateWhen: [orchestration:podman, sandbox:podman]
174
175
 
176
+ pnpm:
177
+ kind: mise
178
+ command: pnpm
179
+ source: "npm:pnpm"
180
+ version: "10.15.0"
181
+ activateWhen: [memory:engram, project:pnpm]
182
+
175
183
  projectDependencies:
176
184
  autoDetect: true
177
185
  commands: []