trustdex 0.5.1 → 0.7.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 (49) hide show
  1. package/README.ko.md +65 -7
  2. package/README.md +71 -7
  3. package/bin/trustdex.mjs +98 -1
  4. package/docs/ARCHITECTURE.ko.md +9 -2
  5. package/docs/ARCHITECTURE.md +11 -2
  6. package/docs/CLAUDE.ko.md +54 -1
  7. package/docs/CLAUDE.md +69 -1
  8. package/docs/CODEX.ko.md +50 -4
  9. package/docs/CODEX.md +62 -4
  10. package/docs/DEFENSIVE_USE_CASE.ko.md +85 -0
  11. package/docs/DEFENSIVE_USE_CASE.md +89 -0
  12. package/docs/EVALUATION.ko.md +46 -1
  13. package/docs/EVALUATION.md +48 -1
  14. package/docs/ROADMAP.ko.md +17 -2
  15. package/docs/ROADMAP.md +17 -2
  16. package/docs/SECURITY_RESEARCH.ko.md +7 -0
  17. package/docs/SECURITY_RESEARCH.md +7 -0
  18. package/docs/THREAT_MODEL.ko.md +8 -1
  19. package/docs/THREAT_MODEL.md +8 -1
  20. package/examples/adversarial/README.ko.md +31 -0
  21. package/examples/adversarial/README.md +31 -0
  22. package/examples/adversarial/drift-after.json +11 -0
  23. package/examples/adversarial/drift-before.json +8 -0
  24. package/examples/adversarial/expected.json +30 -0
  25. package/examples/adversarial/mcp-config.json +32 -0
  26. package/examples/adversarial/permissions/README.ko.md +15 -0
  27. package/examples/adversarial/permissions/README.md +15 -0
  28. package/examples/adversarial/permissions/claude-expanded.settings.json +30 -0
  29. package/examples/adversarial/permissions/claude-restrictive.settings.json +16 -0
  30. package/examples/adversarial/permissions/codex-expanded.toml +13 -0
  31. package/examples/adversarial/permissions/codex-restrictive.toml +13 -0
  32. package/examples/adversarial/permissions/expected.json +18 -0
  33. package/examples/adversarial/policy.json +10 -0
  34. package/examples/claude.mcp.json +24 -0
  35. package/examples/claude.policy.json +6 -0
  36. package/examples/claude.settings.json +26 -0
  37. package/examples/codex.config.toml +16 -0
  38. package/examples/codex.permissions.toml +13 -0
  39. package/examples/mcp.json +22 -0
  40. package/examples/trust-store.example.json +16 -0
  41. package/examples/trustdex.policy.json +14 -0
  42. package/package.json +5 -3
  43. package/schemas/permission-posture-diff-v1.schema.json +78 -0
  44. package/schemas/permission-posture-v1.schema.json +162 -0
  45. package/src/claude-settings.mjs +173 -0
  46. package/src/codex-config.mjs +9 -7
  47. package/src/codex-settings.mjs +247 -0
  48. package/src/policy-packs.mjs +38 -2
  49. package/src/posture.mjs +540 -0
@@ -17,6 +17,9 @@ TrustDex는 AI 에이전트가 서드파티 도구에 접근하기 전에 내리
17
17
  - 소스, 출처, 결정, 지문 및 기능 드리프트
18
18
  - 서명된 검토 기록과 신뢰 관련 변경 후 재검토
19
19
  - 지원하지 않는 구문에서 안전하게 실패해야 하는 파서 동작
20
+ - Claude Code 권한 설정의 자동 행동 권한
21
+ - Codex 샌드박스, 승인, 네트워크, 쓰기 가능 루트, 웹 검색 및 서브에이전트 설정
22
+ - 구조적 권한 상태 드리프트 및 에이전트 자율성 확대 시 재검토
20
23
 
21
24
  의도한 결과물은 재현 가능한 픽스처, 회귀 테스트, 문서화된 제한 사항 및 에이전트 개발자와 운영자를 위한 실용적인 완화책입니다.
22
25
 
@@ -57,7 +60,11 @@ TrustDex 연구는 관련 없는 공개 시스템을 테스트할 권한을 부
57
60
  ## 현재 재현 가능한 증거
58
61
 
59
62
  - [적대적 MCP 픽스처](../examples/adversarial/README.ko.md)
63
+ - [Claude Code 권한 픽스처](../examples/claude.settings.json)
64
+ - [Codex 권한 픽스처](../examples/codex.permissions.toml)
65
+ - [적대적 Claude 및 Codex 권한 상태 픽스처](../examples/adversarial/permissions/README.ko.md)
60
66
  - [평가 기록](EVALUATION.ko.md)
67
+ - [방어적 AI 에이전트 보안 사용 사례](DEFENSIVE_USE_CASE.ko.md)
61
68
  - [위협 모델](THREAT_MODEL.ko.md)
62
69
  - [보안 정책](../SECURITY.ko.md)
63
70
 
@@ -17,6 +17,9 @@ The research asks whether observable configuration, provenance, integrity, and c
17
17
  - source, provenance, decision, fingerprint, and capability drift
18
18
  - signed review records and re-review after trust-relevant change
19
19
  - parser behavior that must fail closed on unsupported syntax
20
+ - automatic action grants in Claude Code permission settings
21
+ - Codex sandbox, approval, network, writable-root, web-search, and subagent settings
22
+ - structural permission posture drift and review when agent autonomy expands
20
23
 
21
24
  The intended outputs are reproducible fixtures, regression tests, documented limitations, and practical mitigations for agent developers and operators.
22
25
 
@@ -57,7 +60,11 @@ Public reports must remove credentials, private endpoints, proprietary prompts,
57
60
  ## Current reproducible evidence
58
61
 
59
62
  - [Adversarial MCP fixtures](../examples/adversarial/README.md)
63
+ - [Claude Code permission fixture](../examples/claude.settings.json)
64
+ - [Codex permission fixture](../examples/codex.permissions.toml)
65
+ - [Adversarial Claude and Codex permission posture fixtures](../examples/adversarial/permissions/README.md)
60
66
  - [Evaluation record](EVALUATION.md)
67
+ - [Defensive AI-agent security use case](DEFENSIVE_USE_CASE.md)
61
68
  - [Threat model](THREAT_MODEL.md)
62
69
  - [Security policy](../SECURITY.md)
63
70
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  TrustDex는 하나의 좁은 질문을 다룹니다.
8
8
 
9
- > **사용자의 정책에 따라 에이전트가 이 확장을 보고 호출하도록 허용해야 하는가?**
9
+ > **사용자의 정책에 따라 에이전트가 이 확장을 보거나 이 자동 행동 권한을 받도록 허용해야 하는가?**
10
10
 
11
11
  ## 범위 내
12
12
 
@@ -19,6 +19,10 @@ TrustDex는 하나의 좁은 질문을 다룹니다.
19
19
  - 검토된 레지스트리 무결성 메타데이터와 일치하지 않는 패키지 바이트로의 대체
20
20
  - 설정된 패키지 버전이 무결성 검증된 아티팩트 버전에서 벗어남
21
21
  - 서명된 신뢰 기록이 있을 때 검토된 스냅샷의 변조
22
+ - 광범위한 셸, 파일 시스템, 네트워크, MCP 또는 서브에이전트 작업을 조용히 자동 승인하는 Claude Code 권한 규칙
23
+ - 샌드박스를 제거하거나 승인을 생략하거나 네트워크 접근 또는 쓰기 가능 루트를 추가하는 Codex 설정
24
+ - 명시적인 검토 없이 변경되는 행동 권한 설정
25
+ - 값이 제거된 구조적 기준 상태보다 확대되는 Claude 또는 Codex 권한 상태
22
26
 
23
27
  ## 신뢰 경계
24
28
 
@@ -41,6 +45,9 @@ TrustDex는 익숙한 프로젝트 이름, 스타 수, 패키지 이름 또는
41
45
  - 로컬 신뢰 저장소 주장만으로 게시자 소유권을 독립적으로 증명
42
46
  - 완전히 침해된 호스트 보호
43
47
  - 도난당한 서명 비공개 키로부터 보호
48
+ - 모든 사용자, 프로젝트, 프로필, 관리형, 시스템, 환경 및 명령줄 소스를 병합한 실제 설정 계산
49
+ - Claude Code 또는 Codex 행동 권한의 런타임 강제 적용
50
+ - 서명되지 않은 권한 상태 스냅샷 작성자의 인증
44
51
 
45
52
  ## 중요한 실패 모드
46
53
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  TrustDex addresses one narrow question:
8
8
 
9
- > **Should an agent be allowed to see and invoke this extension under the user's policy?**
9
+ > **Should an agent see this extension or receive this automatic action capability under the user's policy?**
10
10
 
11
11
  ## In scope
12
12
 
@@ -19,6 +19,10 @@ TrustDex addresses one narrow question:
19
19
  - substitution of package bytes that do not match reviewed registry integrity metadata
20
20
  - configured package versions drifting from an integrity-verified artifact version
21
21
  - tampering with a reviewed snapshot when a signed trust record is available
22
+ - Claude Code permission rules that silently auto-approve broad shell, filesystem, network, MCP, or subagent actions
23
+ - Codex configurations that remove the sandbox, suppress approvals, enable network access, or add writable roots
24
+ - action-permission settings changing without an explicit review
25
+ - Claude or Codex permission posture expanding relative to a value-free structural baseline
22
26
 
23
27
  ## Trust boundaries
24
28
 
@@ -41,6 +45,9 @@ TrustDex does **not** treat a familiar project name, star count, package name, o
41
45
  - independently proving publisher ownership from a local trust-store claim
42
46
  - protecting a fully compromised host
43
47
  - protecting a stolen signing private key
48
+ - calculating the effective configuration after every user, project, profile, managed, system, environment, and command-line source is merged
49
+ - enforcing Claude Code or Codex action permissions at runtime
50
+ - authenticating the author of an unsigned permission posture snapshot
44
51
 
45
52
  ## Important failure mode
46
53
 
@@ -0,0 +1,31 @@
1
+ # 비활성 적대적 픽스처
2
+
3
+ <p align="right">
4
+ <a href="./README.md">English</a> | <strong>한국어</strong>
5
+ </p>
6
+
7
+ 이 파일들은 TrustDex 정책 경계의 재현 가능한 방어적 테스트를 제공합니다.
8
+
9
+ - `mcp-config.json`에는 정적인 MCP 설정 사례 7개가 포함되어 있습니다.
10
+ - `policy.json`은 소스 허용 목록과 독립적으로 차단 신호를 테스트할 수 있도록 픽스처 패키지 1개와 픽스처 호스트 2개를 명시적으로 신뢰합니다.
11
+ - `expected.json`은 필수 결정과 최소 신호를 기록합니다.
12
+ - `drift-before.json`과 `drift-after.json`은 검토된 패키지에 비밀 정보를 포함하는 환경 키가 추가되는 상황을 모델링합니다.
13
+
14
+ 모든 패키지 이름은 가상이며, 모든 원격 엔드포인트는 예약된 `.invalid` 최상위 도메인을 사용하고, 자격 증명으로 보이는 모든 값은 자리표시자입니다. 이를 실제 값으로 바꾸지 마세요. TrustDex는 이 파일을 읽지만 나열된 명령을 실행하거나 나열된 엔드포인트에 연결하지 않습니다.
15
+
16
+ 강제 평가 실행:
17
+
18
+ ```bash
19
+ npm run test:research
20
+ ```
21
+
22
+ 사람이 읽을 수 있는 결정을 직접 검사:
23
+
24
+ ```bash
25
+ node ./bin/trustdex.mjs inspect \
26
+ ./examples/adversarial/mcp-config.json \
27
+ --pack strict \
28
+ --policy ./examples/adversarial/policy.json
29
+ ```
30
+
31
+ 차단 사례가 있으므로 두 번째 명령은 종료 코드 `2`를 반환합니다. 예상 결과와 제한 사항은 [평가 기록](../../docs/EVALUATION.ko.md)을 참고하세요.
@@ -0,0 +1,31 @@
1
+ # Inert adversarial fixtures
2
+
3
+ <p align="right">
4
+ <strong>English</strong> | <a href="./README.ko.md">한국어</a>
5
+ </p>
6
+
7
+ These files provide a reproducible defensive test of TrustDex's policy boundary.
8
+
9
+ - `mcp-config.json` contains seven static MCP configuration cases.
10
+ - `policy.json` explicitly trusts one fixture package and two fixture hosts so blocking signals can be tested independently of source allowlisting.
11
+ - `expected.json` records the required decisions and minimum signals.
12
+ - `drift-before.json` and `drift-after.json` model a reviewed package gaining a secret-bearing environment key.
13
+
14
+ All package names are fictional, all remote endpoints use the reserved `.invalid` top-level domain, and all apparent credentials are placeholders. Do not replace them with real values. TrustDex reads these files but never executes the listed commands or contacts the listed endpoints.
15
+
16
+ Run the enforced evaluation:
17
+
18
+ ```bash
19
+ npm run test:research
20
+ ```
21
+
22
+ Inspect the human-readable decisions directly:
23
+
24
+ ```bash
25
+ node ./bin/trustdex.mjs inspect \
26
+ ./examples/adversarial/mcp-config.json \
27
+ --pack strict \
28
+ --policy ./examples/adversarial/policy.json
29
+ ```
30
+
31
+ The second command exits with code `2` because blocking cases are present. See [the evaluation record](../../docs/EVALUATION.md) for the expected results and limitations.
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "reviewed-package": {
4
+ "command": "npx",
5
+ "args": ["-y", "@trustdex-fixtures/reviewed-server@1.2.3"],
6
+ "env": {
7
+ "API_TOKEN": "NOT_A_REAL_SECRET"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "reviewed-package": {
4
+ "command": "npx",
5
+ "args": ["-y", "@trustdex-fixtures/reviewed-server@1.2.3"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "trusted-pinned-package": {
3
+ "action": "allow",
4
+ "signals": ["install-on-run"]
5
+ },
6
+ "floating-version": {
7
+ "action": "block",
8
+ "signals": ["install-on-run", "unbounded-version"]
9
+ },
10
+ "shell-launcher": {
11
+ "action": "block",
12
+ "signals": ["filesystem-path", "shell-execution"]
13
+ },
14
+ "credential-bearing-url": {
15
+ "action": "block",
16
+ "signals": ["embedded-credentials", "network-endpoint", "url-query-parameters"]
17
+ },
18
+ "insecure-remote": {
19
+ "action": "block",
20
+ "signals": ["insecure-transport", "network-endpoint"]
21
+ },
22
+ "sensitive-local-env": {
23
+ "action": "ask",
24
+ "signals": ["filesystem-path", "secret-env"]
25
+ },
26
+ "unknown-remote": {
27
+ "action": "block",
28
+ "signals": ["network-endpoint"]
29
+ }
30
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "mcpServers": {
3
+ "trusted-pinned-package": {
4
+ "command": "npx",
5
+ "args": ["-y", "@trustdex-fixtures/reviewed-server@1.2.3"]
6
+ },
7
+ "floating-version": {
8
+ "command": "npx",
9
+ "args": ["-y", "@trustdex-fixtures/floating-server@latest"]
10
+ },
11
+ "shell-launcher": {
12
+ "command": "bash",
13
+ "args": ["-lc", "./fixture-server.mjs"]
14
+ },
15
+ "credential-bearing-url": {
16
+ "url": "https://fixture-user:fixture-password@credentials.fixture.invalid/mcp?token=fixture-token"
17
+ },
18
+ "insecure-remote": {
19
+ "url": "http://insecure.fixture.invalid/mcp"
20
+ },
21
+ "sensitive-local-env": {
22
+ "command": "node",
23
+ "args": ["./fixture-server.mjs"],
24
+ "env": {
25
+ "SERVICE_API_TOKEN": "NOT_A_REAL_SECRET"
26
+ }
27
+ },
28
+ "unknown-remote": {
29
+ "url": "https://unknown.fixture.invalid/mcp"
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,15 @@
1
+ # 적대적 권한 상태 픽스처
2
+
3
+ 이 픽스처는 Claude Code와 Codex의 제한적인 기준 상태와 이후의 자율성 확대를
4
+ 모델링합니다. 모든 자격 증명, 명령 인수, 경로 및 호스트명은 비활성 테스트
5
+ 데이터입니다. `.invalid` 호스트명은 공개 인터넷에서 해석될 수 없습니다.
6
+
7
+ 평가는 다음을 검증합니다.
8
+
9
+ - 제한적 설정도 안전 인증으로 표현하지 않고 검토 가능한 상태로 유지
10
+ - 자동 셸, 네트워크, 파일 시스템 및 서브에이전트 권한 확대 감지
11
+ - 권한 상태 비교가 `needs-review`를 반환
12
+ - 검사, 스냅샷 또는 차이 출력에 설정 값과 경로 값이 나타나지 않음
13
+
14
+ 이 픽스처는 외부 시스템에 대한 보안 테스트를 허가하지 않으며 실제 사용자
15
+ 설정을 재현하지 않습니다.
@@ -0,0 +1,15 @@
1
+ # Adversarial permission posture fixtures
2
+
3
+ These fixtures model a restrictive baseline and a later autonomy expansion for
4
+ Claude Code and Codex. Every credential, command argument, path, and hostname is
5
+ inert test data. The `.invalid` hostname cannot resolve on the public Internet.
6
+
7
+ The evaluation asserts that:
8
+
9
+ - restrictive settings remain reviewable without being described as certified safe
10
+ - automatic shell, network, filesystem, and subagent expansion is detected
11
+ - permission posture comparison returns `needs-review`
12
+ - settings values and path values never appear in inspection, snapshot, or diff output
13
+
14
+ The fixtures do not authorize security testing against any external system and do
15
+ not reproduce a real user configuration.
@@ -0,0 +1,30 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(reviewer --token INERT_CLAUDE_PERMISSION_SECRET)",
5
+ "WebFetch(domain:research.invalid)",
6
+ "Agent(Explore)",
7
+ "mcp__reviewed__*"
8
+ ],
9
+ "defaultMode": "auto",
10
+ "additionalDirectories": [
11
+ "../INERT_CLAUDE_PERMISSION_PATH"
12
+ ],
13
+ "blockReadsOutsideWorkingDirectories": false
14
+ },
15
+ "env": {
16
+ "API_TOKEN": "INERT_CLAUDE_PERMISSION_SECRET"
17
+ },
18
+ "hooks": {
19
+ "PreToolUse": [
20
+ {
21
+ "hooks": [
22
+ {
23
+ "type": "command",
24
+ "command": "printf INERT_CLAUDE_HOOK_SECRET"
25
+ }
26
+ ]
27
+ }
28
+ ]
29
+ }
30
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "ask": [
4
+ "Bash(git status)",
5
+ "Agent(Explore)"
6
+ ],
7
+ "deny": [
8
+ "WebFetch",
9
+ "mcp__unreviewed__*"
10
+ ],
11
+ "defaultMode": "plan",
12
+ "disableBypassPermissionsMode": "disable",
13
+ "disableAutoMode": "disable",
14
+ "blockReadsOutsideWorkingDirectories": true
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ approval_policy = "never"
2
+ approvals_reviewer = "auto_review"
3
+ sandbox_mode = "danger-full-access"
4
+ web_search = "live"
5
+
6
+ [sandbox_workspace_write]
7
+ network_access = true
8
+ writable_roots = ["../INERT_CODEX_PERMISSION_PATH"]
9
+ exclude_slash_tmp = false
10
+ exclude_tmpdir_env_var = false
11
+
12
+ [agents]
13
+ enabled = true
@@ -0,0 +1,13 @@
1
+ approval_policy = "on-request"
2
+ approvals_reviewer = "user"
3
+ sandbox_mode = "read-only"
4
+ web_search = "disabled"
5
+
6
+ [sandbox_workspace_write]
7
+ network_access = false
8
+ writable_roots = []
9
+ exclude_slash_tmp = true
10
+ exclude_tmpdir_env_var = true
11
+
12
+ [agents]
13
+ enabled = false
@@ -0,0 +1,18 @@
1
+ {
2
+ "claude": {
3
+ "restrictiveAction": "ask",
4
+ "expandedAction": "block",
5
+ "diffStatus": "needs-review"
6
+ },
7
+ "codex": {
8
+ "restrictiveAction": "ask",
9
+ "expandedAction": "block",
10
+ "diffStatus": "needs-review"
11
+ },
12
+ "forbiddenOutputMarkers": [
13
+ "INERT_CLAUDE_PERMISSION_SECRET",
14
+ "INERT_CLAUDE_PERMISSION_PATH",
15
+ "INERT_CLAUDE_HOOK_SECRET",
16
+ "INERT_CODEX_PERMISSION_PATH"
17
+ ]
18
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "trustedPackages": [
4
+ "@trustdex-fixtures/reviewed-server"
5
+ ],
6
+ "allowedRemoteHosts": [
7
+ "credentials.fixture.invalid",
8
+ "insecure.fixture.invalid"
9
+ ]
10
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "mcpServers": {
3
+ "reviewed": {
4
+ "type": "http",
5
+ "url": "https://reviewed.invalid/mcp"
6
+ },
7
+ "unknown": {
8
+ "type": "http",
9
+ "url": "https://unknown.invalid/mcp"
10
+ },
11
+ "helper": {
12
+ "type": "http",
13
+ "url": "https://reviewed.invalid/mcp",
14
+ "headersHelper": "INERT_HELPER_NOT_EXECUTED"
15
+ },
16
+ "needsReview": {
17
+ "type": "http",
18
+ "url": "https://reviewed.invalid/mcp",
19
+ "headers": {
20
+ "Authorization": "Bearer ${EXAMPLE_API_TOKEN}"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 1,
3
+ "allowedRemoteHosts": [
4
+ "reviewed.invalid"
5
+ ]
6
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "permissions": {
4
+ "allow": [
5
+ "Bash(npm test)",
6
+ "WebFetch(domain:docs.example.invalid)",
7
+ "mcp__reviewed__read_*",
8
+ "Agent(Explore)"
9
+ ],
10
+ "ask": [
11
+ "Edit",
12
+ "Bash(git push *)"
13
+ ],
14
+ "deny": [
15
+ "Read(./.env)",
16
+ "WebFetch(domain:*)"
17
+ ],
18
+ "defaultMode": "default",
19
+ "additionalDirectories": [
20
+ "../shared-read-only"
21
+ ],
22
+ "disableBypassPermissionsMode": "disable",
23
+ "disableAutoMode": "disable",
24
+ "blockReadsOutsideWorkingDirectories": true
25
+ }
26
+ }
@@ -0,0 +1,16 @@
1
+ model = "gpt-5.6-sol"
2
+
3
+ [mcp_servers.filesystem]
4
+ command = "npx"
5
+ args = ["-y", "@modelcontextprotocol/server-filesystem@1.2.3", "./workspace"]
6
+ env_vars = ["LOCAL_TOKEN"]
7
+
8
+ [mcp_servers.remote-example]
9
+ url = "https://mcp.example.com/mcp"
10
+ bearer_token_env_var = "MCP_BEARER_TOKEN"
11
+
12
+ [mcp_servers.remote-example.http_headers]
13
+ X-Region = "us-east-1"
14
+
15
+ [features]
16
+ example = true
@@ -0,0 +1,13 @@
1
+ approval_policy = "on-request"
2
+ approvals_reviewer = "user"
3
+ sandbox_mode = "workspace-write"
4
+ web_search = "cached"
5
+
6
+ [sandbox_workspace_write]
7
+ network_access = false
8
+ writable_roots = ["../reviewed-shared"]
9
+ exclude_slash_tmp = true
10
+ exclude_tmpdir_env_var = true
11
+
12
+ [agents]
13
+ enabled = false
@@ -0,0 +1,22 @@
1
+ {
2
+ "mcpServers": {
3
+ "filesystem": {
4
+ "command": "npx",
5
+ "args": [
6
+ "-y",
7
+ "@modelcontextprotocol/server-filesystem@1.2.3",
8
+ "./workspace"
9
+ ]
10
+ },
11
+ "unknown-calendar": {
12
+ "command": "npx",
13
+ "args": [
14
+ "-y",
15
+ "calendar-helper@latest"
16
+ ],
17
+ "env": {
18
+ "CALENDAR_API_TOKEN": "${CALENDAR_API_TOKEN}"
19
+ }
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 1,
3
+ "claims": [
4
+ {
5
+ "type": "package",
6
+ "subject": "example-mcp-server",
7
+ "publisher": "Example Publisher",
8
+ "status": "verified",
9
+ "evidence": {
10
+ "kind": "manual-review",
11
+ "reference": "https://example.invalid/security-review",
12
+ "checkedAt": "2026-09-19T00:00:00Z"
13
+ }
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 1,
3
+ "unknownAction": "block",
4
+ "localAction": "ask",
5
+ "sensitiveAction": "ask",
6
+ "unpinnedAction": "ask",
7
+ "shellAction": "block",
8
+ "trustedPackages": [
9
+ "@modelcontextprotocol/server-filesystem"
10
+ ],
11
+ "allowedRemoteHosts": [
12
+ "mcp.example.com"
13
+ ]
14
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trustdex",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "A local-first trust, provenance, and review gate for AI agent tools, MCP servers, skills, and plugins.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "scripts": {
10
10
  "test": "node --test",
11
- "test:research": "node --test test/research-fixtures.test.mjs",
12
- "check": "node --check bin/trustdex.mjs && node --check src/canonical.mjs && node --check src/claude-config.mjs && node --check src/codex-config.mjs && node --check src/extensions.mjs && node --check src/gate.mjs && node --check src/inspect.mjs && node --check src/policy.mjs && node --check src/policy-packs.mjs && node --check src/provenance.mjs && node --check src/provenance-online.mjs && node --check src/review.mjs && node --check src/snapshot.mjs && node --check src/trust-record.mjs",
11
+ "test:research": "node --test test/research-fixtures.test.mjs test/claude-settings.test.mjs test/codex-settings.test.mjs test/posture.test.mjs",
12
+ "check": "node --check bin/trustdex.mjs && node --check src/canonical.mjs && node --check src/claude-config.mjs && node --check src/claude-settings.mjs && node --check src/codex-config.mjs && node --check src/codex-settings.mjs && node --check src/extensions.mjs && node --check src/gate.mjs && node --check src/inspect.mjs && node --check src/policy.mjs && node --check src/policy-packs.mjs && node --check src/posture.mjs && node --check src/provenance.mjs && node --check src/provenance-online.mjs && node --check src/review.mjs && node --check src/snapshot.mjs && node --check src/trust-record.mjs",
13
13
  "prepublishOnly": "npm test && npm run check"
14
14
  },
15
15
  "engines": {
@@ -38,6 +38,8 @@
38
38
  "bin",
39
39
  "src",
40
40
  "docs",
41
+ "examples",
42
+ "schemas",
41
43
  "README.md",
42
44
  "SECURITY.md",
43
45
  "LICENSE"
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/grigent/trustdex/blob/main/schemas/permission-posture-diff-v1.schema.json",
4
+ "title": "TrustDex permission posture diff v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "runtime",
10
+ "status",
11
+ "baselineDigest",
12
+ "currentDigest",
13
+ "summary",
14
+ "changes"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": { "const": 1 },
18
+ "runtime": { "enum": ["claude", "codex"] },
19
+ "status": { "enum": ["unchanged", "restricted", "needs-review"] },
20
+ "baselineDigest": { "$ref": "#/$defs/digest" },
21
+ "currentDigest": { "$ref": "#/$defs/digest" },
22
+ "summary": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["expansions", "restrictions", "reviews"],
26
+ "properties": {
27
+ "expansions": { "$ref": "#/$defs/count" },
28
+ "restrictions": { "$ref": "#/$defs/count" },
29
+ "reviews": { "$ref": "#/$defs/count" }
30
+ }
31
+ },
32
+ "changes": {
33
+ "type": "array",
34
+ "items": { "$ref": "#/$defs/change" }
35
+ }
36
+ },
37
+ "$defs": {
38
+ "digest": {
39
+ "type": "string",
40
+ "pattern": "^[a-f0-9]{64}$"
41
+ },
42
+ "count": {
43
+ "type": "integer",
44
+ "minimum": 0
45
+ },
46
+ "scalar": {
47
+ "type": ["string", "number", "boolean", "null"]
48
+ },
49
+ "change": {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "required": ["impact", "type", "field"],
53
+ "properties": {
54
+ "impact": { "enum": ["expansion", "restriction", "review"] },
55
+ "type": {
56
+ "enum": [
57
+ "policy-changed",
58
+ "items-added",
59
+ "items-removed",
60
+ "decision-changed",
61
+ "count-changed",
62
+ "boolean-changed",
63
+ "value-changed"
64
+ ]
65
+ },
66
+ "field": { "type": "string" },
67
+ "before": { "$ref": "#/$defs/scalar" },
68
+ "after": { "$ref": "#/$defs/scalar" },
69
+ "items": {
70
+ "type": "array",
71
+ "minItems": 1,
72
+ "uniqueItems": true,
73
+ "items": { "type": "string" }
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }