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,153 @@
|
|
|
1
|
+
# RISE-066: Config Environment Variable Substitution
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/066-config-env-variables.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code configuration files can reference environment variables using `${VAR_NAME}` syntax, keeping secrets out of config files and enabling environment-specific configuration without file duplication. A developer commits their config to git with `"apiKey": "${ANTHROPIC_API_KEY}"` and secrets never touch version control. Different machines, CI environments, and deployment contexts each provide their own values through the environment — same config file, different behavior.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- API keys and secrets must be hardcoded in `~/.mia-code.json` or passed via environment variables that bypass the config system entirely
|
|
14
|
+
- Config files containing secrets cannot be committed to version control or shared across machines
|
|
15
|
+
- There is no way to reference dynamic values (like the current user's home directory) in config files
|
|
16
|
+
- Different environments (development, CI, staging) require separate config files with identical structure but different values
|
|
17
|
+
- The `MIA_CODE_*` environment variable prefix (RISE-064) handles top-level overrides but not substitution within complex nested values
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- Any string value in a config file can contain `${VAR_NAME}` which is replaced with the environment variable's value at load time
|
|
21
|
+
- Secrets live in the environment (`.env` files, shell profiles, CI secrets) while config structure lives in files
|
|
22
|
+
- Config files are safe to commit because they contain references, not values
|
|
23
|
+
- Missing variable behavior is configurable: error (fail fast) or empty string (permissive)
|
|
24
|
+
- Special variables like `${HOME}`, `${PWD}`, and `${USER}` are always available regardless of environment
|
|
25
|
+
|
|
26
|
+
## Desired Outcome Definition
|
|
27
|
+
|
|
28
|
+
When mia-code loads a config file, all `${VAR_NAME}` patterns in string values are replaced with the corresponding environment variable values. Missing variables either cause an error or resolve to empty string based on configuration. Config files with variable references can be safely committed to version control.
|
|
29
|
+
|
|
30
|
+
## Natural Language Functional Description
|
|
31
|
+
|
|
32
|
+
### Substitution Syntax
|
|
33
|
+
|
|
34
|
+
The pattern `${VAR_NAME}` within any string value in a config file is replaced with the value of the environment variable `VAR_NAME`:
|
|
35
|
+
|
|
36
|
+
```jsonc
|
|
37
|
+
{
|
|
38
|
+
"provider": {
|
|
39
|
+
"anthropic": {
|
|
40
|
+
"apiKey": "${ANTHROPIC_API_KEY}" // Replaced at load time
|
|
41
|
+
},
|
|
42
|
+
"openai": {
|
|
43
|
+
"apiKey": "${OPENAI_API_KEY}"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"logDir": "${HOME}/.mia-code/logs" // e.g., /home/dev/.mia-code/logs
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Substitution Rules
|
|
51
|
+
|
|
52
|
+
1. **Pattern matching**: Only `${...}` is recognized. `$VAR` without braces is not substituted (treated as literal).
|
|
53
|
+
2. **String values only**: Substitution occurs only in JSON string values, not in keys, numbers, booleans, or null.
|
|
54
|
+
3. **Partial substitution**: A string can contain multiple variables and literal text: `"${HOME}/projects/${PROJECT_NAME}/config"`.
|
|
55
|
+
4. **No nested substitution**: The result of a substitution is not re-scanned for further `${...}` patterns. This prevents injection and keeps behavior predictable.
|
|
56
|
+
5. **Escape sequence**: `\${VAR}` is treated as the literal string `${VAR}` (the backslash is consumed).
|
|
57
|
+
|
|
58
|
+
### Missing Variable Handling
|
|
59
|
+
|
|
60
|
+
When a `${VAR_NAME}` references an undefined environment variable:
|
|
61
|
+
|
|
62
|
+
- **Default behavior (strict)**: Emit a warning and leave the pattern unreplaced. The literal string `${VAR_NAME}` remains in the config value, which will likely cause a downstream error (e.g., invalid API key).
|
|
63
|
+
- **Permissive mode**: `{"config": {"envSubstitution": "permissive"}}` — replace missing variables with empty string `""`.
|
|
64
|
+
- **Error mode**: `{"config": {"envSubstitution": "error"}}` — throw a config loading error that prevents startup.
|
|
65
|
+
|
|
66
|
+
The mode is configured via the built-in defaults or a higher-precedence config level that has already been loaded.
|
|
67
|
+
|
|
68
|
+
### Special Variables
|
|
69
|
+
|
|
70
|
+
These variables are always available, even if not set in the environment:
|
|
71
|
+
|
|
72
|
+
| Variable | Value | Example |
|
|
73
|
+
|----------|-------|---------|
|
|
74
|
+
| `${HOME}` | User's home directory | `/home/developer` |
|
|
75
|
+
| `${PWD}` | Current working directory | `/projects/myapp` |
|
|
76
|
+
| `${USER}` | Current username | `developer` |
|
|
77
|
+
| `${HOSTNAME}` | Machine hostname | `dev-laptop` |
|
|
78
|
+
| `${MIA_CODE_VERSION}` | Current mia-code version | `1.2.3` |
|
|
79
|
+
|
|
80
|
+
If these conflict with actual environment variables, the environment variable value takes precedence.
|
|
81
|
+
|
|
82
|
+
### Substitution Timing
|
|
83
|
+
|
|
84
|
+
Variable substitution occurs at config load time, after JSONC parsing and before deep merging:
|
|
85
|
+
|
|
86
|
+
1. Parse JSONC → raw config object
|
|
87
|
+
2. Walk all string values and apply `${...}` substitution
|
|
88
|
+
3. Merge with other config levels (RISE-064)
|
|
89
|
+
4. Validate the merged result
|
|
90
|
+
|
|
91
|
+
This means the same `${VAR}` in different config levels resolves to the same value (they share the same environment).
|
|
92
|
+
|
|
93
|
+
### Security Considerations
|
|
94
|
+
|
|
95
|
+
- Config files with `${...}` references are safe to commit because they contain no actual secrets
|
|
96
|
+
- The `/config` command masks resolved secret values (API keys, tokens) in its display: `apiKey: sk-****`
|
|
97
|
+
- Environment variable values are never logged at info level; debug logging masks them
|
|
98
|
+
- Substitution does not apply to values in non-config contexts (session data, message content)
|
|
99
|
+
|
|
100
|
+
### Error Reporting
|
|
101
|
+
|
|
102
|
+
When substitution encounters issues:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Config warning: Undefined environment variable in ~/.config/mia-code/config.json:
|
|
106
|
+
Line 5: "apiKey": "${ANTHROPIC_API_KEY}"
|
|
107
|
+
Variable ANTHROPIC_API_KEY is not set.
|
|
108
|
+
|
|
109
|
+
Tip: Set it in your shell profile or .env file:
|
|
110
|
+
export ANTHROPIC_API_KEY=your-key-here
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Warnings include the file, line number, variable name, and a helpful suggestion.
|
|
114
|
+
|
|
115
|
+
### Integration with .env Files
|
|
116
|
+
|
|
117
|
+
mia-code optionally loads `.env` files before config substitution:
|
|
118
|
+
1. Check for `.env` in the project root
|
|
119
|
+
2. Check for `.env.local` in the project root (higher precedence)
|
|
120
|
+
3. Parse key=value pairs and add them to the substitution environment
|
|
121
|
+
4. `.env` values do not override actual environment variables
|
|
122
|
+
|
|
123
|
+
This is opt-in via config: `{"config": {"loadDotEnv": true}}` (default: false).
|
|
124
|
+
|
|
125
|
+
### Config Display
|
|
126
|
+
|
|
127
|
+
The `/config` command shows both the template value and the resolved value for substituted settings:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
provider.anthropic.apiKey: ${ANTHROPIC_API_KEY} → sk-**** [global config]
|
|
131
|
+
logDir: ${HOME}/.mia-code/logs → /home/dev/.mia-code/logs [global config]
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Supporting Structures
|
|
135
|
+
|
|
136
|
+
- **JSONC Config (RISE-065)** parses config files before substitution is applied
|
|
137
|
+
- **Multi-Level Config (RISE-064)** defines when in the loading pipeline substitution occurs
|
|
138
|
+
- **Config Deep Merging (RISE-067)** merges config after substitution resolves values
|
|
139
|
+
- **Managed Config Directory (RISE-070)** uses the same substitution system for enterprise config
|
|
140
|
+
|
|
141
|
+
## Creative Advancement Scenarios
|
|
142
|
+
|
|
143
|
+
**Scenario 1 — Git-Safe Config:**
|
|
144
|
+
A team commits `./mia-code.json` to their repository: `{"provider": {"anthropic": {"apiKey": "${ANTHROPIC_API_KEY}"}}}`. Each developer has `ANTHROPIC_API_KEY` in their shell profile. The config is shared, the secrets are not. New team members clone the repo, set their key, and start working.
|
|
145
|
+
|
|
146
|
+
**Scenario 2 — CI/CD Pipeline:**
|
|
147
|
+
A GitHub Actions workflow sets `ANTHROPIC_API_KEY` as a repository secret. The mia-code config file in the repo references `${ANTHROPIC_API_KEY}`. The CI runner resolves it at runtime. No config file changes needed between local development and CI.
|
|
148
|
+
|
|
149
|
+
**Scenario 3 — Multi-Environment Config:**
|
|
150
|
+
A developer works on two projects: one using Anthropic, one using OpenAI. Both config files reference `${ANTHROPIC_API_KEY}` and `${OPENAI_API_KEY}` respectively. The developer's shell profile exports both. Each project resolves only the key it needs.
|
|
151
|
+
|
|
152
|
+
**Scenario 4 — Dynamic Paths:**
|
|
153
|
+
A developer's config uses `"logDir": "${HOME}/.mia-code/logs"`. On their Linux workstation, logs go to `/home/dev/.mia-code/logs`. On their Mac, logs go to `/Users/dev/.mia-code/logs`. Same config file, platform-appropriate paths.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# RISE-067: Config Deep Merging
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/067-config-deep-merging.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code assembles its final configuration by intelligently merging contributions from multiple sources — not by crude overwriting but by recursive deep merging that preserves structure, combines collections, and applies targeted overrides. A global config provides the foundation, a project config adjusts specific settings, and the result is a coherent whole where each source contributes its piece without destroying the others' contributions.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code loads config from a single source (`~/.mia-code.json`) so no merging is needed
|
|
14
|
+
- If multi-source loading were added naively, a project config with one key would erase all global settings (shallow replace)
|
|
15
|
+
- There is no defined behavior for merging arrays — should a project's plugin list replace or extend the global list?
|
|
16
|
+
- Nested objects (like provider configurations with multiple sub-providers) would be lost if any level provides a partial override
|
|
17
|
+
- No mechanism exists to intentionally remove a setting from a lower level (e.g., disable a globally enabled plugin for one project)
|
|
18
|
+
- The relationship between "combine" and "override" is ambiguous without explicit rules
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Objects merge recursively: project config sets `provider.anthropic.model` without erasing `provider.openai`
|
|
22
|
+
- Arrays concatenate by default: project plugins add to global plugins
|
|
23
|
+
- Scalars replace: last source wins for simple values
|
|
24
|
+
- Explicit removal: setting a key to `null` removes it from the merged result
|
|
25
|
+
- Explicit array replacement: empty array `[]` replaces rather than concatenating
|
|
26
|
+
- Merge order follows the precedence hierarchy from RISE-064
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
A deep merge function combines configuration objects from multiple sources following deterministic rules. Objects merge recursively, arrays concatenate, scalars replace. Special sentinels (null, empty array) provide escape hatches for removal and replacement. The merge produces a single resolved config object.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Merge Algorithm
|
|
35
|
+
|
|
36
|
+
The deep merge processes two config objects (base and override) recursively:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
function deepMerge(base, override):
|
|
40
|
+
for each key in override:
|
|
41
|
+
if override[key] is null:
|
|
42
|
+
delete result[key] // null removes
|
|
43
|
+
else if override[key] is object AND base[key] is object:
|
|
44
|
+
result[key] = deepMerge(base[key], override[key]) // recurse
|
|
45
|
+
else if override[key] is array AND base[key] is array:
|
|
46
|
+
if override[key] is empty:
|
|
47
|
+
result[key] = [] // empty array replaces
|
|
48
|
+
else:
|
|
49
|
+
result[key] = base[key].concat(override[key]) // concatenate
|
|
50
|
+
else:
|
|
51
|
+
result[key] = override[key] // scalar replace
|
|
52
|
+
for each key in base not in override:
|
|
53
|
+
result[key] = base[key] // preserve base values
|
|
54
|
+
return result
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Merge Rules by Type
|
|
58
|
+
|
|
59
|
+
**Objects → Recursive Merge:**
|
|
60
|
+
Each key in the override object is merged with the corresponding key in the base object. Keys present only in the base are preserved. Keys present only in the override are added.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Base: {"provider": {"openai": {"apiKey": "sk-1"}, "model": "gpt-4"}}
|
|
64
|
+
Override: {"provider": {"anthropic": {"apiKey": "sk-2"}}}
|
|
65
|
+
Result: {"provider": {"openai": {"apiKey": "sk-1"}, "model": "gpt-4", "anthropic": {"apiKey": "sk-2"}}}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Scalars → Replace:**
|
|
69
|
+
When the override provides a scalar value (string, number, boolean) for a key, it replaces the base value entirely, regardless of the base value's type.
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Base: {"model": "gemini-2.5-pro", "verbose": false}
|
|
73
|
+
Override: {"model": "claude-sonnet-4", "verbose": true}
|
|
74
|
+
Result: {"model": "claude-sonnet-4", "verbose": true}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Arrays → Concatenate:**
|
|
78
|
+
When both base and override have arrays for the same key, the arrays are concatenated (base first, then override).
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Base: {"plugins": ["plugin-a", "plugin-b"]}
|
|
82
|
+
Override: {"plugins": ["plugin-c"]}
|
|
83
|
+
Result: {"plugins": ["plugin-a", "plugin-b", "plugin-c"]}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Deduplication is not performed automatically — if both lists contain `"plugin-a"`, it appears twice. Consumers should handle deduplication if needed.
|
|
87
|
+
|
|
88
|
+
**Null → Remove Key:**
|
|
89
|
+
Setting a key to `null` in the override removes it from the merged result entirely. This is an explicit removal signal.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Base: {"provider": {"openai": {"apiKey": "sk-1"}, "anthropic": {"apiKey": "sk-2"}}}
|
|
93
|
+
Override: {"provider": {"openai": null}}
|
|
94
|
+
Result: {"provider": {"anthropic": {"apiKey": "sk-2"}}}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Empty Array → Replace:**
|
|
98
|
+
An empty array `[]` in the override replaces the base array entirely (does not concatenate). This allows a project to clear a global list.
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Base: {"plugins": ["plugin-a", "plugin-b"]}
|
|
102
|
+
Override: {"plugins": []}
|
|
103
|
+
Result: {"plugins": []}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Multi-Level Merge
|
|
107
|
+
|
|
108
|
+
When merging more than two levels, the merge is applied sequentially from lowest to highest precedence:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
result = defaults
|
|
112
|
+
result = deepMerge(result, globalConfig)
|
|
113
|
+
result = deepMerge(result, envVars)
|
|
114
|
+
result = deepMerge(result, projectConfig)
|
|
115
|
+
result = deepMerge(result, cliFlags)
|
|
116
|
+
result = deepMerge(result, inlineConfig)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Each merge produces an intermediate result that becomes the base for the next level.
|
|
120
|
+
|
|
121
|
+
### Type Coercion at Merge Boundaries
|
|
122
|
+
|
|
123
|
+
When base and override have different types for the same key:
|
|
124
|
+
- **Object vs. scalar**: override wins (scalar replaces object or vice versa)
|
|
125
|
+
- **Array vs. scalar**: override wins
|
|
126
|
+
- **Array vs. object**: override wins
|
|
127
|
+
- A warning is emitted when types conflict, as this usually indicates a config error
|
|
128
|
+
|
|
129
|
+
### Merge Source Tracking
|
|
130
|
+
|
|
131
|
+
During merging, each resolved value is annotated with its source level:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
interface ResolvedValue {
|
|
135
|
+
value: any;
|
|
136
|
+
source: "default" | "global" | "env" | "project" | "cli" | "inline" | "managed";
|
|
137
|
+
filePath?: string; // for file-based sources
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
These annotations power the `/config` display (RISE-064) that shows where each value came from.
|
|
142
|
+
|
|
143
|
+
### Permission Ruleset Merging
|
|
144
|
+
|
|
145
|
+
Permission rulesets (RISE-011) receive special merge treatment:
|
|
146
|
+
- Permission rules from all levels are combined
|
|
147
|
+
- Agent-specific permission overrides take precedence over general rules
|
|
148
|
+
- Deny rules from any level cannot be overridden by allow rules from a lower-precedence level
|
|
149
|
+
- Managed config (RISE-070) deny rules cannot be overridden at all
|
|
150
|
+
|
|
151
|
+
### Edge Cases
|
|
152
|
+
|
|
153
|
+
- **Circular references**: not possible in JSON — not a concern
|
|
154
|
+
- **Very deep nesting** (>10 levels): supported but a warning is emitted as this likely indicates a config error
|
|
155
|
+
- **Large arrays** (>1000 elements): concatenation proceeds but a performance warning is emitted
|
|
156
|
+
- **Undefined vs. missing**: a key absent from the override is different from a key set to `undefined`. Only `null` triggers removal.
|
|
157
|
+
|
|
158
|
+
## Supporting Structures
|
|
159
|
+
|
|
160
|
+
- **Multi-Level Config (RISE-064)** defines the precedence order and invokes deep merge at each level
|
|
161
|
+
- **JSONC Config (RISE-065)** provides the parsed objects that are inputs to the merge
|
|
162
|
+
- **Config Environment Variables (RISE-066)** resolves variable references before objects enter the merge
|
|
163
|
+
- **Managed Config Directory (RISE-070)** provides the highest-precedence config object for merging
|
|
164
|
+
- **Agent Permission Rulesets (RISE-011)** defines special merging rules for permission config
|
|
165
|
+
|
|
166
|
+
## Creative Advancement Scenarios
|
|
167
|
+
|
|
168
|
+
**Scenario 1 — Additive Provider Configuration:**
|
|
169
|
+
A developer's global config sets up OpenAI: `{"provider": {"openai": {"apiKey": "sk-1"}}}`. Their project config adds Anthropic: `{"provider": {"anthropic": {"apiKey": "sk-2"}}}`. After deep merge, both providers are available. Neither config file needs to know about the other's providers.
|
|
170
|
+
|
|
171
|
+
**Scenario 2 — Disabling a Global Plugin:**
|
|
172
|
+
A developer's global config includes `{"plugins": ["linter", "formatter"]}`. A specific project doesn't want any plugins: `{"plugins": []}`. The empty array replaces the global list. No plugins load for that project.
|
|
173
|
+
|
|
174
|
+
**Scenario 3 — Removing a Provider:**
|
|
175
|
+
A developer's global config has three providers. A project should only use Anthropic, so its config sets: `{"provider": {"openai": null, "google": null}}`. After merge, only Anthropic remains from the global config.
|
|
176
|
+
|
|
177
|
+
**Scenario 4 — Combined Permission Rules:**
|
|
178
|
+
Global config allows `git *` commands. Project config allows `npm *` additionally. After merge, both `git *` and `npm *` are allowed — the project inherits global permissions and adds its own.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# RISE-068: Remote Organization Config
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/068-remote-org-config.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code fetches organization-wide configuration defaults from a remote endpoint, enabling enterprise teams to share consistent settings without manual distribution. When a developer clones a company repository and runs mia-code, the tool automatically discovers the organization's default models, allowed providers, security policies, and standard agents — creating alignment across hundreds of developers with zero individual setup. The organization speaks once, and every developer's mia-code listens.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- There is no mechanism for an organization to distribute mia-code configuration to its developers
|
|
14
|
+
- Each developer must manually configure their own `~/.mia-code.json` independently
|
|
15
|
+
- Organizational policies (which models are allowed, which tools are restricted) must be communicated out-of-band (Slack, wiki, onboarding docs)
|
|
16
|
+
- There is no enforcement of consistent agent behavior across a team
|
|
17
|
+
- New team members spend time configuring mia-code instead of coding
|
|
18
|
+
- Policy changes (e.g., "switch to Claude for all projects") require manual updates on every developer's machine
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Organizations publish config at a well-known URL: `https://company.com/.well-known/mia-code.json`
|
|
22
|
+
- mia-code discovers the organization from the git remote URL and fetches the org config
|
|
23
|
+
- Org config provides defaults: models, providers, permissions, agents, plugins
|
|
24
|
+
- Org config has low precedence — overridden by global, project, and CLI config
|
|
25
|
+
- Config is cached locally with a 24-hour TTL to avoid network dependency
|
|
26
|
+
- If the fetch fails, cached config is used; if no cache exists, the level is skipped gracefully
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
When a developer runs mia-code in a project with a git remote pointing to an organization's domain, the tool fetches org-wide config defaults from `https://<domain>/.well-known/mia-code.json`. This config is merged into the config hierarchy at the lowest file-based precedence level (below global config). The config is cached for offline use.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Organization Discovery
|
|
35
|
+
|
|
36
|
+
When mia-code initializes in a project directory:
|
|
37
|
+
1. Check for a git repository (look for `.git` directory)
|
|
38
|
+
2. Read the `origin` remote URL: `git remote get-url origin`
|
|
39
|
+
3. Extract the hostname from the remote URL (e.g., `github.com/acme-corp/project` → `github.com`)
|
|
40
|
+
4. For known hosting platforms (GitHub, GitLab, Bitbucket), extract the organization: `acme-corp`
|
|
41
|
+
5. Construct the config URL: `https://github.com/acme-corp/.well-known/mia-code.json` or check org-level metadata
|
|
42
|
+
|
|
43
|
+
For self-hosted git servers, the hostname itself is used: `https://git.acme.com/.well-known/mia-code.json`
|
|
44
|
+
|
|
45
|
+
### Config Endpoint
|
|
46
|
+
|
|
47
|
+
Organizations publish their config as a JSON (or JSONC) file at a well-known path:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
https://<domain>/.well-known/mia-code.json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The file follows the standard mia-code config schema:
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
{
|
|
57
|
+
// Acme Corp mia-code defaults
|
|
58
|
+
"orgName": "Acme Corp",
|
|
59
|
+
"policyVersion": "2025-01-15",
|
|
60
|
+
|
|
61
|
+
"model": "claude-sonnet-4",
|
|
62
|
+
"engine": "claude",
|
|
63
|
+
|
|
64
|
+
"provider": {
|
|
65
|
+
"anthropic": {
|
|
66
|
+
// Org-provisioned API endpoint
|
|
67
|
+
"baseUrl": "https://api.acme-internal.com/claude/v1"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// Restrict to approved providers only
|
|
72
|
+
"allowedProviders": ["anthropic", "google"],
|
|
73
|
+
"blockedProviders": ["openai"],
|
|
74
|
+
|
|
75
|
+
// Default permission policy
|
|
76
|
+
"permissions": {
|
|
77
|
+
"bash": "ask",
|
|
78
|
+
"file_write": "ask",
|
|
79
|
+
"file_read": "allow"
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// Standard agents for the organization
|
|
83
|
+
"agents": [
|
|
84
|
+
{
|
|
85
|
+
"name": "acme-reviewer",
|
|
86
|
+
"prompt": "Review code following Acme Corp coding standards..."
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Precedence
|
|
93
|
+
|
|
94
|
+
Org config sits at the lowest file-based level, below global config:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
Built-in defaults (lowest)
|
|
98
|
+
↓
|
|
99
|
+
Remote org config ← this level
|
|
100
|
+
↓
|
|
101
|
+
Global config (~/.config/mia-code/config.json)
|
|
102
|
+
↓
|
|
103
|
+
Environment variables
|
|
104
|
+
↓
|
|
105
|
+
Project config (./mia-code.json)
|
|
106
|
+
↓
|
|
107
|
+
CLI flags
|
|
108
|
+
↓
|
|
109
|
+
Inline config
|
|
110
|
+
↓
|
|
111
|
+
Managed config (highest)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This means individual developers can always override org defaults with their personal preferences or project-specific settings.
|
|
115
|
+
|
|
116
|
+
### Caching
|
|
117
|
+
|
|
118
|
+
Fetched org config is cached locally:
|
|
119
|
+
- Cache location: `~/.cache/mia-code/org-config/<domain-hash>.json`
|
|
120
|
+
- Cache TTL: 24 hours (configurable via `{"config": {"orgConfigTTL": 86400}}`)
|
|
121
|
+
- Cache metadata: includes fetch timestamp, ETag/Last-Modified headers for conditional requests
|
|
122
|
+
- On cache hit: use cached config without network request
|
|
123
|
+
- On cache expired: attempt fetch; if successful, update cache; if failed, use stale cache with a warning
|
|
124
|
+
- Cache can be forced-refreshed: `/config refresh-org`
|
|
125
|
+
|
|
126
|
+
### Fetch Behavior
|
|
127
|
+
|
|
128
|
+
The config fetch is designed to be non-blocking and fault-tolerant:
|
|
129
|
+
1. Fetch timeout: 5 seconds (org config should not delay startup significantly)
|
|
130
|
+
2. On network error: warn and skip (use cache if available)
|
|
131
|
+
3. On 404: assume no org config exists; do not retry for 7 days
|
|
132
|
+
4. On 5xx: use cache if available; retry on next startup
|
|
133
|
+
5. Fetch happens in parallel with other initialization — does not block the agent from starting
|
|
134
|
+
6. If config arrives after the agent has started, a config reload is triggered
|
|
135
|
+
|
|
136
|
+
### Security
|
|
137
|
+
|
|
138
|
+
- Org config is fetched over HTTPS only (HTTP URLs are rejected)
|
|
139
|
+
- Config content is validated against the expected schema before use
|
|
140
|
+
- Org config cannot set API keys or secrets (these fields are ignored if present)
|
|
141
|
+
- A warning is shown on first fetch: "Loading organization config from https://... [y to accept / n to skip]"
|
|
142
|
+
- Accepted organizations are remembered: `~/.config/mia-code/trusted-orgs.json`
|
|
143
|
+
- Org config modifications are logged for auditability
|
|
144
|
+
|
|
145
|
+
### GitHub Integration
|
|
146
|
+
|
|
147
|
+
For GitHub-hosted organizations, mia-code can alternatively fetch org config from:
|
|
148
|
+
1. A `.mia-code` repository in the organization (e.g., `github.com/acme-corp/.mia-code`)
|
|
149
|
+
2. The `mia-code.json` file in the organization's `.github` repository
|
|
150
|
+
3. Organization-level metadata (if accessible via GitHub API)
|
|
151
|
+
|
|
152
|
+
The priority: `.well-known` endpoint > `.mia-code` repo > `.github` repo.
|
|
153
|
+
|
|
154
|
+
### Config Display
|
|
155
|
+
|
|
156
|
+
The `/config` command annotates org-sourced values:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
model: claude-sonnet-4 [org: Acme Corp (policy v2025-01-15)]
|
|
160
|
+
engine: claude [org: Acme Corp (policy v2025-01-15)]
|
|
161
|
+
theme: monokai [global: ~/.config/mia-code/config.json]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Supporting Structures
|
|
165
|
+
|
|
166
|
+
- **Multi-Level Config (RISE-064)** defines where org config sits in the precedence hierarchy
|
|
167
|
+
- **Config Deep Merging (RISE-067)** merges org config with other levels
|
|
168
|
+
- **JSONC Config (RISE-065)** parses the org config file (may contain comments)
|
|
169
|
+
- **Managed Config Directory (RISE-070)** provides an even higher-precedence enterprise override
|
|
170
|
+
|
|
171
|
+
## Creative Advancement Scenarios
|
|
172
|
+
|
|
173
|
+
**Scenario 1 — Seamless Team Onboarding:**
|
|
174
|
+
A new developer joins Acme Corp, clones a project, and runs `mia-code`. The tool detects the `acme-corp` GitHub organization, fetches org config, and automatically uses the company's preferred model and API endpoint. The developer starts coding immediately — no config setup needed.
|
|
175
|
+
|
|
176
|
+
**Scenario 2 — Organization Policy Update:**
|
|
177
|
+
Acme Corp decides to switch from Gemini to Claude for all agent interactions. They update `/.well-known/mia-code.json` on their domain. Over the next 24 hours (as caches expire), every developer's mia-code picks up the change automatically.
|
|
178
|
+
|
|
179
|
+
**Scenario 3 — Provider Restriction:**
|
|
180
|
+
An enterprise blocks OpenAI for compliance reasons. Their org config includes `"blockedProviders": ["openai"]`. Even if a developer has an OpenAI API key in their global config, mia-code will not use it in projects under this organization.
|
|
181
|
+
|
|
182
|
+
**Scenario 4 — Offline Development:**
|
|
183
|
+
A developer works on a plane without internet. mia-code attempts to fetch org config, fails, and falls back to the cached version from yesterday. Everything works as expected. When they reconnect, the cache refreshes automatically on next startup.
|