nonoka-cli 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.nonoka/repo_map.jsonl +5 -4
  2. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/PKG-INFO +11 -7
  3. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/README.md +10 -6
  4. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/pyproject.toml +2 -1
  5. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/cli.py +4 -5
  6. nonoka_cli-0.2.5/src/nonoka_cli/commands/run_cmd.py +110 -0
  7. nonoka_cli-0.2.5/tests/unit/commands/test_run_cmd.py +113 -0
  8. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/uv.lock +214 -9
  9. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/nonoka-tui-testing/SKILL.md +0 -0
  10. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/nonoka-tui-testing/references/checklist.md +0 -0
  11. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/nonoka-tui-testing/scripts/analyze-timeline.py +0 -0
  12. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/nonoka-tui-testing/scripts/capture-screenshots.py +0 -0
  13. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/nonoka-tui-testing/scripts/setup-sandbox.sh +0 -0
  14. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/tui-testing/SKILL.md +0 -0
  15. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.agents/skills/tui-testing/scripts/opencode_tui.py +0 -0
  16. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.gitignore +0 -0
  17. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/.nonoka/plugin.json.example +0 -0
  18. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/LICENSE +0 -0
  19. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/NOTICE +0 -0
  20. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/TODO.md +0 -0
  21. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/docs/external-mcp-skill-design.md +0 -0
  22. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/docs/nonoka-cli-complex-task-evaluation.md +0 -0
  23. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/docs/nonoka-cli-refactor-design.md +0 -0
  24. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/docs/subagent-refactor-design.md +0 -0
  25. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/docs/subagent-refactor-plan.md +0 -0
  26. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/install.sh +0 -0
  27. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/nonoka.yaml +0 -0
  28. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/nonoka.yaml.example +0 -0
  29. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/.gitignore +0 -0
  30. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/LICENSE +0 -0
  31. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/README.md +0 -0
  32. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/bun.lock +0 -0
  33. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/package.json +0 -0
  34. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/src/index.ts +0 -0
  35. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/src/nonoka-language-model.ts +0 -0
  36. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/src/protocol.ts +0 -0
  37. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/src/stream.ts +0 -0
  38. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/tests/language-model.test.ts +0 -0
  39. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/tests/protocol.test.ts +0 -0
  40. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/tests/stream.test.ts +0 -0
  41. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/packages/nonoka-opencode-provider/tsconfig.json +0 -0
  42. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/scripts/quick-install.sh +0 -0
  43. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/__init__.py +0 -0
  44. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/__main__.py +0 -0
  45. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/bridge/__init__.py +0 -0
  46. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/bridge/events.py +0 -0
  47. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/bridge/handler.py +0 -0
  48. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/bridge/protocol.py +0 -0
  49. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/bridge/server.py +0 -0
  50. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/commands/__init__.py +0 -0
  51. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/commands/config_cmd.py +0 -0
  52. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/commands/doctor_cmd.py +0 -0
  53. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/commands/opencode_cmd.py +0 -0
  54. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/commands/plugin_cmd.py +0 -0
  55. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/config/__init__.py +0 -0
  56. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/config/loader.py +0 -0
  57. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/config/manager.py +0 -0
  58. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/config/models.py +0 -0
  59. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/__init__.py +0 -0
  60. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/agent_factory.py +0 -0
  61. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/context.py +0 -0
  62. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/context_trimmer.py +0 -0
  63. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/git_service.py +0 -0
  64. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/mcp_service.py +0 -0
  65. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/namespaces.py +0 -0
  66. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/orchestrator.py +0 -0
  67. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/planning_service.py +0 -0
  68. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/plugin_manifest.py +0 -0
  69. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/plugin_manifest_converter.py +0 -0
  70. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/prompt_builder.py +0 -0
  71. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/repo_map_service.py +0 -0
  72. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/review_service.py +0 -0
  73. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/runner_service.py +0 -0
  74. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/session_service.py +0 -0
  75. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/subagent_service.py +0 -0
  76. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/task_state.py +0 -0
  77. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/tool_output_policy.py +0 -0
  78. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/core/tool_service.py +0 -0
  79. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/mcp/__init__.py +0 -0
  80. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/mcp/manager.py +0 -0
  81. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/mcp/models.py +0 -0
  82. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/sessions/__init__.py +0 -0
  83. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/sessions/manager.py +0 -0
  84. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/sessions/models.py +0 -0
  85. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/skills/__init__.py +0 -0
  86. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/tools/__init__.py +0 -0
  87. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/tools/builtins/__init__.py +0 -0
  88. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/tools/builtins/agent_tools.py +0 -0
  89. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/tools/builtins/file_tools.py +0 -0
  90. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/tools/loader.py +0 -0
  91. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/utils/__init__.py +0 -0
  92. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/utils/errors.py +0 -0
  93. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/utils/logging.py +0 -0
  94. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/src/nonoka_cli/utils/trace_logger.py +0 -0
  95. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/conftest.py +0 -0
  96. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/integration/test_server_external_capabilities.py +0 -0
  97. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/bridge/test_events.py +0 -0
  98. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/bridge/test_handler.py +0 -0
  99. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/bridge/test_protocol.py +0 -0
  100. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/commands/test_config_cmd.py +0 -0
  101. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/commands/test_doctor_cmd.py +0 -0
  102. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/commands/test_opencode_cmd.py +0 -0
  103. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/config/test_loader.py +0 -0
  104. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/config/test_models.py +0 -0
  105. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_agent_factory.py +0 -0
  106. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_context_trimmer.py +0 -0
  107. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_git_service.py +0 -0
  108. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_orchestrator.py +0 -0
  109. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_planning_service.py +0 -0
  110. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_plugin_manifest.py +0 -0
  111. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_plugin_manifest_converter.py +0 -0
  112. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_repo_map_service.py +0 -0
  113. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_review_service.py +0 -0
  114. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_task_state.py +0 -0
  115. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/core/test_tool_output_policy.py +0 -0
  116. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/sessions/test_manager.py +0 -0
  117. {nonoka_cli-0.2.4 → nonoka_cli-0.2.5}/tests/unit/utils/test_trace_logger.py +0 -0
@@ -15,11 +15,12 @@
15
15
  {"path": "src/nonoka_cli/bridge/handler.py", "mtime": 1783854422.9287047, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "json", "line": 5, "signature": "module json"}, {"kind": "function", "name": "os", "line": 6, "signature": "module os"}, {"kind": "class", "name": "AsyncIterator", "line": 7, "signature": "class AsyncIterator"}, {"kind": "class", "name": "Path", "line": 8, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 9, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 11, "signature": "module structlog"}, {"kind": "class", "name": "StreamEvent", "line": 12, "signature": "class StreamEvent"}, {"kind": "function", "name": "translate_stream_event", "line": 14, "signature": "def translate_stream_event"}, {"kind": "class", "name": "ChatMessage", "line": 16, "signature": "class ChatMessage"}, {"kind": "class", "name": "ChatRequest", "line": 17, "signature": "class ChatRequest"}, {"kind": "class", "name": "DebugEvent", "line": 18, "signature": "class DebugEvent"}, {"kind": "class", "name": "ErrorEvent", "line": 19, "signature": "class ErrorEvent"}, {"kind": "class", "name": "FinishEvent", "line": 20, "signature": "class FinishEvent"}, {"kind": "class", "name": "OutboundMessage", "line": 21, "signature": "class OutboundMessage"}, {"kind": "class", "name": "SessionInitEvent", "line": 22, "signature": "class SessionInitEvent"}, {"kind": "function", "name": "encode_outbound_message", "line": 23, "signature": "def encode_outbound_message"}, {"kind": "class", "name": "AgentFactory", "line": 25, "signature": "class AgentFactory"}, {"kind": "class", "name": "Orchestrator", "line": 26, "signature": "class Orchestrator"}, {"kind": "class", "name": "TaskStateService", "line": 27, "signature": "class TaskStateService"}, {"kind": "class", "name": "SessionNotFoundError", "line": 28, "signature": "class SessionNotFoundError"}, {"kind": "class", "name": "TraceLogger", "line": 29, "signature": "class TraceLogger"}, {"kind": "variable", "name": "logger", "line": 31, "signature": "logger = structlog.get_logger(\"nonoka_cli.bridge.handler\")"}, {"kind": "class", "name": "ChatRequestHandler", "line": 34, "signature": "class ChatRequestHandler"}, {"kind": "method", "name": "__init__", "line": 44, "signature": "def __init__"}, {"kind": "variable", "name": "_send", "line": 55, "signature": "self._send = send"}, {"kind": "variable", "name": "_config_path", "line": 56, "signature": "self._config_path = config_path"}, {"kind": "variable", "name": "_model", "line": 57, "signature": "self._model = model"}, {"kind": "variable", "name": "_orchestrator", "line": 58, "signature": "self._orchestrator: Orchestrator | None = None"}, {"kind": "variable", "name": "_session_id", "line": 59, "signature": "self._session_id: str | None = None"}, {"kind": "variable", "name": "_session_init_sent", "line": 60, "signature": "self._session_init_sent = False"}, {"kind": "variable", "name": "_working_dir", "line": 61, "signature": "self._working_dir: Path = Path.cwd()"}, {"kind": "variable", "name": "_task_state_service", "line": 62, "signature": "self._task_state_service: TaskStateService | None = None"}, {"kind": "variable", "name": "_debug_enabled", "line": 63, "signature": "self._debug_enabled = os.environ.get(\"NONOKA_DEBUG\", \"\").lower() in {\"1\", \"true\", \"yes\"}"}, {"kind": "method", "name": "send", "line": 65, "signature": "def send"}, {"kind": "method", "name": "_emit_debug", "line": 69, "signature": "def _emit_debug"}, {"kind": "method", "name": "orchestrator", "line": 87, "signature": "def orchestrator"}, {"kind": "method", "name": "handle", "line": 91, "signature": "def handle"}, {"kind": "method", "name": "_ensure_orchestrator", "line": 209, "signature": "def _ensure_orchestrator"}, {"kind": "method", "name": "_apply_session", "line": 231, "signature": "def _apply_session"}, {"kind": "method", "name": "_extract_prompt", "line": 258, "signature": "def _extract_prompt"}, {"kind": "method", "name": "_extract_approvals", "line": 266, "signature": "def _extract_approvals"}, {"kind": "method", "name": "_build_external_tools", "line": 302, "signature": "def _build_external_tools"}, {"kind": "method", "name": "_extract_pending_tool_call_ids", "line": 316, "signature": "def _extract_pending_tool_call_ids"}, {"kind": "method", "name": "_extract_host_system_prompt", "line": 327, "signature": "def _extract_host_system_prompt"}, {"kind": "method", "name": "_sanitize_messages_for_resume", "line": 340, "signature": "def _sanitize_messages_for_resume"}, {"kind": "method", "name": "_extract_tool_results", "line": 352, "signature": "def _extract_tool_results"}, {"kind": "method", "name": "_consume_stream", "line": 387, "signature": "def _consume_stream"}, {"kind": "method", "name": "_sync_task_state", "line": 409, "signature": "def _sync_task_state"}, {"kind": "method", "name": "_summarize_stream_event", "line": 443, "signature": "def _summarize_stream_event"}, {"kind": "method", "name": "reset_session_init", "line": 477, "signature": "def reset_session_init"}, {"kind": "method", "name": "shutdown", "line": 485, "signature": "def shutdown"}, {"kind": "function", "name": "build_sender", "line": 496, "signature": "def build_sender"}, {"kind": "function", "name": "_send", "line": 499, "signature": "def _send"}]}
16
16
  {"path": "src/nonoka_cli/bridge/protocol.py", "mtime": 1783784407.695538, "symbols": [{"kind": "variable", "name": "annotations", "line": 8, "signature": "instance annotations"}, {"kind": "class", "name": "Any", "line": 10, "signature": "class Any"}, {"kind": "variable", "name": "Literal", "line": 10, "signature": "instance Literal"}, {"kind": "class", "name": "BaseModel", "line": 12, "signature": "class BaseModel"}, {"kind": "function", "name": "Field", "line": 12, "signature": "def Field"}, {"kind": "class", "name": "ToolCall", "line": 19, "signature": "class ToolCall"}, {"kind": "variable", "name": "id", "line": 22, "signature": "id: str"}, {"kind": "variable", "name": "name", "line": 23, "signature": "name: str"}, {"kind": "variable", "name": "arguments", "line": 24, "signature": "arguments: str"}, {"kind": "class", "name": "ChatMessage", "line": 27, "signature": "class ChatMessage"}, {"kind": "variable", "name": "role", "line": 30, "signature": "role: Literal[\"system\", \"user\", \"assistant\", \"tool\"]"}, {"kind": "variable", "name": "content", "line": 31, "signature": "content: str"}, {"kind": "variable", "name": "tool_call_id", "line": 32, "signature": "tool_call_id: str | None = None"}, {"kind": "variable", "name": "tool_calls", "line": 33, "signature": "tool_calls: list[ToolCall] | None = None"}, {"kind": "class", "name": "ExternalToolDefinition", "line": 36, "signature": "class ExternalToolDefinition"}, {"kind": "variable", "name": "name", "line": 39, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 40, "signature": "description: str"}, {"kind": "variable", "name": "parameters", "line": 41, "signature": "parameters: dict[str, Any]"}, {"kind": "class", "name": "ExternalMCPToolDefinition", "line": 44, "signature": "class ExternalMCPToolDefinition"}, {"kind": "variable", "name": "name", "line": 47, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 48, "signature": "description: str"}, {"kind": "variable", "name": "parameters", "line": 49, "signature": "parameters: dict[str, Any]"}, {"kind": "class", "name": "ExternalMCPServerDefinition", "line": 52, "signature": "class ExternalMCPServerDefinition"}, {"kind": "variable", "name": "name", "line": 55, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 56, "signature": "description: str = \"\""}, {"kind": "variable", "name": "tools", "line": 57, "signature": "tools: list[ExternalMCPToolDefinition]"}, {"kind": "class", "name": "ExternalSkillToolDefinition", "line": 60, "signature": "class ExternalSkillToolDefinition"}, {"kind": "variable", "name": "name", "line": 63, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 64, "signature": "description: str"}, {"kind": "variable", "name": "parameters", "line": 65, "signature": "parameters: dict[str, Any]"}, {"kind": "class", "name": "ExternalSkillDefinition", "line": 68, "signature": "class ExternalSkillDefinition"}, {"kind": "variable", "name": "name", "line": 71, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 72, "signature": "description: str = \"\""}, {"kind": "variable", "name": "tools", "line": 73, "signature": "tools: list[ExternalSkillToolDefinition]"}, {"kind": "variable", "name": "system_prompt", "line": 74, "signature": "system_prompt: str = \"\""}, {"kind": "variable", "name": "activation_prompt", "line": 75, "signature": "activation_prompt: str = \"\""}, {"kind": "class", "name": "ChatRequest", "line": 78, "signature": "class ChatRequest"}, {"kind": "variable", "name": "type", "line": 81, "signature": "type: Literal[\"chat\"] = \"chat\""}, {"kind": "variable", "name": "messages", "line": 82, "signature": "messages: list[ChatMessage]"}, {"kind": "variable", "name": "tools", "line": 83, "signature": "tools: list[ExternalToolDefinition] | None = None"}, {"kind": "variable", "name": "external_mcp_servers", "line": 84, "signature": "external_mcp_servers: list[ExternalMCPServerDefinition] | None = None"}, {"kind": "variable", "name": "external_skills", "line": 85, "signature": "external_skills: list[ExternalSkillDefinition] | None = None"}, {"kind": "variable", "name": "session_id", "line": 86, "signature": "session_id: str | None = None"}, {"kind": "variable", "name": "new_session", "line": 87, "signature": "new_session: bool = False"}, {"kind": "variable", "name": "cwd", "line": 88, "signature": "cwd: str = Field(default=\".\")"}, {"kind": "variable", "name": "model", "line": 89, "signature": "model: str | None = None"}, {"kind": "variable", "name": "request_id", "line": 90, "signature": "request_id: str | None = None"}, {"kind": "variable", "name": "InboundMessage", "line": 93, "signature": "InboundMessage = ChatRequest"}, {"kind": "class", "name": "SessionInitEvent", "line": 101, "signature": "class SessionInitEvent"}, {"kind": "variable", "name": "type", "line": 104, "signature": "type: Literal[\"session_init\"] = \"session_init\""}, {"kind": "variable", "name": "session_id", "line": 105, "signature": "session_id: str"}, {"kind": "class", "name": "TextDeltaEvent", "line": 108, "signature": "class TextDeltaEvent"}, {"kind": "variable", "name": "type", "line": 111, "signature": "type: Literal[\"text_delta\"] = \"text_delta\""}, {"kind": "variable", "name": "text", "line": 112, "signature": "text: str"}, {"kind": "class", "name": "FinishEvent", "line": 115, "signature": "class FinishEvent"}, {"kind": "variable", "name": "type", "line": 118, "signature": "type: Literal[\"finish\"] = \"finish\""}, {"kind": "variable", "name": "finish_reason", "line": 119, "signature": "finish_reason: Literal[\"stop\", \"error\", \"cancel\", \"approval_required\", \"tool_calls\"]"}, {"kind": "class", "name": "ToolCallEvent", "line": 122, "signature": "class ToolCallEvent"}, {"kind": "variable", "name": "type", "line": 125, "signature": "type: Literal[\"tool_call\"] = \"tool_call\""}, {"kind": "variable", "name": "tool_call_id", "line": 126, "signature": "tool_call_id: str"}, {"kind": "variable", "name": "tool_name", "line": 127, "signature": "tool_name: str"}, {"kind": "variable", "name": "args", "line": 128, "signature": "args: Any = None"}, {"kind": "variable", "name": "metadata", "line": 129, "signature": "metadata: dict[str, Any] | None = None"}, {"kind": "class", "name": "ToolResultEvent", "line": 132, "signature": "class ToolResultEvent"}, {"kind": "variable", "name": "type", "line": 135, "signature": "type: Literal[\"tool_result\"] = \"tool_result\""}, {"kind": "variable", "name": "tool_call_id", "line": 136, "signature": "tool_call_id: str"}, {"kind": "variable", "name": "tool_name", "line": 137, "signature": "tool_name: str"}, {"kind": "variable", "name": "content", "line": 138, "signature": "content: str"}, {"kind": "variable", "name": "result", "line": 139, "signature": "result: Any = None"}, {"kind": "variable", "name": "is_error", "line": 140, "signature": "is_error: bool = False"}, {"kind": "class", "name": "ApprovalRequestEvent", "line": 143, "signature": "class ApprovalRequestEvent"}, {"kind": "variable", "name": "type", "line": 146, "signature": "type: Literal[\"approval_request\"] = \"approval_request\""}, {"kind": "variable", "name": "id", "line": 147, "signature": "id: str"}, {"kind": "variable", "name": "tool_call_id", "line": 148, "signature": "tool_call_id: str"}, {"kind": "variable", "name": "tool_name", "line": 149, "signature": "tool_name: str"}, {"kind": "variable", "name": "args", "line": 150, "signature": "args: Any = None"}, {"kind": "class", "name": "DebugEvent", "line": 153, "signature": "class DebugEvent"}, {"kind": "variable", "name": "type", "line": 161, "signature": "type: Literal[\"debug\"] = \"debug\""}, {"kind": "variable", "name": "level", "line": 162, "signature": "level: Literal[\"info\", \"warning\", \"error\"] = \"info\""}, {"kind": "variable", "name": "message", "line": 163, "signature": "message: str"}, {"kind": "variable", "name": "payload", "line": 164, "signature": "payload: dict[str, Any] | None = None"}, {"kind": "class", "name": "ErrorEvent", "line": 167, "signature": "class ErrorEvent"}, {"kind": "variable", "name": "type", "line": 170, "signature": "type: Literal[\"error\"] = \"error\""}, {"kind": "variable", "name": "message", "line": 171, "signature": "message: str"}, {"kind": "variable", "name": "OutboundMessage", "line": 174, "signature": "OutboundMessage = ( SessionInitEvent | TextDeltaEvent | ToolCallEvent | ToolResultEvent | ApprovalRequestEvent | FinishEvent | DebugEvent | ErrorEvent )"}, {"kind": "function", "name": "parse_inbound_line", "line": 191, "signature": "def parse_inbound_line"}, {"kind": "function", "name": "encode_outbound_message", "line": 216, "signature": "def encode_outbound_message"}]}
17
17
  {"path": "src/nonoka_cli/bridge/server.py", "mtime": 1784004088.649871, "symbols": [{"kind": "variable", "name": "annotations", "line": 8, "signature": "instance annotations"}, {"kind": "function", "name": "asyncio", "line": 10, "signature": "module asyncio"}, {"kind": "function", "name": "logging", "line": 11, "signature": "module logging"}, {"kind": "function", "name": "os", "line": 12, "signature": "module os"}, {"kind": "function", "name": "sys", "line": 13, "signature": "module sys"}, {"kind": "class", "name": "Path", "line": 14, "signature": "class Path"}, {"kind": "function", "name": "structlog", "line": 16, "signature": "module structlog"}, {"kind": "class", "name": "ChatRequestHandler", "line": 18, "signature": "class ChatRequestHandler"}, {"kind": "function", "name": "build_sender", "line": 18, "signature": "def build_sender"}, {"kind": "class", "name": "ChatRequest", "line": 20, "signature": "class ChatRequest"}, {"kind": "class", "name": "ErrorEvent", "line": 21, "signature": "class ErrorEvent"}, {"kind": "function", "name": "parse_inbound_line", "line": 22, "signature": "def parse_inbound_line"}, {"kind": "function", "name": "setup_logging", "line": 24, "signature": "def setup_logging"}, {"kind": "variable", "name": "logger", "line": 26, "signature": "logger = structlog.get_logger(\"nonoka_cli.bridge\")"}, {"kind": "class", "name": "BridgeServer", "line": 29, "signature": "class BridgeServer"}, {"kind": "method", "name": "__init__", "line": 32, "signature": "def __init__"}, {"kind": "variable", "name": "_stdin", "line": 45, "signature": "self._stdin = stdin"}, {"kind": "variable", "name": "_stdout", "line": 46, "signature": "self._stdout = stdout"}, {"kind": "variable", "name": "_handler", "line": 47, "signature": "self._handler = ChatRequestHandler( send=build_sender(stdout), config_path=config_path, model=model, )"}, {"kind": "variable", "name": "_running", "line": 52, "signature": "self._running = True"}, {"kind": "variable", "name": "_chat_lock", "line": 53, "signature": "self._chat_lock = asyncio.Lock()"}, {"kind": "method", "name": "run", "line": 59, "signature": "def run"}, {"kind": "method", "name": "_handle_chat", "line": 94, "signature": "def _handle_chat"}, {"kind": "method", "name": "_shutdown", "line": 110, "signature": "def _shutdown"}, {"kind": "function", "name": "_setup_logging", "line": 128, "signature": "def _setup_logging"}, {"kind": "function", "name": "_async_main", "line": 135, "signature": "def _async_main"}, {"kind": "function", "name": "main", "line": 156, "signature": "def main"}]}
18
- {"path": "src/nonoka_cli/cli.py", "mtime": 1783844424.7407386, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "logging", "line": 6, "signature": "module logging"}, {"kind": "function", "name": "os", "line": 7, "signature": "module os"}, {"kind": "function", "name": "sys", "line": 8, "signature": "module sys"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "function", "name": "structlog", "line": 25, "signature": "module structlog"}, {"kind": "function", "name": "load_dotenv", "line": 26, "signature": "def load_dotenv"}, {"kind": "function", "name": "server_main", "line": 28, "signature": "def server_main"}, {"kind": "function", "name": "config_cmd", "line": 29, "signature": "module config_cmd"}, {"kind": "function", "name": "doctor_cmd", "line": 29, "signature": "module doctor_cmd"}, {"kind": "function", "name": "opencode_cmd", "line": 29, "signature": "module opencode_cmd"}, {"kind": "function", "name": "plugin_cmd", "line": 29, "signature": "module plugin_cmd"}, {"kind": "function", "name": "setup_logging", "line": 30, "signature": "def setup_logging"}, {"kind": "variable", "name": "logger", "line": 32, "signature": "logger = structlog.get_logger(\"nonoka_cli.cli\")"}, {"kind": "function", "name": "_load_env_files", "line": 35, "signature": "def _load_env_files"}, {"kind": "function", "name": "_build_parser", "line": 51, "signature": "def _build_parser"}, {"kind": "function", "name": "main", "line": 95, "signature": "def main"}]}
18
+ {"path": "src/nonoka_cli/cli.py", "mtime": 1784217590.4602783, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "logging", "line": 6, "signature": "module logging"}, {"kind": "function", "name": "os", "line": 7, "signature": "module os"}, {"kind": "function", "name": "sys", "line": 8, "signature": "module sys"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "function", "name": "structlog", "line": 25, "signature": "module structlog"}, {"kind": "function", "name": "load_dotenv", "line": 26, "signature": "def load_dotenv"}, {"kind": "function", "name": "server_main", "line": 28, "signature": "def server_main"}, {"kind": "function", "name": "config_cmd", "line": 29, "signature": "module config_cmd"}, {"kind": "function", "name": "doctor_cmd", "line": 29, "signature": "module doctor_cmd"}, {"kind": "function", "name": "opencode_cmd", "line": 29, "signature": "module opencode_cmd"}, {"kind": "function", "name": "plugin_cmd", "line": 29, "signature": "module plugin_cmd"}, {"kind": "function", "name": "run_cmd", "line": 29, "signature": "module run_cmd"}, {"kind": "function", "name": "setup_logging", "line": 30, "signature": "def setup_logging"}, {"kind": "variable", "name": "logger", "line": 32, "signature": "logger = structlog.get_logger(\"nonoka_cli.cli\")"}, {"kind": "function", "name": "_load_env_files", "line": 35, "signature": "def _load_env_files"}, {"kind": "function", "name": "_build_parser", "line": 51, "signature": "def _build_parser"}, {"kind": "function", "name": "main", "line": 96, "signature": "def main"}]}
19
19
  {"path": "src/nonoka_cli/commands/config_cmd.py", "mtime": 1783767794.6866252, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "getpass", "line": 6, "signature": "module getpass"}, {"kind": "function", "name": "json", "line": 7, "signature": "module json"}, {"kind": "function", "name": "os", "line": 8, "signature": "module os"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 10, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 12, "signature": "module structlog"}, {"kind": "function", "name": "yaml", "line": 13, "signature": "module yaml"}, {"kind": "class", "name": "ConfigLoader", "line": 15, "signature": "class ConfigLoader"}, {"kind": "class", "name": "ConfigManager", "line": 16, "signature": "class ConfigManager"}, {"kind": "class", "name": "CLIBehaviorConfig", "line": 17, "signature": "class CLIBehaviorConfig"}, {"kind": "class", "name": "CLIConfig", "line": 17, "signature": "class CLIConfig"}, {"kind": "class", "name": "HITLConfigModel", "line": 17, "signature": "class HITLConfigModel"}, {"kind": "class", "name": "ConfigError", "line": 18, "signature": "class ConfigError"}, {"kind": "variable", "name": "logger", "line": 20, "signature": "logger = structlog.get_logger(\"nonoka_cli.commands.config\")"}, {"kind": "variable", "name": "_GLOBAL_ENV_PATH", "line": 23, "signature": "_GLOBAL_ENV_PATH = Path.home() / \".config\" / \"nonoka\" / \".env\""}, {"kind": "function", "name": "_load_manager", "line": 26, "signature": "def _load_manager"}, {"kind": "function", "name": "_read_input", "line": 38, "signature": "def _read_input"}, {"kind": "function", "name": "_confirm", "line": 47, "signature": "def _confirm"}, {"kind": "function", "name": "_read_secret", "line": 56, "signature": "def _read_secret"}, {"kind": "function", "name": "_load_env_file", "line": 70, "signature": "def _load_env_file"}, {"kind": "function", "name": "_write_env_file", "line": 85, "signature": "def _write_env_file"}, {"kind": "function", "name": "_set_dotted", "line": 102, "signature": "def _set_dotted"}, {"kind": "function", "name": "_coerce_value", "line": 113, "signature": "def _coerce_value"}, {"kind": "variable", "name": "_DEFAULT_DANGEROUS_TOOLS", "line": 134, "signature": "_DEFAULT_DANGEROUS_TOOLS = [ \"write_file\", \"edit_file\", \"delete_file\", \"execute_command\", ]"}, {"kind": "variable", "name": "_DEFAULT_SYSTEM_PROMPT", "line": 141, "signature": "_DEFAULT_SYSTEM_PROMPT = ( \"You are nonoka-cli, an autonomous coding assistant running inside OpenCode.\\n\" \"Use the tools available to you proactively to complete tasks.\\n\" \"For multi-step tasks, always start by calling the todowrite tool to create a plan.\\n\" \"Keep responses concise but thorough.\" )"}, {"kind": "function", "name": "_api_key_env_for_model", "line": 149, "signature": "def _api_key_env_for_model"}, {"kind": "function", "name": "_api_key_source_summary", "line": 165, "signature": "def _api_key_source_summary"}, {"kind": "function", "name": "_collect_api_key", "line": 174, "signature": "def _collect_api_key"}, {"kind": "function", "name": "cmd_init", "line": 213, "signature": "def cmd_init"}, {"kind": "function", "name": "cmd_set", "line": 285, "signature": "def cmd_set"}, {"kind": "function", "name": "cmd_show", "line": 306, "signature": "def cmd_show"}, {"kind": "function", "name": "_add_config_arg", "line": 320, "signature": "def _add_config_arg"}, {"kind": "function", "name": "add_subparser", "line": 328, "signature": "def add_subparser"}]}
20
20
  {"path": "src/nonoka_cli/commands/doctor_cmd.py", "mtime": 1782916416.4781291, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "asyncio", "line": 6, "signature": "module asyncio"}, {"kind": "function", "name": "importlib", "line": 7, "signature": "module importlib"}, {"kind": "function", "name": "json", "line": 8, "signature": "module json"}, {"kind": "function", "name": "os", "line": 9, "signature": "module os"}, {"kind": "function", "name": "shutil", "line": 10, "signature": "module shutil"}, {"kind": "function", "name": "subprocess", "line": 11, "signature": "module subprocess"}, {"kind": "function", "name": "sys", "line": 12, "signature": "module sys"}, {"kind": "function", "name": "dataclass", "line": 13, "signature": "def dataclass"}, {"kind": "class", "name": "Path", "line": 14, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 15, "signature": "class Any"}, {"kind": "class", "name": "ConfigLoader", "line": 17, "signature": "class ConfigLoader"}, {"kind": "class", "name": "CLIConfig", "line": 18, "signature": "class CLIConfig"}, {"kind": "class", "name": "ConfigError", "line": 19, "signature": "class ConfigError"}, {"kind": "class", "name": "CheckResult", "line": 25, "signature": "class CheckResult"}, {"kind": "variable", "name": "status", "line": 28, "signature": "status: str"}, {"kind": "variable", "name": "message", "line": 29, "signature": "message: str"}, {"kind": "variable", "name": "remedy", "line": 30, "signature": "remedy: str = \"\""}, {"kind": "variable", "name": "_STATUS_ICONS", "line": 33, "signature": "_STATUS_ICONS = { \"ok\": \"✓\", \"warn\": \"⚠\", \"error\": \"✗\", }"}, {"kind": "function", "name": "_api_key_env_for_model", "line": 40, "signature": "def _api_key_env_for_model"}, {"kind": "function", "name": "_run", "line": 56, "signature": "def _run"}, {"kind": "function", "name": "check_nonoka_cli_version", "line": 71, "signature": "def check_nonoka_cli_version"}, {"kind": "function", "name": "check_python_version", "line": 80, "signature": "def check_python_version"}, {"kind": "function", "name": "check_opencode", "line": 92, "signature": "def check_opencode"}, {"kind": "function", "name": "_provider_version_from_npm_global", "line": 113, "signature": "def _provider_version_from_npm_global"}, {"kind": "function", "name": "_provider_version_from_opencode_dir", "line": 135, "signature": "def _provider_version_from_opencode_dir"}, {"kind": "function", "name": "check_provider", "line": 154, "signature": "def check_provider"}, {"kind": "function", "name": "check_config", "line": 166, "signature": "def check_config"}, {"kind": "function", "name": "check_api_key", "line": 192, "signature": "def check_api_key"}, {"kind": "function", "name": "_find_opencode_config", "line": 213, "signature": "def _find_opencode_config"}, {"kind": "function", "name": "check_opencode_config", "line": 224, "signature": "def check_opencode_config"}, {"kind": "function", "name": "_ping_llm", "line": 254, "signature": "def _ping_llm"}, {"kind": "class", "name": "AgentBuilder", "line": 257, "signature": "class AgentBuilder"}, {"kind": "function", "name": "check_llm", "line": 292, "signature": "def check_llm"}, {"kind": "function", "name": "run_doctor", "line": 303, "signature": "def run_doctor"}, {"kind": "function", "name": "_add_config_arg", "line": 331, "signature": "def _add_config_arg"}, {"kind": "function", "name": "add_subparser", "line": 339, "signature": "def add_subparser"}]}
21
21
  {"path": "src/nonoka_cli/commands/opencode_cmd.py", "mtime": 1784208223.6342945, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "json", "line": 6, "signature": "module json"}, {"kind": "function", "name": "shutil", "line": 7, "signature": "module shutil"}, {"kind": "function", "name": "subprocess", "line": 8, "signature": "module subprocess"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 10, "signature": "class Any"}, {"kind": "class", "name": "ConfigLoader", "line": 12, "signature": "class ConfigLoader"}, {"kind": "class", "name": "CLIConfig", "line": 13, "signature": "class CLIConfig"}, {"kind": "class", "name": "ConfigError", "line": 14, "signature": "class ConfigError"}, {"kind": "variable", "name": "_PROVIDER_PACKAGE", "line": 17, "signature": "_PROVIDER_PACKAGE = \"nonoka-opencode-provider\""}, {"kind": "function", "name": "_resolve_provider_version", "line": 20, "signature": "def _resolve_provider_version"}, {"kind": "variable", "name": "_PROVIDER_VERSION", "line": 32, "signature": "_PROVIDER_VERSION = _resolve_provider_version()"}, {"kind": "variable", "name": "_OPENCODE_AUTO_APPROVED_TOOLS", "line": 37, "signature": "_OPENCODE_AUTO_APPROVED_TOOLS = [\"read\", \"bash\", \"edit\", \"write\", \"todowrite\"]"}, {"kind": "function", "name": "_build_opencode_permission", "line": 40, "signature": "def _build_opencode_permission"}, {"kind": "variable", "name": "_DEFAULT_OPENCODE_CONFIG", "line": 62, "signature": "_DEFAULT_OPENCODE_CONFIG = { \"$schema\": \"https://opencode.ai/config.json\", \"model\": \"nonoka/default\", \"autoupdate\": False, \"provider\": { \"nonoka\": { \"npm\": \"nonoka-opencode-provider\", \"name\": \"Nonoka\", \"options\": { \"serverCommand\": [\"bash\", \"-c\", \"nonoka-cli --server 2>/tmp/nonoka-server.log\"], \"cwd\": \".\", }, \"models\": { \"default\": {\"name\": \"Nonoka Default\"} } } }, \"permission\": { \"*\": \"ask\", \"read\": \"ask\", \"bash\": \"ask\", \"edit\": \"ask\", \"write\": \"ask\", \"todowrite\": \"ask\", }, \"agent\": { \"build\": { \"mode\": \"primary\", \"permission\": { \"*\": \"ask\", \"read\": \"ask\", \"bash\": \"ask\", \"edit\": \"ask\", \"write\": \"ask\", \"todowrite\": \"ask\", }, } }, \"tools\": { \"skill\": False }, }"}, {"kind": "function", "name": "_install_provider_locally", "line": 114, "signature": "def _install_provider_locally"}, {"kind": "variable", "name": "_OPENCODE_PROMPT_GUIDELINES", "line": 156, "signature": "_OPENCODE_PROMPT_GUIDELINES = ( \"\\n\" \"OpenCode-specific guidelines:\\n\" \"- You are running inside OpenCode. Use only the tools provided by OpenCode.\\n\" \"- Tool names available in this environment include bash, read, write, edit, and todowrite.\\n\" \"- For multi-step tasks, keep the OpenCode TODO panel up to date using the todowrite tool.\\n\" \"- Do not explore directories or read files unless the user explicitly requests it.\\n\" \"- When writing or editing files, use absolute paths under the current working directory \" \"unless the user provides a different path.\\n\" \"- Prefer reading a file before editing it when you need context.\\n\" )"}, {"kind": "function", "name": "_build_opencode_agent_prompt", "line": 169, "signature": "def _build_opencode_agent_prompt"}, {"kind": "function", "name": "_load_config", "line": 196, "signature": "def _load_config"}, {"kind": "function", "name": "_global_opencode_path", "line": 205, "signature": "def _global_opencode_path"}, {"kind": "function", "name": "cmd_init", "line": 210, "signature": "def cmd_init"}, {"kind": "function", "name": "_add_config_arg", "line": 305, "signature": "def _add_config_arg"}, {"kind": "function", "name": "add_subparser", "line": 313, "signature": "def add_subparser"}]}
22
22
  {"path": "src/nonoka_cli/commands/plugin_cmd.py", "mtime": 1783844325.165602, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "json", "line": 6, "signature": "module json"}, {"kind": "class", "name": "Path", "line": 7, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 8, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 10, "signature": "module structlog"}, {"kind": "function", "name": "yaml", "line": 11, "signature": "module yaml"}, {"kind": "class", "name": "PluginManifestLoader", "line": 13, "signature": "class PluginManifestLoader"}, {"kind": "function", "name": "convert_to_opencode", "line": 15, "signature": "def convert_to_opencode"}, {"kind": "function", "name": "write_opencode_files", "line": 16, "signature": "def write_opencode_files"}, {"kind": "class", "name": "ConfigError", "line": 18, "signature": "class ConfigError"}, {"kind": "variable", "name": "logger", "line": 20, "signature": "logger = structlog.get_logger(\"nonoka_cli.commands.plugin\")"}, {"kind": "function", "name": "_load_manifest", "line": 23, "signature": "def _load_manifest"}, {"kind": "function", "name": "run_convert", "line": 35, "signature": "def run_convert"}, {"kind": "function", "name": "add_subparser", "line": 61, "signature": "def add_subparser"}]}
23
+ {"path": "src/nonoka_cli/commands/run_cmd.py", "mtime": 1784217471.137306, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "argparse", "line": 5, "signature": "module argparse"}, {"kind": "function", "name": "shutil", "line": 6, "signature": "module shutil"}, {"kind": "function", "name": "subprocess", "line": 7, "signature": "module subprocess"}, {"kind": "function", "name": "sys", "line": 8, "signature": "module sys"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 10, "signature": "class Any"}, {"kind": "function", "name": "cmd_init", "line": 12, "signature": "def cmd_init"}, {"kind": "function", "name": "_has_opencode", "line": 15, "signature": "def _has_opencode"}, {"kind": "function", "name": "_has_opencode_config", "line": 20, "signature": "def _has_opencode_config"}, {"kind": "function", "name": "_ensure_opencode_config", "line": 25, "signature": "def _ensure_opencode_config"}, {"kind": "function", "name": "launch_tui", "line": 47, "signature": "def launch_tui"}, {"kind": "function", "name": "cmd_run", "line": 80, "signature": "def cmd_run"}, {"kind": "function", "name": "add_subparser", "line": 85, "signature": "def add_subparser"}]}
23
24
  {"path": "src/nonoka_cli/config/__init__.py", "mtime": 1782715700.1570864, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "ConfigLoader", "line": 5, "signature": "class ConfigLoader"}, {"kind": "function", "name": "load_config", "line": 5, "signature": "def load_config"}, {"kind": "class", "name": "ConfigManager", "line": 6, "signature": "class ConfigManager"}, {"kind": "class", "name": "CLIConfig", "line": 7, "signature": "class CLIConfig"}, {"kind": "variable", "name": "__all__", "line": 9, "signature": "__all__ = [\"CLIConfig\", \"ConfigLoader\", \"load_config\", \"ConfigManager\"]"}]}
24
25
  {"path": "src/nonoka_cli/config/loader.py", "mtime": 1782906479.885954, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "os", "line": 5, "signature": "module os"}, {"kind": "function", "name": "re", "line": 6, "signature": "module re"}, {"kind": "class", "name": "Path", "line": 7, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 8, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 10, "signature": "module structlog"}, {"kind": "class", "name": "ValidationError", "line": 11, "signature": "class ValidationError"}, {"kind": "class", "name": "CLIConfig", "line": 13, "signature": "class CLIConfig"}, {"kind": "class", "name": "ConfigError", "line": 14, "signature": "class ConfigError"}, {"kind": "class", "name": "ConfigNotFoundError", "line": 14, "signature": "class ConfigNotFoundError"}, {"kind": "variable", "name": "logger", "line": 16, "signature": "logger = structlog.get_logger(\"nonoka_cli.config\")"}, {"kind": "variable", "name": "_ENV_PATTERN", "line": 18, "signature": "_ENV_PATTERN = re.compile(r\"\\$\\{(?P<name>[A-Za-z_][A-Za-z0-9_]*)(?::-?(?P<default>[^}]*))?\\}\")"}, {"kind": "function", "name": "_format_pydantic_errors", "line": 21, "signature": "def _format_pydantic_errors"}, {"kind": "function", "name": "_suggest_fix", "line": 46, "signature": "def _suggest_fix"}, {"kind": "function", "name": "_substitute_env_vars", "line": 71, "signature": "def _substitute_env_vars"}, {"kind": "function", "name": "replacer", "line": 74, "signature": "def replacer"}, {"kind": "class", "name": "ConfigLoader", "line": 93, "signature": "class ConfigLoader"}, {"kind": "variable", "name": "DEFAULT_PATH", "line": 102, "signature": "DEFAULT_PATH = Path.home() / \".config\" / \"nonoka\" / \"config.yaml\""}, {"kind": "variable", "name": "MCP_SERVERS_PATH", "line": 103, "signature": "MCP_SERVERS_PATH = Path.home() / \".config\" / \"nonoka\" / \"mcp_servers.yaml\""}, {"kind": "method", "name": "fallback_path", "line": 106, "signature": "def fallback_path"}, {"kind": "method", "name": "find_config_file", "line": 111, "signature": "def find_config_file"}, {"kind": "method", "name": "_load_yaml", "line": 137, "signature": "def _load_yaml"}, {"kind": "method", "name": "load", "line": 159, "signature": "def load"}, {"kind": "method", "name": "save", "line": 214, "signature": "def save"}, {"kind": "method", "name": "save_mcp_servers", "line": 246, "signature": "def save_mcp_servers"}, {"kind": "method", "name": "load_mcp_servers", "line": 267, "signature": "def load_mcp_servers"}, {"kind": "function", "name": "load_config", "line": 277, "signature": "def load_config"}]}
25
26
  {"path": "src/nonoka_cli/config/manager.py", "mtime": 1782828810.7918913, "symbols": [{"kind": "variable", "name": "annotations", "line": 7, "signature": "instance annotations"}, {"kind": "class", "name": "Path", "line": 9, "signature": "class Path"}, {"kind": "class", "name": "Callable", "line": 10, "signature": "class Callable"}, {"kind": "function", "name": "structlog", "line": 12, "signature": "module structlog"}, {"kind": "class", "name": "ConfigLoader", "line": 14, "signature": "class ConfigLoader"}, {"kind": "class", "name": "CLIConfig", "line": 15, "signature": "class CLIConfig"}, {"kind": "class", "name": "ConfigError", "line": 16, "signature": "class ConfigError"}, {"kind": "variable", "name": "logger", "line": 18, "signature": "logger = structlog.get_logger(\"nonoka_cli.config\")"}, {"kind": "variable", "name": "ChangeCallback", "line": 20, "signature": "ChangeCallback = Callable[[CLIConfig], None]"}, {"kind": "class", "name": "ConfigManager", "line": 23, "signature": "class ConfigManager"}, {"kind": "method", "name": "load", "line": 39, "signature": "def load"}, {"kind": "method", "name": "__init__", "line": 60, "signature": "def __init__"}, {"kind": "variable", "name": "_config", "line": 67, "signature": "self._config = config"}, {"kind": "variable", "name": "_config_path", "line": 68, "signature": "self._config_path = config_path"}, {"kind": "variable", "name": "_listeners", "line": 69, "signature": "self._listeners: list[ChangeCallback] = []"}, {"kind": "method", "name": "config", "line": 72, "signature": "def config"}, {"kind": "method", "name": "config_path", "line": 77, "signature": "def config_path"}, {"kind": "method", "name": "get", "line": 81, "signature": "def get"}, {"kind": "method", "name": "reload", "line": 85, "signature": "def reload"}, {"kind": "method", "name": "on_change", "line": 130, "signature": "def on_change"}, {"kind": "method", "name": "remove_listener", "line": 138, "signature": "def remove_listener"}, {"kind": "method", "name": "save", "line": 153, "signature": "def save"}]}
@@ -28,7 +29,7 @@
28
29
  {"path": "src/nonoka_cli/core/agent_factory.py", "mtime": 1784032357.4657493, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "json", "line": 5, "signature": "module json"}, {"kind": "class", "name": "Path", "line": 6, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 7, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 9, "signature": "module structlog"}, {"kind": "class", "name": "Agent", "line": 11, "signature": "class Agent"}, {"kind": "class", "name": "AgentBuilder", "line": 12, "signature": "class AgentBuilder"}, {"kind": "class", "name": "ExternalCapability", "line": 13, "signature": "class ExternalCapability"}, {"kind": "class", "name": "ExternalMCPRegistry", "line": 14, "signature": "class ExternalMCPRegistry"}, {"kind": "class", "name": "ExternalMCPServer", "line": 15, "signature": "class ExternalMCPServer"}, {"kind": "class", "name": "ExternalMCPToolDefinition", "line": 16, "signature": "class ExternalMCPToolDefinition"}, {"kind": "class", "name": "ExternalSkill", "line": 17, "signature": "class ExternalSkill"}, {"kind": "class", "name": "ExternalSkillRegistry", "line": 18, "signature": "class ExternalSkillRegistry"}, {"kind": "class", "name": "ExternalSkillToolDefinition", "line": 19, "signature": "class ExternalSkillToolDefinition"}, {"kind": "class", "name": "SkillRegistry", "line": 20, "signature": "class SkillRegistry"}, {"kind": "function", "name": "load_skill", "line": 21, "signature": "def load_skill"}, {"kind": "class", "name": "Capability", "line": 23, "signature": "class Capability"}, {"kind": "class", "name": "CLIConfig", "line": 25, "signature": "class CLIConfig"}, {"kind": "class", "name": "PrefixedCapability", "line": 27, "signature": "class PrefixedCapability"}, {"kind": "function", "name": "mcp_tool_name", "line": 28, "signature": "def mcp_tool_name"}, {"kind": "function", "name": "skill_tool_name", "line": 29, "signature": "def skill_tool_name"}, {"kind": "class", "name": "SystemPromptBuilder", "line": 31, "signature": "class SystemPromptBuilder"}, {"kind": "class", "name": "MCPManager", "line": 32, "signature": "class MCPManager"}, {"kind": "class", "name": "ToolLoader", "line": 33, "signature": "class ToolLoader"}, {"kind": "class", "name": "AgentBuildError", "line": 34, "signature": "class AgentBuildError"}, {"kind": "variable", "name": "logger", "line": 36, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "variable", "name": "_DEFAULT_CODING_SYSTEM_PROMPT", "line": 39, "signature": "_DEFAULT_CODING_SYSTEM_PROMPT = \"\"\"\\ You are nonoka-cli, an autonomous ai assistant running in a terminal. You can read, write, edit, and delete files, run shell commands, and explore the project directory. Use your tools proactively to complete tasks. When given a task, follow this workflow: 1. Understand the goal. Ask clarifying questions only when the request is ambiguous. 2. Explore the working directory with `list_dir`, `view_dir`, and `grep_files` to understand the project structure. 3. Read relevant files with `view` or `read_file` before modifying them. 4. Make changes with the right tool: - `write_file` for new files or complete rewrites. - `edit_file` for small, precise changes (old_string must appear exactly once). - `search_and_replace` for bulk replacements. - `delete_file` to remove files. 5. Run commands with `execute_command` to install dependencies, build, test, lint, or verify your work. 6. Report what you did, what was created/changed, and any remaining manual steps. Guidelines: - Always read a file before editing it. - When using `edit_file`, include enough surrounding context in `old_string` so the match is unique. - Prefer `write_file` over many small `edit_file` calls when rewriting a whole file or large section. - Run build/test commands when available and report the result. - If a command fails, analyze the output and try to fix the issue. - Keep responses concise but thorough. You operate in the user's current working directory. \"\"\""}, {"kind": "variable", "name": "_OPENCODE_HOSTED_SYSTEM_PROMPT", "line": 72, "signature": "_OPENCODE_HOSTED_SYSTEM_PROMPT = ( \"You are nonoka-cli, an autonomous coding assistant running inside OpenCode.\\n\" \"Use only the tools provided to you by this environment to complete tasks.\\n\" \"OpenCode handles host native tool execution and any required approvals.\\n\\n\" \"Skill and MCP namespace rules (important):\\n\" \"- nonoka-managed skills expose tools as ``skill__<skill>__<tool>``.\\n\" \"- nonoka-managed MCP servers expose tools as ``mcp__<server>__<tool>``.\\n\" \"- To activate a skill's full guidance, call the ``load_skill`` tool first.\\n\" \"- Do NOT use OpenCode's native ``skill:<name>`` syntax; it is disabled in\\n\" \" this configuration to avoid conflicting with nonoka's skill tools.\\n\\n\" \"Guidelines:\\n\" \"- Prefer reading files before editing them.\\n\" \"- Run build/test commands when available and report the result.\\n\" \"- If a command fails, analyze the output and try to fix the issue.\\n\" \"- Keep responses concise but thorough.\\n\\n\" \"You operate in the user's current working directory.\\n\" )"}, {"kind": "class", "name": "AgentFactory", "line": 91, "signature": "class AgentFactory"}, {"kind": "method", "name": "__init__", "line": 101, "signature": "def __init__"}, {"kind": "variable", "name": "_config", "line": 119, "signature": "self._config = config"}, {"kind": "variable", "name": "_mcp_manager", "line": 120, "signature": "self._mcp_manager = mcp_manager"}, {"kind": "variable", "name": "_tool_loader", "line": 121, "signature": "self._tool_loader = tool_loader"}, {"kind": "variable", "name": "_skill_registry", "line": 122, "signature": "self._skill_registry = skill_registry"}, {"kind": "variable", "name": "_allowed_tools", "line": 123, "signature": "self._allowed_tools = set(allowed_tools or [])"}, {"kind": "variable", "name": "_agent", "line": 124, "signature": "self._agent: Agent | None = None"}, {"kind": "variable", "name": "_repo_map", "line": 125, "signature": "self._repo_map: str | None = None"}, {"kind": "variable", "name": "_git_summary", "line": 126, "signature": "self._git_summary: str | None = None"}, {"kind": "variable", "name": "_plugin_summary", "line": 127, "signature": "self._plugin_summary: str | None = None"}, {"kind": "variable", "name": "_execution_plan", "line": 128, "signature": "self._execution_plan: str | None = None"}, {"kind": "method", "name": "config", "line": 131, "signature": "def config"}, {"kind": "method", "name": "tool_loader", "line": 136, "signature": "def tool_loader"}, {"kind": "method", "name": "skill_registry", "line": 141, "signature": "def skill_registry"}, {"kind": "method", "name": "_executor_max_turns", "line": 145, "signature": "def _executor_max_turns"}, {"kind": "method", "name": "build", "line": 149, "signature": "def build"}, {"kind": "method", "name": "_build_system_prompt", "line": 245, "signature": "def _build_system_prompt"}, {"kind": "method", "name": "build_with_external_tools", "line": 265, "signature": "def build_with_external_tools"}, {"kind": "method", "name": "_skill_registry_for_build", "line": 465, "signature": "def _skill_registry_for_build"}, {"kind": "method", "name": "create_external_tool_capability", "line": 491, "signature": "def create_external_tool_capability"}, {"kind": "method", "name": "_is_opencode_native_skill_enabled", "line": 511, "signature": "def _is_opencode_native_skill_enabled"}, {"kind": "method", "name": "_collect_tools", "line": 533, "signature": "def _collect_tools"}, {"kind": "method", "name": "list_all_tools", "line": 559, "signature": "def list_all_tools"}, {"kind": "method", "name": "get_tool", "line": 567, "signature": "def get_tool"}, {"kind": "method", "name": "rebuild", "line": 574, "signature": "def rebuild"}, {"kind": "method", "name": "get_agent", "line": 596, "signature": "def get_agent"}, {"kind": "class", "name": "_PrefixedSkillRegistry", "line": 601, "signature": "class _PrefixedSkillRegistry"}, {"kind": "method", "name": "__init__", "line": 609, "signature": "def __init__"}, {"kind": "variable", "name": "_inner", "line": 610, "signature": "self._inner = inner"}, {"kind": "method", "name": "discover", "line": 612, "signature": "def discover"}, {"kind": "method", "name": "available", "line": 616, "signature": "def available"}, {"kind": "method", "name": "enabled", "line": 620, "signature": "def enabled"}, {"kind": "method", "name": "get_skill", "line": 623, "signature": "def get_skill"}, {"kind": "method", "name": "get_tools", "line": 626, "signature": "def get_tools"}, {"kind": "method", "name": "build_registry_block", "line": 637, "signature": "def build_registry_block"}]}
29
30
  {"path": "src/nonoka_cli/core/context.py", "mtime": 1783826146.2299054, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "dataclass", "line": 5, "signature": "def dataclass"}, {"kind": "function", "name": "field", "line": 5, "signature": "def field"}, {"kind": "class", "name": "Path", "line": 6, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 7, "signature": "class Any"}, {"kind": "class", "name": "CLIConfig", "line": 9, "signature": "class CLIConfig"}, {"kind": "class", "name": "CLIContext", "line": 13, "signature": "class CLIContext"}, {"kind": "variable", "name": "user", "line": 19, "signature": "user: str"}, {"kind": "variable", "name": "session_id", "line": 20, "signature": "session_id: str"}, {"kind": "variable", "name": "config", "line": 21, "signature": "config: CLIConfig"}, {"kind": "variable", "name": "working_dir", "line": 22, "signature": "working_dir: Path"}, {"kind": "variable", "name": "task_state_service", "line": 23, "signature": "task_state_service: Any = field(default=None, repr=False)"}, {"kind": "variable", "name": "skill_manager", "line": 24, "signature": "skill_manager: Any = field(default=None, repr=False)"}, {"kind": "variable", "name": "mcp_manager", "line": 25, "signature": "mcp_manager: Any = field(default=None, repr=False)"}, {"kind": "variable", "name": "git_service", "line": 26, "signature": "git_service: Any = field(default=None, repr=False)"}, {"kind": "variable", "name": "repo_map_service", "line": 27, "signature": "repo_map_service: Any = field(default=None, repr=False)"}, {"kind": "variable", "name": "plugin_manifests", "line": 28, "signature": "plugin_manifests: list[Any] = field(default_factory=list, repr=False)"}]}
30
31
  {"path": "src/nonoka_cli/core/context_trimmer.py", "mtime": 1783768025.1620889, "symbols": [{"kind": "variable", "name": "annotations", "line": 10, "signature": "instance annotations"}, {"kind": "function", "name": "dataclass", "line": 12, "signature": "def dataclass"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "class", "name": "LLMMessage", "line": 15, "signature": "class LLMMessage"}, {"kind": "class", "name": "LLMMessageRole", "line": 15, "signature": "class LLMMessageRole"}, {"kind": "class", "name": "ContextTrimConfig", "line": 19, "signature": "class ContextTrimConfig"}, {"kind": "variable", "name": "max_turns", "line": 22, "signature": "max_turns: int = 8"}, {"kind": "variable", "name": "enabled", "line": 25, "signature": "enabled: bool = True"}, {"kind": "variable", "name": "max_tokens", "line": 28, "signature": "max_tokens: int | None = None"}, {"kind": "method", "name": "__post_init__", "line": 31, "signature": "def __post_init__"}, {"kind": "class", "name": "TurnBasedContextTrimmer", "line": 36, "signature": "class TurnBasedContextTrimmer"}, {"kind": "method", "name": "__init__", "line": 45, "signature": "def __init__"}, {"kind": "variable", "name": "_config", "line": 46, "signature": "self._config = config or ContextTrimConfig()"}, {"kind": "method", "name": "config", "line": 49, "signature": "def config"}, {"kind": "method", "name": "trim", "line": 52, "signature": "def trim"}, {"kind": "method", "name": "_is_real_user_message", "line": 73, "signature": "def _is_real_user_message"}, {"kind": "method", "name": "from_config", "line": 82, "signature": "def from_config"}]}
31
- {"path": "src/nonoka_cli/core/git_service.py", "mtime": 1783843930.9025667, "symbols": [{"kind": "variable", "name": "annotations", "line": 11, "signature": "instance annotations"}, {"kind": "function", "name": "shutil", "line": 13, "signature": "module shutil"}, {"kind": "function", "name": "structlog", "line": 14, "signature": "module structlog"}, {"kind": "class", "name": "Path", "line": 15, "signature": "class Path"}, {"kind": "class", "name": "SimpleNamespace", "line": 16, "signature": "class SimpleNamespace"}, {"kind": "class", "name": "Any", "line": 17, "signature": "class Any"}, {"kind": "class", "name": "RunContext", "line": 19, "signature": "class RunContext"}, {"kind": "class", "name": "CLIConfig", "line": 21, "signature": "class CLIConfig"}, {"kind": "class", "name": "GitConfig", "line": 21, "signature": "class GitConfig"}, {"kind": "variable", "name": "logger", "line": 23, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "variable", "name": "_WRITE_TOOLS", "line": 25, "signature": "_WRITE_TOOLS = { \"write_file\", \"edit_file\", \"search_and_replace\", \"delete_file\", }"}, {"kind": "class", "name": "GitService", "line": 33, "signature": "class GitService"}, {"kind": "method", "name": "__init__", "line": 36, "signature": "def __init__"}, {"kind": "variable", "name": "_working_dir", "line": 41, "signature": "self._working_dir = working_dir"}, {"kind": "variable", "name": "_config", "line": 42, "signature": "self._config = config or GitConfig()"}, {"kind": "variable", "name": "_last_checkpoint", "line": 43, "signature": "self._last_checkpoint: str | None = None"}, {"kind": "method", "name": "enabled", "line": 46, "signature": "def enabled"}, {"kind": "method", "name": "working_dir", "line": 50, "signature": "def working_dir"}, {"kind": "method", "name": "is_git_repo", "line": 53, "signature": "def is_git_repo"}, {"kind": "method", "name": "should_checkpoint_before", "line": 72, "signature": "def should_checkpoint_before"}, {"kind": "method", "name": "should_checkpoint_after", "line": 80, "signature": "def should_checkpoint_after"}, {"kind": "method", "name": "checkpoint_before", "line": 88, "signature": "def checkpoint_before"}, {"kind": "function", "name": "git_checkpoint", "line": 102, "signature": "def git_checkpoint"}, {"kind": "method", "name": "checkpoint_after", "line": 121, "signature": "def checkpoint_after"}, {"kind": "function", "name": "git_checkpoint", "line": 139, "signature": "def git_checkpoint"}, {"kind": "method", "name": "rollback_last", "line": 162, "signature": "def rollback_last"}, {"kind": "function", "name": "git_rollback", "line": 188, "signature": "def git_rollback"}, {"kind": "method", "name": "_build_checkpoint_message", "line": 216, "signature": "def _build_checkpoint_message"}, {"kind": "method", "name": "status_summary", "line": 248, "signature": "def status_summary"}, {"kind": "class", "name": "Agent", "line": 254, "signature": "class Agent"}, {"kind": "class", "name": "RunContext", "line": 255, "signature": "class RunContext"}, {"kind": "class", "name": "Session", "line": 256, "signature": "class Session"}, {"kind": "function", "name": "build_git_service", "line": 275, "signature": "def build_git_service"}]}
32
+ {"path": "src/nonoka_cli/core/git_service.py", "mtime": 1783843930.9025667, "symbols": [{"kind": "variable", "name": "annotations", "line": 11, "signature": "instance annotations"}, {"kind": "function", "name": "shutil", "line": 13, "signature": "module shutil"}, {"kind": "function", "name": "structlog", "line": 14, "signature": "module structlog"}, {"kind": "class", "name": "Path", "line": 15, "signature": "class Path"}, {"kind": "class", "name": "SimpleNamespace", "line": 16, "signature": "class SimpleNamespace"}, {"kind": "class", "name": "Any", "line": 17, "signature": "class Any"}, {"kind": "class", "name": "RunContext", "line": 19, "signature": "class RunContext"}, {"kind": "class", "name": "CLIConfig", "line": 21, "signature": "class CLIConfig"}, {"kind": "class", "name": "GitConfig", "line": 21, "signature": "class GitConfig"}, {"kind": "variable", "name": "logger", "line": 23, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "variable", "name": "_WRITE_TOOLS", "line": 25, "signature": "_WRITE_TOOLS = { \"write_file\", \"edit_file\", \"search_and_replace\", \"delete_file\", }"}, {"kind": "class", "name": "GitService", "line": 33, "signature": "class GitService"}, {"kind": "method", "name": "__init__", "line": 36, "signature": "def __init__"}, {"kind": "variable", "name": "_working_dir", "line": 41, "signature": "self._working_dir = working_dir"}, {"kind": "variable", "name": "_config", "line": 42, "signature": "self._config = config or GitConfig()"}, {"kind": "variable", "name": "_last_checkpoint", "line": 43, "signature": "self._last_checkpoint: str | None = None"}, {"kind": "method", "name": "enabled", "line": 46, "signature": "def enabled"}, {"kind": "method", "name": "working_dir", "line": 50, "signature": "def working_dir"}, {"kind": "method", "name": "is_git_repo", "line": 53, "signature": "def is_git_repo"}, {"kind": "method", "name": "should_checkpoint_before", "line": 72, "signature": "def should_checkpoint_before"}, {"kind": "method", "name": "should_checkpoint_after", "line": 80, "signature": "def should_checkpoint_after"}, {"kind": "method", "name": "checkpoint_before", "line": 88, "signature": "def checkpoint_before"}, {"kind": "method", "name": "checkpoint_after", "line": 121, "signature": "def checkpoint_after"}, {"kind": "method", "name": "rollback_last", "line": 162, "signature": "def rollback_last"}, {"kind": "function", "name": "git_rollback", "line": 188, "signature": "def git_rollback"}, {"kind": "method", "name": "_build_checkpoint_message", "line": 216, "signature": "def _build_checkpoint_message"}, {"kind": "method", "name": "status_summary", "line": 248, "signature": "def status_summary"}, {"kind": "class", "name": "Agent", "line": 254, "signature": "class Agent"}, {"kind": "class", "name": "RunContext", "line": 255, "signature": "class RunContext"}, {"kind": "class", "name": "Session", "line": 256, "signature": "class Session"}, {"kind": "function", "name": "git_status", "line": 257, "signature": "def git_status"}, {"kind": "function", "name": "build_git_service", "line": 275, "signature": "def build_git_service"}]}
32
33
  {"path": "src/nonoka_cli/core/mcp_service.py", "mtime": 1782738883.2285938, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "structlog", "line": 5, "signature": "module structlog"}, {"kind": "class", "name": "ConfigLoader", "line": 7, "signature": "class ConfigLoader"}, {"kind": "class", "name": "CLIConfig", "line": 8, "signature": "class CLIConfig"}, {"kind": "class", "name": "MCPServerConfigModel", "line": 8, "signature": "class MCPServerConfigModel"}, {"kind": "class", "name": "AgentFactory", "line": 9, "signature": "class AgentFactory"}, {"kind": "class", "name": "MCPManager", "line": 10, "signature": "class MCPManager"}, {"kind": "class", "name": "MCPStatus", "line": 11, "signature": "class MCPStatus"}, {"kind": "class", "name": "ConfigError", "line": 12, "signature": "class ConfigError"}, {"kind": "variable", "name": "logger", "line": 14, "signature": "logger = structlog.get_logger(\"nonoka_cli.core.mcp\")"}, {"kind": "class", "name": "MCPService", "line": 17, "signature": "class MCPService"}, {"kind": "method", "name": "__init__", "line": 20, "signature": "def __init__"}, {"kind": "variable", "name": "_manager", "line": 21, "signature": "self._manager = manager"}, {"kind": "variable", "name": "_agent_factory", "line": 22, "signature": "self._agent_factory = agent_factory"}, {"kind": "method", "name": "list_status", "line": 24, "signature": "def list_status"}, {"kind": "method", "name": "restart", "line": 28, "signature": "def restart"}, {"kind": "method", "name": "add_server", "line": 33, "signature": "def add_server"}]}
33
34
  {"path": "src/nonoka_cli/core/namespaces.py", "mtime": 1783841688.9249947, "symbols": [{"kind": "variable", "name": "annotations", "line": 8, "signature": "instance annotations"}, {"kind": "function", "name": "re", "line": 10, "signature": "module re"}, {"kind": "class", "name": "Any", "line": 11, "signature": "class Any"}, {"kind": "variable", "name": "NAMESPACE_SEPARATOR", "line": 18, "signature": "NAMESPACE_SEPARATOR = \"__\""}, {"kind": "function", "name": "sanitize_tool_name", "line": 21, "signature": "def sanitize_tool_name"}, {"kind": "function", "name": "mcp_tool_name", "line": 34, "signature": "def mcp_tool_name"}, {"kind": "function", "name": "skill_tool_name", "line": 39, "signature": "def skill_tool_name"}, {"kind": "class", "name": "PrefixedCapability", "line": 44, "signature": "class PrefixedCapability"}, {"kind": "method", "name": "__init__", "line": 52, "signature": "def __init__"}, {"kind": "variable", "name": "_wrapped", "line": 53, "signature": "self._wrapped = wrapped"}, {"kind": "variable", "name": "name", "line": 54, "signature": "self.name = sanitize_tool_name(f\"{prefix}{wrapped.name}\")"}, {"kind": "variable", "name": "description", "line": 55, "signature": "self.description = getattr(wrapped, \"description\", \"\")"}, {"kind": "variable", "name": "parameters", "line": 56, "signature": "self.parameters = getattr(wrapped, \"parameters\", {})"}, {"kind": "variable", "name": "external", "line": 57, "signature": "self.external = getattr(wrapped, \"external\", False)"}, {"kind": "variable", "name": "metadata", "line": 58, "signature": "self.metadata = dict(getattr(wrapped, \"metadata\", {}) or {})"}, {"kind": "method", "name": "invoke", "line": 60, "signature": "def invoke"}, {"kind": "method", "name": "to_json_schema", "line": 63, "signature": "def to_json_schema"}, {"kind": "method", "name": "__getattr__", "line": 74, "signature": "def __getattr__"}]}
34
35
  {"path": "src/nonoka_cli/core/orchestrator.py", "mtime": 1783953935.6631825, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "AsyncIterator", "line": 5, "signature": "class AsyncIterator"}, {"kind": "class", "name": "Path", "line": 6, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 7, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 9, "signature": "module structlog"}, {"kind": "function", "name": "Runner", "line": 10, "signature": "module Runner"}, {"kind": "class", "name": "SQLiteCheckpointStore", "line": 11, "signature": "class SQLiteCheckpointStore"}, {"kind": "class", "name": "RunContext", "line": 12, "signature": "class RunContext"}, {"kind": "class", "name": "Hooks", "line": 13, "signature": "class Hooks"}, {"kind": "class", "name": "LLMMessageRole", "line": 14, "signature": "class LLMMessageRole"}, {"kind": "class", "name": "StreamEvent", "line": 15, "signature": "class StreamEvent"}, {"kind": "class", "name": "Capability", "line": 16, "signature": "class Capability"}, {"kind": "class", "name": "HumanInTheLoopHooks", "line": 17, "signature": "class HumanInTheLoopHooks"}, {"kind": "class", "name": "HumanApprover", "line": 18, "signature": "class HumanApprover"}, {"kind": "class", "name": "ToolRule", "line": 18, "signature": "class ToolRule"}, {"kind": "class", "name": "SkillRegistry", "line": 19, "signature": "class SkillRegistry"}, {"kind": "class", "name": "ConfigManager", "line": 21, "signature": "class ConfigManager"}, {"kind": "class", "name": "CLIConfig", "line": 22, "signature": "class CLIConfig"}, {"kind": "class", "name": "MCPServerConfigModel", "line": 22, "signature": "class MCPServerConfigModel"}, {"kind": "class", "name": "AgentFactory", "line": 23, "signature": "class AgentFactory"}, {"kind": "class", "name": "CLIContext", "line": 24, "signature": "class CLIContext"}, {"kind": "class", "name": "TurnBasedContextTrimmer", "line": 25, "signature": "class TurnBasedContextTrimmer"}, {"kind": "class", "name": "GitService", "line": 26, "signature": "class GitService"}, {"kind": "function", "name": "build_git_service", "line": 26, "signature": "def build_git_service"}, {"kind": "class", "name": "MCPService", "line": 27, "signature": "class MCPService"}, {"kind": "class", "name": "PlanningService", "line": 28, "signature": "class PlanningService"}, {"kind": "function", "name": "build_planning_service", "line": 28, "signature": "def build_planning_service"}, {"kind": "class", "name": "ReviewService", "line": 29, "signature": "class ReviewService"}, {"kind": "function", "name": "build_review_service", "line": 29, "signature": "def build_review_service"}, {"kind": "class", "name": "PluginManifestLoader", "line": 31, "signature": "class PluginManifestLoader"}, {"kind": "function", "name": "format_manifest_summary", "line": 32, "signature": "def format_manifest_summary"}, {"kind": "function", "name": "merge_manifests", "line": 33, "signature": "def merge_manifests"}, {"kind": "class", "name": "RepoMapService", "line": 35, "signature": "class RepoMapService"}, {"kind": "function", "name": "build_repo_map_service", "line": 35, "signature": "def build_repo_map_service"}, {"kind": "class", "name": "RunnerService", "line": 36, "signature": "class RunnerService"}, {"kind": "class", "name": "SessionService", "line": 37, "signature": "class SessionService"}, {"kind": "class", "name": "TaskStateService", "line": 38, "signature": "class TaskStateService"}, {"kind": "class", "name": "ToolOutputPolicy", "line": 39, "signature": "class ToolOutputPolicy"}, {"kind": "class", "name": "ToolService", "line": 40, "signature": "class ToolService"}, {"kind": "class", "name": "MCPManager", "line": 41, "signature": "class MCPManager"}, {"kind": "class", "name": "MCPStatus", "line": 42, "signature": "class MCPStatus"}, {"kind": "class", "name": "SessionInfo", "line": 43, "signature": "class SessionInfo"}, {"kind": "class", "name": "ToolLoader", "line": 44, "signature": "class ToolLoader"}, {"kind": "class", "name": "ConfigError", "line": 45, "signature": "class ConfigError"}, {"kind": "class", "name": "MCPRestartExhaustedError", "line": 45, "signature": "class MCPRestartExhaustedError"}, {"kind": "class", "name": "OrchestratorError", "line": 45, "signature": "class OrchestratorError"}, {"kind": "variable", "name": "logger", "line": 47, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "class", "name": "_DeferredApprover", "line": 50, "signature": "class _DeferredApprover"}, {"kind": "method", "name": "request_approval", "line": 58, "signature": "def request_approval"}, {"kind": "method", "name": "supports_modify", "line": 62, "signature": "def supports_modify"}, {"kind": "function", "name": "_paths_from_tool_arguments", "line": 66, "signature": "def _paths_from_tool_arguments"}, {"kind": "class", "name": "Orchestrator", "line": 78, "signature": "class Orchestrator"}, {"kind": "method", "name": "__init__", "line": 81, "signature": "def __init__"}, {"kind": "variable", "name": "_config", "line": 90, "signature": "self._config = config"}, {"kind": "variable", "name": "_config_manager", "line": 91, "signature": "self._config_manager = config_manager"}, {"kind": "variable", "name": "_session_service", "line": 92, "signature": "self._session_service = session_service or SessionService(db_path=db_path)"}, {"kind": "variable", "name": "_mcp_manager", "line": 93, "signature": "self._mcp_manager = mcp_manager or MCPManager()"}, {"kind": "variable", "name": "_tool_loader", "line": 94, "signature": "self._tool_loader = tool_loader"}, {"kind": "variable", "name": "_agent_factory", "line": 95, "signature": "self._agent_factory: AgentFactory | None = None"}, {"kind": "variable", "name": "_runner_service", "line": 96, "signature": "self._runner_service: RunnerService | None = None"}, {"kind": "variable", "name": "_tool_service", "line": 97, "signature": "self._tool_service: ToolService | None = None"}, {"kind": "variable", "name": "_mcp_service", "line": 98, "signature": "self._mcp_service: MCPService | None = None"}, {"kind": "variable", "name": "_git_service", "line": 99, "signature": "self._git_service: GitService | None = None"}, {"kind": "variable", "name": "_repo_map_service", "line": 100, "signature": "self._repo_map_service: RepoMapService | None = None"}, {"kind": "variable", "name": "_planning_service", "line": 101, "signature": "self._planning_service: PlanningService | None = None"}, {"kind": "variable", "name": "_review_service", "line": 102, "signature": "self._review_service: ReviewService | None = None"}, {"kind": "variable", "name": "_plugin_manifests", "line": 103, "signature": "self._plugin_manifests: list[Any] = []"}, {"kind": "variable", "name": "_initialized", "line": 104, "signature": "self._initialized = False"}, {"kind": "method", "name": "config", "line": 107, "signature": "def config"}, {"kind": "method", "name": "session_id", "line": 113, "signature": "def session_id"}, {"kind": "method", "name": "mcp_manager", "line": 117, "signature": "def mcp_manager"}, {"kind": "method", "name": "_ensure_initialized", "line": 120, "signature": "def _ensure_initialized"}, {"kind": "method", "name": "_touch_session", "line": 124, "signature": "def _touch_session"}, {"kind": "method", "name": "initialize", "line": 131, "signature": "def initialize"}, {"kind": "method", "name": "_build_hooks", "line": 224, "signature": "def _build_hooks"}, {"kind": "function", "name": "on_llm_request", "line": 254, "signature": "def on_llm_request"}, {"kind": "function", "name": "on_tool_start", "line": 271, "signature": "def on_tool_start"}, {"kind": "function", "name": "on_tool_end", "line": 284, "signature": "def on_tool_end"}, {"kind": "method", "name": "_build_repo_map_block", "line": 327, "signature": "def _build_repo_map_block"}, {"kind": "method", "name": "_build_repo_map_block_for_dir", "line": 333, "signature": "def _build_repo_map_block_for_dir"}, {"kind": "method", "name": "_git_status_summary_for_dir", "line": 338, "signature": "def _git_status_summary_for_dir"}, {"kind": "method", "name": "_build_plugin_summary", "line": 343, "signature": "def _build_plugin_summary"}, {"kind": "method", "name": "_effective_allowed_tools", "line": 350, "signature": "def _effective_allowed_tools"}, {"kind": "method", "name": "_subagent_tools", "line": 357, "signature": "def _subagent_tools"}, {"kind": "method", "name": "_on_config_changed", "line": 370, "signature": "def _on_config_changed"}, {"kind": "method", "name": "_build_skill_registry", "line": 375, "signature": "def _build_skill_registry"}, {"kind": "method", "name": "_build_cli_context", "line": 395, "signature": "def _build_cli_context"}, {"kind": "method", "name": "execute", "line": 424, "signature": "def execute"}, {"kind": "method", "name": "resume_approval", "line": 478, "signature": "def resume_approval"}, {"kind": "method", "name": "execute_with_external_tools", "line": 511, "signature": "def execute_with_external_tools"}, {"kind": "method", "name": "resume_external_tools", "line": 585, "signature": "def resume_external_tools"}, {"kind": "method", "name": "new_session", "line": 643, "signature": "def new_session"}, {"kind": "method", "name": "switch_session", "line": 650, "signature": "def switch_session"}, {"kind": "method", "name": "rename_session", "line": 655, "signature": "def rename_session"}, {"kind": "method", "name": "delete_session", "line": 660, "signature": "def delete_session"}, {"kind": "method", "name": "list_sessions", "line": 665, "signature": "def list_sessions"}, {"kind": "method", "name": "switch_model", "line": 670, "signature": "def switch_model"}, {"kind": "method", "name": "reload_config", "line": 693, "signature": "def reload_config"}, {"kind": "method", "name": "_tools", "line": 729, "signature": "def _tools"}, {"kind": "method", "name": "list_tools", "line": 734, "signature": "def list_tools"}, {"kind": "method", "name": "get_tool_info", "line": 738, "signature": "def get_tool_info"}, {"kind": "method", "name": "reload_tools", "line": 742, "signature": "def reload_tools"}, {"kind": "method", "name": "_mcps", "line": 747, "signature": "def _mcps"}, {"kind": "method", "name": "list_mcp_status", "line": 752, "signature": "def list_mcp_status"}, {"kind": "method", "name": "restart_mcp", "line": 756, "signature": "def restart_mcp"}, {"kind": "method", "name": "add_mcp_server", "line": 760, "signature": "def add_mcp_server"}, {"kind": "method", "name": "shutdown", "line": 769, "signature": "def shutdown"}]}
@@ -36,7 +37,7 @@
36
37
  {"path": "src/nonoka_cli/core/plugin_manifest.py", "mtime": 1783860763.716773, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "function", "name": "json", "line": 11, "signature": "module json"}, {"kind": "function", "name": "structlog", "line": 12, "signature": "module structlog"}, {"kind": "class", "name": "Path", "line": 13, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 14, "signature": "class Any"}, {"kind": "class", "name": "BaseModel", "line": 16, "signature": "class BaseModel"}, {"kind": "function", "name": "Field", "line": 16, "signature": "def Field"}, {"kind": "function", "name": "field_validator", "line": 16, "signature": "def field_validator"}, {"kind": "class", "name": "MCPServerConfigModel", "line": 18, "signature": "class MCPServerConfigModel"}, {"kind": "class", "name": "ConfigError", "line": 19, "signature": "class ConfigError"}, {"kind": "variable", "name": "logger", "line": 21, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "variable", "name": "DEFAULT_MANIFEST_PATHS", "line": 23, "signature": "DEFAULT_MANIFEST_PATHS = [ Path(\".nonoka\") / \"plugin.json\", ]"}, {"kind": "class", "name": "SkillEntry", "line": 28, "signature": "class SkillEntry"}, {"kind": "variable", "name": "name", "line": 31, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 32, "signature": "description: str = \"\""}, {"kind": "variable", "name": "path", "line": 33, "signature": "path: str | None = None"}, {"kind": "variable", "name": "system_prompt", "line": 34, "signature": "system_prompt: str = \"\""}, {"kind": "variable", "name": "activation_prompt", "line": 35, "signature": "activation_prompt: str = \"\""}, {"kind": "class", "name": "AgentEntry", "line": 38, "signature": "class AgentEntry"}, {"kind": "variable", "name": "name", "line": 41, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 42, "signature": "description: str = \"\""}, {"kind": "variable", "name": "model", "line": 43, "signature": "model: str = \"\""}, {"kind": "variable", "name": "system_prompt", "line": 44, "signature": "system_prompt: str = \"\""}, {"kind": "variable", "name": "max_turns", "line": 45, "signature": "max_turns: int = 5"}, {"kind": "variable", "name": "allowed_tools", "line": 46, "signature": "allowed_tools: list[str] = Field(default_factory=list)"}, {"kind": "class", "name": "CommandEntry", "line": 49, "signature": "class CommandEntry"}, {"kind": "variable", "name": "name", "line": 52, "signature": "name: str"}, {"kind": "variable", "name": "description", "line": 53, "signature": "description: str = \"\""}, {"kind": "variable", "name": "command", "line": 54, "signature": "command: str"}, {"kind": "class", "name": "HookEntry", "line": 57, "signature": "class HookEntry"}, {"kind": "variable", "name": "event", "line": 60, "signature": "event: str"}, {"kind": "variable", "name": "command", "line": 61, "signature": "command: str"}, {"kind": "class", "name": "PluginManifest", "line": 64, "signature": "class PluginManifest"}, {"kind": "variable", "name": "schema_version", "line": 72, "signature": "schema_version: str = \"1.0\""}, {"kind": "variable", "name": "name", "line": 73, "signature": "name: str = \"\""}, {"kind": "variable", "name": "description", "line": 74, "signature": "description: str = \"\""}, {"kind": "variable", "name": "skills", "line": 75, "signature": "skills: list[SkillEntry] = Field(default_factory=list)"}, {"kind": "variable", "name": "agents", "line": 76, "signature": "agents: list[AgentEntry] = Field(default_factory=list)"}, {"kind": "variable", "name": "mcp_servers", "line": 77, "signature": "mcp_servers: dict[str, MCPServerConfigModel] = Field(default_factory=dict)"}, {"kind": "variable", "name": "commands", "line": 78, "signature": "commands: list[CommandEntry] = Field(default_factory=list)"}, {"kind": "variable", "name": "hooks", "line": 79, "signature": "hooks: list[HookEntry] = Field(default_factory=list)"}, {"kind": "variable", "name": "allowed_tools", "line": 80, "signature": "allowed_tools: list[str] = Field(default_factory=list)"}, {"kind": "method", "name": "_validate_mcp_servers", "line": 84, "signature": "def _validate_mcp_servers"}, {"kind": "class", "name": "PluginManifestLoader", "line": 92, "signature": "class PluginManifestLoader"}, {"kind": "method", "name": "__init__", "line": 95, "signature": "def __init__"}, {"kind": "variable", "name": "_extra_paths", "line": 96, "signature": "self._extra_paths = [Path(p).expanduser() for p in (extra_paths or [])]"}, {"kind": "method", "name": "discover", "line": 98, "signature": "def discover"}, {"kind": "method", "name": "load", "line": 105, "signature": "def load"}, {"kind": "function", "name": "merge_manifests", "line": 121, "signature": "def merge_manifests"}, {"kind": "function", "name": "format_manifest_summary", "line": 149, "signature": "def format_manifest_summary"}]}
37
38
  {"path": "src/nonoka_cli/core/plugin_manifest_converter.py", "mtime": 1783861259.2775762, "symbols": [{"kind": "variable", "name": "annotations", "line": 10, "signature": "instance annotations"}, {"kind": "class", "name": "Path", "line": 12, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "class", "name": "PluginManifest", "line": 15, "signature": "class PluginManifest"}, {"kind": "function", "name": "_skill_to_markdown", "line": 18, "signature": "def _skill_to_markdown"}, {"kind": "function", "name": "convert_to_opencode", "line": 31, "signature": "def convert_to_opencode"}, {"kind": "function", "name": "write_opencode_files", "line": 55, "signature": "def write_opencode_files"}]}
38
39
  {"path": "src/nonoka_cli/core/prompt_builder.py", "mtime": 1783947925.8497574, "symbols": [{"kind": "variable", "name": "annotations", "line": 17, "signature": "instance annotations"}, {"kind": "class", "name": "Path", "line": 19, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 20, "signature": "class Any"}, {"kind": "variable", "name": "_OPENCODE_TODO_WORKFLOW_BLOCK", "line": 23, "signature": "_OPENCODE_TODO_WORKFLOW_BLOCK = \"\"\"\\ MANDATORY TODO WORKFLOW for multi-step tasks: 1. FIRST, call the `todowrite` tool to create the complete todo list. Mark the first step as `in_progress` and the rest as `pending`. 2. BEFORE starting any step, call `todowrite` to mark that step as `in_progress` and any previously completed steps as `completed`. 3. AFTER a step finishes successfully, call `todowrite` to mark it as `completed` and the next step as `in_progress`. 4. If a step fails or is skipped, call `todowrite` to mark it as `cancelled`. 5. At the end, call `todowrite` with every item marked `completed`. Do not skip these updates. The user sees progress through the OpenCode TODO UI, so you must keep the list accurate at every transition. Use these statuses exactly: - `pending` for steps not yet started. - `in_progress` for the step currently being worked on. - `completed` for steps that finished successfully. - `cancelled` for steps that failed or were skipped. \"\"\""}, {"kind": "class", "name": "SystemPromptBuilder", "line": 45, "signature": "class SystemPromptBuilder"}, {"kind": "method", "name": "__init__", "line": 48, "signature": "def __init__"}, {"kind": "variable", "name": "_base", "line": 83, "signature": "self._base = base"}, {"kind": "variable", "name": "_model", "line": 84, "signature": "self._model = model.strip()"}, {"kind": "variable", "name": "_cwd", "line": 85, "signature": "self._cwd = cwd"}, {"kind": "variable", "name": "_host_tools", "line": 86, "signature": "self._host_tools = host_tools or []"}, {"kind": "variable", "name": "_external_mcp_tools", "line": 87, "signature": "self._external_mcp_tools = external_mcp_tools or []"}, {"kind": "variable", "name": "_external_skill_tools", "line": 88, "signature": "self._external_skill_tools = external_skill_tools or []"}, {"kind": "variable", "name": "_internal_mcp_tools", "line": 89, "signature": "self._internal_mcp_tools = internal_mcp_tools or []"}, {"kind": "variable", "name": "_internal_skill_tools", "line": 90, "signature": "self._internal_skill_tools = internal_skill_tools or []"}, {"kind": "variable", "name": "_opencode_native_skill_enabled", "line": 91, "signature": "self._opencode_native_skill_enabled = opencode_native_skill_enabled"}, {"kind": "variable", "name": "_repo_map", "line": 92, "signature": "self._repo_map = repo_map"}, {"kind": "variable", "name": "_git_summary", "line": 93, "signature": "self._git_summary = git_summary"}, {"kind": "variable", "name": "_plugin_summary", "line": 94, "signature": "self._plugin_summary = plugin_summary"}, {"kind": "variable", "name": "_execution_plan", "line": 95, "signature": "self._execution_plan = execution_plan"}, {"kind": "variable", "name": "_allowed_tools", "line": 96, "signature": "self._allowed_tools = allowed_tools or []"}, {"kind": "method", "name": "build", "line": 98, "signature": "def build"}, {"kind": "method", "name": "_inject_identity", "line": 141, "signature": "def _inject_identity"}, {"kind": "method", "name": "_build_native_skill_warning", "line": 148, "signature": "def _build_native_skill_warning"}, {"kind": "method", "name": "_build_cwd_block", "line": 160, "signature": "def _build_cwd_block"}, {"kind": "method", "name": "_build_todo_block", "line": 175, "signature": "def _build_todo_block"}, {"kind": "method", "name": "_build_planner_block", "line": 181, "signature": "def _build_planner_block"}, {"kind": "method", "name": "_build_execution_plan_block", "line": 199, "signature": "def _build_execution_plan_block"}, {"kind": "method", "name": "_build_approval_block", "line": 212, "signature": "def _build_approval_block"}, {"kind": "method", "name": "_build_namespaces_block", "line": 229, "signature": "def _build_namespaces_block"}]}
39
- {"path": "src/nonoka_cli/core/repo_map_service.py", "mtime": 1783848818.693583, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "function", "name": "structlog", "line": 11, "signature": "module structlog"}, {"kind": "class", "name": "Path", "line": 12, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "class", "name": "Agent", "line": 15, "signature": "class Agent"}, {"kind": "class", "name": "RunContext", "line": 16, "signature": "class RunContext"}, {"kind": "class", "name": "Session", "line": 17, "signature": "class Session"}, {"kind": "variable", "name": "build_repo_map", "line": 18, "signature": "instance build_repo_map"}, {"kind": "variable", "name": "search_repo_map", "line": 18, "signature": "instance search_repo_map"}, {"kind": "class", "name": "CLIConfig", "line": 20, "signature": "class CLIConfig"}, {"kind": "class", "name": "RepoMapConfig", "line": 20, "signature": "class RepoMapConfig"}, {"kind": "variable", "name": "logger", "line": 22, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "class", "name": "RepoMapService", "line": 25, "signature": "class RepoMapService"}, {"kind": "method", "name": "__init__", "line": 28, "signature": "def __init__"}, {"kind": "variable", "name": "_working_dir", "line": 29, "signature": "self._working_dir = working_dir"}, {"kind": "variable", "name": "_config", "line": 30, "signature": "self._config = config or RepoMapConfig()"}, {"kind": "method", "name": "enabled", "line": 33, "signature": "def enabled"}, {"kind": "method", "name": "working_dir", "line": 37, "signature": "def working_dir"}, {"kind": "method", "name": "build", "line": 40, "signature": "def build"}, {"kind": "method", "name": "search", "line": 58, "signature": "def search"}, {"kind": "method", "name": "build_system_prompt_block", "line": 70, "signature": "def build_system_prompt_block"}, {"kind": "method", "name": "_run_context", "line": 88, "signature": "def _run_context"}, {"kind": "class", "name": "_RepoMapDeps", "line": 100, "signature": "class _RepoMapDeps"}, {"kind": "method", "name": "__init__", "line": 101, "signature": "def __init__"}, {"kind": "variable", "name": "working_dir", "line": 102, "signature": "self.working_dir = working_dir"}, {"kind": "function", "name": "build_repo_map_service", "line": 105, "signature": "def build_repo_map_service"}]}
40
+ {"path": "src/nonoka_cli/core/repo_map_service.py", "mtime": 1783848818.693583, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "function", "name": "structlog", "line": 11, "signature": "module structlog"}, {"kind": "class", "name": "Path", "line": 12, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "class", "name": "Agent", "line": 15, "signature": "class Agent"}, {"kind": "class", "name": "RunContext", "line": 16, "signature": "class RunContext"}, {"kind": "class", "name": "Session", "line": 17, "signature": "class Session"}, {"kind": "variable", "name": "build_repo_map", "line": 18, "signature": "instance build_repo_map"}, {"kind": "function", "name": "search_repo_map", "line": 18, "signature": "def search_repo_map"}, {"kind": "class", "name": "CLIConfig", "line": 20, "signature": "class CLIConfig"}, {"kind": "class", "name": "RepoMapConfig", "line": 20, "signature": "class RepoMapConfig"}, {"kind": "variable", "name": "logger", "line": 22, "signature": "logger = structlog.get_logger(\"nonoka_cli.core\")"}, {"kind": "class", "name": "RepoMapService", "line": 25, "signature": "class RepoMapService"}, {"kind": "method", "name": "__init__", "line": 28, "signature": "def __init__"}, {"kind": "variable", "name": "_working_dir", "line": 29, "signature": "self._working_dir = working_dir"}, {"kind": "variable", "name": "_config", "line": 30, "signature": "self._config = config or RepoMapConfig()"}, {"kind": "method", "name": "enabled", "line": 33, "signature": "def enabled"}, {"kind": "method", "name": "working_dir", "line": 37, "signature": "def working_dir"}, {"kind": "method", "name": "build", "line": 40, "signature": "def build"}, {"kind": "method", "name": "search", "line": 58, "signature": "def search"}, {"kind": "method", "name": "build_system_prompt_block", "line": 70, "signature": "def build_system_prompt_block"}, {"kind": "method", "name": "_run_context", "line": 88, "signature": "def _run_context"}, {"kind": "class", "name": "_RepoMapDeps", "line": 100, "signature": "class _RepoMapDeps"}, {"kind": "method", "name": "__init__", "line": 101, "signature": "def __init__"}, {"kind": "variable", "name": "working_dir", "line": 102, "signature": "self.working_dir = working_dir"}, {"kind": "function", "name": "build_repo_map_service", "line": 105, "signature": "def build_repo_map_service"}]}
40
41
  {"path": "src/nonoka_cli/core/review_service.py", "mtime": 1784032357.4587493, "symbols": [{"kind": "variable", "name": "annotations", "line": 8, "signature": "instance annotations"}, {"kind": "function", "name": "json", "line": 10, "signature": "module json"}, {"kind": "function", "name": "re", "line": 11, "signature": "module re"}, {"kind": "class", "name": "Path", "line": 12, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "class", "name": "AgentTool", "line": 15, "signature": "class AgentTool"}, {"kind": "class", "name": "RunContext", "line": 16, "signature": "class RunContext"}, {"kind": "class", "name": "RunResult", "line": 17, "signature": "class RunResult"}, {"kind": "class", "name": "BaseModel", "line": 18, "signature": "class BaseModel"}, {"kind": "function", "name": "Field", "line": 18, "signature": "def Field"}, {"kind": "class", "name": "ValidationError", "line": 18, "signature": "class ValidationError"}, {"kind": "class", "name": "AgentsConfig", "line": 20, "signature": "class AgentsConfig"}, {"kind": "class", "name": "CLIConfig", "line": 20, "signature": "class CLIConfig"}, {"kind": "class", "name": "SubagentService", "line": 21, "signature": "class SubagentService"}, {"kind": "class", "name": "_ReviewIssue", "line": 24, "signature": "class _ReviewIssue"}, {"kind": "variable", "name": "severity", "line": 27, "signature": "severity: str = Field( default=\"warning\", pattern=r\"^(critical|warning|info)$\", )"}, {"kind": "variable", "name": "file", "line": 31, "signature": "file: str = \"\""}, {"kind": "variable", "name": "line", "line": 32, "signature": "line: int | None = None"}, {"kind": "variable", "name": "description", "line": 33, "signature": "description: str"}, {"kind": "class", "name": "_ReviewOutput", "line": 36, "signature": "class _ReviewOutput"}, {"kind": "variable", "name": "approved", "line": 39, "signature": "approved: bool"}, {"kind": "variable", "name": "issues", "line": 40, "signature": "issues: list[_ReviewIssue] = Field(default_factory=list)"}, {"kind": "variable", "name": "suggestions", "line": 41, "signature": "suggestions: list[str] = Field(default_factory=list)"}, {"kind": "variable", "name": "_REVIEWER_SYSTEM_PROMPT", "line": 44, "signature": "_REVIEWER_SYSTEM_PROMPT = \"\"\"You are a code reviewer. Review the provided diff against the original task goal. Report concrete issues only. Do not suggest style-only or cosmetic changes. Return ONLY a JSON object matching this exact schema (no markdown, no extra text): { \"approved\": false, \"issues\": [ { \"severity\": \"critical|warning|info\", \"file\": \"<affected file path>\", \"line\": null, \"description\": \"<clear explanation of the problem>\" } ], \"suggestions\": [\"<actionable improvement>\"] } Rules: - Output valid JSON only. - approved is true only if the changes fully satisfy the goal and have no serious issues. - issues should be concrete: bugs, security problems, missing error handling, broken logic. - suggestions should be actionable and specific. - Do not include style-only feedback (formatting, naming preferences without justification). \"\"\""}, {"kind": "variable", "name": "_MAX_REVIEW_FILE_BYTES", "line": 72, "signature": "_MAX_REVIEW_FILE_BYTES = 1024 * 1024"}, {"kind": "function", "name": "_strip_markdown_fences", "line": 75, "signature": "def _strip_markdown_fences"}, {"kind": "function", "name": "_parse_and_validate_review", "line": 84, "signature": "def _parse_and_validate_review"}, {"kind": "class", "name": "_ReviewerAgentTool", "line": 104, "signature": "class _ReviewerAgentTool"}, {"kind": "method", "name": "parameters", "line": 114, "signature": "def parameters"}, {"kind": "method", "name": "invoke", "line": 126, "signature": "def invoke"}, {"kind": "method", "name": "_read_files", "line": 137, "signature": "def _read_files"}, {"kind": "class", "name": "ReviewService", "line": 179, "signature": "class ReviewService"}, {"kind": "method", "name": "_role_config", "line": 187, "signature": "def _role_config"}, {"kind": "method", "name": "_tool_name", "line": 191, "signature": "def _tool_name"}, {"kind": "method", "name": "_tool_description", "line": 195, "signature": "def _tool_description"}, {"kind": "method", "name": "_default_system_prompt", "line": 204, "signature": "def _default_system_prompt"}, {"kind": "method", "name": "reviewer_model", "line": 208, "signature": "def reviewer_model"}, {"kind": "method", "name": "reviewer_max_turns", "line": 213, "signature": "def reviewer_max_turns"}, {"kind": "method", "name": "_build_agent_tool", "line": 216, "signature": "def _build_agent_tool"}, {"kind": "method", "name": "review", "line": 227, "signature": "def review"}, {"kind": "method", "name": "_extract_result", "line": 245, "signature": "def _extract_result"}, {"kind": "method", "name": "_disabled_result", "line": 265, "signature": "def _disabled_result"}, {"kind": "method", "name": "_error_result", "line": 274, "signature": "def _error_result"}, {"kind": "function", "name": "build_review_service", "line": 282, "signature": "def build_review_service"}]}
41
42
  {"path": "src/nonoka_cli/core/runner_service.py", "mtime": 1783237022.4122121, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "AsyncIterator", "line": 5, "signature": "class AsyncIterator"}, {"kind": "class", "name": "Any", "line": 6, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 8, "signature": "module structlog"}, {"kind": "class", "name": "Agent", "line": 9, "signature": "class Agent"}, {"kind": "function", "name": "Runner", "line": 9, "signature": "module Runner"}, {"kind": "class", "name": "StreamEvent", "line": 10, "signature": "class StreamEvent"}, {"kind": "class", "name": "OrchestratorError", "line": 12, "signature": "class OrchestratorError"}, {"kind": "variable", "name": "logger", "line": 14, "signature": "logger = structlog.get_logger(\"nonoka_cli.core.runner\")"}, {"kind": "class", "name": "RunnerService", "line": 17, "signature": "class RunnerService"}, {"kind": "method", "name": "__init__", "line": 24, "signature": "def __init__"}, {"kind": "variable", "name": "_runner", "line": 28, "signature": "self._runner = runner"}, {"kind": "method", "name": "runner", "line": 31, "signature": "def runner"}, {"kind": "method", "name": "run", "line": 35, "signature": "def run"}, {"kind": "method", "name": "resume_approval", "line": 65, "signature": "def resume_approval"}, {"kind": "method", "name": "resume_external_tools", "line": 93, "signature": "def resume_external_tools"}]}
42
43
  {"path": "src/nonoka_cli/core/session_service.py", "mtime": 1782737068.4209127, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "uuid", "line": 5, "signature": "module uuid"}, {"kind": "class", "name": "Path", "line": 6, "signature": "class Path"}, {"kind": "function", "name": "structlog", "line": 8, "signature": "module structlog"}, {"kind": "class", "name": "SessionManager", "line": 10, "signature": "class SessionManager"}, {"kind": "class", "name": "SessionInfo", "line": 11, "signature": "class SessionInfo"}, {"kind": "class", "name": "SessionError", "line": 12, "signature": "class SessionError"}, {"kind": "class", "name": "SessionNotFoundError", "line": 12, "signature": "class SessionNotFoundError"}, {"kind": "variable", "name": "logger", "line": 14, "signature": "logger = structlog.get_logger(\"nonoka_cli.core.session\")"}, {"kind": "class", "name": "SessionService", "line": 17, "signature": "class SessionService"}, {"kind": "method", "name": "__init__", "line": 20, "signature": "def __init__"}, {"kind": "variable", "name": "_manager", "line": 25, "signature": "self._manager = session_manager or SessionManager(db_path=db_path)"}, {"kind": "variable", "name": "_current_id", "line": 26, "signature": "self._current_id: str = str(uuid.uuid4())"}, {"kind": "method", "name": "current_id", "line": 29, "signature": "def current_id"}, {"kind": "method", "name": "manager", "line": 33, "signature": "def manager"}, {"kind": "method", "name": "initialize", "line": 36, "signature": "def initialize"}, {"kind": "method", "name": "new", "line": 45, "signature": "def new"}, {"kind": "method", "name": "switch", "line": 56, "signature": "def switch"}, {"kind": "method", "name": "rename", "line": 65, "signature": "def rename"}, {"kind": "method", "name": "delete", "line": 69, "signature": "def delete"}, {"kind": "method", "name": "list", "line": 77, "signature": "def list"}, {"kind": "method", "name": "touch", "line": 81, "signature": "def touch"}, {"kind": "method", "name": "close", "line": 85, "signature": "def close"}]}
@@ -53,7 +54,7 @@
53
54
  {"path": "src/nonoka_cli/skills/__init__.py", "mtime": 1783758503.6491573, "symbols": [{"kind": "variable", "name": "annotations", "line": 7, "signature": "instance annotations"}, {"kind": "variable", "name": "__all__", "line": 9, "signature": "__all__: list[str] = []"}]}
54
55
  {"path": "src/nonoka_cli/tools/__init__.py", "mtime": 1782618411.0249205, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "ToolLoader", "line": 5, "signature": "class ToolLoader"}, {"kind": "variable", "name": "__all__", "line": 7, "signature": "__all__ = [\"ToolLoader\"]"}]}
55
56
  {"path": "src/nonoka_cli/tools/builtins/__init__.py", "mtime": 1783831752.9557486, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "Capability", "line": 5, "signature": "class Capability"}, {"kind": "function", "name": "agent_tools", "line": 7, "signature": "module agent_tools"}, {"kind": "function", "name": "file_tools", "line": 7, "signature": "module file_tools"}, {"kind": "function", "name": "get_tools", "line": 10, "signature": "def get_tools"}]}
56
- {"path": "src/nonoka_cli/tools/builtins/agent_tools.py", "mtime": 1783947809.170639, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "class", "name": "Capability", "line": 11, "signature": "class Capability"}, {"kind": "variable", "name": "build_repo_map", "line": 13, "signature": "instance build_repo_map"}, {"kind": "function", "name": "git_checkpoint", "line": 14, "signature": "def git_checkpoint"}, {"kind": "variable", "name": "git_rollback", "line": 15, "signature": "instance git_rollback"}, {"kind": "variable", "name": "git_status", "line": 16, "signature": "instance git_status"}, {"kind": "variable", "name": "lsp_document_symbols", "line": 17, "signature": "instance lsp_document_symbols"}, {"kind": "function", "name": "search_repo_map", "line": 18, "signature": "def search_repo_map"}, {"kind": "function", "name": "get_tools", "line": 22, "signature": "def get_tools"}]}
57
+ {"path": "src/nonoka_cli/tools/builtins/agent_tools.py", "mtime": 1783947809.170639, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "class", "name": "Capability", "line": 11, "signature": "class Capability"}, {"kind": "function", "name": "build_repo_map", "line": 13, "signature": "def build_repo_map"}, {"kind": "function", "name": "git_checkpoint", "line": 14, "signature": "def git_checkpoint"}, {"kind": "function", "name": "git_rollback", "line": 15, "signature": "def git_rollback"}, {"kind": "function", "name": "git_status", "line": 16, "signature": "def git_status"}, {"kind": "function", "name": "lsp_document_symbols", "line": 17, "signature": "def lsp_document_symbols"}, {"kind": "function", "name": "search_repo_map", "line": 18, "signature": "def search_repo_map"}, {"kind": "function", "name": "get_tools", "line": 22, "signature": "def get_tools"}]}
57
58
  {"path": "src/nonoka_cli/tools/builtins/file_tools.py", "mtime": 1782618411.0219204, "symbols": [{"kind": "variable", "name": "annotations", "line": 9, "signature": "instance annotations"}, {"kind": "function", "name": "asyncio", "line": 11, "signature": "module asyncio"}, {"kind": "class", "name": "Path", "line": 12, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 13, "signature": "class Any"}, {"kind": "function", "name": "tool", "line": 15, "signature": "def tool"}, {"kind": "class", "name": "RunContext", "line": 16, "signature": "class RunContext"}, {"kind": "variable", "name": "_MAX_READ_BYTES", "line": 18, "signature": "_MAX_READ_BYTES = 1024 * 1024"}, {"kind": "variable", "name": "_MAX_GREP_HITS", "line": 19, "signature": "_MAX_GREP_HITS = 50"}, {"kind": "variable", "name": "_MAX_LIST_ENTRIES", "line": 20, "signature": "_MAX_LIST_ENTRIES = 200"}, {"kind": "variable", "name": "_MAX_TREE_DEPTH", "line": 21, "signature": "_MAX_TREE_DEPTH = 5"}, {"kind": "variable", "name": "_MAX_TREE_ENTRIES", "line": 22, "signature": "_MAX_TREE_ENTRIES = 200"}, {"kind": "variable", "name": "_TREE_SKIP_DIRS", "line": 25, "signature": "_TREE_SKIP_DIRS = { \".git\", \".venv\", \"venv\", \"node_modules\", \"__pycache__\", \".pytest_cache\", \".mypy_cache\", \".tox\", \"dist\", \"build\", \".eggs\", }"}, {"kind": "function", "name": "_resolve_path", "line": 40, "signature": "def _resolve_path"}, {"kind": "function", "name": "_truncate", "line": 48, "signature": "def _truncate"}, {"kind": "function", "name": "read_file", "line": 56, "signature": "def read_file"}, {"kind": "function", "name": "view", "line": 97, "signature": "def view"}, {"kind": "function", "name": "view_dir", "line": 146, "signature": "def view_dir"}, {"kind": "function", "name": "walk", "line": 168, "signature": "def walk"}, {"kind": "function", "name": "write_file", "line": 210, "signature": "def write_file"}, {"kind": "function", "name": "edit_file", "line": 238, "signature": "def edit_file"}, {"kind": "function", "name": "search_and_replace", "line": 285, "signature": "def search_and_replace"}, {"kind": "function", "name": "delete_file", "line": 330, "signature": "def delete_file"}, {"kind": "function", "name": "list_dir", "line": 357, "signature": "def list_dir"}, {"kind": "function", "name": "grep_files", "line": 390, "signature": "def grep_files"}, {"kind": "function", "name": "execute_command", "line": 440, "signature": "def execute_command"}, {"kind": "function", "name": "get_tools", "line": 475, "signature": "def get_tools"}]}
58
59
  {"path": "src/nonoka_cli/tools/loader.py", "mtime": 1782618411.0249205, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "function", "name": "importlib", "line": 5, "signature": "module importlib"}, {"kind": "function", "name": "sys", "line": 6, "signature": "module sys"}, {"kind": "function", "name": "types", "line": 7, "signature": "module types"}, {"kind": "class", "name": "Path", "line": 8, "signature": "class Path"}, {"kind": "class", "name": "Any", "line": 9, "signature": "class Any"}, {"kind": "function", "name": "structlog", "line": 11, "signature": "module structlog"}, {"kind": "function", "name": "tool_decorator", "line": 12, "signature": "def tool_decorator"}, {"kind": "class", "name": "ToolRegistry", "line": 13, "signature": "class ToolRegistry"}, {"kind": "class", "name": "Tool", "line": 14, "signature": "class Tool"}, {"kind": "class", "name": "Capability", "line": 15, "signature": "class Capability"}, {"kind": "function", "name": "builtins", "line": 17, "signature": "module builtins"}, {"kind": "variable", "name": "logger", "line": 19, "signature": "logger = structlog.get_logger(\"nonoka_cli.tools\")"}, {"kind": "class", "name": "ToolLoaderError", "line": 22, "signature": "class ToolLoaderError"}, {"kind": "function", "name": "_load_builtin_tools", "line": 28, "signature": "def _load_builtin_tools"}, {"kind": "function", "name": "_module_name_for_file", "line": 36, "signature": "def _module_name_for_file"}, {"kind": "function", "name": "_import_module_from_file", "line": 44, "signature": "def _import_module_from_file"}, {"kind": "function", "name": "_discover_tools_in_module", "line": 72, "signature": "def _discover_tools_in_module"}, {"kind": "function", "name": "_wrap_callable_if_needed", "line": 85, "signature": "def _wrap_callable_if_needed"}, {"kind": "class", "name": "ToolLoader", "line": 98, "signature": "class ToolLoader"}, {"kind": "method", "name": "__init__", "line": 115, "signature": "def __init__"}, {"kind": "variable", "name": "search_paths", "line": 125, "signature": "self.search_paths: list[Path] = [ Path(p).expanduser() for p in (search_paths or []) ]"}, {"kind": "variable", "name": "_builtins_registry", "line": 128, "signature": "self._builtins_registry = ( _load_builtin_tools() if include_builtins else ToolRegistry() )"}, {"kind": "variable", "name": "_loaded_registry", "line": 131, "signature": "self._loaded_registry: ToolRegistry | None = None"}, {"kind": "method", "name": "builtins", "line": 134, "signature": "def builtins"}, {"kind": "method", "name": "load_all", "line": 138, "signature": "def load_all"}, {"kind": "method", "name": "reload", "line": 167, "signature": "def reload"}, {"kind": "method", "name": "get_loaded", "line": 171, "signature": "def get_loaded"}, {"kind": "method", "name": "_scan_directory", "line": 180, "signature": "def _scan_directory"}, {"kind": "method", "name": "list_tool_paths", "line": 204, "signature": "def list_tool_paths"}]}
59
60
  {"path": "src/nonoka_cli/utils/errors.py", "mtime": 1782715152.4953737, "symbols": [{"kind": "variable", "name": "annotations", "line": 3, "signature": "instance annotations"}, {"kind": "class", "name": "ConfigError", "line": 6, "signature": "class ConfigError"}, {"kind": "class", "name": "ConfigNotFoundError", "line": 11, "signature": "class ConfigNotFoundError"}, {"kind": "class", "name": "AgentBuildError", "line": 16, "signature": "class AgentBuildError"}, {"kind": "class", "name": "OrchestratorError", "line": 21, "signature": "class OrchestratorError"}, {"kind": "class", "name": "SessionError", "line": 26, "signature": "class SessionError"}, {"kind": "class", "name": "SessionNotFoundError", "line": 31, "signature": "class SessionNotFoundError"}, {"kind": "class", "name": "MCPError", "line": 36, "signature": "class MCPError"}, {"kind": "class", "name": "MCPConnectionError", "line": 41, "signature": "class MCPConnectionError"}, {"kind": "class", "name": "MCPRestartExhaustedError", "line": 46, "signature": "class MCPRestartExhaustedError"}]}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nonoka-cli
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: OpenCode backend for the Nonoka Agent framework
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -51,7 +51,7 @@ The installer will:
51
51
  3. Install `nonoka-cli` and the OpenCode provider.
52
52
  4. Generate `~/.config/nonoka/config.yaml` and `~/.config/opencode/opencode.json`.
53
53
 
54
- After installing, configure your API key and run `opencode`:
54
+ After installing, configure your API key and run `nonoka`:
55
55
 
56
56
  ```bash
57
57
  # Interactive: it will ask for your key and save it to ~/.config/nonoka/.env
@@ -61,9 +61,13 @@ nonoka-cli config init
61
61
  export DEEPSEEK_API_KEY=<your-key>
62
62
 
63
63
  nonoka-cli doctor
64
- opencode
64
+ nonoka
65
65
  ```
66
66
 
67
+ `nonoka` is a shortcut for `nonoka-cli run` and starts the OpenCode TUI with the
68
+ Nonoka backend. You can also use `nonoka run --message "<task>"` for one-shot
69
+ CLI usage.
70
+
67
71
  `nonoka-cli` automatically loads `~/.config/nonoka/.env` and `./.env` on startup,
68
72
  so you don't need to `export` every time if you save the key in `.env`.
69
73
 
@@ -111,7 +115,7 @@ nonoka-cli opencode init --global
111
115
  3. Make sure your model API key is exported, then run:
112
116
 
113
117
  ```bash
114
- opencode
118
+ nonoka
115
119
  ```
116
120
 
117
121
  ## `nonoka-cli doctor`
@@ -126,10 +130,10 @@ Example output:
126
130
 
127
131
  ```
128
132
  nonoka-cli doctor
129
- ✓ nonoka-cli 0.2.4
133
+ ✓ nonoka-cli 0.2.5
130
134
  ✓ Python 3.11
131
- ✓ opencode 1.17.13
132
- ✓ provider nonoka-opencode-provider@0.2.4
135
+ ✓ opencode 1.18.2
136
+ ✓ provider nonoka-opencode-provider@0.2.12
133
137
  ✓ config ~/.config/nonoka/config.yaml
134
138
  ✓ API key DEEPSEEK_API_KEY set
135
139
  ✓ OpenCode provider config in /home/user/.config/opencode/opencode.json
@@ -22,7 +22,7 @@ The installer will:
22
22
  3. Install `nonoka-cli` and the OpenCode provider.
23
23
  4. Generate `~/.config/nonoka/config.yaml` and `~/.config/opencode/opencode.json`.
24
24
 
25
- After installing, configure your API key and run `opencode`:
25
+ After installing, configure your API key and run `nonoka`:
26
26
 
27
27
  ```bash
28
28
  # Interactive: it will ask for your key and save it to ~/.config/nonoka/.env
@@ -32,9 +32,13 @@ nonoka-cli config init
32
32
  export DEEPSEEK_API_KEY=<your-key>
33
33
 
34
34
  nonoka-cli doctor
35
- opencode
35
+ nonoka
36
36
  ```
37
37
 
38
+ `nonoka` is a shortcut for `nonoka-cli run` and starts the OpenCode TUI with the
39
+ Nonoka backend. You can also use `nonoka run --message "<task>"` for one-shot
40
+ CLI usage.
41
+
38
42
  `nonoka-cli` automatically loads `~/.config/nonoka/.env` and `./.env` on startup,
39
43
  so you don't need to `export` every time if you save the key in `.env`.
40
44
 
@@ -82,7 +86,7 @@ nonoka-cli opencode init --global
82
86
  3. Make sure your model API key is exported, then run:
83
87
 
84
88
  ```bash
85
- opencode
89
+ nonoka
86
90
  ```
87
91
 
88
92
  ## `nonoka-cli doctor`
@@ -97,10 +101,10 @@ Example output:
97
101
 
98
102
  ```
99
103
  nonoka-cli doctor
100
- ✓ nonoka-cli 0.2.4
104
+ ✓ nonoka-cli 0.2.5
101
105
  ✓ Python 3.11
102
- ✓ opencode 1.17.13
103
- ✓ provider nonoka-opencode-provider@0.2.4
106
+ ✓ opencode 1.18.2
107
+ ✓ provider nonoka-opencode-provider@0.2.12
104
108
  ✓ config ~/.config/nonoka/config.yaml
105
109
  ✓ API key DEEPSEEK_API_KEY set
106
110
  ✓ OpenCode provider config in /home/user/.config/opencode/opencode.json
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nonoka-cli"
7
- version = "0.2.4"
7
+ version = "0.2.5"
8
8
  description = "OpenCode backend for the Nonoka Agent framework"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -29,6 +29,7 @@ dependencies = [
29
29
 
30
30
  [project.scripts]
31
31
  nonoka-cli = "nonoka_cli.cli:main"
32
+ nonoka = "nonoka_cli.cli:main"
32
33
 
33
34
  [project.optional-dependencies]
34
35
  dev = [
@@ -26,7 +26,7 @@ import structlog
26
26
  from dotenv import load_dotenv
27
27
 
28
28
  from nonoka_cli.bridge.server import main as server_main
29
- from nonoka_cli.commands import config_cmd, doctor_cmd, opencode_cmd, plugin_cmd
29
+ from nonoka_cli.commands import config_cmd, doctor_cmd, opencode_cmd, plugin_cmd, run_cmd
30
30
  from nonoka_cli.utils.logging import setup_logging
31
31
 
32
32
  logger = structlog.get_logger("nonoka_cli.cli")
@@ -88,6 +88,7 @@ def _build_parser() -> argparse.ArgumentParser:
88
88
  doctor_cmd.add_subparser(subparsers)
89
89
  opencode_cmd.add_subparser(subparsers)
90
90
  plugin_cmd.add_subparser(subparsers)
91
+ run_cmd.add_subparser(subparsers)
91
92
 
92
93
  return parser
93
94
 
@@ -116,16 +117,14 @@ def main() -> int:
116
117
  setup_logging(level=log_level, console=args.verbose or args.debug)
117
118
  return args.func(args)
118
119
 
120
+ # No subcommand given: launch the OpenCode TUI by default.
119
121
  log_level = (
120
122
  logging.DEBUG if args.debug
121
123
  else logging.INFO if args.verbose
122
124
  else logging.WARNING
123
125
  )
124
126
  setup_logging(level=log_level, console=args.verbose or args.debug)
125
-
126
- print("nonoka-cli: use --server to start the OpenCode backend.", file=sys.stderr)
127
- parser.print_help(sys.stderr)
128
- return 0
127
+ return run_cmd.launch_tui(args)
129
128
 
130
129
 
131
130
  if __name__ == "__main__":