fable-engine 1.3.1__tar.gz → 1.3.3__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.
- {fable_engine-1.3.1/fable_engine.egg-info → fable_engine-1.3.3}/PKG-INFO +40 -11
- {fable_engine-1.3.1 → fable_engine-1.3.3}/README.md +38 -9
- fable_engine-1.3.3/docs/stop-ai-agents-writing-too-early.md +80 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/base.py +1 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/server.py +1 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/session.py +1 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3/fable_engine.egg-info}/PKG-INFO +40 -11
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine.egg-info/SOURCES.txt +3 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/__init__.py +1 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/installer.py +12 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/launcher.py +29 -1
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/manifest.py +5 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/resources.json +6 -1
- fable_engine-1.3.3/fable_mode/skill_bundle.py +163 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/pyproject.toml +2 -2
- fable_engine-1.3.3/setup.py +70 -0
- fable_engine-1.3.3/tests/test_skill_distribution.py +230 -0
- fable_engine-1.3.1/setup.py +0 -30
- {fable_engine-1.3.1 → fable_engine-1.3.3}/LICENSE +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/MANIFEST.in +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/docs/fable-v1-v2-migration.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/docs/fable-v2-architecture.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/docs/system3-architecture.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_compressor.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/cas.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/deliberation.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/fleet.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/lifecycle.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/scrapers.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/actions/system3.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/browser.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/cas.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/fable_session.json +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/guards.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/schema.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/arxiv.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/github.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/reddit.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/web.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/x.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/scrapers/youtube.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/test_server.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine/updater.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine.egg-info/dependency_links.txt +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine.egg-info/entry_points.txt +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_engine.egg-info/top_level.txt +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/__main__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/adapters.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode/safety.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_mode_entry.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/adapters.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/ast_tools.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/compute.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/design_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/diagnostics.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/fleet_dispatcher.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/mock_auditor.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/mutation.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/property_oracle.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/receipt_attestor.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/red_team_swarm.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/test_harness.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/vector_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/visual.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/coder_fleet/workspace.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/cortical/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/cortical/plasticity_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/execution_broker.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/proof_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/protocol.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/runtime.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/causal.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/dialectical.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/evolution.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/executive.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/free_energy.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/hyperbolic.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/induction.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/kripke.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/system3/oracle.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/fable_v2/verifiers.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/rules/AGENTS.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/rules/GEMINI.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/rules/fable-mode.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/setup.cfg +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/SKILL.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/concurrency.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/design_3d.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/frontend_design.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/process.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/python.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/research.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/rust.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/security.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/synaptic_matrix.json +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/system.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/cortex/target.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/autonomous-agentic-migration.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/breakthrough-algorithm-synthesis.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/deepthink-analysis-proof.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/distributed-system-design.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/swe-bench-pro-debugging.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/examples/weak_model_ollama_setup.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/aaa-threejs-game-engine.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/adversarial-code-review-swarm.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/agentic-execution.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/anti-slop-frontend-architecture.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/architectural-blueprinting.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/cinematic-design-engine.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/cognitive-protocol.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/deepthink-mode.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/design-tokens-and-typographies.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/goal-rubric-and-pipeline-automation.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/hebbian-cortical-plasticity.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/innovation-engine.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/interleaved-verification.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/model-velocity-calibration.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/prompt-scaffolds.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/proof-architecture.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/svg-craft-and-vector-design.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/system2-session-engine.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/system3-meta-cognition.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/visual-imagination-engine.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/skills/fable-mode/references/weak-model-frontier-uplift.md +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/__init__.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_anti_loop_circuit_breaker.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_auto_updater.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_coder_fleet.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_delegation_compiler.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_descriptor_boundaries.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_design_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_epistemic_evidence_validator.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_execution_broker.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_fable_v2.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_fleet_transitions.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_fsm_redteam_evolution.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_goal_rubric_and_pipeline.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_hebbian_plasticity.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_packaging_runtime.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_proof_engine.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_red_team_swarm.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_redteam_remediation.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_registration_transaction.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_requested_regressions.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_scrapers.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_server_actions.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_server_frontier_actions.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_server_protocol.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_stealth_browser.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_system3.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_system3_deep_integration.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_system3_frontier.py +0 -0
- {fable_engine-1.3.1 → fable_engine-1.3.3}/tests/test_vector_engine.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: fable-engine
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
4
4
|
Summary: Independent deterministic System 2 cognitive engine and mechanical time-lock MCP server
|
|
5
5
|
Author: REX-codebase
|
|
6
6
|
License: MIT License
|
|
@@ -29,7 +29,7 @@ License: MIT License
|
|
|
29
29
|
Project-URL: Homepage, https://github.com/REX-codebase/fable-mode
|
|
30
30
|
Project-URL: Repository, https://github.com/REX-codebase/fable-mode
|
|
31
31
|
Project-URL: Issues, https://github.com/REX-codebase/fable-mode/issues
|
|
32
|
-
Keywords: mcp,ai-agents,coding-agents,verification,red-team,llm-tools
|
|
32
|
+
Keywords: mcp,model-context-protocol,ai-agents,coding-agents,agent-safety,verification,red-team,llm-tools
|
|
33
33
|
Classifier: Programming Language :: Python :: 3
|
|
34
34
|
Classifier: Programming Language :: Python :: 3.10
|
|
35
35
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -49,6 +49,8 @@ Dynamic: requires-python
|
|
|
49
49
|
|
|
50
50
|
# Fable Mode
|
|
51
51
|
|
|
52
|
+
<!-- mcp-name: io.github.REX-codebase/fable-mode -->
|
|
53
|
+
|
|
52
54
|
**Agents that think before they write.**
|
|
53
55
|
|
|
54
56
|
<br/>
|
|
@@ -61,7 +63,7 @@ Dynamic: requires-python
|
|
|
61
63
|
|
|
62
64
|
<img src="https://img.shields.io/badge/dependencies-0-black" alt="Zero Dependencies"/>
|
|
63
65
|
|
|
64
|
-
<img src="https://img.shields.io/badge/tests-
|
|
66
|
+
<img src="https://img.shields.io/badge/tests-490%20passing-black" alt="490 tests passing"/>
|
|
65
67
|
|
|
66
68
|
<br/><br/>
|
|
67
69
|
|
|
@@ -83,9 +85,7 @@ mechanical, not prompt advice: no timer, no proof, no write access.
|
|
|
83
85
|
<img src="./assets/flow-simple.svg" width="720" alt="Think → Prove → Attack → Write"/>
|
|
84
86
|
</div>
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
<video src="https://github.com/REX-codebase/fable-mode/raw/main/assets/launch-film.mp4" width="720" controls muted loop playsinline></video>
|
|
88
|
-
</div>
|
|
88
|
+
https://github.com/user-attachments/assets/27f4f8a2-b1bb-4398-a08c-bc9fd93d69d7
|
|
89
89
|
|
|
90
90
|
<br/>
|
|
91
91
|
|
|
@@ -114,22 +114,50 @@ red-team swarm for code, and a sealed record of what was verified.
|
|
|
114
114
|
pip install fable-engine
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
Or install the MCP server in your editor:
|
|
118
|
+
|
|
119
|
+
[](vscode:mcp/install?%7B%22name%22%3A%22fable-engine%22%2C%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22--from%22%2C%22fable-engine%3D%3D1.3.3%22%2C%22fable-engine%22%5D%7D)
|
|
120
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=fable-engine&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyItLWZyb20iLCJmYWJsZS1lbmdpbmU9PTEuMy4zIiwiZmFibGUtZW5naW5lIl19)
|
|
121
|
+
|
|
122
|
+
These links configure Fable Engine for AI agents in VS Code Chat or Cursor. They do not install a standalone editor extension. Both use `uvx`, which downloads and runs the pinned PyPI release in an isolated environment.
|
|
123
|
+
|
|
124
|
+
Point your agent at the MCP server manually:
|
|
118
125
|
|
|
119
126
|
```jsonc
|
|
120
|
-
// Claude Code: claude mcp add fable-engine --
|
|
127
|
+
// Claude Code: claude mcp add fable-engine -- uvx --from fable-engine==1.3.3 fable-engine
|
|
121
128
|
// Cursor: ~/.cursor/mcp.json
|
|
122
129
|
{
|
|
123
130
|
"mcpServers": {
|
|
124
131
|
"fable-engine": {
|
|
125
|
-
"command": "
|
|
126
|
-
"args": ["
|
|
132
|
+
"command": "uvx",
|
|
133
|
+
"args": ["--from", "fable-engine==1.3.3", "fable-engine"]
|
|
127
134
|
}
|
|
128
135
|
}
|
|
129
136
|
}
|
|
130
137
|
```
|
|
131
138
|
|
|
132
|
-
Python 3.10+, zero runtime dependencies.
|
|
139
|
+
Python 3.10+, zero runtime dependencies. Published on [PyPI as `fable-engine`](https://pypi.org/project/fable-engine/).
|
|
140
|
+
|
|
141
|
+
<br/>
|
|
142
|
+
|
|
143
|
+
### Optional: the Agent Skill
|
|
144
|
+
|
|
145
|
+
Installing `fable-engine` gives your agent the MCP tools. It does not install
|
|
146
|
+
or activate the Fable Mode Agent Skill - the prompt-side workflow in
|
|
147
|
+
[`skills/fable-mode`](./skills/fable-mode/SKILL.md). Nothing in the package
|
|
148
|
+
activates those instructions on its own; the skill is always a separate,
|
|
149
|
+
explicit opt-in.
|
|
150
|
+
|
|
151
|
+
The complete skill tree ships inside the wheel. To install it into your
|
|
152
|
+
project's skills directory (the cross-client `.agents/skills/` convention):
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
uvx --from fable-engine==1.3.3 fable-mode install-skill --yes
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This copies the skill to `.agents/skills/fable-mode`. Preview first with
|
|
159
|
+
`--dry-run`, choose another location with `--target <dir>`, and reload your
|
|
160
|
+
agent afterwards so it picks up the skill.
|
|
133
161
|
|
|
134
162
|
<br/>
|
|
135
163
|
|
|
@@ -155,6 +183,7 @@ Python 3.10+, zero runtime dependencies. PyPI package publishing is in progress.
|
|
|
155
183
|
- [V1 → V2 migration](./docs/fable-v1-v2-migration.md)
|
|
156
184
|
- [V2 architecture](./docs/fable-v2-architecture.md)
|
|
157
185
|
- [System 3 (experimental)](./docs/system3-architecture.md)
|
|
186
|
+
- [Stop AI coding agents from writing too early](./docs/stop-ai-agents-writing-too-early.md)
|
|
158
187
|
|
|
159
188
|
<br/>
|
|
160
189
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
# Fable Mode
|
|
8
8
|
|
|
9
|
+
<!-- mcp-name: io.github.REX-codebase/fable-mode -->
|
|
10
|
+
|
|
9
11
|
**Agents that think before they write.**
|
|
10
12
|
|
|
11
13
|
<br/>
|
|
@@ -18,7 +20,7 @@
|
|
|
18
20
|
|
|
19
21
|
<img src="https://img.shields.io/badge/dependencies-0-black" alt="Zero Dependencies"/>
|
|
20
22
|
|
|
21
|
-
<img src="https://img.shields.io/badge/tests-
|
|
23
|
+
<img src="https://img.shields.io/badge/tests-490%20passing-black" alt="490 tests passing"/>
|
|
22
24
|
|
|
23
25
|
<br/><br/>
|
|
24
26
|
|
|
@@ -40,9 +42,7 @@ mechanical, not prompt advice: no timer, no proof, no write access.
|
|
|
40
42
|
<img src="./assets/flow-simple.svg" width="720" alt="Think → Prove → Attack → Write"/>
|
|
41
43
|
</div>
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
<video src="https://github.com/REX-codebase/fable-mode/raw/main/assets/launch-film.mp4" width="720" controls muted loop playsinline></video>
|
|
45
|
-
</div>
|
|
45
|
+
https://github.com/user-attachments/assets/27f4f8a2-b1bb-4398-a08c-bc9fd93d69d7
|
|
46
46
|
|
|
47
47
|
<br/>
|
|
48
48
|
|
|
@@ -71,22 +71,50 @@ red-team swarm for code, and a sealed record of what was verified.
|
|
|
71
71
|
pip install fable-engine
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
Or install the MCP server in your editor:
|
|
75
|
+
|
|
76
|
+
[](vscode:mcp/install?%7B%22name%22%3A%22fable-engine%22%2C%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22--from%22%2C%22fable-engine%3D%3D1.3.3%22%2C%22fable-engine%22%5D%7D)
|
|
77
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=fable-engine&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyItLWZyb20iLCJmYWJsZS1lbmdpbmU9PTEuMy4zIiwiZmFibGUtZW5naW5lIl19)
|
|
78
|
+
|
|
79
|
+
These links configure Fable Engine for AI agents in VS Code Chat or Cursor. They do not install a standalone editor extension. Both use `uvx`, which downloads and runs the pinned PyPI release in an isolated environment.
|
|
80
|
+
|
|
81
|
+
Point your agent at the MCP server manually:
|
|
75
82
|
|
|
76
83
|
```jsonc
|
|
77
|
-
// Claude Code: claude mcp add fable-engine --
|
|
84
|
+
// Claude Code: claude mcp add fable-engine -- uvx --from fable-engine==1.3.3 fable-engine
|
|
78
85
|
// Cursor: ~/.cursor/mcp.json
|
|
79
86
|
{
|
|
80
87
|
"mcpServers": {
|
|
81
88
|
"fable-engine": {
|
|
82
|
-
"command": "
|
|
83
|
-
"args": ["
|
|
89
|
+
"command": "uvx",
|
|
90
|
+
"args": ["--from", "fable-engine==1.3.3", "fable-engine"]
|
|
84
91
|
}
|
|
85
92
|
}
|
|
86
93
|
}
|
|
87
94
|
```
|
|
88
95
|
|
|
89
|
-
Python 3.10+, zero runtime dependencies.
|
|
96
|
+
Python 3.10+, zero runtime dependencies. Published on [PyPI as `fable-engine`](https://pypi.org/project/fable-engine/).
|
|
97
|
+
|
|
98
|
+
<br/>
|
|
99
|
+
|
|
100
|
+
### Optional: the Agent Skill
|
|
101
|
+
|
|
102
|
+
Installing `fable-engine` gives your agent the MCP tools. It does not install
|
|
103
|
+
or activate the Fable Mode Agent Skill - the prompt-side workflow in
|
|
104
|
+
[`skills/fable-mode`](./skills/fable-mode/SKILL.md). Nothing in the package
|
|
105
|
+
activates those instructions on its own; the skill is always a separate,
|
|
106
|
+
explicit opt-in.
|
|
107
|
+
|
|
108
|
+
The complete skill tree ships inside the wheel. To install it into your
|
|
109
|
+
project's skills directory (the cross-client `.agents/skills/` convention):
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
uvx --from fable-engine==1.3.3 fable-mode install-skill --yes
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
This copies the skill to `.agents/skills/fable-mode`. Preview first with
|
|
116
|
+
`--dry-run`, choose another location with `--target <dir>`, and reload your
|
|
117
|
+
agent afterwards so it picks up the skill.
|
|
90
118
|
|
|
91
119
|
<br/>
|
|
92
120
|
|
|
@@ -112,6 +140,7 @@ Python 3.10+, zero runtime dependencies. PyPI package publishing is in progress.
|
|
|
112
140
|
- [V1 → V2 migration](./docs/fable-v1-v2-migration.md)
|
|
113
141
|
- [V2 architecture](./docs/fable-v2-architecture.md)
|
|
114
142
|
- [System 3 (experimental)](./docs/system3-architecture.md)
|
|
143
|
+
- [Stop AI coding agents from writing too early](./docs/stop-ai-agents-writing-too-early.md)
|
|
115
144
|
|
|
116
145
|
<br/>
|
|
117
146
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Stop AI coding agents from writing too early
|
|
2
|
+
|
|
3
|
+
AI coding agents often move from a plausible plan to editing files before they have gathered enough evidence. Prompt instructions can ask them to slow down, but a model can reinterpret or skip prompt advice. Fable Mode adds a mechanical gate: the agent can inspect and reason, but it cannot earn write permission until the configured time lock and proof checks pass.
|
|
4
|
+
|
|
5
|
+
## The failure mode
|
|
6
|
+
|
|
7
|
+
A typical unsafe loop looks like this:
|
|
8
|
+
|
|
9
|
+
1. The agent reads one or two files.
|
|
10
|
+
2. It forms a confident hypothesis.
|
|
11
|
+
3. It edits code before testing the hypothesis.
|
|
12
|
+
4. Tests reveal a hidden constraint after the workspace has already changed.
|
|
13
|
+
|
|
14
|
+
Fable Mode separates research from authority. A session begins with execution locked. Claims need evidence receipts, implementation faces adversarial review, and the final record shows what was checked.
|
|
15
|
+
|
|
16
|
+
## Install the MCP server
|
|
17
|
+
|
|
18
|
+
Install [uv](https://docs.astral.sh/uv/getting-started/installation/) so your MCP client can run the package without changing your global Python environment.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uvx --from fable-engine==1.3.3 fable-engine
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
For Claude Code:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
claude mcp add fable-engine -- uvx --from fable-engine==1.3.3 fable-engine
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
For an MCP client that uses JSON configuration:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"mcpServers": {
|
|
35
|
+
"fable-engine": {
|
|
36
|
+
"command": "uvx",
|
|
37
|
+
"args": ["--from", "fable-engine==1.3.3", "fable-engine"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## What the gate changes
|
|
44
|
+
|
|
45
|
+
Fable Mode uses four stages:
|
|
46
|
+
|
|
47
|
+
- **Think:** keep execution locked while the agent gathers context and specifies invariants.
|
|
48
|
+
- **Prove:** attach evidence to claims instead of treating confidence as proof.
|
|
49
|
+
- **Attack:** try to break the proposed change through adversarial checks.
|
|
50
|
+
- **Write:** unlock only after the earlier gates pass.
|
|
51
|
+
|
|
52
|
+
The minimum time budget is two minutes. That is a floor, not a claim that two minutes is enough for every task. Use a longer budget when the codebase, blast radius, or uncertainty is larger.
|
|
53
|
+
|
|
54
|
+
## When to use it
|
|
55
|
+
|
|
56
|
+
Fable Mode fits work where premature edits are expensive:
|
|
57
|
+
|
|
58
|
+
- migrations and dependency upgrades;
|
|
59
|
+
- security-sensitive changes;
|
|
60
|
+
- refactors across unfamiliar code;
|
|
61
|
+
- changes with hidden compatibility constraints;
|
|
62
|
+
- autonomous coding runs where no person reviews every intermediate step.
|
|
63
|
+
|
|
64
|
+
It is not a guarantee of correct code. It makes the path to write access explicit and checkable, so a coding agent cannot treat a good-sounding plan as permission to edit.
|
|
65
|
+
|
|
66
|
+
## Verify the server before connecting a client
|
|
67
|
+
|
|
68
|
+
The package has no runtime dependencies. You can confirm the pinned release and inspect its MCP initialization response in an isolated environment before adding it to an editor or agent:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uvx --from fable-engine==1.3.3 fable-engine
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The server communicates over standard input and output. MCP clients start and manage that process for you after configuration.
|
|
75
|
+
|
|
76
|
+
## Next steps
|
|
77
|
+
|
|
78
|
+
- Read the [V2 architecture](./fable-v2-architecture.md).
|
|
79
|
+
- Review the [V1 to V2 migration guide](./fable-v1-v2-migration.md).
|
|
80
|
+
- Inspect the source and tests in the [Fable Mode repository](https://github.com/REX-codebase/fable-mode).
|
|
@@ -25,7 +25,7 @@ from typing import Any, Dict, List, Optional, Tuple
|
|
|
25
25
|
|
|
26
26
|
logger = logging.getLogger("fable-engine.scrapers.base")
|
|
27
27
|
|
|
28
|
-
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 FableResearch/1.3.
|
|
28
|
+
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 FableResearch/1.3.3"
|
|
29
29
|
|
|
30
30
|
MAX_RETRY_DELAY_SECONDS = 10.0
|
|
31
31
|
|
|
@@ -1530,7 +1530,7 @@ class FableSession:
|
|
|
1530
1530
|
def to_dict(self) -> Dict[str, Any]:
|
|
1531
1531
|
"""Serializes session to dictionary."""
|
|
1532
1532
|
return {
|
|
1533
|
-
"version": "1.3.
|
|
1533
|
+
"version": "1.3.3",
|
|
1534
1534
|
"session_name": self.session_name,
|
|
1535
1535
|
"session_id": self.session_id,
|
|
1536
1536
|
"objective": self.objective,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: fable-engine
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
4
4
|
Summary: Independent deterministic System 2 cognitive engine and mechanical time-lock MCP server
|
|
5
5
|
Author: REX-codebase
|
|
6
6
|
License: MIT License
|
|
@@ -29,7 +29,7 @@ License: MIT License
|
|
|
29
29
|
Project-URL: Homepage, https://github.com/REX-codebase/fable-mode
|
|
30
30
|
Project-URL: Repository, https://github.com/REX-codebase/fable-mode
|
|
31
31
|
Project-URL: Issues, https://github.com/REX-codebase/fable-mode/issues
|
|
32
|
-
Keywords: mcp,ai-agents,coding-agents,verification,red-team,llm-tools
|
|
32
|
+
Keywords: mcp,model-context-protocol,ai-agents,coding-agents,agent-safety,verification,red-team,llm-tools
|
|
33
33
|
Classifier: Programming Language :: Python :: 3
|
|
34
34
|
Classifier: Programming Language :: Python :: 3.10
|
|
35
35
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -49,6 +49,8 @@ Dynamic: requires-python
|
|
|
49
49
|
|
|
50
50
|
# Fable Mode
|
|
51
51
|
|
|
52
|
+
<!-- mcp-name: io.github.REX-codebase/fable-mode -->
|
|
53
|
+
|
|
52
54
|
**Agents that think before they write.**
|
|
53
55
|
|
|
54
56
|
<br/>
|
|
@@ -61,7 +63,7 @@ Dynamic: requires-python
|
|
|
61
63
|
|
|
62
64
|
<img src="https://img.shields.io/badge/dependencies-0-black" alt="Zero Dependencies"/>
|
|
63
65
|
|
|
64
|
-
<img src="https://img.shields.io/badge/tests-
|
|
66
|
+
<img src="https://img.shields.io/badge/tests-490%20passing-black" alt="490 tests passing"/>
|
|
65
67
|
|
|
66
68
|
<br/><br/>
|
|
67
69
|
|
|
@@ -83,9 +85,7 @@ mechanical, not prompt advice: no timer, no proof, no write access.
|
|
|
83
85
|
<img src="./assets/flow-simple.svg" width="720" alt="Think → Prove → Attack → Write"/>
|
|
84
86
|
</div>
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
<video src="https://github.com/REX-codebase/fable-mode/raw/main/assets/launch-film.mp4" width="720" controls muted loop playsinline></video>
|
|
88
|
-
</div>
|
|
88
|
+
https://github.com/user-attachments/assets/27f4f8a2-b1bb-4398-a08c-bc9fd93d69d7
|
|
89
89
|
|
|
90
90
|
<br/>
|
|
91
91
|
|
|
@@ -114,22 +114,50 @@ red-team swarm for code, and a sealed record of what was verified.
|
|
|
114
114
|
pip install fable-engine
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
Or install the MCP server in your editor:
|
|
118
|
+
|
|
119
|
+
[](vscode:mcp/install?%7B%22name%22%3A%22fable-engine%22%2C%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22--from%22%2C%22fable-engine%3D%3D1.3.3%22%2C%22fable-engine%22%5D%7D)
|
|
120
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=fable-engine&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyItLWZyb20iLCJmYWJsZS1lbmdpbmU9PTEuMy4zIiwiZmFibGUtZW5naW5lIl19)
|
|
121
|
+
|
|
122
|
+
These links configure Fable Engine for AI agents in VS Code Chat or Cursor. They do not install a standalone editor extension. Both use `uvx`, which downloads and runs the pinned PyPI release in an isolated environment.
|
|
123
|
+
|
|
124
|
+
Point your agent at the MCP server manually:
|
|
118
125
|
|
|
119
126
|
```jsonc
|
|
120
|
-
// Claude Code: claude mcp add fable-engine --
|
|
127
|
+
// Claude Code: claude mcp add fable-engine -- uvx --from fable-engine==1.3.3 fable-engine
|
|
121
128
|
// Cursor: ~/.cursor/mcp.json
|
|
122
129
|
{
|
|
123
130
|
"mcpServers": {
|
|
124
131
|
"fable-engine": {
|
|
125
|
-
"command": "
|
|
126
|
-
"args": ["
|
|
132
|
+
"command": "uvx",
|
|
133
|
+
"args": ["--from", "fable-engine==1.3.3", "fable-engine"]
|
|
127
134
|
}
|
|
128
135
|
}
|
|
129
136
|
}
|
|
130
137
|
```
|
|
131
138
|
|
|
132
|
-
Python 3.10+, zero runtime dependencies.
|
|
139
|
+
Python 3.10+, zero runtime dependencies. Published on [PyPI as `fable-engine`](https://pypi.org/project/fable-engine/).
|
|
140
|
+
|
|
141
|
+
<br/>
|
|
142
|
+
|
|
143
|
+
### Optional: the Agent Skill
|
|
144
|
+
|
|
145
|
+
Installing `fable-engine` gives your agent the MCP tools. It does not install
|
|
146
|
+
or activate the Fable Mode Agent Skill - the prompt-side workflow in
|
|
147
|
+
[`skills/fable-mode`](./skills/fable-mode/SKILL.md). Nothing in the package
|
|
148
|
+
activates those instructions on its own; the skill is always a separate,
|
|
149
|
+
explicit opt-in.
|
|
150
|
+
|
|
151
|
+
The complete skill tree ships inside the wheel. To install it into your
|
|
152
|
+
project's skills directory (the cross-client `.agents/skills/` convention):
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
uvx --from fable-engine==1.3.3 fable-mode install-skill --yes
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This copies the skill to `.agents/skills/fable-mode`. Preview first with
|
|
159
|
+
`--dry-run`, choose another location with `--target <dir>`, and reload your
|
|
160
|
+
agent afterwards so it picks up the skill.
|
|
133
161
|
|
|
134
162
|
<br/>
|
|
135
163
|
|
|
@@ -155,6 +183,7 @@ Python 3.10+, zero runtime dependencies. PyPI package publishing is in progress.
|
|
|
155
183
|
- [V1 → V2 migration](./docs/fable-v1-v2-migration.md)
|
|
156
184
|
- [V2 architecture](./docs/fable-v2-architecture.md)
|
|
157
185
|
- [System 3 (experimental)](./docs/system3-architecture.md)
|
|
186
|
+
- [Stop AI coding agents from writing too early](./docs/stop-ai-agents-writing-too-early.md)
|
|
158
187
|
|
|
159
188
|
<br/>
|
|
160
189
|
|
|
@@ -7,6 +7,7 @@ pyproject.toml
|
|
|
7
7
|
setup.py
|
|
8
8
|
docs/fable-v1-v2-migration.md
|
|
9
9
|
docs/fable-v2-architecture.md
|
|
10
|
+
docs/stop-ai-agents-writing-too-early.md
|
|
10
11
|
docs/system3-architecture.md
|
|
11
12
|
fable_engine/__init__.py
|
|
12
13
|
fable_engine/browser.py
|
|
@@ -46,6 +47,7 @@ fable_mode/launcher.py
|
|
|
46
47
|
fable_mode/manifest.py
|
|
47
48
|
fable_mode/resources.json
|
|
48
49
|
fable_mode/safety.py
|
|
50
|
+
fable_mode/skill_bundle.py
|
|
49
51
|
fable_v2/__init__.py
|
|
50
52
|
fable_v2/adapters.py
|
|
51
53
|
fable_v2/execution_broker.py
|
|
@@ -146,6 +148,7 @@ tests/test_scrapers.py
|
|
|
146
148
|
tests/test_server_actions.py
|
|
147
149
|
tests/test_server_frontier_actions.py
|
|
148
150
|
tests/test_server_protocol.py
|
|
151
|
+
tests/test_skill_distribution.py
|
|
149
152
|
tests/test_stealth_browser.py
|
|
150
153
|
tests/test_system3.py
|
|
151
154
|
tests/test_system3_deep_integration.py
|
|
@@ -125,7 +125,18 @@ def _source_path(root: Path, rel: str) -> Path:
|
|
|
125
125
|
if checkout.is_file():
|
|
126
126
|
return checkout
|
|
127
127
|
return _license_path()
|
|
128
|
-
|
|
128
|
+
candidate = root / rel
|
|
129
|
+
if candidate.exists() or not rel.startswith("skills/"):
|
|
130
|
+
return candidate
|
|
131
|
+
# Wheels carry the skill tree as fable_mode package data, not beside
|
|
132
|
+
# site-packages, so portable installs from a wheel resolve it there.
|
|
133
|
+
try:
|
|
134
|
+
packaged = Path(resources.files("fable_mode").joinpath(rel))
|
|
135
|
+
if packaged.exists():
|
|
136
|
+
return packaged
|
|
137
|
+
except (OSError, TypeError, ValueError):
|
|
138
|
+
pass
|
|
139
|
+
return candidate
|
|
129
140
|
|
|
130
141
|
|
|
131
142
|
@dataclass
|
|
@@ -17,6 +17,7 @@ from pathlib import Path
|
|
|
17
17
|
from .adapters import (RegistrationError, cleanup_recorded_registrations,
|
|
18
18
|
detect_hosts, register_hosts, validate_registration_record)
|
|
19
19
|
from .installer import Installer, InstallError, verify_installation
|
|
20
|
+
from .skill_bundle import SKILL_NAME, install_skill
|
|
20
21
|
from .manifest import ALLOWED_FILES, validate_manifest
|
|
21
22
|
from . import __version__
|
|
22
23
|
|
|
@@ -251,7 +252,7 @@ def _is_frozen() -> bool:
|
|
|
251
252
|
def _parser() -> argparse.ArgumentParser:
|
|
252
253
|
p = argparse.ArgumentParser(prog="fable-mode")
|
|
253
254
|
p.add_argument("--version", action="version", version=__version__)
|
|
254
|
-
p.add_argument("mode", nargs="?", choices=("install", "serve", "verify", "version", "uninstall"), default="install")
|
|
255
|
+
p.add_argument("mode", nargs="?", choices=("install", "serve", "verify", "version", "uninstall", "install-skill"), default="install")
|
|
255
256
|
p.add_argument("--yes", action="store_true", help="confirm unattended installation")
|
|
256
257
|
p.add_argument("--register-hosts", action="store_true")
|
|
257
258
|
p.add_argument("--aliases", action="store_true", help="also probe legacy cc/antigravity aliases")
|
|
@@ -259,6 +260,8 @@ def _parser() -> argparse.ArgumentParser:
|
|
|
259
260
|
p.add_argument("--state-dir")
|
|
260
261
|
p.add_argument("--install-dir")
|
|
261
262
|
p.add_argument("--workspace")
|
|
263
|
+
p.add_argument("--target", help="skill destination directory (default: .agents/skills/fable-mode)")
|
|
264
|
+
p.add_argument("--force", action="store_true", help="overwrite foreign or locally edited skill files")
|
|
262
265
|
return p
|
|
263
266
|
|
|
264
267
|
|
|
@@ -302,6 +305,31 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
302
305
|
except (OSError, RuntimeError, ValueError) as exc:
|
|
303
306
|
print(f"serve: {exc}", file=sys.stderr)
|
|
304
307
|
return 1
|
|
308
|
+
if args.mode == "install-skill":
|
|
309
|
+
target = (Path(args.target).expanduser() if args.target
|
|
310
|
+
else Path.cwd() / ".agents" / "skills" / SKILL_NAME)
|
|
311
|
+
if not args.dry_run and not args.yes:
|
|
312
|
+
if not sys.stdin.isatty():
|
|
313
|
+
print("install-skill requires --yes in unattended mode", file=sys.stderr)
|
|
314
|
+
return 2
|
|
315
|
+
try:
|
|
316
|
+
confirmed = input(f"Install the Fable Mode Agent Skill to {target}? [y/N] ").strip().lower() in {"y", "yes"}
|
|
317
|
+
except (EOFError, KeyboardInterrupt):
|
|
318
|
+
confirmed = False
|
|
319
|
+
if not confirmed:
|
|
320
|
+
print("Skill installation cancelled.")
|
|
321
|
+
return 0
|
|
322
|
+
try:
|
|
323
|
+
result = install_skill(target, force=args.force, dry_run=args.dry_run)
|
|
324
|
+
except InstallError as exc:
|
|
325
|
+
print(f"install-skill: {exc}", file=sys.stderr)
|
|
326
|
+
return 1
|
|
327
|
+
verb = "Would install" if result.dry_run else "Installed"
|
|
328
|
+
changes = f"{len(result.installed)} new, {len(result.updated)} updated, {len(result.unchanged)} unchanged"
|
|
329
|
+
print(f"{verb} the Fable Mode Agent Skill ({result.planned} files: {changes}) to {result.target}")
|
|
330
|
+
if not result.dry_run:
|
|
331
|
+
print("Restart or reload your agent to pick up the skill.")
|
|
332
|
+
return 0
|
|
305
333
|
installer = Installer(Path(args.install_dir) if args.install_dir else None)
|
|
306
334
|
if args.mode == "verify":
|
|
307
335
|
return verify(installer)
|
|
@@ -116,6 +116,11 @@ ALLOWED_FILES: tuple[str, ...] = (
|
|
|
116
116
|
"skills/fable-mode/cortex/frontend_design.md",
|
|
117
117
|
"skills/fable-mode/cortex/research.md",
|
|
118
118
|
"skills/fable-mode/cortex/concurrency.md",
|
|
119
|
+
"skills/fable-mode/cortex/process.md",
|
|
120
|
+
"skills/fable-mode/cortex/security.md",
|
|
121
|
+
"skills/fable-mode/cortex/system.md",
|
|
122
|
+
"skills/fable-mode/cortex/target.md",
|
|
123
|
+
"skills/fable-mode/cortex/synaptic_matrix.json",
|
|
119
124
|
"LICENSE",
|
|
120
125
|
)
|
|
121
126
|
|
|
@@ -109,6 +109,11 @@
|
|
|
109
109
|
"skills/fable-mode/cortex/frontend_design.md",
|
|
110
110
|
"skills/fable-mode/cortex/research.md",
|
|
111
111
|
"skills/fable-mode/cortex/concurrency.md",
|
|
112
|
+
"skills/fable-mode/cortex/process.md",
|
|
113
|
+
"skills/fable-mode/cortex/security.md",
|
|
114
|
+
"skills/fable-mode/cortex/system.md",
|
|
115
|
+
"skills/fable-mode/cortex/target.md",
|
|
116
|
+
"skills/fable-mode/cortex/synaptic_matrix.json",
|
|
112
117
|
"LICENSE"
|
|
113
118
|
]
|
|
114
|
-
}
|
|
119
|
+
}
|