oasr 0.4.0__tar.gz → 0.5.1__tar.gz

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 (165) hide show
  1. {oasr-0.4.0 → oasr-0.5.1}/CHANGELOG.md +94 -2
  2. {oasr-0.4.0 → oasr-0.5.1}/PKG-INFO +1 -1
  3. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/.INDEX.md +4 -2
  4. oasr-0.5.1/docs/commands/CLEAN.md +13 -0
  5. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/CLONE.md +0 -1
  6. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/CONFIG.md +77 -1
  7. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/EXEC.md +172 -0
  8. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/REGISTRY.md +36 -0
  9. oasr-0.5.1/docs/config.example.toml +220 -0
  10. oasr-0.5.1/docs/configuration/.INDEX +58 -0
  11. oasr-0.5.1/docs/configuration/README.md +226 -0
  12. oasr-0.5.1/docs/configuration/adapter.md +72 -0
  13. oasr-0.5.1/docs/configuration/agent.md +196 -0
  14. oasr-0.5.1/docs/configuration/environment-variables.md +371 -0
  15. oasr-0.5.1/docs/configuration/examples/ci-cd.toml +71 -0
  16. oasr-0.5.1/docs/configuration/examples/development.toml +70 -0
  17. oasr-0.5.1/docs/configuration/examples/minimal.toml +12 -0
  18. oasr-0.5.1/docs/configuration/examples/production.toml +61 -0
  19. oasr-0.5.1/docs/configuration/precedence.md +307 -0
  20. oasr-0.5.1/docs/configuration/profiles.md +393 -0
  21. oasr-0.5.1/docs/configuration/validation.md +97 -0
  22. {oasr-0.4.0 → oasr-0.5.1}/pyproject.toml +1 -1
  23. {oasr-0.4.0 → oasr-0.5.1}/src/cli.py +1 -1
  24. oasr-0.5.1/src/commands/clean.py +30 -0
  25. {oasr-0.4.0 → oasr-0.5.1}/src/commands/config.py +78 -26
  26. {oasr-0.4.0 → oasr-0.5.1}/src/commands/exec.py +65 -12
  27. {oasr-0.4.0 → oasr-0.5.1}/src/commands/registry.py +144 -0
  28. {oasr-0.4.0 → oasr-0.5.1}/src/config/__init__.py +30 -11
  29. oasr-0.5.1/src/config/defaults.py +40 -0
  30. oasr-0.5.1/src/config/env.py +248 -0
  31. oasr-0.5.1/src/config/schema.py +111 -0
  32. oasr-0.5.1/src/policy/__init__.py +50 -0
  33. oasr-0.5.1/src/policy/defaults.py +27 -0
  34. oasr-0.5.1/src/policy/enforcement.py +98 -0
  35. oasr-0.5.1/src/policy/profile.py +185 -0
  36. {oasr-0.4.0 → oasr-0.5.1}/tests/test_config.py +121 -0
  37. {oasr-0.4.0 → oasr-0.5.1}/tests/test_config_command.py +9 -9
  38. oasr-0.5.1/tests/test_config_env.py +308 -0
  39. oasr-0.5.1/tests/test_config_integration.py +148 -0
  40. {oasr-0.4.0 → oasr-0.5.1}/tests/test_exec.py +47 -13
  41. oasr-0.5.1/tests/test_policy_enforcement.py +158 -0
  42. oasr-0.5.1/tests/test_policy_profile.py +181 -0
  43. {oasr-0.4.0 → oasr-0.5.1}/uv.lock +1 -1
  44. oasr-0.4.0/docs/commands/CLEAN.md +0 -11
  45. oasr-0.4.0/doctor/SKILL.md +0 -35
  46. oasr-0.4.0/doctor/assets/schemas/session.schema.yaml +0 -87
  47. oasr-0.4.0/doctor/assets/schemas/treatment.schema.yaml +0 -70
  48. oasr-0.4.0/doctor/references/00_ROUTER.md +0 -104
  49. oasr-0.4.0/doctor/references/01_SUMMARY.md +0 -44
  50. oasr-0.4.0/doctor/references/02_TRIGGERS.md +0 -40
  51. oasr-0.4.0/doctor/references/03_ALWAYS.md +0 -43
  52. oasr-0.4.0/doctor/references/04_NEVER.md +0 -45
  53. oasr-0.4.0/doctor/references/05_PROCEDURE.md +0 -99
  54. oasr-0.4.0/doctor/references/06_FAILURES.md +0 -77
  55. oasr-0.4.0/doctor/scripts/include/.doctor/session.yaml +0 -11
  56. oasr-0.4.0/doctor/scripts/include/doctor_cli.py +0 -357
  57. oasr-0.4.0/doctor/scripts/include/doctor_parse.py +0 -348
  58. oasr-0.4.0/doctor/scripts/include/pyproject.toml +0 -12
  59. oasr-0.4.0/doctor/scripts/include/uv.lock +0 -78
  60. oasr-0.4.0/doctor/scripts/router_checks.sh +0 -87
  61. oasr-0.4.0/doctor/scripts/skill.ps1 +0 -65
  62. oasr-0.4.0/doctor/scripts/skill.sh +0 -57
  63. oasr-0.4.0/src/commands/clean.py +0 -155
  64. oasr-0.4.0/src/config/defaults.py +0 -16
  65. oasr-0.4.0/src/config/schema.py +0 -36
  66. {oasr-0.4.0 → oasr-0.5.1}/.gitignore +0 -0
  67. {oasr-0.4.0 → oasr-0.5.1}/CONTRIBUTING.md +0 -0
  68. {oasr-0.4.0 → oasr-0.5.1}/LICENSE +0 -0
  69. {oasr-0.4.0 → oasr-0.5.1}/NOTICE +0 -0
  70. {oasr-0.4.0 → oasr-0.5.1}/README.md +0 -0
  71. {oasr-0.4.0 → oasr-0.5.1}/docs/.INDEX.md +0 -0
  72. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/adapter.png +0 -0
  73. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/add-glob.png +0 -0
  74. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/add-remote.png +0 -0
  75. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/add.png +0 -0
  76. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/find-add.png +0 -0
  77. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/find.png +0 -0
  78. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/help.png +0 -0
  79. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/info.png +0 -0
  80. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/list.png +0 -0
  81. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/rm-glob.png +0 -0
  82. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/rm.png +0 -0
  83. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/status.png +0 -0
  84. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/sync-update.png +0 -0
  85. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/sync.png +0 -0
  86. {oasr-0.4.0 → oasr-0.5.1}/docs/.images/use.png +0 -0
  87. {oasr-0.4.0 → oasr-0.5.1}/docs/QUICKSTART.md +0 -0
  88. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/ADAPTER.md +0 -0
  89. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/ADD.md +0 -0
  90. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/DIFF.md +0 -0
  91. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/FIND.md +0 -0
  92. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/HELP.md +0 -0
  93. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/INFO.md +0 -0
  94. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/LIST.md +0 -0
  95. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/RM.md +0 -0
  96. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/ROOT.md +0 -0
  97. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/STATUS.md +0 -0
  98. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/SYNC.md +0 -0
  99. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/UPDATE.md +0 -0
  100. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/USE.md +0 -0
  101. {oasr-0.4.0 → oasr-0.5.1}/docs/commands/VALIDATE.md +0 -0
  102. {oasr-0.4.0 → oasr-0.5.1}/docs/validation/.INDEX.md +0 -0
  103. {oasr-0.4.0 → oasr-0.5.1}/docs/validation/ERRORS.md +0 -0
  104. {oasr-0.4.0 → oasr-0.5.1}/docs/validation/INFO.md +0 -0
  105. {oasr-0.4.0 → oasr-0.5.1}/docs/validation/RULES.md +0 -0
  106. {oasr-0.4.0 → oasr-0.5.1}/docs/validation/WARNINGS.md +0 -0
  107. {oasr-0.4.0 → oasr-0.5.1}/install.ps1 +0 -0
  108. {oasr-0.4.0 → oasr-0.5.1}/install.sh +0 -0
  109. {oasr-0.4.0 → oasr-0.5.1}/llms.txt +0 -0
  110. {oasr-0.4.0 → oasr-0.5.1}/scripts/README.md +0 -0
  111. {oasr-0.4.0 → oasr-0.5.1}/scripts/fix.sh +0 -0
  112. {oasr-0.4.0 → oasr-0.5.1}/scripts/lint.sh +0 -0
  113. {oasr-0.4.0 → oasr-0.5.1}/scripts/test.sh +0 -0
  114. {oasr-0.4.0 → oasr-0.5.1}/src/__init__.py +0 -0
  115. {oasr-0.4.0 → oasr-0.5.1}/src/__main__.py +0 -0
  116. {oasr-0.4.0 → oasr-0.5.1}/src/adapter.py +0 -0
  117. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/__init__.py +0 -0
  118. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/base.py +0 -0
  119. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/claude.py +0 -0
  120. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/codex.py +0 -0
  121. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/copilot.py +0 -0
  122. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/cursor.py +0 -0
  123. {oasr-0.4.0 → oasr-0.5.1}/src/adapters/windsurf.py +0 -0
  124. {oasr-0.4.0 → oasr-0.5.1}/src/agents/__init__.py +0 -0
  125. {oasr-0.4.0 → oasr-0.5.1}/src/agents/base.py +0 -0
  126. {oasr-0.4.0 → oasr-0.5.1}/src/agents/claude.py +0 -0
  127. {oasr-0.4.0 → oasr-0.5.1}/src/agents/codex.py +0 -0
  128. {oasr-0.4.0 → oasr-0.5.1}/src/agents/copilot.py +0 -0
  129. {oasr-0.4.0 → oasr-0.5.1}/src/agents/opencode.py +0 -0
  130. {oasr-0.4.0 → oasr-0.5.1}/src/agents/registry.py +0 -0
  131. {oasr-0.4.0 → oasr-0.5.1}/src/commands/__init__.py +0 -0
  132. {oasr-0.4.0 → oasr-0.5.1}/src/commands/adapter.py +0 -0
  133. {oasr-0.4.0 → oasr-0.5.1}/src/commands/add.py +0 -0
  134. {oasr-0.4.0 → oasr-0.5.1}/src/commands/clone.py +0 -0
  135. {oasr-0.4.0 → oasr-0.5.1}/src/commands/diff.py +0 -0
  136. {oasr-0.4.0 → oasr-0.5.1}/src/commands/find.py +0 -0
  137. {oasr-0.4.0 → oasr-0.5.1}/src/commands/help.py +0 -0
  138. {oasr-0.4.0 → oasr-0.5.1}/src/commands/info.py +0 -0
  139. {oasr-0.4.0 → oasr-0.5.1}/src/commands/list.py +0 -0
  140. {oasr-0.4.0 → oasr-0.5.1}/src/commands/rm.py +0 -0
  141. {oasr-0.4.0 → oasr-0.5.1}/src/commands/status.py +0 -0
  142. {oasr-0.4.0 → oasr-0.5.1}/src/commands/sync.py +0 -0
  143. {oasr-0.4.0 → oasr-0.5.1}/src/commands/update.py +0 -0
  144. {oasr-0.4.0 → oasr-0.5.1}/src/commands/use.py +0 -0
  145. {oasr-0.4.0 → oasr-0.5.1}/src/commands/validate.py +0 -0
  146. {oasr-0.4.0 → oasr-0.5.1}/src/discovery.py +0 -0
  147. {oasr-0.4.0 → oasr-0.5.1}/src/manifest.py +0 -0
  148. {oasr-0.4.0 → oasr-0.5.1}/src/registry.py +0 -0
  149. {oasr-0.4.0 → oasr-0.5.1}/src/remote.py +0 -0
  150. {oasr-0.4.0 → oasr-0.5.1}/src/skillcopy/__init__.py +0 -0
  151. {oasr-0.4.0 → oasr-0.5.1}/src/skillcopy/local.py +0 -0
  152. {oasr-0.4.0 → oasr-0.5.1}/src/skillcopy/remote.py +0 -0
  153. {oasr-0.4.0 → oasr-0.5.1}/src/tracking.py +0 -0
  154. {oasr-0.4.0 → oasr-0.5.1}/src/validate.py +0 -0
  155. {oasr-0.4.0 → oasr-0.5.1}/tests/conftest.py +0 -0
  156. {oasr-0.4.0 → oasr-0.5.1}/tests/test_adapters.py +0 -0
  157. {oasr-0.4.0 → oasr-0.5.1}/tests/test_agents.py +0 -0
  158. {oasr-0.4.0 → oasr-0.5.1}/tests/test_clone.py +0 -0
  159. {oasr-0.4.0 → oasr-0.5.1}/tests/test_copy.py +0 -0
  160. {oasr-0.4.0 → oasr-0.5.1}/tests/test_help.py +0 -0
  161. {oasr-0.4.0 → oasr-0.5.1}/tests/test_list.py +0 -0
  162. {oasr-0.4.0 → oasr-0.5.1}/tests/test_multi_skill.py +0 -0
  163. {oasr-0.4.0 → oasr-0.5.1}/tests/test_remote.py +0 -0
  164. {oasr-0.4.0 → oasr-0.5.1}/tests/test_tracking.py +0 -0
  165. {oasr-0.4.0 → oasr-0.5.1}/tests/test_use_glob.py +0 -0
@@ -4,9 +4,101 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.5.1] - 2026-02-02
8
8
 
9
- ## [0.4.0] - TBD
9
+ ### Added
10
+ - **🌍 Environment Variable Support** — Full OASR_* environment variable support for all configuration
11
+ - Naming convention: `OASR_<SECTION>_<KEY>` (e.g., `OASR_AGENT`, `OASR_PROFILE`)
12
+ - Type-aware parsing: bool, int, list (comma-separated), string
13
+ - Clear precedence: CLI flags > env vars > config file > defaults
14
+ - 17 documented environment variables
15
+ - **✅ Enhanced Config Validation** — Early validation with helpful error messages
16
+ - `oasr config set` validates agent names against available drivers
17
+ - Profile reference validation (checks if profile exists)
18
+ - `--force` flag to bypass validation when needed
19
+ - Dotted notation support: `validation.strict`, `adapter.default`
20
+ - Suggestions in error messages: "Invalid agent 'foo'. Valid agents: codex, copilot..."
21
+ - **📚 Configuration Documentation Restructure** — Progressive disclosure documentation
22
+ - New `docs/configuration/` directory with 12 files (~37KB)
23
+ - Navigation manifest: `.INDEX` file for documentation structure
24
+ - 7 detailed guides: Overview, Agent, Profiles, Validation, Adapter, Env Vars, Precedence
25
+ - 4 example configs: Minimal, Development, CI/CD, Production
26
+ - Easy-to-find specific information with cross-references
27
+
28
+ ### Changed
29
+ - **Config loading**: Now accepts `cli_overrides` parameter for precedence merging
30
+ - **Config command**: Enhanced validation and better error messages
31
+ - **Documentation**: `docs/commands/CONFIG.md` updated with pointers to new structure
32
+
33
+ ### Technical
34
+ - **New module**: `src/config/env.py` with parsing, type coercion, and merging logic
35
+ - **50 new tests**: 40 env var tests + 10 integration tests (287 total tests passing)
36
+ - **Backward compatible**: All existing functionality preserved
37
+ - **Type safety**: Enhanced type checking and validation throughout
38
+
39
+ ### Documentation
40
+ - **[docs/configuration/](docs/configuration/README.md)**: New comprehensive configuration guide
41
+ - **[Environment Variables](docs/configuration/environment-variables.md)**: Complete OASR_* reference
42
+ - **[Precedence](docs/configuration/precedence.md)**: Detailed precedence rules and examples
43
+ - **[Examples](docs/configuration/examples/)**: 4 ready-to-use configuration examples
44
+
45
+ ## [0.5.0] - 2026-02-02
46
+
47
+ ### Added
48
+ - **🔒 Execution Policy System** — Host-level security boundaries for `oasr exec`
49
+ - Policy profiles define what agents can and cannot do
50
+ - Conservative safe defaults (fail closed)
51
+ - User-defined custom profiles in `config.toml`
52
+ - Pre-execution confirmation for risky operations
53
+ - Risk triggers: stdin, file prompts, non-safe profiles, network/env/shell access
54
+ - **New CLI flags for `oasr exec`**:
55
+ - `--profile <name>` — Choose execution policy profile
56
+ - `-y/--yes` — Skip confirmation prompt
57
+ - `--confirm` — Force confirmation even for safe operations
58
+ - **Configuration support for policies**:
59
+ - `[oasr]` section with `default_profile` setting
60
+ - `[profiles.<name>]` tables for custom profiles
61
+ - Policy field validation in config schema
62
+ - Built-in "safe" profile with conservative defaults
63
+
64
+ ### Changed
65
+ - **Security model**: `oasr exec` now requires explicit confirmation for risky execution contexts
66
+ - **Config schema**: Extended to support execution policy profiles
67
+
68
+ ### Security
69
+ - **Prompt injection mitigation**: Policy enforcement reduces impact of malicious skill instructions
70
+ - **Sensitive file protection**: Default deny list includes `~/.ssh`, `~/.aws`, `~/.gnupg`, `.env`, etc.
71
+ - **Execution boundaries**: Clear limits on filesystem access, network, environment variables, and shell commands
72
+ - **User awareness**: Policy summary shown before risky executions
73
+ - **Fail-closed design**: Missing/malformed config falls back to safe defaults
74
+
75
+ ### Documentation
76
+ - **[EXEC.md](docs/commands/EXEC.md)**: Added comprehensive Security Model section
77
+ - **[CONFIG.md](docs/commands/CONFIG.md)**: Added Execution Policy Profiles documentation
78
+ - **Policy examples**: Multiple profile configurations for different use cases
79
+
80
+ ### Technical
81
+ - **New module**: `src/policy/` subpackage with clean API (Profile, load, assess_risk, prompt_confirmation)
82
+ - **41 new tests**: 30 policy tests + 11 config profile tests
83
+ - **Test coverage**: 187 total tests passing (all existing tests still pass)
84
+ - **Backward compatible**: No breaking changes to existing commands
85
+
86
+ ## [0.4.2] - 2026-02-01
87
+
88
+ ### Added
89
+ - **registry prune subcommand**: Added `oasr registry prune` to align with registry command taxonomy
90
+
91
+ ### Changed
92
+ - **clean command**: Deprecated `oasr clean` in favor of `oasr registry prune` (will be removed in v0.6.0)
93
+ - **documentation**: Updated REGISTRY.md with prune subcommand documentation and usage examples
94
+
95
+ ## [0.4.1] - 2026-02-01
96
+
97
+ ### Fixed
98
+ - **exec command**: Fixed `CompletedProcess` attribute error where code incorrectly referenced `.success`, `.output`, and `.error` attributes that don't exist. Now correctly uses `.returncode`
99
+ - **clone documentation**: Removed non-existent `-r, --recursive` flag from CLONE.md documentation
100
+
101
+ ## [0.4.0] - 2026-01-31
10
102
 
11
103
  ### Added
12
104
  - **🚀 `oasr exec` command** — Execute skills as CLI tools from anywhere
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oasr
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: CLI for managing agent skills across IDE integrations
5
5
  Project-URL: Homepage, https://github.com/jgodau/asr
6
6
  Project-URL: Repository, https://github.com/jgodau/asr
@@ -3,7 +3,7 @@
3
3
  ## Core Commands (v0.4.0)
4
4
 
5
5
  - [oasr](ROOT.md) - Global flags and options
6
- - [oasr registry](REGISTRY.md) - Manage skill registry (validate, add, remove, list, sync)
6
+ - [oasr registry](REGISTRY.md) - Manage skill registry (validate, add, remove, list, sync, prune)
7
7
  - [oasr diff](DIFF.md) - Show status of tracked skills
8
8
  - [oasr sync](SYNC.md) - Refresh outdated tracked skills
9
9
  - [oasr config](CONFIG.md) - Manage configuration (NEW in v0.4.0)
@@ -11,7 +11,6 @@
11
11
  - [oasr exec](EXEC.md) - Execute skills as CLI tools (NEW in v0.4.0)
12
12
  - [oasr find](FIND.md) - Find/discover skills in your file system
13
13
  - [oasr validate](VALIDATE.md) - Validate a skill
14
- - [oasr clean](CLEAN.md) - Clean up the registry
15
14
  - [oasr adapter](ADAPTER.md) - Generate IDE/Tooling adapters
16
15
  - [oasr update](UPDATE.md) - Update the `oasr` CLI
17
16
  - [oasr info](INFO.md) - Show detailed information about a skill
@@ -19,6 +18,9 @@
19
18
 
20
19
  ## Deprecated Commands
21
20
 
21
+ ### v0.4.1 Deprecations
22
+ - [oasr clean](CLEAN.md) - **Deprecated**, use `oasr registry prune` instead (will be removed in v0.6.0)
23
+
22
24
  ### v0.4.0 Deprecations
23
25
  - [oasr use](USE.md) - **Deprecated**, use `oasr clone` instead (will be removed in v0.5.0)
24
26
 
@@ -0,0 +1,13 @@
1
+ # `oasr clean` (DEPRECATED)
2
+
3
+ > **⚠️ Warning: This command is deprecated and will be removed in v0.6.0.**
4
+ > Use `oasr registry prune` instead.
5
+
6
+ Remove orphaned manifests and entries for missing skills.
7
+
8
+ ```bash
9
+ oasr clean # Shows deprecation warning
10
+ oasr registry prune # New command (recommended)
11
+ ```
12
+
13
+ This command now delegates to `oasr registry prune`. See [REGISTRY.md](./REGISTRY.md#oasr-registry-prune) for full documentation.
@@ -17,7 +17,6 @@ oasr clone skill-one skill-two # Multiple skills
17
17
  ## Options
18
18
 
19
19
  - `-d, --dest DIR` — Destination directory (default: current directory)
20
- - `-r, --recursive` — Create destination directory if it doesn't exist
21
20
  - `--quiet` — Suppress informational output
22
21
  - `--json` — Output results in JSON format
23
22
 
@@ -1,6 +1,25 @@
1
1
  # `oasr config`
2
2
 
3
- Manage OASR configuration settings. Configure default agent, validation rules, and adapter preferences.
3
+ Manage OASR configuration settings.
4
+
5
+ > **Note:** For comprehensive configuration documentation, see [`docs/configuration/`](../configuration/README.md)
6
+
7
+ ## Quick Reference
8
+
9
+ ```bash
10
+ oasr config set <key> <value> # Set a config value
11
+ oasr config get <key> # Get a config value
12
+ oasr config list # Show all configuration
13
+ oasr config path # Show config file location
14
+ ```
15
+
16
+ **See also:**
17
+ - [Configuration Overview](../configuration/README.md) - Complete config guide
18
+ - [Environment Variables](../configuration/environment-variables.md) - OASR_* reference
19
+ - [Agent Configuration](../configuration/agent.md) - Agent settings
20
+ - [Policy Profiles](../configuration/profiles.md) - Execution policies
21
+
22
+ ---
4
23
 
5
24
  ## Usage
6
25
 
@@ -241,6 +260,63 @@ Configure a different agent:
241
260
  oasr config set agent copilot
242
261
  ```
243
262
 
263
+ ## Execution Policy Profiles (v0.5.0+)
264
+
265
+ Policy profiles define security boundaries for `oasr exec`. They control what agents can do during skill execution.
266
+
267
+ ### Default Profile
268
+
269
+ Set the default execution policy profile:
270
+
271
+ ```bash
272
+ oasr config set oasr.default_profile safe
273
+ ```
274
+
275
+ This determines which profile is used unless overridden with `--profile`.
276
+
277
+ ### Defining Custom Profiles
278
+
279
+ Add custom profiles to `~/.oasr/config.toml`:
280
+
281
+ ```toml
282
+ [oasr]
283
+ default_profile = "safe"
284
+
285
+ # Conservative default
286
+ [profiles.safe]
287
+ fs_read_roots = ["./"]
288
+ fs_write_roots = ["./out", "./.oasr"]
289
+ deny_paths = ["~/.ssh", "~/.aws", "~/.gnupg", ".env"]
290
+ allowed_commands = ["rg", "fd", "jq", "cat"]
291
+ deny_shell = true
292
+ network = false
293
+ allow_env = false
294
+
295
+ # Development profile (more permissive)
296
+ [profiles.dev]
297
+ fs_read_roots = ["./", "~/projects"]
298
+ fs_write_roots = ["./", "~/projects/output"]
299
+ deny_paths = ["~/.ssh", "~/.aws"]
300
+ allowed_commands = ["bash", "curl", "git", "python"]
301
+ deny_shell = false
302
+ network = true
303
+ allow_env = true
304
+ ```
305
+
306
+ ### Profile Settings Reference
307
+
308
+ | Setting | Type | Description |
309
+ |---------|------|-------------|
310
+ | `fs_read_roots` | list[string] | Allowed filesystem read locations |
311
+ | `fs_write_roots` | list[string] | Allowed filesystem write locations |
312
+ | `deny_paths` | list[string] | Explicitly denied paths |
313
+ | `allowed_commands` | list[string] | Permitted shell commands |
314
+ | `deny_shell` | bool | Deny all shell execution |
315
+ | `network` | bool | Allow network access |
316
+ | `allow_env` | bool | Allow environment variable access |
317
+
318
+ See [`oasr exec` documentation](EXEC.md#security-model) for detailed security model explanation.
319
+
244
320
  ## Advanced Usage
245
321
 
246
322
  ### Direct Config File Editing
@@ -2,6 +2,8 @@
2
2
 
3
3
  Execute skills as CLI tools from anywhere on your system. Run skills with agent-driven execution without needing to clone them first.
4
4
 
5
+ > **🔒 Security Note**: As of v0.5.0, `oasr exec` includes host-level execution policy enforcement to protect against prompt injection and unsafe agent behavior. See [Security Model](#security-model) below.
6
+
5
7
  ## Usage
6
8
 
7
9
  ```bash
@@ -13,6 +15,9 @@ oasr exec <skill-name> [options]
13
15
  - `-p, --prompt TEXT` — Inline prompt/instructions for the agent
14
16
  - `-i, --instructions FILE` — Read prompt from a file
15
17
  - `-a, --agent AGENT` — Override the default agent (codex, copilot, claude, opencode)
18
+ - `--profile PROFILE` — Use a specific execution policy profile (default: from config)
19
+ - `-y, --yes` — Skip confirmation prompt for risky operations
20
+ - `--confirm` — Force confirmation even for safe operations
16
21
 
17
22
  ## Features
18
23
 
@@ -311,6 +316,173 @@ This allows skills to:
311
316
  - Tracking skill versions
312
317
  - Working offline
313
318
 
319
+ ## Security Model
320
+
321
+ ### Overview
322
+
323
+ OASR enforces **host-level execution policies** to reduce the impact of prompt injection and unsafe agent behavior. Policies define what agents can and cannot do, protecting sensitive files and preventing unauthorized actions.
324
+
325
+ **Key Principles:**
326
+ - OASR does not judge skills
327
+ - OASR enforces user-defined host policy (execution ceilings)
328
+ - Skills and agents cannot override policy
329
+ - Policies stored in `~/.oasr/config.toml`
330
+ - Conservative defaults (fail closed)
331
+
332
+ ### Policy Profiles
333
+
334
+ Execution policies are organized into profiles. Each profile defines:
335
+
336
+ | Setting | Description | Safe Default |
337
+ |---------|-------------|--------------|
338
+ | `fs_read_roots` | Allowed read locations | `["./"]` |
339
+ | `fs_write_roots` | Allowed write locations | `["./out", "./.oasr"]` |
340
+ | `deny_paths` | Explicitly denied paths | `["~/.ssh", "~/.aws", "~/.gnupg", ".env"]` |
341
+ | `allowed_commands` | Permitted shell commands | `["rg", "fd", "jq", "cat"]` |
342
+ | `deny_shell` | Block shell execution | `true` |
343
+ | `network` | Allow network access | `false` |
344
+ | `allow_env` | Allow environment access | `false` |
345
+
346
+ ### Risk Triggers
347
+
348
+ OASR requires explicit confirmation when:
349
+
350
+ 1. **Input from stdin** (non-interactive/piped)
351
+ 2. **Prompt from file** (`-i/--instructions`)
352
+ 3. **Non-safe profile** in use
353
+ 4. **Environment access** enabled
354
+ 5. **Network access** enabled
355
+ 6. **Shell execution** allowed
356
+ 7. **Force confirmation** flag (`--confirm`)
357
+
358
+ ### Confirmation Flow
359
+
360
+ When risk triggers are detected:
361
+
362
+ ```
363
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
364
+ EXECUTION POLICY REVIEW
365
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
366
+ Skill: csv-analyzer
367
+ Agent: codex
368
+ Profile: safe
369
+ Network: denied
370
+ Environment: denied
371
+ Shell: denied
372
+ Allowed commands: rg, fd, jq, cat
373
+ Read roots: ./
374
+ Write roots: ./out, ./.oasr
375
+ Deny paths: ~/.ssh, ~/.aws, ~/.gnupg, ~/.config, .env
376
+
377
+ ⚠ This execution requires confirmation due to:
378
+ - Input from stdin (non-interactive)
379
+
380
+ Proceed? [y/N]
381
+ ```
382
+
383
+ **Default answer is No** (safe).
384
+
385
+ ### Configuration
386
+
387
+ Define profiles in `~/.oasr/config.toml`:
388
+
389
+ ```toml
390
+ [oasr]
391
+ default_profile = "safe"
392
+
393
+ [profiles.safe]
394
+ fs_read_roots = ["./"]
395
+ fs_write_roots = ["./out", "./.oasr"]
396
+ deny_paths = ["~/.ssh", "~/.aws", "~/.gnupg", "~/.config", ".env"]
397
+ allowed_commands = ["rg", "fd", "jq", "cat"]
398
+ deny_shell = true
399
+ network = false
400
+ allow_env = false
401
+
402
+ [profiles.dev]
403
+ # More permissive for development
404
+ network = true
405
+ allow_env = true
406
+ deny_shell = false
407
+ allowed_commands = ["bash", "curl", "git", "python", "node"]
408
+ ```
409
+
410
+ ### Usage Examples
411
+
412
+ #### Safe Default (No Confirmation)
413
+ ```bash
414
+ # Interactive prompt, safe profile
415
+ oasr exec csv-analyzer -p "Analyze data"
416
+ # No confirmation needed
417
+ ```
418
+
419
+ #### Stdin Triggers Confirmation
420
+ ```bash
421
+ # Non-interactive input
422
+ echo "data" | oasr exec csv-analyzer
423
+ # Requires confirmation (unless --yes)
424
+ ```
425
+
426
+ #### Skip Confirmation
427
+ ```bash
428
+ # Use --yes to bypass (use carefully!)
429
+ echo "data" | oasr exec csv-analyzer --yes
430
+ ```
431
+
432
+ #### Use Different Profile
433
+ ```bash
434
+ # Use 'dev' profile with more permissions
435
+ oasr exec api-tester -p "Run tests" --profile dev
436
+ ```
437
+
438
+ #### Force Confirmation
439
+ ```bash
440
+ # Force confirmation even if safe
441
+ oasr exec data-processor -p "Process" --confirm
442
+ ```
443
+
444
+ ### Best Practices
445
+
446
+ 1. **Use safe defaults**: Start with the built-in safe profile
447
+ 2. **Create custom profiles**: Define profiles for different trust levels
448
+ 3. **Be explicit with --yes**: Only skip confirmation when you understand the risks
449
+ 4. **Review policy before confirming**: Read the summary carefully
450
+ 5. **Protect sensitive paths**: Always include `~/.ssh`, `~/.aws`, etc. in `deny_paths`
451
+ 6. **Limit commands**: Only allow necessary commands in `allowed_commands`
452
+ 7. **Use profiles per context**: Different profiles for dev/prod/testing
453
+
454
+ ### What This Protects Against
455
+
456
+ ✅ **Prompt injection attempts** that try to access sensitive files
457
+ ✅ **Unsafe agent behavior** (network calls, shell execution)
458
+ ✅ **Accidental exposure** of credentials or secrets
459
+ ✅ **Unauthorized file access** outside allowed roots
460
+ ✅ **Malicious skill instructions** that exceed policy
461
+
462
+ ### What This Does NOT Do
463
+
464
+ ❌ NLP-based prompt injection detection
465
+ ❌ Prompt rewriting or sanitization
466
+ ❌ Skill correctness validation
467
+ ❌ Agent-specific permission models
468
+ ❌ Plan-gated execution (staged for future)
469
+
470
+ ### Limitations
471
+
472
+ - **Confirmation is on execution, not per-action**: Policy is checked before running, not during
473
+ - **Agent behavior is not monitored**: Once confirmed, agent runs with specified permissions
474
+ - **Trust required**: You must trust the agent CLI itself
475
+ - **File-level enforcement not yet implemented**: Path checks are advisory in v0.5.0
476
+
477
+ ### Future Enhancements
478
+
479
+ Planned for future releases:
480
+ - Plan-gated execution (structured plan approval)
481
+ - Runtime file access enforcement
482
+ - Command allowlist enforcement via executor
483
+ - Network access controls
484
+ - Real-time policy violations monitoring
485
+
314
486
  ## Configuration
315
487
 
316
488
  ### Set Default Agent
@@ -105,6 +105,40 @@ Syncing remote skills...
105
105
  Synced: 2 skills
106
106
  ```
107
107
 
108
+ ### `oasr registry prune`
109
+
110
+ Clean up corrupted/missing skills and orphaned artifacts:
111
+
112
+ ```bash
113
+ oasr registry prune # Interactive cleanup
114
+ oasr registry prune -y # Skip confirmation
115
+ oasr registry prune --dry-run # Show what would be cleaned
116
+ oasr registry prune --json # JSON output
117
+ ```
118
+
119
+ This command:
120
+ - Removes skills whose source files/URLs are no longer accessible
121
+ - Removes orphaned manifest files not in the registry
122
+ - Requires confirmation unless `-y` flag is used
123
+
124
+ **Example output:**
125
+ ```bash
126
+ $ oasr registry prune
127
+ Checking 3 remote skill(s)...
128
+ ↓ python-analyzer (checking GitHub...)
129
+ ✓ python-analyzer (checked)
130
+
131
+ The following will be cleaned:
132
+
133
+ Skills with missing sources:
134
+ ✗ old-skill (/path/to/missing)
135
+
136
+ Proceed with cleanup? [y/N] y
137
+ Removed skill: old-skill
138
+
139
+ Cleaned 1 skill(s), 0 manifest(s)
140
+ ```
141
+
108
142
  ## Migration from v0.2.0
109
143
 
110
144
  The v0.3.0 CLI taxonomy reorganizes commands under the `registry` subcommand:
@@ -117,3 +151,5 @@ The v0.3.0 CLI taxonomy reorganizes commands under the `registry` subcommand:
117
151
  | `oasr status` | `oasr registry -v` |
118
152
  | `oasr sync` (manifest validation) | `oasr registry` |
119
153
  | `oasr sync --update` (remote sync) | `oasr registry sync` |
154
+
155
+ **v0.4.1 update:** `oasr clean` → `oasr registry prune`