zjcode 0.0.1__py3-none-any.whl

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 (163) hide show
  1. deepagents_code/__init__.py +42 -0
  2. deepagents_code/__main__.py +6 -0
  3. deepagents_code/_ask_user_types.py +90 -0
  4. deepagents_code/_cli_context.py +96 -0
  5. deepagents_code/_constants.py +41 -0
  6. deepagents_code/_debug.py +148 -0
  7. deepagents_code/_debug_buffer.py +204 -0
  8. deepagents_code/_env_vars.py +411 -0
  9. deepagents_code/_fake_models.py +66 -0
  10. deepagents_code/_git.py +521 -0
  11. deepagents_code/_paths.py +69 -0
  12. deepagents_code/_server_config.py +576 -0
  13. deepagents_code/_session_stats.py +235 -0
  14. deepagents_code/_startup_error.py +45 -0
  15. deepagents_code/_testing_models.py +305 -0
  16. deepagents_code/_textual_patches.py +420 -0
  17. deepagents_code/_tool_stream.py +694 -0
  18. deepagents_code/_version.py +46 -0
  19. deepagents_code/agent.py +1976 -0
  20. deepagents_code/app.py +19239 -0
  21. deepagents_code/app.tcss +438 -0
  22. deepagents_code/approval_mode.py +131 -0
  23. deepagents_code/ask_user.py +306 -0
  24. deepagents_code/auth_display.py +185 -0
  25. deepagents_code/auth_store.py +545 -0
  26. deepagents_code/built_in_skills/__init__.py +5 -0
  27. deepagents_code/built_in_skills/remember/SKILL.md +118 -0
  28. deepagents_code/built_in_skills/skill-creator/SKILL.md +383 -0
  29. deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +366 -0
  30. deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +158 -0
  31. deepagents_code/client/__init__.py +1 -0
  32. deepagents_code/client/commands/__init__.py +1 -0
  33. deepagents_code/client/commands/auth.py +541 -0
  34. deepagents_code/client/commands/config.py +714 -0
  35. deepagents_code/client/commands/mcp.py +250 -0
  36. deepagents_code/client/commands/tools.py +416 -0
  37. deepagents_code/client/launch/__init__.py +1 -0
  38. deepagents_code/client/launch/server.py +978 -0
  39. deepagents_code/client/launch/server_manager.py +540 -0
  40. deepagents_code/client/non_interactive.py +1758 -0
  41. deepagents_code/client/remote_client.py +794 -0
  42. deepagents_code/clipboard.py +217 -0
  43. deepagents_code/command_registry.py +450 -0
  44. deepagents_code/config.py +4829 -0
  45. deepagents_code/config_manifest.py +1451 -0
  46. deepagents_code/configurable_model.py +577 -0
  47. deepagents_code/default_agent_prompt.md +12 -0
  48. deepagents_code/doctor.py +559 -0
  49. deepagents_code/editor.py +142 -0
  50. deepagents_code/event_bus.py +411 -0
  51. deepagents_code/extras_info.py +661 -0
  52. deepagents_code/file_ops.py +576 -0
  53. deepagents_code/formatting.py +135 -0
  54. deepagents_code/goal_rubric.py +497 -0
  55. deepagents_code/goal_tools.py +459 -0
  56. deepagents_code/hooks.py +348 -0
  57. deepagents_code/input.py +1041 -0
  58. deepagents_code/integrations/__init__.py +1 -0
  59. deepagents_code/integrations/openai_codex.py +551 -0
  60. deepagents_code/integrations/sandbox_config.py +198 -0
  61. deepagents_code/integrations/sandbox_factory.py +1124 -0
  62. deepagents_code/integrations/sandbox_provider.py +137 -0
  63. deepagents_code/integrations/sandbox_registry.py +350 -0
  64. deepagents_code/iterm_cursor_guide.py +176 -0
  65. deepagents_code/local_context.py +926 -0
  66. deepagents_code/main.py +3985 -0
  67. deepagents_code/managed_tools.py +642 -0
  68. deepagents_code/mcp_auth.py +1950 -0
  69. deepagents_code/mcp_config.py +176 -0
  70. deepagents_code/mcp_disabled.py +212 -0
  71. deepagents_code/mcp_login_service.py +281 -0
  72. deepagents_code/mcp_oauth_ui.py +199 -0
  73. deepagents_code/mcp_providers/__init__.py +23 -0
  74. deepagents_code/mcp_providers/_registry.py +39 -0
  75. deepagents_code/mcp_providers/base.py +133 -0
  76. deepagents_code/mcp_providers/github.py +102 -0
  77. deepagents_code/mcp_providers/slack.py +175 -0
  78. deepagents_code/mcp_tools.py +2427 -0
  79. deepagents_code/mcp_trust.py +207 -0
  80. deepagents_code/media_utils.py +826 -0
  81. deepagents_code/memory_guard.py +474 -0
  82. deepagents_code/model_config.py +4156 -0
  83. deepagents_code/notifications.py +247 -0
  84. deepagents_code/offload.py +402 -0
  85. deepagents_code/onboarding.py +223 -0
  86. deepagents_code/output.py +69 -0
  87. deepagents_code/paste_collapse.py +103 -0
  88. deepagents_code/project_utils.py +231 -0
  89. deepagents_code/py.typed +0 -0
  90. deepagents_code/reasoning_effort.py +641 -0
  91. deepagents_code/reliable_rubric.py +97 -0
  92. deepagents_code/resume_state.py +237 -0
  93. deepagents_code/server_graph.py +310 -0
  94. deepagents_code/session_end_summary.py +329 -0
  95. deepagents_code/sessions.py +1716 -0
  96. deepagents_code/skills/__init__.py +18 -0
  97. deepagents_code/skills/commands.py +1252 -0
  98. deepagents_code/skills/invocation.py +112 -0
  99. deepagents_code/skills/load.py +196 -0
  100. deepagents_code/skills/trust.py +547 -0
  101. deepagents_code/state_migration.py +136 -0
  102. deepagents_code/subagents.py +278 -0
  103. deepagents_code/system_prompt.md +204 -0
  104. deepagents_code/terminal_capabilities.py +115 -0
  105. deepagents_code/terminal_escape.py +287 -0
  106. deepagents_code/theme.py +891 -0
  107. deepagents_code/todo_list_prompt.md +12 -0
  108. deepagents_code/tool_catalog.py +509 -0
  109. deepagents_code/tool_display.py +367 -0
  110. deepagents_code/tools.py +516 -0
  111. deepagents_code/tui/__init__.py +1 -0
  112. deepagents_code/tui/textual_adapter.py +2553 -0
  113. deepagents_code/tui/widgets/__init__.py +9 -0
  114. deepagents_code/tui/widgets/_js_eval_display.py +139 -0
  115. deepagents_code/tui/widgets/_links.py +261 -0
  116. deepagents_code/tui/widgets/agent_selector.py +420 -0
  117. deepagents_code/tui/widgets/approval.py +602 -0
  118. deepagents_code/tui/widgets/ask_user.py +515 -0
  119. deepagents_code/tui/widgets/auth.py +1997 -0
  120. deepagents_code/tui/widgets/autocomplete.py +890 -0
  121. deepagents_code/tui/widgets/chat_input.py +3181 -0
  122. deepagents_code/tui/widgets/codex_auth.py +452 -0
  123. deepagents_code/tui/widgets/cwd_switch.py +242 -0
  124. deepagents_code/tui/widgets/debug_console.py +868 -0
  125. deepagents_code/tui/widgets/diff.py +252 -0
  126. deepagents_code/tui/widgets/effort_selector.py +189 -0
  127. deepagents_code/tui/widgets/goal_review.py +390 -0
  128. deepagents_code/tui/widgets/goal_status.py +50 -0
  129. deepagents_code/tui/widgets/history.py +194 -0
  130. deepagents_code/tui/widgets/install_confirm.py +248 -0
  131. deepagents_code/tui/widgets/launch_init.py +482 -0
  132. deepagents_code/tui/widgets/loading.py +227 -0
  133. deepagents_code/tui/widgets/mcp_login.py +539 -0
  134. deepagents_code/tui/widgets/mcp_reconnect.py +212 -0
  135. deepagents_code/tui/widgets/mcp_viewer.py +1634 -0
  136. deepagents_code/tui/widgets/message_store.py +999 -0
  137. deepagents_code/tui/widgets/messages.py +3846 -0
  138. deepagents_code/tui/widgets/model_selector.py +2343 -0
  139. deepagents_code/tui/widgets/notification_center.py +456 -0
  140. deepagents_code/tui/widgets/notification_detail.py +257 -0
  141. deepagents_code/tui/widgets/notification_settings.py +170 -0
  142. deepagents_code/tui/widgets/restart_prompt.py +158 -0
  143. deepagents_code/tui/widgets/skill_trust.py +131 -0
  144. deepagents_code/tui/widgets/startup_tip.py +91 -0
  145. deepagents_code/tui/widgets/status.py +781 -0
  146. deepagents_code/tui/widgets/subagent_panel.py +969 -0
  147. deepagents_code/tui/widgets/theme_selector.py +401 -0
  148. deepagents_code/tui/widgets/thread_selector.py +2564 -0
  149. deepagents_code/tui/widgets/tool_renderers.py +190 -0
  150. deepagents_code/tui/widgets/tool_widgets.py +304 -0
  151. deepagents_code/tui/widgets/update_available.py +311 -0
  152. deepagents_code/tui/widgets/update_confirm.py +184 -0
  153. deepagents_code/tui/widgets/update_progress.py +327 -0
  154. deepagents_code/tui/widgets/welcome.py +508 -0
  155. deepagents_code/turn_end_summary.py +522 -0
  156. deepagents_code/ui.py +858 -0
  157. deepagents_code/unicode_security.py +563 -0
  158. deepagents_code/update_check.py +3124 -0
  159. zjcode-0.0.1.data/data/deepagents_code/default_agent_prompt.md +12 -0
  160. zjcode-0.0.1.dist-info/METADATA +220 -0
  161. zjcode-0.0.1.dist-info/RECORD +163 -0
  162. zjcode-0.0.1.dist-info/WHEEL +4 -0
  163. zjcode-0.0.1.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,112 @@
1
+ """Helpers for loading and formatting skill invocations."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ if TYPE_CHECKING:
9
+ from pathlib import Path
10
+
11
+ from deepagents_code.skills.load import ExtendedSkillMetadata
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class SkillInvocationEnvelope:
16
+ """Structured prompt and checkpoint metadata for a skill invocation.
17
+
18
+ Attributes:
19
+ prompt: Composed prompt that wraps `SKILL.md` content with
20
+ invocation instructions.
21
+ message_kwargs: Extra fields merged into the initial HumanMessage.
22
+ """
23
+
24
+ prompt: str
25
+ message_kwargs: dict[str, Any]
26
+
27
+
28
+ def discover_skills_and_roots(
29
+ assistant_id: str,
30
+ ) -> tuple[list[ExtendedSkillMetadata], list[Path]]:
31
+ """Discover skills and build pre-resolved containment roots.
32
+
33
+ Args:
34
+ assistant_id: Agent identifier used to resolve user skill directories.
35
+
36
+ Returns:
37
+ Tuple of `(skill metadata list, pre-resolved containment roots)`.
38
+ """
39
+ from deepagents_code.config import settings
40
+ from deepagents_code.skills.load import list_skills
41
+ from deepagents_code.skills.trust import load_trusted_skill_dirs
42
+
43
+ skills = list_skills(
44
+ built_in_skills_dir=settings.get_built_in_skills_dir(),
45
+ user_skills_dir=settings.get_user_skills_dir(assistant_id),
46
+ project_skills_dir=settings.get_project_skills_dir(),
47
+ user_agent_skills_dir=settings.get_user_agent_skills_dir(),
48
+ project_agent_skills_dir=settings.get_project_agent_skills_dir(),
49
+ user_claude_skills_dir=settings.get_user_claude_skills_dir(),
50
+ project_claude_skills_dir=settings.get_project_claude_skills_dir(),
51
+ )
52
+ roots = [
53
+ path.resolve()
54
+ for path in (
55
+ settings.get_built_in_skills_dir(),
56
+ settings.get_user_skills_dir(assistant_id),
57
+ settings.get_project_skills_dir(),
58
+ settings.get_user_agent_skills_dir(),
59
+ settings.get_project_agent_skills_dir(),
60
+ settings.get_user_claude_skills_dir(),
61
+ settings.get_project_claude_skills_dir(),
62
+ )
63
+ if path is not None
64
+ ]
65
+ roots.extend(path.resolve() for path in settings.get_extra_skills_dirs())
66
+ # Persisted in-the-moment approvals extend the containment allowlist just
67
+ # like the declarative `extra_allowed_dirs`, but are managed by the trust
68
+ # store rather than hand-edited config. These entries are already the
69
+ # canonical approved directories and are verified against post-approval
70
+ # symlink swaps by `load_trusted_skill_dirs`, so they are added as-is
71
+ # rather than re-resolved (re-resolving would follow an injected symlink to
72
+ # a directory the user never approved).
73
+ roots.extend(load_trusted_skill_dirs())
74
+ return skills, roots
75
+
76
+
77
+ def build_skill_invocation_envelope(
78
+ skill: ExtendedSkillMetadata,
79
+ content: str,
80
+ args: str = "",
81
+ ) -> SkillInvocationEnvelope:
82
+ """Build the wrapped prompt and persisted metadata for a skill.
83
+
84
+ Args:
85
+ skill: Loaded skill metadata.
86
+ content: Raw `SKILL.md` content.
87
+ args: Optional user request appended after the skill body.
88
+
89
+ Returns:
90
+ A `SkillInvocationEnvelope` with the composed prompt and
91
+ `message_kwargs` containing persisted skill metadata.
92
+ """
93
+ prompt = (
94
+ f"I'm invoking the skill `{skill['name']}`. "
95
+ "Below are the full instructions from the skill's SKILL.md file. "
96
+ "Follow these instructions to complete the task.\n\n"
97
+ f"---\n{content}\n---"
98
+ )
99
+ if args:
100
+ prompt += f"\n\n**User request:** {args}"
101
+
102
+ message_kwargs = {
103
+ "additional_kwargs": {
104
+ "__skill": {
105
+ "name": skill["name"],
106
+ "description": str(skill.get("description", "")),
107
+ "source": str(skill.get("source", "")),
108
+ "args": args,
109
+ },
110
+ },
111
+ }
112
+ return SkillInvocationEnvelope(prompt=prompt, message_kwargs=message_kwargs)
@@ -0,0 +1,196 @@
1
+ """Skill loader for CLI commands.
2
+
3
+ This module provides filesystem-based skill discovery for CLI operations
4
+ (list, create, info, delete). It wraps the prebuilt middleware functionality from
5
+ deepagents.middleware.skills and adapts it for direct filesystem access
6
+ needed by CLI commands.
7
+
8
+ For middleware usage within agents, use
9
+ deepagents.middleware.skills.SkillsMiddleware directly.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ from typing import TYPE_CHECKING, Literal, cast
16
+
17
+ from deepagents.backends.filesystem import FilesystemBackend
18
+
19
+ if TYPE_CHECKING:
20
+ from collections.abc import Sequence
21
+ from pathlib import Path
22
+ from deepagents.middleware.skills import (
23
+ SkillMetadata,
24
+ _list_skills as list_skills_from_backend, # noqa: PLC2701 # Intentional access to internal skill listing
25
+ )
26
+
27
+ from deepagents_code._version import __version__ as _cli_version
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ class ExtendedSkillMetadata(SkillMetadata):
33
+ """Extended skill metadata for CLI display, adds source tracking.
34
+
35
+ Attributes:
36
+ source: Origin of the skill. One of `'built-in'`, `'user'`, `'project'`,
37
+ or `'claude (experimental)'`.
38
+ """
39
+
40
+ source: Literal["built-in", "user", "project", "claude (experimental)"]
41
+
42
+
43
+ # Re-export for CLI commands
44
+ __all__ = ["SkillMetadata", "list_skills", "load_skill_content"]
45
+
46
+
47
+ def list_skills(
48
+ *,
49
+ built_in_skills_dir: Path | None = None,
50
+ user_skills_dir: Path | None = None,
51
+ project_skills_dir: Path | None = None,
52
+ user_agent_skills_dir: Path | None = None,
53
+ project_agent_skills_dir: Path | None = None,
54
+ user_claude_skills_dir: Path | None = None,
55
+ project_claude_skills_dir: Path | None = None,
56
+ ) -> list[ExtendedSkillMetadata]:
57
+ """List skills from built-in, user, and/or project directories.
58
+
59
+ This is a dcode-specific wrapper around the prebuilt middleware's skill loading
60
+ functionality. It uses `FilesystemBackend` to load skills from local directories.
61
+
62
+ Precedence order (lowest to highest):
63
+ 0. `built_in_skills_dir` (`<package>/built_in_skills/`)
64
+ 1. `user_skills_dir` (`~/.deepagents/{agent}/skills/`)
65
+ 2. `user_agent_skills_dir` (`~/.agents/skills/`)
66
+ 3. `project_skills_dir` (`.deepagents/skills/`)
67
+ 4. `project_agent_skills_dir` (`.agents/skills/`)
68
+ 5. `user_claude_skills_dir` (`~/.claude/skills/`, experimental)
69
+ 6. `project_claude_skills_dir` (`.claude/skills/`, experimental)
70
+
71
+ Skills from higher-precedence directories override those with the same name.
72
+
73
+ Args:
74
+ built_in_skills_dir: Path to built-in skills shipped with the package.
75
+ user_skills_dir: Path to `~/.deepagents/{agent}/skills/`.
76
+ project_skills_dir: Path to `.deepagents/skills/`.
77
+ user_agent_skills_dir: Path to `~/.agents/skills/` (alias).
78
+ project_agent_skills_dir: Path to `.agents/skills/` (alias).
79
+ user_claude_skills_dir: Path to `~/.claude/skills/` (experimental).
80
+ project_claude_skills_dir: Path to `.claude/skills/` (experimental).
81
+
82
+ Returns:
83
+ Merged list of skill metadata from all sources, with higher-precedence
84
+ directories taking priority when names conflict.
85
+ """
86
+ all_skills: dict[str, ExtendedSkillMetadata] = {}
87
+
88
+ sources: list[tuple[Path | None, str, bool]] = [
89
+ (built_in_skills_dir, "built-in", False),
90
+ (user_skills_dir, "user", False),
91
+ (user_agent_skills_dir, "user", False),
92
+ (project_skills_dir, "project", False),
93
+ (project_agent_skills_dir, "project", False),
94
+ (user_claude_skills_dir, "claude (experimental)", True),
95
+ (project_claude_skills_dir, "claude (experimental)", True),
96
+ ]
97
+ """Sources in precedence order (lowest to highest).
98
+
99
+ Each tuple: `(directory, source label, is_experimental)`.
100
+
101
+ Each source is individually try/except-guarded so a single inaccessible
102
+ directory doesn't block the rest.
103
+ """
104
+
105
+ for skill_dir, source_label, experimental in sources:
106
+ if not skill_dir or not skill_dir.exists():
107
+ continue
108
+ try:
109
+ backend = FilesystemBackend(root_dir=str(skill_dir), virtual_mode=False)
110
+ skills = list_skills_from_backend(backend=backend, source_path=".")
111
+ if experimental and skills:
112
+ logger.info(
113
+ "Discovered %d skill(s) from experimental Claude path: %s",
114
+ len(skills),
115
+ skill_dir,
116
+ )
117
+ for skill in skills:
118
+ extra: dict[str, object] = {"source": source_label}
119
+ if source_label == "built-in":
120
+ extra["metadata"] = {
121
+ **skill["metadata"],
122
+ "deepagents-code-version": _cli_version,
123
+ }
124
+ extended = cast("ExtendedSkillMetadata", {**skill, **extra})
125
+ all_skills[skill["name"]] = extended
126
+ except Exception:
127
+ # Degrade gracefully — one malformed/inaccessible source must not
128
+ # block discovery of others, so catch broadly and log instead.
129
+ # WARNING (not ERROR) because a half-written SKILL.md from a user is
130
+ # an expected condition, not a code defect.
131
+ logger.warning(
132
+ "Could not load skills from %s",
133
+ skill_dir,
134
+ exc_info=True,
135
+ )
136
+
137
+ return list(all_skills.values())
138
+
139
+
140
+ def load_skill_content(
141
+ skill_path: str,
142
+ *,
143
+ allowed_roots: Sequence[Path] = (),
144
+ ) -> str | None:
145
+ """Read the full raw SKILL.md content for a skill.
146
+
147
+ Returns the complete file content including any YAML frontmatter.
148
+ Callers are responsible for parsing or stripping frontmatter if needed.
149
+
150
+ When `allowed_roots` is provided, the resolved path must fall within at
151
+ least one root directory. This prevents symlink traversal from reading files
152
+ outside known skill directories.
153
+
154
+ Args:
155
+ skill_path: Path to the SKILL.md file (from `SkillMetadata['path']`).
156
+ allowed_roots: Skill root directories the resolved path must be
157
+ contained within.
158
+
159
+ Callers must pre-resolve these via `Path.resolve()` — the resolved
160
+ skill path is compared directly, so un-resolved roots cause false
161
+ containment failures.
162
+
163
+ If empty, containment is not checked.
164
+
165
+ Returns:
166
+ Full text content of the SKILL.md file, or `None` on read failure.
167
+
168
+ Raises:
169
+ PermissionError: If the resolved path is outside all `allowed_roots`.
170
+ """
171
+ from pathlib import Path
172
+
173
+ path = Path(skill_path).resolve()
174
+
175
+ if allowed_roots and not any(path.is_relative_to(root) for root in allowed_roots):
176
+ logger.warning(
177
+ "Skill path %s is outside all allowed roots, refusing to read",
178
+ skill_path,
179
+ )
180
+ from deepagents_code._env_vars import EXTRA_SKILLS_DIRS
181
+
182
+ msg = (
183
+ f"Skill path {skill_path} resolves outside all allowed skill "
184
+ "directories. If this is a symlink, add the target directory to "
185
+ f"{EXTRA_SKILLS_DIRS} or [skills].extra_allowed_dirs "
186
+ "in ~/.deepagents/config.toml."
187
+ )
188
+ raise PermissionError(msg)
189
+
190
+ try:
191
+ return path.read_text(encoding="utf-8")
192
+ except (OSError, UnicodeDecodeError):
193
+ logger.warning(
194
+ "Could not read skill content from %s", skill_path, exc_info=True
195
+ )
196
+ return None