mia-code 0.2.0 → 0.3.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.
- package/.miette/260321.md +1 -0
- package/.miette/260323.md +9 -0
- package/.miette/260331.md +2 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--d3417f2c-df12-4f0f-8a1b-d88e7968f822/d3417f2c-df12-4f0f-8a1b-d88e7968f822.md +63 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--e6c3fc5d-4a70-4523-ba7d-a3250da4c235/e6c3fc5d-4a70-4523-ba7d-a3250da4c235.md +72 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--efeb00a2-b17a-4d32-b1f0-b90c37a8d24e/efeb00a2-b17a-4d32-b1f0-b90c37a8d24e.md +62 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.json +302 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.md +149 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/AGENTS.md +31 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/meta-decomposition-3-children.md +67 -0
- package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/61f9dd4d-7aa6-45e6-a58b-e480b1aa6737--from-mia-openclaw-workspace.md +125 -0
- package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/STATUS.md +1 -0
- package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.json +177 -0
- package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.md +77 -0
- package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.json +222 -0
- package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.md +99 -0
- package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.json +111 -0
- package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.md +67 -0
- package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.json +349 -0
- package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.md +147 -0
- package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.json +118 -0
- package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.md +64 -0
- package/GUILLAUME.md +8 -0
- package/KINSHIP.md +9 -0
- package/MIA_CODE_ARCHITECTURE_REPORT.md +718 -0
- package/contextual_research/260119-MIA-CODE--98090899-8aff-4e11-9dc3-8b99466d1.md +1101 -0
- package/contextual_research/MIA.md +38 -0
- package/contextual_research/MIAWAPASCONE.md +59 -0
- package/contextual_research/MIETTE.md +38 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2504.00218v2.pdf +7483 -12
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2505.00212v3.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/CONTENT.md +1014 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/DESIGN.gemini.md +242 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/INDEX.md +45 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.md +2025 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.pdf +7483 -12
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.md +1755 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_12_decomposed_prompting.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_19_hugginggpt_planning.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.md +766 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.pdf +3431 -4
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.md +260 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.md +558 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_34_hierarchical_multi_agent.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_5_open_intent_extraction.pdf +0 -0
- package/contextual_research/PODCAST.md +109 -0
- package/contextual_research/langchain-principles-roadmap.md +157 -0
- package/contextual_research/persona-to-narrative-character-inquiry_260201.md +50 -0
- package/dist/cli.js +35 -11
- package/dist/geminiHeadless.js +8 -2
- package/dist/index.js +2 -1
- package/dist/mcp/miaco-server.js +10 -1
- package/dist/mcp/miatel-server.js +10 -1
- package/dist/mcp/miawa-server.js +10 -1
- package/dist/mcp/utils.d.ts +6 -1
- package/dist/mcp/utils.js +24 -3
- package/dist/sessionStore.d.ts +8 -2
- package/dist/sessionStore.js +39 -3
- package/dist/types.d.ts +1 -0
- package/miaco/README.md +124 -0
- package/miaco/dist/commands/chart.d.ts +6 -0
- package/miaco/dist/commands/chart.d.ts.map +1 -0
- package/miaco/dist/commands/chart.js +222 -0
- package/miaco/dist/commands/chart.js.map +1 -0
- package/miaco/dist/commands/decompose.d.ts +6 -0
- package/miaco/dist/commands/decompose.d.ts.map +1 -0
- package/miaco/dist/commands/decompose.js +98 -0
- package/miaco/dist/commands/decompose.js.map +1 -0
- package/miaco/dist/commands/schema.d.ts +6 -0
- package/miaco/dist/commands/schema.d.ts.map +1 -0
- package/miaco/dist/commands/schema.js +66 -0
- package/miaco/dist/commands/schema.js.map +1 -0
- package/miaco/dist/commands/stc.d.ts +11 -0
- package/miaco/dist/commands/stc.d.ts.map +1 -0
- package/miaco/dist/commands/stc.js +590 -0
- package/miaco/dist/commands/stc.js.map +1 -0
- package/miaco/dist/commands/trace.d.ts +6 -0
- package/miaco/dist/commands/trace.d.ts.map +1 -0
- package/miaco/dist/commands/trace.js +83 -0
- package/miaco/dist/commands/trace.js.map +1 -0
- package/miaco/dist/commands/validate.d.ts +6 -0
- package/miaco/dist/commands/validate.d.ts.map +1 -0
- package/miaco/dist/commands/validate.js +58 -0
- package/miaco/dist/commands/validate.js.map +1 -0
- package/miaco/dist/decompose.d.ts +93 -0
- package/miaco/dist/decompose.d.ts.map +1 -0
- package/miaco/dist/decompose.js +562 -0
- package/miaco/dist/decompose.js.map +1 -0
- package/miaco/dist/index.d.ts +18 -0
- package/miaco/dist/index.d.ts.map +1 -0
- package/miaco/dist/index.js +83 -0
- package/miaco/dist/index.js.map +1 -0
- package/miaco/dist/storage.d.ts +60 -0
- package/miaco/dist/storage.d.ts.map +1 -0
- package/miaco/dist/storage.js +100 -0
- package/miaco/dist/storage.js.map +1 -0
- package/miaco/package-lock.json +4103 -0
- package/miaco/package.json +40 -0
- package/miaco/tsconfig.json +18 -0
- package/miaco/version-patch-commit-and-publish.sh +1 -0
- package/miatel/MISSION_251231.md +3 -0
- package/miatel/README.md +107 -0
- package/miatel/dist/commands/analyze.d.ts +6 -0
- package/miatel/dist/commands/analyze.d.ts.map +1 -0
- package/miatel/dist/commands/analyze.js +100 -0
- package/miatel/dist/commands/analyze.js.map +1 -0
- package/miatel/dist/commands/arc.d.ts +6 -0
- package/miatel/dist/commands/arc.d.ts.map +1 -0
- package/miatel/dist/commands/arc.js +71 -0
- package/miatel/dist/commands/arc.js.map +1 -0
- package/miatel/dist/commands/beat.d.ts +6 -0
- package/miatel/dist/commands/beat.d.ts.map +1 -0
- package/miatel/dist/commands/beat.js +165 -0
- package/miatel/dist/commands/beat.js.map +1 -0
- package/miatel/dist/commands/theme.d.ts +6 -0
- package/miatel/dist/commands/theme.d.ts.map +1 -0
- package/miatel/dist/commands/theme.js +54 -0
- package/miatel/dist/commands/theme.js.map +1 -0
- package/miatel/dist/index.d.ts +18 -0
- package/miatel/dist/index.d.ts.map +1 -0
- package/miatel/dist/index.js +80 -0
- package/miatel/dist/index.js.map +1 -0
- package/miatel/dist/storage.d.ts +55 -0
- package/miatel/dist/storage.d.ts.map +1 -0
- package/miatel/dist/storage.js +100 -0
- package/miatel/dist/storage.js.map +1 -0
- package/miatel/package-lock.json +4103 -0
- package/miatel/package.json +35 -0
- package/miatel/src/commands/analyze.ts +109 -0
- package/miatel/src/commands/arc.ts +78 -0
- package/miatel/src/commands/beat.ts +176 -0
- package/miatel/src/commands/theme.ts +60 -0
- package/miatel/src/index.ts +94 -0
- package/miatel/src/storage.ts +156 -0
- package/miatel/tsconfig.json +18 -0
- package/miawa/MISSION_251231.md +144 -0
- package/miawa/README.md +133 -0
- package/miawa/dist/commands/beat.d.ts +6 -0
- package/miawa/dist/commands/beat.d.ts.map +1 -0
- package/miawa/dist/commands/beat.js +69 -0
- package/miawa/dist/commands/beat.js.map +1 -0
- package/miawa/dist/commands/ceremony.d.ts +6 -0
- package/miawa/dist/commands/ceremony.d.ts.map +1 -0
- package/miawa/dist/commands/ceremony.js +239 -0
- package/miawa/dist/commands/ceremony.js.map +1 -0
- package/miawa/dist/commands/circle.d.ts +6 -0
- package/miawa/dist/commands/circle.d.ts.map +1 -0
- package/miawa/dist/commands/circle.js +75 -0
- package/miawa/dist/commands/circle.js.map +1 -0
- package/miawa/dist/commands/eva.d.ts +6 -0
- package/miawa/dist/commands/eva.d.ts.map +1 -0
- package/miawa/dist/commands/eva.js +73 -0
- package/miawa/dist/commands/eva.js.map +1 -0
- package/miawa/dist/commands/wound.d.ts +6 -0
- package/miawa/dist/commands/wound.d.ts.map +1 -0
- package/miawa/dist/commands/wound.js +74 -0
- package/miawa/dist/commands/wound.js.map +1 -0
- package/miawa/dist/index.d.ts +19 -0
- package/miawa/dist/index.d.ts.map +1 -0
- package/miawa/dist/index.js +91 -0
- package/miawa/dist/index.js.map +1 -0
- package/miawa/dist/storage.d.ts +73 -0
- package/miawa/dist/storage.d.ts.map +1 -0
- package/miawa/dist/storage.js +100 -0
- package/miawa/dist/storage.js.map +1 -0
- package/miawa/package-lock.json +4103 -0
- package/miawa/package.json +36 -0
- package/miawa/src/commands/beat.ts +74 -0
- package/miawa/src/commands/ceremony.ts +256 -0
- package/miawa/src/commands/circle.ts +83 -0
- package/miawa/src/commands/eva.ts +84 -0
- package/miawa/src/commands/wound.ts +79 -0
- package/miawa/src/index.ts +108 -0
- package/miawa/src/storage.ts +179 -0
- package/miawa/tsconfig.json +18 -0
- package/package.json +7 -5
- package/references/acp/CLAUDE.md +7 -0
- package/references/acp/agent-plan.md +84 -0
- package/references/acp/clients.md +31 -0
- package/references/acp/extensibility.md +137 -0
- package/references/acp/initialization.md +225 -0
- package/references/acp/prompt-turn.md +321 -0
- package/references/acp/proxy-chains.md +562 -0
- package/references/acp/schema.md +3171 -0
- package/references/acp/session-list.md +334 -0
- package/references/acp/session-modes.md +170 -0
- package/references/acp/slash-commands.md +99 -0
- package/references/acp/terminals.md +281 -0
- package/references/acp/tool-calls.md +311 -0
- package/references/acp/typescript.md +29 -0
- package/references/claude/agent-teams.md +399 -0
- package/references/claude/chrome.md +231 -0
- package/references/claude/headless.md +158 -0
- package/references/claude/hooks-guide.md +708 -0
- package/references/claude/output-styles.md +112 -0
- package/references/claude/plugins.md +432 -0
- package/references/claude/skills.md +693 -0
- package/references/claude/sub-agents.md +816 -0
- package/references/copilot/acp/agents.md +32 -0
- package/references/copilot/acp/architecture.md +37 -0
- package/references/copilot/acp/clients.md +31 -0
- package/references/copilot/acp/introduction.md +42 -0
- package/references/copilot/acp/registry.md +339 -0
- package/references/copilot/acp-server.md +117 -0
- package/references/copilot/create-copilot-instructions.md +840 -0
- package/references/langchain/llms.txt +833 -0
- package/references/langchain/python/agents.md +677 -0
- package/references/langchain/python/context-engineering.md +1195 -0
- package/references/langchain/python/human-in-the-loop.md +326 -0
- package/references/langchain/python/long-term-memory.md +168 -0
- package/references/langchain/python/mcp.md +949 -0
- package/references/langchain/python/multi-agents/custom-workflow.md +187 -0
- package/references/langchain/python/multi-agents/handoffs.md +436 -0
- package/references/langchain/python/multi-agents/overview.md +295 -0
- package/references/langchain/python/multi-agents/router.md +150 -0
- package/references/langchain/python/multi-agents/skills.md +92 -0
- package/references/langchain/python/multi-agents/subagents.md +486 -0
- package/references/langchain/python/retrieval.md +320 -0
- package/references/langchain/python/runtime.md +141 -0
- package/references/langchain/python/short-term-memory.md +658 -0
- package/references/langchain/python/structured-output.md +712 -0
- package/references/langfuse/llms.txt +148 -0
- package/references/langgraph/javascript/llms.txt +275 -0
- package/references/skills/home.md +259 -0
- package/references/skills/integrate-skills.md +103 -0
- package/references/skills/specification.md +254 -0
- package/references/skills/what-are-skills.md +74 -0
- package/rispecs/README.md +164 -0
- package/rispecs/_sync_/miadi-code/SPEC.md +313 -0
- package/rispecs/_sync_/miadi-code/STATUS.md +177 -0
- package/rispecs/_sync_/miadi-code/dashboard/SPEC.md +465 -0
- package/rispecs/_sync_/miadi-code/dashboard/STATUS.md +212 -0
- package/rispecs/_sync_/miadi-code/multiline-input/SPEC.md +232 -0
- package/rispecs/_sync_/miadi-code/multiline-input/STATUS.md +108 -0
- package/rispecs/_sync_/miadi-code/pde/SPEC.md +253 -0
- package/rispecs/_sync_/miadi-code/pde/STATUS.md +56 -0
- package/rispecs/_sync_/miadi-code/stc/SPEC.md +397 -0
- package/rispecs/_sync_/miadi-code/stc/STATUS.md +70 -0
- package/rispecs/ava-langstack/inquiry-routing-upgrade.spec.md +119 -0
- package/rispecs/borrowed_from_opencode/001-client-server-architecture.rispec.md +98 -0
- package/rispecs/borrowed_from_opencode/002-event-bus-system.rispec.md +125 -0
- package/rispecs/borrowed_from_opencode/003-instance-state-pattern.rispec.md +136 -0
- package/rispecs/borrowed_from_opencode/004-namespace-module-pattern.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/005-zod-schema-validation.rispec.md +139 -0
- package/rispecs/borrowed_from_opencode/006-named-error-system.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/007-structured-logging.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/008-lazy-initialization.rispec.md +127 -0
- package/rispecs/borrowed_from_opencode/009-multi-agent-system.rispec.md +97 -0
- package/rispecs/borrowed_from_opencode/010-agent-definition-config.rispec.md +135 -0
- package/rispecs/borrowed_from_opencode/011-agent-permission-rulesets.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/012-agent-prompt-templates.rispec.md +141 -0
- package/rispecs/borrowed_from_opencode/013-agent-generation.rispec.md +142 -0
- package/rispecs/borrowed_from_opencode/014-plan-build-mode-toggle.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/015-subagent-task-delegation.rispec.md +146 -0
- package/rispecs/borrowed_from_opencode/016-agent-model-selection.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/017-compaction-agent.rispec.md +150 -0
- package/rispecs/borrowed_from_opencode/018-session-persistence.rispec.md +125 -0
- package/rispecs/borrowed_from_opencode/019-session-compaction.rispec.md +132 -0
- package/rispecs/borrowed_from_opencode/020-session-forking.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/021-session-revert-snapshot.rispec.md +135 -0
- package/rispecs/borrowed_from_opencode/022-session-sharing.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/023-session-summary-diffs.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/024-child-sessions.rispec.md +164 -0
- package/rispecs/borrowed_from_opencode/025-session-title-generation.rispec.md +162 -0
- package/rispecs/borrowed_from_opencode/026-message-parts-model.rispec.md +201 -0
- package/rispecs/borrowed_from_opencode/027-streaming-message-deltas.rispec.md +212 -0
- package/rispecs/borrowed_from_opencode/028-multi-provider-architecture.rispec.md +184 -0
- package/rispecs/borrowed_from_opencode/029-provider-authentication.rispec.md +225 -0
- package/rispecs/borrowed_from_opencode/030-model-registry.rispec.md +222 -0
- package/rispecs/borrowed_from_opencode/031-cost-tracking.rispec.md +243 -0
- package/rispecs/borrowed_from_opencode/032-provider-transform-pipeline.rispec.md +282 -0
- package/rispecs/borrowed_from_opencode/033-provider-sdk-abstraction.rispec.md +338 -0
- package/rispecs/borrowed_from_opencode/034-tool-registry.rispec.md +110 -0
- package/rispecs/borrowed_from_opencode/035-tool-context-injection.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/036-tool-output-truncation.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/037-batch-tool.rispec.md +129 -0
- package/rispecs/borrowed_from_opencode/038-multi-edit-tool.rispec.md +167 -0
- package/rispecs/borrowed_from_opencode/039-apply-patch-tool.rispec.md +161 -0
- package/rispecs/borrowed_from_opencode/040-code-search-tool.rispec.md +143 -0
- package/rispecs/borrowed_from_opencode/041-web-fetch-tool.rispec.md +131 -0
- package/rispecs/borrowed_from_opencode/042-web-search-tool.rispec.md +159 -0
- package/rispecs/borrowed_from_opencode/043-todo-tool.rispec.md +156 -0
- package/rispecs/borrowed_from_opencode/044-plan-mode-tool.rispec.md +139 -0
- package/rispecs/borrowed_from_opencode/045-task-tool.rispec.md +146 -0
- package/rispecs/borrowed_from_opencode/046-question-tool.rispec.md +170 -0
- package/rispecs/borrowed_from_opencode/047-external-directory-tool.rispec.md +166 -0
- package/rispecs/borrowed_from_opencode/048-file-read-write-tools.rispec.md +205 -0
- package/rispecs/borrowed_from_opencode/049-lsp-server-management.rispec.md +104 -0
- package/rispecs/borrowed_from_opencode/050-lsp-hover-completion.rispec.md +102 -0
- package/rispecs/borrowed_from_opencode/051-lsp-diagnostics.rispec.md +86 -0
- package/rispecs/borrowed_from_opencode/052-lsp-root-detection.rispec.md +109 -0
- package/rispecs/borrowed_from_opencode/053-remote-mcp-servers.rispec.md +119 -0
- package/rispecs/borrowed_from_opencode/054-mcp-oauth-flow.rispec.md +107 -0
- package/rispecs/borrowed_from_opencode/055-mcp-tool-conversion.rispec.md +118 -0
- package/rispecs/borrowed_from_opencode/056-mcp-connection-monitoring.rispec.md +106 -0
- package/rispecs/borrowed_from_opencode/057-local-mcp-servers.rispec.md +116 -0
- package/rispecs/borrowed_from_opencode/058-rich-tui.rispec.md +108 -0
- package/rispecs/borrowed_from_opencode/059-streaming-display.rispec.md +116 -0
- package/rispecs/borrowed_from_opencode/060-permission-prompts.rispec.md +130 -0
- package/rispecs/borrowed_from_opencode/061-session-navigation.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/062-syntax-highlighting.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/063-keybinding-system.rispec.md +181 -0
- package/rispecs/borrowed_from_opencode/064-multi-level-config.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/065-jsonc-config.rispec.md +190 -0
- package/rispecs/borrowed_from_opencode/066-config-env-variables.rispec.md +153 -0
- package/rispecs/borrowed_from_opencode/067-config-deep-merging.rispec.md +178 -0
- package/rispecs/borrowed_from_opencode/068-remote-org-config.rispec.md +183 -0
- package/rispecs/borrowed_from_opencode/069-config-markdown-frontmatter.rispec.md +206 -0
- package/rispecs/borrowed_from_opencode/070-managed-config-directory.rispec.md +232 -0
- package/rispecs/borrowed_from_opencode/071-plugin-architecture.rispec.md +104 -0
- package/rispecs/borrowed_from_opencode/072-plugin-hooks.rispec.md +123 -0
- package/rispecs/borrowed_from_opencode/073-plugin-auto-install.rispec.md +115 -0
- package/rispecs/borrowed_from_opencode/074-permission-system.rispec.md +133 -0
- package/rispecs/borrowed_from_opencode/075-git-worktree-management.rispec.md +126 -0
- package/rispecs/borrowed_from_opencode/076-snapshot-system.rispec.md +124 -0
- package/rispecs/borrowed_from_opencode/077-snapshot-diff.rispec.md +117 -0
- package/rispecs/borrowed_from_opencode/078-snapshot-restore.rispec.md +128 -0
- package/rispecs/borrowed_from_opencode/079-worktree-branch-naming.rispec.md +122 -0
- package/rispecs/borrowed_from_opencode/080-sqlite-storage.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/081-database-migrations.rispec.md +148 -0
- package/rispecs/borrowed_from_opencode/082-database-transactions.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/083-deferred-effects.rispec.md +148 -0
- package/rispecs/borrowed_from_opencode/084-permission-rules.rispec.md +123 -0
- package/rispecs/borrowed_from_opencode/085-permission-glob-patterns.rispec.md +113 -0
- package/rispecs/borrowed_from_opencode/086-permission-merging.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/087-permission-modes.rispec.md +145 -0
- package/rispecs/borrowed_from_opencode/088-http-api-server.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/089-openapi-spec-generation.rispec.md +164 -0
- package/rispecs/borrowed_from_opencode/090-websocket-support.rispec.md +136 -0
- package/rispecs/borrowed_from_opencode/091-sse-streaming.rispec.md +168 -0
- package/rispecs/borrowed_from_opencode/092-mdns-discovery.rispec.md +145 -0
- package/rispecs/borrowed_from_opencode/093-javascript-sdk.rispec.md +200 -0
- package/rispecs/borrowed_from_opencode/094-skill-system.rispec.md +187 -0
- package/rispecs/borrowed_from_opencode/095-skill-discovery.rispec.md +182 -0
- package/rispecs/borrowed_from_opencode/096-desktop-remote-driving.rispec.md +175 -0
- package/rispecs/borrowed_from_opencode/INDEX.md +255 -0
- package/rispecs/core.rispecs.md +261 -0
- package/rispecs/engines.rispecs.md +241 -0
- package/rispecs/formatting.rispecs.md +252 -0
- package/rispecs/living-specifications.rispecs.md +361 -0
- package/rispecs/mcp.rispecs.md +197 -0
- package/rispecs/pde.rispecs.md +399 -0
- package/rispecs/pi-mono-envisionning/ENVISIONING.md +366 -0
- package/rispecs/pi-mono-envisionning/storytelling-horizon.rispecs.md +76 -0
- package/rispecs/pi-mono-envisionning/widget.rispecs.md +2 -0
- package/rispecs/relation-to-mcp-structural-thinking.kin.md +72 -0
- package/rispecs/research-for-better-framework/CLAUDE.md +7 -0
- package/rispecs/research-for-better-framework/survey-pi-openclaw-opencode-openhands.md +210 -0
- package/rispecs/session.rispecs.md +277 -0
- package/rispecs/stc.rispecs.md +138 -0
- package/rispecs/unifier.rispecs.md +317 -0
- package/scripts/LAUNCH--mcp-mia-code--testing--2603141315--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +2 -0
- package/scripts/RESUME--mia-code--mcps--260313--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +1 -0
- package/scripts/install-widget-in-home-pi-agent-extensions.sh +4 -0
- package/scripts/sample-decompose--2604011535-prompt.sh +1 -0
- package/skills/deep-search/AGENTS.md +17 -0
- package/skills/deep-search/SKILL.md +281 -0
- package/skills/deep-search/agent-templates.md +224 -0
- package/skills/deep-search/orchestration-patterns.md +95 -0
- package/skills/miaco-pde-inquiry-routing-deep-search/AGENTS.md +13 -0
- package/skills/miaco-pde-inquiry-routing-deep-search/SKILL.md +136 -0
- package/skills/miaco-pde-inquiry-routing-internal-external-relationship/AGENTS.md +4 -0
- package/skills/miaco-pde-inquiry-routing-internal-external-relationship/SKILL.md +157 -0
- package/skills/miaco-pde-inquiry-routing-local-qmd/AGENTS.md +42 -0
- package/skills/miaco-pde-inquiry-routing-local-qmd/SKILL.md +135 -0
- package/skills/qmd/AGENTS.md +3 -0
- package/skills/qmd/SKILL.md +144 -0
- package/skills/qmd/references/mcp-setup.md +102 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/SKILL.md +234 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/agent-templates.md +436 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/orchestration-patterns.md +197 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/ceremonial-technology.md +102 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/creative-orientation.md +99 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/prompt-decomposition.md +73 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/rise-framework.md +74 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/structural-tension.md +82 -0
- package/src/cli.ts +35 -11
- package/src/geminiHeadless.ts +7 -2
- package/src/index.ts +2 -1
- package/src/mcp/miaco-server.ts +13 -1
- package/src/mcp/miatel-server.ts +13 -1
- package/src/mcp/miawa-server.ts +13 -1
- package/src/mcp/utils.ts +41 -8
- package/src/sessionStore.ts +44 -4
- package/src/types.ts +2 -1
- package/widget/mia-ceremony/README.md +36 -0
- package/widget/mia-ceremony/index.ts +143 -0
- package/widget/mia-interceptor/README.md +39 -0
- package/widget/mia-interceptor/index.ts +221 -0
- package/widget/mia-tools/README.md +37 -0
- package/widget/mia-tools/index.ts +569 -0
- package/widget/miette-echo/README.md +44 -0
- package/widget/miette-echo/index.ts +164 -0
- package/.claude/settings.local.json +0 -9
- package/.hch/issue_.env +0 -4
- package/.hch/issue_add__2601211715.json +0 -77
- package/.hch/issue_add__2601211715.md +0 -4
- package/.hch/issue_add__2602242020.json +0 -78
- package/.hch/issue_add__2602242020.md +0 -7
- package/.hch/issues.json +0 -2312
- package/.hch/issues.md +0 -30
- package/WS__mia-code__260214__IAIP_PDE.code-workspace +0 -29
- package/WS__mia-code__src332__260122.code-workspace +0 -23
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/checkpoints/index.md +0 -6
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/events.jsonl +0 -213
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/plan.md +0 -243
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/workspace.yaml +0 -5
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# RISE-083: Deferred Effects
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/083-deferred-effects.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
Side effects — event publishing, cache invalidation, file operations, notifications — are separated from database mutations and executed only after the data is safely committed. This eliminates an entire class of consistency bugs: no event about a session that wasn't persisted, no cache invalidation for a write that rolled back, no notification about an action that never completed.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code performs side effects inline with data mutations — no separation of concerns
|
|
14
|
+
- If a JSON write fails mid-operation, any events or notifications already fired cannot be retracted
|
|
15
|
+
- Cache state can become stale if a write operation partially succeeds
|
|
16
|
+
- No mechanism exists to queue side effects and conditionally execute them
|
|
17
|
+
- Event publishing and data persistence are tightly coupled — testing either in isolation is difficult
|
|
18
|
+
- Concurrent operations can interleave mutations and effects in unpredictable order
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Side effects are registered during transactions via `tx.effect()` but not executed until commit
|
|
22
|
+
- If the transaction rolls back, all registered effects are silently discarded
|
|
23
|
+
- Effects execute in registration order after the transaction successfully commits
|
|
24
|
+
- Effect errors are logged but never cause transaction rollback (effects are post-commit)
|
|
25
|
+
- The pattern is consistent and enforced — all side effects go through the deferred mechanism
|
|
26
|
+
- Testing is simplified: verify mutations and effects independently
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
Within a transaction, code registers three effects: publish a `session.created` event, invalidate the session list cache, and write an audit log entry. The transaction commits — all three effects execute in order. In another case, the transaction fails on the second insert — the transaction rolls back and none of the three effects execute. The system is always consistent.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Effect Registration
|
|
35
|
+
|
|
36
|
+
Within a transaction, effects are registered using `tx.effect()`:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
await db.transaction(async (tx) => {
|
|
40
|
+
const session = { id: "abc", root: "/project" };
|
|
41
|
+
|
|
42
|
+
await tx.run("INSERT INTO sessions ...", [session.id, session.root]);
|
|
43
|
+
|
|
44
|
+
// Effect 1: Publish event
|
|
45
|
+
tx.effect(() => {
|
|
46
|
+
Bus.publish("session.created", session);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Effect 2: Invalidate cache
|
|
50
|
+
tx.effect(() => {
|
|
51
|
+
sessionCache.invalidate(session.root);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Effect 3: Audit log
|
|
55
|
+
tx.effect(() => {
|
|
56
|
+
auditLog.write("session_created", session.id);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await tx.run("INSERT INTO messages ...", [msgId, session.id]);
|
|
60
|
+
});
|
|
61
|
+
// All three effects execute here, in order, only if transaction committed
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Effect Types
|
|
65
|
+
|
|
66
|
+
Effects can encapsulate any side effect:
|
|
67
|
+
|
|
68
|
+
**Event Publishing** — the most common effect. Ensures events about data changes only fire after the data is persisted:
|
|
69
|
+
```typescript
|
|
70
|
+
tx.effect(() => Bus.publish("message.added", { sessionId, messageId }));
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Cache Invalidation** — ensures caches are invalidated only after the underlying data actually changed:
|
|
74
|
+
```typescript
|
|
75
|
+
tx.effect(() => queryCache.delete(`sessions:${projectRoot}`));
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**File Operations** — ensures files are only written/modified after the database records the intent:
|
|
79
|
+
```typescript
|
|
80
|
+
tx.effect(() => fs.writeFileSync(exportPath, sessionExport));
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Notifications** — ensures users/plugins are notified only about completed operations:
|
|
84
|
+
```typescript
|
|
85
|
+
tx.effect(() => pluginManager.notify("session.created", sessionData));
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**UI Updates** — ensures the interface reflects committed state:
|
|
89
|
+
```typescript
|
|
90
|
+
tx.effect(() => tui.refresh("session-list"));
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Execution Semantics
|
|
94
|
+
|
|
95
|
+
1. **Registration:** `tx.effect(callback)` appends the callback to an internal queue. No execution occurs.
|
|
96
|
+
2. **On commit:** After the SQL transaction commits, iterate the queue and execute each callback in order.
|
|
97
|
+
3. **On rollback:** Discard the entire queue. No callbacks execute. No logging needed.
|
|
98
|
+
4. **Error handling:** If an effect callback throws, catch the error, log it with context, and continue to the next effect. Effects are best-effort — they cannot retroactively undo the committed transaction.
|
|
99
|
+
|
|
100
|
+
### Error Isolation
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
await db.transaction(async (tx) => {
|
|
104
|
+
await tx.run("INSERT INTO sessions ...");
|
|
105
|
+
|
|
106
|
+
tx.effect(() => {
|
|
107
|
+
throw new Error("Event bus unavailable");
|
|
108
|
+
// This error is caught and logged
|
|
109
|
+
// Does NOT rollback the transaction
|
|
110
|
+
// Does NOT prevent subsequent effects
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
tx.effect(() => {
|
|
114
|
+
sessionCache.invalidate(root);
|
|
115
|
+
// This still executes even if the previous effect failed
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
// Transaction committed. First effect logged error. Second effect ran.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Implementation
|
|
122
|
+
|
|
123
|
+
The `Transaction` class maintains an internal effect queue. `effect()` appends callbacks; `commit()` executes them in order after SQL commit (catching and logging errors); `rollback()` discards the queue. Effects registered within savepoints follow the savepoint's fate — if a savepoint rolls back, its effects are discarded while the outer transaction's effects remain.
|
|
124
|
+
|
|
125
|
+
### Testing
|
|
126
|
+
|
|
127
|
+
Deferred effects simplify testing by separating mutations from triggers. Test data inserts independently from event assertions — verify the transaction wrote correct rows, then separately verify the correct events fired after commit.
|
|
128
|
+
|
|
129
|
+
## Supporting Structures
|
|
130
|
+
|
|
131
|
+
- **Database Transactions (RISE-082)** provides the transactional context where effects are registered
|
|
132
|
+
- **Event Bus (RISE-002)** is the primary consumer of deferred effects for event publishing
|
|
133
|
+
- **SQLite Storage (RISE-080)** provides the database layer that commits trigger effect execution
|
|
134
|
+
- **Structured Logging (RISE-007)** records effect failures for debugging
|
|
135
|
+
|
|
136
|
+
## Creative Advancement Scenarios
|
|
137
|
+
|
|
138
|
+
**Scenario 1 — Consistent Event Publishing:**
|
|
139
|
+
A session is created in a transaction. The `session.created` event is deferred. Mid-transaction, the message insert fails due to a constraint violation. The transaction rolls back. The event never fires. No UI component, no plugin, no logger ever learns about a session that doesn't exist.
|
|
140
|
+
|
|
141
|
+
**Scenario 2 — Cache Coherence:**
|
|
142
|
+
A batch update modifies 50 messages within a transaction. Cache invalidation is deferred. If the batch fails at message #30, the cache is never invalidated — it still holds the correct (pre-update) data. If the batch succeeds, the cache is invalidated once (not 50 times).
|
|
143
|
+
|
|
144
|
+
**Scenario 3 — Plugin Notification Safety:**
|
|
145
|
+
A plugin subscribes to `session.created` events. The deferred effect ensures the plugin only receives the event after the session is queryable in the database. The plugin can immediately call `db.get("SELECT * FROM sessions WHERE id = ?")` and find the session — guaranteed.
|
|
146
|
+
|
|
147
|
+
**Scenario 4 — Effect Error Resilience:**
|
|
148
|
+
An audit logging service is down. The deferred effect that writes to the audit log throws. The error is logged locally. The next effect (cache invalidation) runs normally. The committed transaction is unaffected. When the audit service recovers, the gap is acceptable — effects are best-effort.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# RISE-084: Permission Rules
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/084-permission-rules.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code gives developers explicit, composable control over what an agent is allowed to do. Each permission rule is a small declarative statement — a single fact about what is permitted, denied, or worth asking about. By stacking these rules into an ordered array, a developer builds a security posture that fits their exact workflow without reaching for a `--yolo` flag or manually approving every action.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code relies on the `--yolo` flag to bypass all safety prompts — it is all-or-nothing
|
|
14
|
+
- Without `--yolo`, every write and bash operation triggers an interactive confirmation
|
|
15
|
+
- There is no way to express "allow writes to test files but ask for production files"
|
|
16
|
+
- Permission logic is scattered across tool execution paths with ad-hoc checks
|
|
17
|
+
- Developers who trust the agent for some tasks but not others have no middle ground
|
|
18
|
+
- No concept of a permission rule as a data structure — decisions are hardcoded behavior
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Each permission is a typed rule object: `{permission: string, pattern?: string, action: "allow"|"deny"|"ask"}`
|
|
22
|
+
- Rules are stored as an ordered array — evaluation is first-match-wins, like firewall rules
|
|
23
|
+
- Permission names map to tool IDs or resource categories: "read", "write", "edit", "bash", "external_directory", "question", plus any registered tool ID
|
|
24
|
+
- A default ruleset provides a reasonable security baseline out of the box
|
|
25
|
+
- Custom rules in project or global config override defaults naturally
|
|
26
|
+
- Rules are composable: a developer adds one rule to change one behavior without touching the rest
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
An agent attempting any action is checked against an ordered array of permission rules. The first rule whose permission name and optional pattern match the action determines the outcome: allow silently, deny silently, or ask the user. Developers configure rules declaratively in config files without writing code.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Rule Structure
|
|
35
|
+
|
|
36
|
+
A permission rule is a plain object with three required fields and one optional field:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
interface PermissionRule {
|
|
40
|
+
permission: string // tool ID or category: "read", "write", "edit", "bash", "external_directory", "question", or any tool ID
|
|
41
|
+
pattern?: string // optional glob pattern scoping the rule to specific paths or commands
|
|
42
|
+
action: "allow" | "deny" | "ask" // what happens when this rule matches
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Default Rules
|
|
47
|
+
|
|
48
|
+
When no custom rules are configured, mia-code applies this baseline:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
[
|
|
52
|
+
{"permission": "read", "action": "allow"},
|
|
53
|
+
{"permission": "write", "action": "ask"},
|
|
54
|
+
{"permission": "edit", "action": "ask"},
|
|
55
|
+
{"permission": "bash", "action": "ask"},
|
|
56
|
+
{"permission": "external_directory", "action": "deny"},
|
|
57
|
+
{"permission": "question", "action": "allow"}
|
|
58
|
+
]
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This default is conservative: reading and asking questions are safe, writing and bash require approval, and accessing directories outside the project is blocked.
|
|
62
|
+
|
|
63
|
+
### Evaluation Algorithm
|
|
64
|
+
|
|
65
|
+
When the agent invokes a tool, the permission system:
|
|
66
|
+
|
|
67
|
+
1. Identifies the permission name (tool ID or mapped category)
|
|
68
|
+
2. Determines the target (file path, command string, or directory)
|
|
69
|
+
3. Iterates through the rule array in order
|
|
70
|
+
4. For each rule: if the permission name matches AND (no pattern OR pattern matches target), this rule applies
|
|
71
|
+
5. Returns the action from the first matching rule
|
|
72
|
+
6. If no rule matches, the default action is "ask"
|
|
73
|
+
|
|
74
|
+
First-match-wins means rule ordering matters. More specific rules go before general ones.
|
|
75
|
+
|
|
76
|
+
### Rule Examples
|
|
77
|
+
|
|
78
|
+
- `{"permission": "bash", "pattern": "rm *", "action": "deny"}` — blocks destructive bash commands
|
|
79
|
+
- `{"permission": "write", "pattern": "*.test.ts", "action": "allow"}` — auto-allows writing test files
|
|
80
|
+
- `{"permission": "write", "pattern": "src/**/*.ts", "action": "allow"}` — auto-allows all TypeScript writes in src
|
|
81
|
+
- `{"permission": "bash", "pattern": "npm test*", "action": "allow"}` — auto-allows running tests
|
|
82
|
+
- `{"permission": "external_directory", "pattern": "/tmp/**", "action": "allow"}` — allows access to temp directory
|
|
83
|
+
- `{"permission": "edit", "action": "allow"}` — blanket allow all edits (placed last as a catch-all)
|
|
84
|
+
|
|
85
|
+
### Configuration
|
|
86
|
+
|
|
87
|
+
Rules are specified in mia-code config under the `permissions` key:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"permissions": {
|
|
92
|
+
"rules": [
|
|
93
|
+
{"permission": "write", "pattern": "*.test.ts", "action": "allow"},
|
|
94
|
+
{"permission": "bash", "pattern": "rm *", "action": "deny"},
|
|
95
|
+
{"permission": "bash", "pattern": "npm *", "action": "allow"}
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Custom rules are prepended to the default rules, so they take priority by virtue of position.
|
|
102
|
+
|
|
103
|
+
## Supporting Structures
|
|
104
|
+
|
|
105
|
+
- **Permission Glob Patterns (RISE-085)** defines the glob matching syntax used in rule patterns
|
|
106
|
+
- **Permission Merging (RISE-086)** defines how rules from multiple sources combine into one effective ruleset
|
|
107
|
+
- **Permission Modes (RISE-087)** defines the three action modes and their user interaction behavior
|
|
108
|
+
- **Zod Schema Validation (RISE-005)** validates rule objects at configuration load time
|
|
109
|
+
- **Named Error System (RISE-006)** provides typed errors for permission denials
|
|
110
|
+
|
|
111
|
+
## Creative Advancement Scenarios
|
|
112
|
+
|
|
113
|
+
**Scenario 1 — Test-Driven Trust:**
|
|
114
|
+
A developer adds `{"permission": "write", "pattern": "*.test.ts", "action": "allow"}` and `{"permission": "bash", "pattern": "npm test", "action": "allow"}` to their project config. The agent writes and runs tests freely but still asks before modifying production code. Trust is earned incrementally.
|
|
115
|
+
|
|
116
|
+
**Scenario 2 — Locked-Down Production:**
|
|
117
|
+
A team adds `{"permission": "bash", "pattern": "rm *", "action": "deny"}` and `{"permission": "write", "pattern": "*.env*", "action": "deny"}` to the global config. No agent on any project can delete files or modify environment files, regardless of other settings.
|
|
118
|
+
|
|
119
|
+
**Scenario 3 — Progressive Relaxation:**
|
|
120
|
+
A new developer starts with all defaults. Over time they add allow rules for specific patterns they trust. Their permission config becomes a document of what they've learned to trust — a personal security policy that grows with experience.
|
|
121
|
+
|
|
122
|
+
**Scenario 4 — Per-Tool Precision:**
|
|
123
|
+
A developer creates rules using specific tool IDs: `{"permission": "grep", "action": "allow"}`, `{"permission": "glob", "action": "allow"}`, `{"permission": "bash", "pattern": "git *", "action": "allow"}`. Each tool gets its own permission treatment.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# RISE-085: Permission Glob Patterns
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/085-permission-glob-patterns.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code uses file-path glob patterns to give developers surgical precision over permission scoping. Instead of blanket allow-or-deny, a developer writes a pattern like `src/**/*.test.ts` and the rule applies only to test files under src. Glob syntax is the universal language developers already know from `.gitignore`, shell expansion, and build tools — no new DSL to learn, no regex complexity to debug.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has no pattern-based permission scoping — permissions are all-or-nothing per tool
|
|
14
|
+
- Developers cannot distinguish between "write to test files" and "write to production files"
|
|
15
|
+
- Bash command filtering does not exist — any bash command is treated the same
|
|
16
|
+
- The `--yolo` flag removes all checks; without it, every action of the same type gets the same treatment
|
|
17
|
+
- No glob matching library is integrated for permission purposes
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- Permission rules accept an optional `pattern` field containing a glob expression
|
|
21
|
+
- Glob patterns match against file paths (for read/write/edit), command strings (for bash), and directory paths (for external_directory)
|
|
22
|
+
- Standard glob syntax is used: `*`, `**`, `?`, `{a,b}`, negation via `!`
|
|
23
|
+
- Pattern matching is efficient and cached — no performance penalty on hot paths
|
|
24
|
+
- A rule without a pattern matches all targets universally (acts as a catch-all)
|
|
25
|
+
- Case sensitivity follows the platform convention: case-insensitive on macOS/Windows, case-sensitive on Linux
|
|
26
|
+
|
|
27
|
+
## Desired Outcome Definition
|
|
28
|
+
|
|
29
|
+
When a permission rule includes a `pattern` field, the pattern is evaluated against the relevant target string (file path, command, or directory). The glob syntax supports the same wildcards developers use in `.gitignore` and shell scripts. Matching is fast, correct, and platform-aware.
|
|
30
|
+
|
|
31
|
+
## Natural Language Functional Description
|
|
32
|
+
|
|
33
|
+
### Glob Syntax Reference
|
|
34
|
+
|
|
35
|
+
| Pattern | Meaning | Example Match |
|
|
36
|
+
|------------|----------------------------------------------|--------------------------------|
|
|
37
|
+
| `*` | Any characters within a single path segment | `*.ts` matches `foo.ts` |
|
|
38
|
+
| `**` | Any characters across multiple path segments | `src/**/*.ts` matches `src/a/b/c.ts` |
|
|
39
|
+
| `?` | Exactly one character | `?.ts` matches `a.ts` |
|
|
40
|
+
| `{a,b}` | Alternatives — matches either `a` or `b` | `*.{ts,js}` matches both |
|
|
41
|
+
| `!pattern` | Negation — excludes matches | `!node_modules/**` excludes |
|
|
42
|
+
|
|
43
|
+
### Target Types
|
|
44
|
+
|
|
45
|
+
Patterns are matched against different targets depending on the permission category:
|
|
46
|
+
|
|
47
|
+
- **read / write / edit**: matched against the file path relative to the project root. Example: `src/utils/helper.ts`.
|
|
48
|
+
- **bash**: matched against the full command string. Example: `npm test --watch`.
|
|
49
|
+
- **external_directory**: matched against the absolute directory path. Example: `/home/user/other-project`.
|
|
50
|
+
|
|
51
|
+
### Matching Algorithm
|
|
52
|
+
|
|
53
|
+
1. Receive the target string (file path, command, or directory path)
|
|
54
|
+
2. Normalize path separators to forward slashes for cross-platform consistency
|
|
55
|
+
3. If the rule has no pattern, it matches (universal rule)
|
|
56
|
+
4. If the pattern starts with `!`, invert the match result
|
|
57
|
+
5. Apply glob matching using micromatch or picomatch semantics
|
|
58
|
+
6. Return boolean: does this pattern match the target?
|
|
59
|
+
|
|
60
|
+
### Path Normalization
|
|
61
|
+
|
|
62
|
+
Before matching, paths are normalized:
|
|
63
|
+
|
|
64
|
+
- Backslashes converted to forward slashes (`\` → `/`)
|
|
65
|
+
- Trailing slashes removed
|
|
66
|
+
- Relative paths resolved against the project root
|
|
67
|
+
- `./` prefix stripped if present
|
|
68
|
+
- No symlink resolution — match against the literal path
|
|
69
|
+
|
|
70
|
+
### Case Sensitivity
|
|
71
|
+
|
|
72
|
+
- **Linux**: case-sensitive matching (default)
|
|
73
|
+
- **macOS**: case-insensitive matching (HFS+ / APFS default)
|
|
74
|
+
- **Windows**: case-insensitive matching (NTFS default)
|
|
75
|
+
|
|
76
|
+
The platform is detected at startup. Override via config: `{"permissions": {"caseSensitive": true}}`.
|
|
77
|
+
|
|
78
|
+
### Pattern Examples for Common Scenarios
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
*.env → matches .env, production.env, .env.local
|
|
82
|
+
src/**/*.ts → matches any .ts file at any depth under src/
|
|
83
|
+
!node_modules/** → excludes everything under node_modules
|
|
84
|
+
*.{test,spec}.ts → matches foo.test.ts, bar.spec.ts
|
|
85
|
+
rm * → matches bash commands starting with "rm "
|
|
86
|
+
git push* → matches "git push", "git push origin main"
|
|
87
|
+
/tmp/** → matches any path under /tmp
|
|
88
|
+
**/*.secret → matches any .secret file anywhere
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### No Pattern Behavior
|
|
92
|
+
|
|
93
|
+
When a permission rule omits the `pattern` field, the rule applies to every target for that permission category. This is the catch-all case — useful for broad defaults like `{"permission": "read", "action": "allow"}` where no path filtering is needed.
|
|
94
|
+
|
|
95
|
+
## Supporting Structures
|
|
96
|
+
|
|
97
|
+
- **Permission Rules (RISE-084)** defines the rule structure that contains optional patterns
|
|
98
|
+
- **Permission Merging (RISE-086)** controls how pattern-bearing rules from multiple sources combine
|
|
99
|
+
- **Namespace Module Pattern (RISE-004)** organizes the glob matching utility under a permissions namespace
|
|
100
|
+
|
|
101
|
+
## Creative Advancement Scenarios
|
|
102
|
+
|
|
103
|
+
**Scenario 1 — Protecting Secrets:**
|
|
104
|
+
A developer adds `{"permission": "read", "pattern": "*.env*", "action": "deny"}` to block the agent from reading environment files containing API keys. The pattern `*.env*` catches `.env`, `.env.local`, `.env.production`, and any variant.
|
|
105
|
+
|
|
106
|
+
**Scenario 2 — Bash Command Guardrails:**
|
|
107
|
+
Rules like `{"permission": "bash", "pattern": "rm -rf *", "action": "deny"}` and `{"permission": "bash", "pattern": "git push --force*", "action": "deny"}` create guardrails around the most dangerous commands while allowing everyday bash usage.
|
|
108
|
+
|
|
109
|
+
**Scenario 3 — Scoped Write Access:**
|
|
110
|
+
A developer configures `{"permission": "write", "pattern": "src/**/*.test.ts", "action": "allow"}` and `{"permission": "write", "pattern": "src/**/*.ts", "action": "ask"}`. Test files are auto-allowed; production TypeScript files still prompt. The ordering ensures tests match first.
|
|
111
|
+
|
|
112
|
+
**Scenario 4 — Cross-Platform Team:**
|
|
113
|
+
A team working across macOS and Linux sets `{"permissions": {"caseSensitive": false}}` in their shared project config. Pattern matching behaves identically on both platforms, preventing surprises where `README.md` matches on Mac but not on Linux.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# RISE-086: Permission Merging
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/086-permission-merging.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code resolves permissions from multiple layers — built-in defaults, global config, project config, agent-specific overrides, and live session choices. Each layer can refine or override the previous one without replacing it entirely. A developer's global "deny rm" rule persists across all projects while a project-specific "allow writes to tests" rule applies only where needed. The merge algorithm is simple: concatenate arrays in precedence order, first match wins.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has no layered configuration for permissions — behavior is hardcoded or toggled by `--yolo`
|
|
14
|
+
- No concept of global vs. project-level permission settings
|
|
15
|
+
- Agent-specific permissions do not exist — all agents share identical capability constraints
|
|
16
|
+
- When a user says "always allow" or "never allow" during a session, that choice is not persisted or layered
|
|
17
|
+
- There is no way to view what the effective merged permission set looks like
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- Five distinct permission layers merge into one effective ruleset
|
|
21
|
+
- Each layer prepends its rules, giving it higher priority (first-match-wins)
|
|
22
|
+
- Session-scoped choices (user "always"/"never" responses) sit at the top — user intent is supreme
|
|
23
|
+
- Agent-specific rules sit above project/global — specialized agents get specialized permissions
|
|
24
|
+
- A `/permissions` command shows the effective merged ruleset with source annotations
|
|
25
|
+
- A `/permissions reset` command clears session-scoped overrides
|
|
26
|
+
|
|
27
|
+
## Desired Outcome Definition
|
|
28
|
+
|
|
29
|
+
When the permission system evaluates an action, it walks a single merged rule array that was assembled from five layers. The merge is a simple array concatenation in precedence order. Developers can inspect the merged result and understand exactly which rule from which source controls each decision.
|
|
30
|
+
|
|
31
|
+
## Natural Language Functional Description
|
|
32
|
+
|
|
33
|
+
### Layer Hierarchy
|
|
34
|
+
|
|
35
|
+
Layers are numbered from lowest to highest precedence:
|
|
36
|
+
|
|
37
|
+
| Layer | Source | Example Location |
|
|
38
|
+
|-------|-------------------------------|-----------------------------------------------|
|
|
39
|
+
| 1 | Built-in defaults | Hardcoded in source |
|
|
40
|
+
| 2 | Global config permissions | `~/.mia-code/config.json` → `permissions.rules` |
|
|
41
|
+
| 3 | Project config permissions | `.mia-code/config.json` → `permissions.rules` |
|
|
42
|
+
| 4 | Agent-specific permissions | Agent definition → `permissions` field |
|
|
43
|
+
| 5 | Session-scoped permissions | Runtime "always"/"never" choices |
|
|
44
|
+
|
|
45
|
+
### Merge Algorithm
|
|
46
|
+
|
|
47
|
+
The merge algorithm is deliberately simple:
|
|
48
|
+
|
|
49
|
+
1. Start with an empty array: `merged = []`
|
|
50
|
+
2. Prepend session-scoped rules (layer 5) → `merged = [...session, ...merged]`
|
|
51
|
+
3. Prepend agent-specific rules (layer 4) → `merged = [...agent, ...merged]`
|
|
52
|
+
4. Prepend project config rules (layer 3) → wait — these go *after* agent rules
|
|
53
|
+
5. Final order: `[...session, ...agent, ...project, ...global, ...defaults]`
|
|
54
|
+
|
|
55
|
+
Because evaluation is first-match-wins, rules earlier in the array (higher precedence layers) naturally override rules later in the array (lower precedence layers).
|
|
56
|
+
|
|
57
|
+
### Detailed Merge Steps
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
effectiveRules = [
|
|
61
|
+
...sessionRules, // Layer 5: user "always"/"never" choices this session
|
|
62
|
+
...agentRules, // Layer 4: agent-specific overrides
|
|
63
|
+
...projectRules, // Layer 3: project .mia-code/config.json
|
|
64
|
+
...globalRules, // Layer 2: global ~/.mia-code/config.json
|
|
65
|
+
...defaultRules // Layer 1: built-in baseline
|
|
66
|
+
]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
No deduplication is performed. If two rules in different layers match the same permission+pattern, the first one encountered wins. Redundant rules in lower layers are simply never reached.
|
|
70
|
+
|
|
71
|
+
### Session-Scoped Rules
|
|
72
|
+
|
|
73
|
+
When a user responds "always" to a permission prompt, a new allow rule is prepended to the session layer:
|
|
74
|
+
```json
|
|
75
|
+
{"permission": "write", "pattern": "src/**/*.ts", "action": "allow", "source": "session"}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
When a user responds "never", a deny rule is prepended:
|
|
79
|
+
```json
|
|
80
|
+
{"permission": "bash", "pattern": "rm *", "action": "deny", "source": "session"}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Session rules are ephemeral — they exist only for the current session and are discarded on exit.
|
|
84
|
+
|
|
85
|
+
### Source Annotations
|
|
86
|
+
|
|
87
|
+
Each rule in the merged array carries a `source` annotation for introspection:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{"permission": "read", "action": "allow", "source": "default"}
|
|
91
|
+
{"permission": "write", "pattern": "*.test.ts", "action": "allow", "source": "project"}
|
|
92
|
+
{"permission": "bash", "pattern": "rm *", "action": "deny", "source": "global"}
|
|
93
|
+
{"permission": "write", "action": "ask", "source": "default"}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Viewing Merged Permissions
|
|
97
|
+
|
|
98
|
+
The `/permissions` slash command displays the effective merged ruleset:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Effective Permission Rules (12 rules):
|
|
102
|
+
#1 [session] write src/**/*.ts → allow
|
|
103
|
+
#2 [agent] bash npm * → allow
|
|
104
|
+
#3 [project] write *.test.ts → allow
|
|
105
|
+
#4 [global] bash rm * → deny
|
|
106
|
+
...
|
|
107
|
+
#12 [default] question → allow
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Resetting Session Permissions
|
|
111
|
+
|
|
112
|
+
`/permissions reset` clears all session-scoped rules (layer 5), returning to the config-defined state. This is useful when a user's "always" or "never" choice was made in error.
|
|
113
|
+
|
|
114
|
+
## Supporting Structures
|
|
115
|
+
|
|
116
|
+
- **Permission Rules (RISE-084)** defines the individual rule objects that are merged
|
|
117
|
+
- **Permission Glob Patterns (RISE-085)** defines pattern matching within rules
|
|
118
|
+
- **Permission Modes (RISE-087)** defines how "always"/"never" responses create session rules
|
|
119
|
+
- **Agent Definition Config (RISE-010)** defines per-agent permission configuration
|
|
120
|
+
- **Instance State (RISE-003)** scopes the session layer to the active session
|
|
121
|
+
|
|
122
|
+
## Creative Advancement Scenarios
|
|
123
|
+
|
|
124
|
+
**Scenario 1 — Team Safety Net:**
|
|
125
|
+
A global config includes `{"permission": "bash", "pattern": "rm -rf *", "action": "deny"}`. A project config adds `{"permission": "write", "pattern": "*.test.ts", "action": "allow"}`. The merged ruleset blocks destructive bash everywhere while allowing test writes in this project.
|
|
126
|
+
|
|
127
|
+
**Scenario 2 — Agent Specialization:**
|
|
128
|
+
A "code-review" agent has `{"permission": "write", "action": "deny"}` in its agent definition — it should never write files. A "test-writer" agent has `{"permission": "write", "pattern": "*.test.ts", "action": "allow"}`. Same project, different agents, different permissions.
|
|
129
|
+
|
|
130
|
+
**Scenario 3 — Session Learning:**
|
|
131
|
+
A developer approves a bash command with "always". The session layer gains an allow rule. Later they realize it was too broad and run `/permissions reset`. The session layer clears, and the next occurrence asks again.
|
|
132
|
+
|
|
133
|
+
**Scenario 4 — Debugging Permissions:**
|
|
134
|
+
A developer runs `/permissions` and sees that a write to `src/index.ts` is being denied. The output shows rule #4 from the global config is the culprit. They adjust the global config and the denial disappears.
|