klaude-code 2.5.0__py3-none-any.whl → 2.5.2__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 (35) hide show
  1. klaude_code/.DS_Store +0 -0
  2. klaude_code/cli/list_model.py +8 -0
  3. klaude_code/cli/main.py +1 -1
  4. klaude_code/config/assets/builtin_config.yaml +0 -2
  5. klaude_code/config/config.py +30 -7
  6. klaude_code/config/model_matcher.py +2 -2
  7. klaude_code/config/sub_agent_model_helper.py +1 -1
  8. klaude_code/const.py +1 -1
  9. klaude_code/core/agent_profile.py +1 -0
  10. klaude_code/core/executor.py +4 -0
  11. klaude_code/core/loaded_skills.py +36 -0
  12. klaude_code/core/task.py +1 -0
  13. klaude_code/core/tool/context.py +1 -3
  14. klaude_code/core/turn.py +0 -7
  15. klaude_code/llm/anthropic/client.py +23 -11
  16. klaude_code/protocol/events/lifecycle.py +1 -0
  17. klaude_code/protocol/events/streaming.py +0 -1
  18. klaude_code/protocol/events/system.py +3 -0
  19. klaude_code/protocol/llm_param.py +1 -0
  20. klaude_code/session/export.py +259 -91
  21. klaude_code/session/templates/export_session.html +141 -59
  22. klaude_code/skill/.DS_Store +0 -0
  23. klaude_code/skill/assets/.DS_Store +0 -0
  24. klaude_code/skill/loader.py +1 -0
  25. klaude_code/tui/command/refresh_cmd.py +2 -0
  26. klaude_code/tui/components/metadata.py +6 -6
  27. klaude_code/tui/components/rich/markdown.py +8 -0
  28. klaude_code/tui/components/welcome.py +32 -0
  29. klaude_code/tui/machine.py +29 -18
  30. klaude_code/tui/renderer.py +0 -1
  31. {klaude_code-2.5.0.dist-info → klaude_code-2.5.2.dist-info}/METADATA +1 -1
  32. {klaude_code-2.5.0.dist-info → klaude_code-2.5.2.dist-info}/RECORD +34 -31
  33. klaude_code/skill/assets/jj-workspace/SKILL.md +0 -20
  34. {klaude_code-2.5.0.dist-info → klaude_code-2.5.2.dist-info}/WHEEL +0 -0
  35. {klaude_code-2.5.0.dist-info → klaude_code-2.5.2.dist-info}/entry_points.txt +0 -0
@@ -55,15 +55,15 @@ def _render_task_metadata_block(
55
55
  token_text.append("↑", style=ThemeKey.METADATA_DIM)
56
56
  token_text.append(format_number(metadata.usage.input_tokens), style=ThemeKey.METADATA)
57
57
  if metadata.usage.cached_tokens > 0:
58
- token_text.append(" ◎", style=ThemeKey.METADATA_DIM)
58
+ token_text.append(" ◎", style=ThemeKey.METADATA_DIM)
59
59
  token_text.append(format_number(metadata.usage.cached_tokens), style=ThemeKey.METADATA)
60
- token_text.append(" ↓", style=ThemeKey.METADATA_DIM)
60
+ token_text.append(" ↓", style=ThemeKey.METADATA_DIM)
61
61
  token_text.append(format_number(metadata.usage.output_tokens), style=ThemeKey.METADATA)
62
62
  if metadata.usage.reasoning_tokens > 0:
63
- token_text.append(" ∿", style=ThemeKey.METADATA_DIM)
63
+ token_text.append(" ∿", style=ThemeKey.METADATA_DIM)
64
64
  token_text.append(format_number(metadata.usage.reasoning_tokens), style=ThemeKey.METADATA)
65
65
  if metadata.usage.image_tokens > 0:
66
- token_text.append(" ⌗ ", style=ThemeKey.METADATA_DIM)
66
+ token_text.append(" ⌗ ", style=ThemeKey.METADATA_DIM)
67
67
  token_text.append(format_number(metadata.usage.image_tokens), style=ThemeKey.METADATA)
68
68
  parts.append(token_text)
69
69
 
@@ -130,8 +130,8 @@ def _render_task_metadata_block(
130
130
  )
131
131
 
132
132
  if parts:
133
- content.append_text(Text(" ", style=ThemeKey.METADATA_DIM))
134
- content.append_text(Text(" ", style=ThemeKey.METADATA_DIM).join(parts))
133
+ content.append_text(Text(" ", style=ThemeKey.METADATA_DIM))
134
+ content.append_text(Text(" ", style=ThemeKey.METADATA_DIM).join(parts))
135
135
 
136
136
  grid.add_row(mark, content)
137
137
  return grid if not is_sub_agent else Padding(grid, (0, 0, 0, 2))
@@ -290,6 +290,14 @@ class MarkdownStream:
290
290
 
291
291
  stable_source = "".join(lines[:stable_line])
292
292
  live_source = "".join(lines[stable_line:])
293
+
294
+ # If the "stable" prefix is only whitespace and we haven't stabilized any
295
+ # non-whitespace content yet, keep everything in the live buffer.
296
+ #
297
+ # This avoids cases where marks/indentation should apply to the first
298
+ # visible line, but would be suppressed because stable_line > 0.
299
+ if min_stable_line == 0 and stable_source.strip() == "":
300
+ return "", text, 0
293
301
  return stable_source, live_source, stable_line
294
302
 
295
303
  def render_ansi(self, text: str, *, apply_mark: bool) -> str:
@@ -59,6 +59,38 @@ def render_welcome(e: events.WelcomeEvent) -> RenderableType:
59
59
  )
60
60
  )
61
61
 
62
+ # Loaded skills summary is provided by core via WelcomeEvent to keep TUI decoupled.
63
+ loaded_skills = e.loaded_skills or {}
64
+ user_skills = loaded_skills.get("user") or []
65
+ project_skills = loaded_skills.get("project") or []
66
+ system_skills = loaded_skills.get("system") or []
67
+
68
+ skill_groups: list[tuple[str, list[str]]] = []
69
+ if user_skills:
70
+ skill_groups.append(("user", user_skills))
71
+ if project_skills:
72
+ skill_groups.append(("project", project_skills))
73
+ if system_skills:
74
+ skill_groups.append(("system", system_skills))
75
+
76
+ if skill_groups:
77
+ panel_content.append_text(Text("\n\n", style=ThemeKey.WELCOME_INFO))
78
+ panel_content.append_text(Text("skills", style=ThemeKey.WELCOME_HIGHLIGHT))
79
+
80
+ label_width = len("[project]")
81
+
82
+ for i, (group_name, skills) in enumerate(skill_groups):
83
+ is_last = i == len(skill_groups) - 1
84
+ prefix = "└─ " if is_last else "├─ "
85
+ label = f"[{group_name}]"
86
+ panel_content.append_text(
87
+ Text.assemble(
88
+ ("\n", ThemeKey.WELCOME_INFO),
89
+ (prefix, ThemeKey.LINES),
90
+ (f"{label.ljust(label_width)} {', '.join(skills)}", ThemeKey.WELCOME_INFO),
91
+ )
92
+ )
93
+
62
94
  border_style = ThemeKey.WELCOME_DEBUG_BORDER if debug_mode else ThemeKey.LINES
63
95
 
64
96
  if e.show_klaude_code_info:
@@ -66,17 +66,6 @@ FAST_TOOLS: frozenset[str] = frozenset(
66
66
  )
67
67
 
68
68
 
69
- def _should_skip_tool_activity(tool_name: str, model_id: str | None) -> bool:
70
- """Check if tool activity should be skipped for non-streaming models."""
71
- if model_id is None:
72
- return False
73
- if tool_name not in FAST_TOOLS:
74
- return False
75
- # Gemini and Grok models don't stream tool JSON at fine granularity
76
- model_lower = model_id.lower()
77
- return "gemini" in model_lower or "grok" in model_lower
78
-
79
-
80
69
  @dataclass
81
70
  class SubAgentThinkingHeaderState:
82
71
  buffer: str = ""
@@ -257,7 +246,7 @@ class SpinnerStatusState:
257
246
  base_status = self._reasoning_status or self._todo_status
258
247
 
259
248
  if base_status:
260
- # Default "Reasoning ..." uses normal style; custom headers use bold italic
249
+ # Default "Thinking ..." uses normal style; custom headers use bold italic
261
250
  is_default_reasoning = base_status == STATUS_THINKING_TEXT
262
251
  status_style = ThemeKey.STATUS_TEXT if is_default_reasoning else ThemeKey.STATUS_TEXT_BOLD_ITALIC
263
252
  if activity_text:
@@ -300,6 +289,7 @@ class _SessionState:
300
289
  session_id: str
301
290
  sub_agent_state: model.SubAgentState | None = None
302
291
  sub_agent_thinking_header: SubAgentThinkingHeaderState | None = None
292
+ model_id: str | None = None
303
293
  assistant_stream_active: bool = False
304
294
  thinking_stream_active: bool = False
305
295
  assistant_char_count: int = 0
@@ -313,6 +303,23 @@ class _SessionState:
313
303
  def should_show_sub_agent_thinking_header(self) -> bool:
314
304
  return bool(self.sub_agent_state and self.sub_agent_state.sub_agent_type == "ImageGen")
315
305
 
306
+ @property
307
+ def should_extract_reasoning_header(self) -> bool:
308
+ """Gemini and GPT-5 models use markdown bold headers in thinking."""
309
+ if self.model_id is None:
310
+ return False
311
+ model_lower = self.model_id.lower()
312
+ return "gemini" in model_lower or "gpt-5" in model_lower
313
+
314
+ def should_skip_tool_activity(self, tool_name: str) -> bool:
315
+ """Check if tool activity should be skipped for non-streaming models."""
316
+ if self.model_id is None:
317
+ return False
318
+ if tool_name not in FAST_TOOLS:
319
+ return False
320
+ model_lower = self.model_id.lower()
321
+ return "gemini" in model_lower or "grok" in model_lower
322
+
316
323
 
317
324
  class DisplayStateMachine:
318
325
  """Simplified, session-aware REPL UI state machine.
@@ -380,6 +387,7 @@ class DisplayStateMachine:
380
387
 
381
388
  case events.TaskStartEvent() as e:
382
389
  s.sub_agent_state = e.sub_agent_state
390
+ s.model_id = e.model_id
383
391
  if not s.is_sub_agent:
384
392
  self._set_primary_if_needed(e.session_id)
385
393
  cmds.append(TaskClockStart())
@@ -412,6 +420,7 @@ class DisplayStateMachine:
412
420
  if not self._is_primary(e.session_id):
413
421
  return []
414
422
  s.thinking_stream_active = True
423
+ s.thinking_tail = ""
415
424
  # Ensure the status reflects that reasoning has started even
416
425
  # before we receive any deltas (or a bold header).
417
426
  self._spinner.set_reasoning_status(STATUS_THINKING_TEXT)
@@ -435,11 +444,13 @@ class DisplayStateMachine:
435
444
  cmds.append(AppendThinking(session_id=e.session_id, content=e.content))
436
445
 
437
446
  # Update reasoning status for spinner (based on bounded tail).
438
- s.thinking_tail = (s.thinking_tail + e.content)[-8192:]
439
- header = extract_last_bold_header(normalize_thinking_content(s.thinking_tail))
440
- if header:
441
- self._spinner.set_reasoning_status(header)
442
- cmds.extend(self._spinner_update_commands())
447
+ # Only extract headers for models that use markdown bold headers in thinking.
448
+ if s.should_extract_reasoning_header:
449
+ s.thinking_tail = (s.thinking_tail + e.content)[-8192:]
450
+ header = extract_last_bold_header(normalize_thinking_content(s.thinking_tail))
451
+ if header:
452
+ self._spinner.set_reasoning_status(header)
453
+ cmds.extend(self._spinner_update_commands())
443
454
 
444
455
  return cmds
445
456
 
@@ -528,7 +539,7 @@ class DisplayStateMachine:
528
539
 
529
540
  # Skip activity state for fast tools on non-streaming models (e.g., Gemini)
530
541
  # to avoid flash-and-disappear effect
531
- if not _should_skip_tool_activity(e.tool_name, e.model_id):
542
+ if not s.should_skip_tool_activity(e.tool_name):
532
543
  tool_active_form = get_tool_active_form(e.tool_name)
533
544
  if is_sub_agent_tool(e.tool_name):
534
545
  self._spinner.add_sub_agent_tool_call(e.tool_call_id, tool_active_form)
@@ -488,7 +488,6 @@ class TUICommandRenderer:
488
488
  continue
489
489
  self.display_tool_call_result(e)
490
490
  case events.TaskMetadataEvent() as e:
491
- self.print()
492
491
  self.print(c_metadata.render_task_metadata(e))
493
492
  self.print()
494
493
  case events.InterruptEvent():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 2.5.0
3
+ Version: 2.5.2
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -1,3 +1,4 @@
1
+ klaude_code/.DS_Store,sha256=cLWFbSgdN0bXEd3_tz93BJSposEPafUBqSr7t-3lPbA,6148
1
2
  klaude_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
3
  klaude_code/app/__init__.py,sha256=7mgWpN9SFDqe8AW44bBn9M19nVsBcZURrsGB_8l2hrU,264
3
4
  klaude_code/app/runtime.py,sha256=St5ZVo9snvc90R5fG4OojlWwtlRSB66AZAYfZD7AOCE,5982
@@ -17,23 +18,24 @@ klaude_code/cli/auth_cmd.py,sha256=4h59A0UrNBCAf_IL_tVU3GY4kxraoab3CTjgCdKvJGM,6
17
18
  klaude_code/cli/config_cmd.py,sha256=ZDNt1qtXbiWtFJBIaqtfqKrGHXQ1X-NHBeu1k1DoO1o,3391
18
19
  klaude_code/cli/cost_cmd.py,sha256=6bL22amGEB2gfCV9KXQfN5cZYyPL6J6JVIjV65_QjJo,12471
19
20
  klaude_code/cli/debug.py,sha256=vEHOjObhrIHDAXk3q6cOgeW2NZxCx5AWM1rJ6FiJnVU,1901
20
- klaude_code/cli/list_model.py,sha256=I3dLrbLfh-cy_FvDCYvKnFGGn9x8v04PtOCcpImUv1U,13258
21
- klaude_code/cli/main.py,sha256=w1b7AaDszcQRpMta90ChKEQ9MfJEYdpXs9swv2Nsv2Y,8711
21
+ klaude_code/cli/list_model.py,sha256=dzXwahAZZv8NHPD4pvOTLaTJTEWnCjS1B-K52n3OHOs,13603
22
+ klaude_code/cli/main.py,sha256=xhV2rVJnFFPeV9ikFVoK9mtRiQtAqgerwYd3EubWXHQ,8754
22
23
  klaude_code/cli/self_update.py,sha256=mn1B7Xn1keQkbwoDURzsM2fFjorzJTNLlV-Y_NYa6fA,2708
23
24
  klaude_code/cli/session_cmd.py,sha256=IyuSkqHOLldcm8qraJWJZEme9TY5Rfqmld9NmVJuHnc,3198
24
25
  klaude_code/config/__init__.py,sha256=Qe1BeMekBfO2-Zd30x33lB70hdM1QQZGrp4DbWSQ-II,353
25
26
  klaude_code/config/assets/__init__.py,sha256=uMUfmXT3I-gYiI-HVr1DrE60mx5cY1o8V7SYuGqOmvY,32
26
- klaude_code/config/assets/builtin_config.yaml,sha256=oM191oAgb5Vi7323RsZ1pVbAt6BSwOhnxJ_zZLvpyy0,7202
27
+ klaude_code/config/assets/builtin_config.yaml,sha256=2ixUe3VyIQtCGd_p4uKBPryg0oXyzPH6lW4TUmglORg,7162
27
28
  klaude_code/config/builtin_config.py,sha256=1rHcFWmS0k6rXeIqR6sF_OgGXSbEd4ugh9bh2N6VSS0,1494
28
- klaude_code/config/config.py,sha256=0-CLWK5oGGa5PY6o2mVkLNiaiuoaG8zp1UvQ6q0_Xxc,23948
29
- klaude_code/config/model_matcher.py,sha256=8pYt7DhEhsjLlYS7G14k6KdDtIzcNj2fYhQQach_JTU,6110
30
- klaude_code/config/sub_agent_model_helper.py,sha256=ntEZXocf3nGesFb8TeyGy1zoB8-yHKih4zngJRdjvf4,8040
29
+ klaude_code/config/config.py,sha256=u9xVkWFkR5ZYSGNkQ-uLBE_ogSpxvncuvBu6pMMuR_g,25062
30
+ klaude_code/config/model_matcher.py,sha256=UCC0QLuQIeEtfHDi0g1JpM1iEjfNMDQEew9FW-MWErA,6159
31
+ klaude_code/config/sub_agent_model_helper.py,sha256=fI-OIZWFI4116qjalsZj2pIi0waPR1cXE-OKrVMFS6g,8064
31
32
  klaude_code/config/thinking.py,sha256=RDWH8UYbeDoIKPXaCIcvVwPAh07Ntaq8w5Zn_fhm-Fk,9329
32
- klaude_code/const.py,sha256=VIHmzb1QNNv06bj7uo-y9LOcunhIMYyJe3RUaShIbkM,11153
33
+ klaude_code/const.py,sha256=FFBwUI2DolPu4_XNzaODyWTr1dETr-JwMQnSTt4Kimc,11149
33
34
  klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
35
  klaude_code/core/agent.py,sha256=5TNzzzHgKLKpEcFhaM0d136kaGUn_mESC8b1nLoxS2o,3913
35
- klaude_code/core/agent_profile.py,sha256=FlLDfwyGyoycJYdp70vCuUliZ0GrmcVd0ZCOs4x7MuQ,12776
36
- klaude_code/core/executor.py,sha256=TKS2TzQM0X1BLxw6x0HoXk0l2QNTrWCPap6wplSgQgQ,33252
36
+ klaude_code/core/agent_profile.py,sha256=EAsAHj9Jd_JaL_ydr13I3uVoBN4RIm9zmKPn3H7NYu8,12817
37
+ klaude_code/core/executor.py,sha256=6-XELfwj14YsrSv4RH8xI5IMMDR_qmenyaUJuqdjjWM,33534
38
+ klaude_code/core/loaded_skills.py,sha256=5lxPzXx2uf9mNxwEu_Jt3qRoATa2jaMvFjBfWhgbaSk,1177
37
39
  klaude_code/core/manager/__init__.py,sha256=hdIbpnYj6i18byiWjtJIm5l7NYYDQMvafw8fePVPydc,562
38
40
  klaude_code/core/manager/llm_clients.py,sha256=X2oMFWgJcP0tK8GEtMMDYR3HyR6_H8FuyCqpzWF5x2k,871
39
41
  klaude_code/core/manager/llm_clients_builder.py,sha256=_88MvbjNK-4s3wKTdzP-GmoUVGKyD88oWXZ7oqRWF8A,1902
@@ -49,9 +51,9 @@ klaude_code/core/prompts/prompt-sub-agent-image-gen.md,sha256=tXYKSzFd04OiC0dmVO
49
51
  klaude_code/core/prompts/prompt-sub-agent-web.md,sha256=UwrO5M_jPUbee_8lL7gB-2VFFLxvzEejluXDkMzmR5A,3625
50
52
  klaude_code/core/prompts/prompt-sub-agent.md,sha256=dmmdsOenbAOfqG6FmdR88spOLZkXmntDBs-cmZ9DN_g,897
51
53
  klaude_code/core/reminders.py,sha256=SOSB1wZMPdCtCwTpvjUW5et-d0JcnUxF7lMg90CZnA4,24384
52
- klaude_code/core/task.py,sha256=eC64_oksvsOdZV_yv16_lWDzqL4QvU_Zs5P5EpitY8c,13911
54
+ klaude_code/core/task.py,sha256=rAgulw45GT1NMhe2P5aLCdCnAa_hOZxKzEAaPYMc6Jk,13982
53
55
  klaude_code/core/tool/__init__.py,sha256=ABUzLwQbBoZPirCcgYbI88GEtswfy1JBDkFUsGpQ-zc,1415
54
- klaude_code/core/tool/context.py,sha256=RnO8gN1w9Lxev0BMqUsZp-zvzD9iKxrYQ3261beLRa4,2975
56
+ klaude_code/core/tool/context.py,sha256=lHMjbLE--WVek8gAPOvaHz4CdeRGzLXSusMyEdEU5ss,2961
55
57
  klaude_code/core/tool/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
58
  klaude_code/core/tool/file/_utils.py,sha256=OG4BE9WyJqzH8ilVCL3D9yvAcHk-r-L9snd-E8gO_io,967
57
59
  klaude_code/core/tool/file/apply_patch.py,sha256=LZd3pYQ9ow_TxiFnqYuzD216HmvkLX6lW6BoMd9iQRs,17080
@@ -87,10 +89,10 @@ klaude_code/core/tool/web/web_fetch_tool.md,sha256=i0IwsZ6r9vAQeCpwDBtEGrWmHPzZk
87
89
  klaude_code/core/tool/web/web_fetch_tool.py,sha256=jXbJTgpI_RvyXy5ac8qIrC-AKOUX1fJ3TpqXq_BfkS4,9596
88
90
  klaude_code/core/tool/web/web_search_tool.md,sha256=l5gGPx-fXHFel1zLBljm8isy9pwEYXGrq5cFzzw1VBw,1135
89
91
  klaude_code/core/tool/web/web_search_tool.py,sha256=ljkgXxP6L5nJnbYB_IOUtPUN9zA_h5hBD55lhNAja08,4293
90
- klaude_code/core/turn.py,sha256=UVCiEpgb5g-yv7zVoelyKdmHgqVEYn5WNiYSVbvu4DA,17976
92
+ klaude_code/core/turn.py,sha256=-HPhkQrkIbiM-szZULnd3-2Zg2lrL6AkPV7ztS6Lb8g,17667
91
93
  klaude_code/llm/__init__.py,sha256=b4AsqnrMIs0a5qR_ti6rZcHwFzAReTwOW96EqozEoSo,287
92
94
  klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
93
- klaude_code/llm/anthropic/client.py,sha256=N1p7dll7jxERejsZM5Wh7HbLWcN6bcLQN6LA7OTgRxk,15655
95
+ klaude_code/llm/anthropic/client.py,sha256=asQofiC13FeScLROMxLtDnRSj0frqe6kPRFZUNE1gm0,16242
94
96
  klaude_code/llm/anthropic/input.py,sha256=FeNhPwP0QJS7E7kICqhRBe2hUNCYkqLf_YP5qWcI_ao,9474
95
97
  klaude_code/llm/bedrock/__init__.py,sha256=UmXPBXMmigAJ7euIh59iivSeUdrYJwum0RYU7okkkPM,86
96
98
  klaude_code/llm/bedrock/client.py,sha256=mETQrhGDt4uEDXO2c3y5Iao9RngygFSF6MOtwqAy1tk,2279
@@ -125,12 +127,12 @@ klaude_code/protocol/commands.py,sha256=MfiUgN7r7VFGh0pel4nCRnk44F2Yzdcd7xqM-M36
125
127
  klaude_code/protocol/events/__init__.py,sha256=5WoUQzj3P7Lih6xO6keaJmaLOyxboO1OtOPavrNNj24,1673
126
128
  klaude_code/protocol/events/base.py,sha256=QfqgksjA2Hj-ClmwKVeJ7QA6Z7YdzjswO1NfAVnPCoI,335
127
129
  klaude_code/protocol/events/chat.py,sha256=mI_Ks5IIU1ZiywclQYxzhSsGA3ga7ACKShU6d9_KqSs,731
128
- klaude_code/protocol/events/lifecycle.py,sha256=5csZkv3oZIuLzs_7H84v8HgAYwbjIjkZOHfjxq9YfxM,357
130
+ klaude_code/protocol/events/lifecycle.py,sha256=gykOiAvdxMrvZ9Jm2T_qlve6Iw70C23o2HRooR0rHg4,389
129
131
  klaude_code/protocol/events/metadata.py,sha256=VcktYa6k51vIQ1H_KeOqQYCZkX0K9gaCQR1neOAOENs,313
130
- klaude_code/protocol/events/streaming.py,sha256=Cn7LRIIzd_7Y0Ex1TnqaLf1imS7m8ZplxfTQSpZy9bY,740
131
- klaude_code/protocol/events/system.py,sha256=0c3x8WwqAo5Y0JmukKbn7FKtgEv-ErqwJb5PGjuHehk,1294
132
+ klaude_code/protocol/events/streaming.py,sha256=U1plGQSTeGZa3E4fIxW_fHXJpuv_DSIBrmGh1l4Fm54,708
133
+ klaude_code/protocol/events/system.py,sha256=FjAnZso1jpOY2nY7DgehuFvBtu_gh5uZqimmpgKbaMA,1392
132
134
  klaude_code/protocol/events/tools.py,sha256=8ds_8Zj-wQWvHNAvNt1-fSIHeDffw1dsLWI7ByrAqcM,617
133
- klaude_code/protocol/llm_param.py,sha256=DSCxBdFSdQV8qOhEjjjYNapgA3v4TBkN5V9HgEWho_k,5164
135
+ klaude_code/protocol/llm_param.py,sha256=mFdAcbzJrIFB4T2QCbLyeZxZQ_38lUNCclEZIH3eWtQ,5191
134
136
  klaude_code/protocol/message.py,sha256=pu-wvInS781y-qSKbl9MqO7k3CtAN7Yu4hUHJCXKjZQ,6210
135
137
  klaude_code/protocol/model.py,sha256=KboyTyfG5DntRMK98oDHomgJfUpHBdeiq51dWXRSqeM,9923
136
138
  klaude_code/protocol/op.py,sha256=pYmvSyVrVr6LlJUiSN2GKwXiDX8meCoxYKNYHXdTKGE,5965
@@ -144,19 +146,20 @@ klaude_code/protocol/sub_agent/web.py,sha256=XOQdqlIp_xno7Q7YVFPFo4AyKU1wbrVKhIi
144
146
  klaude_code/protocol/tools.py,sha256=T0mzW9EhidVMNkwH-KTeB5FgwMvXBnV_MYE5ytrU1TM,343
145
147
  klaude_code/session/__init__.py,sha256=4sw81uQvEd3YUOOjamKk1KqGmxeb4Ic9T1Tee5zztyU,241
146
148
  klaude_code/session/codec.py,sha256=a374UZkOusn9MgFCc--yznDljK_4Qfy6yDPfhQq5_P0,1889
147
- klaude_code/session/export.py,sha256=Oa0BdrqipFGkGp62dAsvQ-bPQr0HFAQBpAb7OmgaNno,38926
149
+ klaude_code/session/export.py,sha256=znoTUCw2tVGgDpl-sT-ba_2Bb2HaH6pvsl4EpLUdYJQ,46102
148
150
  klaude_code/session/selector.py,sha256=snBpnz9UQCe_0K8HttSGCJECCE4YEzpWs_Fdmk2P9nI,2195
149
151
  klaude_code/session/session.py,sha256=iQdjVoiretvsPvVkUv1rW9z5IDnwPQ6RuFAp-gATF9o,23162
150
152
  klaude_code/session/store.py,sha256=HRrmFzwEVdExqDQlT9FBZOhlFtQmM9Im9zco8pzvUMY,6455
151
- klaude_code/session/templates/export_session.html,sha256=YIr-jzbgwxPviZ_EE7TeYah7tqzOeNzW-IdpzvlfbcY,125826
153
+ klaude_code/session/templates/export_session.html,sha256=y4H2DwYx29MuSeKgT8JWdZKNguemaDKN-b75x0sr0eU,127667
152
154
  klaude_code/session/templates/mermaid_viewer.html,sha256=Y_wEWFm4mKWpfAz3YMis5DdLEkhw_2d8CpU6jbvGZow,27842
155
+ klaude_code/skill/.DS_Store,sha256=zy9qIqi2YLGzlZwHNM4oAX8rDoNTg9yxdo22PJOwupg,6148
153
156
  klaude_code/skill/__init__.py,sha256=yeWeCfRGPOhT4mx_pjdo4fLondQ_Vx0edBtnFusLhls,839
157
+ klaude_code/skill/assets/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
154
158
  klaude_code/skill/assets/create-plan/SKILL.md,sha256=g_SLyBid2dwj56FBzh87lZGu1t08edLs0plimT2uNzs,2481
155
159
  klaude_code/skill/assets/deslop/SKILL.md,sha256=XMBER6gOyYnZof_u7l30CZSzmDcINe8XP-n_loah0EQ,873
156
160
  klaude_code/skill/assets/handoff/SKILL.md,sha256=GDHrEqWUeAQy7gGhha_y5jzjpv8C-xhk0hqMH5h59v8,1712
157
- klaude_code/skill/assets/jj-workspace/SKILL.md,sha256=toxoyrBBoGl9Yv4PYrw_gD071LLZ2RoepUR8qTDRn1M,977
158
161
  klaude_code/skill/assets/skill-creator/SKILL.md,sha256=0ByoWb9ao0UKSoM5Tmz-Qe5CAPliTrVpUK0gPd9TFqo,5520
159
- klaude_code/skill/loader.py,sha256=dq-92iX4RWUZd8sFO3KZySOVf5-M6xev29tJlaC0Ivw,8612
162
+ klaude_code/skill/loader.py,sha256=Lcj3j5H9-5wERkvOz77J9Z0uWJ3skrpVQvnzYqrpRJU,8644
160
163
  klaude_code/skill/manager.py,sha256=GcE6IGooYmWn75wWa2TfJj8VRaBgAlABeK3sD_bIgBY,3448
161
164
  klaude_code/skill/system_skills.py,sha256=ryGN07t0Xv2Yn_Prfq072tdIN0Dp4ZpdXLTl7O7rCkg,6122
162
165
  klaude_code/tui/__init__.py,sha256=Q8-0D-uesw3oFwHcFLD5UaWlTFbrj8qV7dSn6C6_g_o,274
@@ -172,7 +175,7 @@ klaude_code/tui/command/model_cmd.py,sha256=EnUcr_nnUm433G2HwEKKNssVE767IgQFNoc9
172
175
  klaude_code/tui/command/model_picker.py,sha256=BAQzMHuRuK0o7q3zM5x1p2pawUuhmYDAHcSLmgKwLZg,5700
173
176
  klaude_code/tui/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
174
177
  klaude_code/tui/command/prompt_command.py,sha256=PGGoH_ZgA-0kTtpjk19rDSsWjiZyAEoUlxnSp8B8GRQ,2764
175
- klaude_code/tui/command/refresh_cmd.py,sha256=Lisqdbm64Ma5IB7Z2Gv1dBdaGiqYbCDGFX497-gnfBM,1255
178
+ klaude_code/tui/command/refresh_cmd.py,sha256=_nY7Iko7GSpHmc9t2vKK2DcXRYbXfUnbGzwsmNc-yPI,1405
176
179
  klaude_code/tui/command/registry.py,sha256=2HDrC6ZqGKSdzQAYra2TSFt1kc3tDliobjrWfgrTdX8,7028
177
180
  klaude_code/tui/command/resume_cmd.py,sha256=eOEJI-vchrOP0zrLDTip7KYb1oRJp9te5aiHFtwOdFQ,3771
178
181
  klaude_code/tui/command/status_cmd.py,sha256=yALYGxyUX7iVdSRAKdG526YkqOvGV9F0CJNwk8nmzu4,5164
@@ -189,12 +192,12 @@ klaude_code/tui/components/developer.py,sha256=1hDr7boJN1z_JyvvFNn8m7MAf4lPDN3eo
189
192
  klaude_code/tui/components/diffs.py,sha256=JUokkkJeTIoKD0b-c-chMzIDmMjivBQqH8DYXIA3hHs,10411
190
193
  klaude_code/tui/components/errors.py,sha256=_9ojf-23ThR-BoMwNEYG68rzILwA_O59muGvofYL10w,669
191
194
  klaude_code/tui/components/mermaid_viewer.py,sha256=MstufMnTauMKzI8cKngXpFqVo-qya20P8ReNkplYtEw,3098
192
- klaude_code/tui/components/metadata.py,sha256=HjIZkMyGu8jgTm4XgkMy82wKsoJXnzQwq_9su7Cqzm4,7227
195
+ klaude_code/tui/components/metadata.py,sha256=ESNZ7l0fCDF8BUdAWEsgoW0iG3HPnvJ2GSrpCSXIhCM,7221
193
196
  klaude_code/tui/components/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4GRGv3lHJzAGRq_o,236
194
197
  klaude_code/tui/components/rich/cjk_wrap.py,sha256=eMqBxftUtll7zrytUb9WtJ6naYLyax0W4KJRpGwWulM,7602
195
198
  klaude_code/tui/components/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
196
199
  klaude_code/tui/components/rich/live.py,sha256=xiMT6dPsxM_jaazddKrV9CMJQWwpe2t9OdjffHvo1JU,2821
197
- klaude_code/tui/components/rich/markdown.py,sha256=hMAWhcuu1GVUK3AsE5G_8Qi-_2aVgTvrbu2nC5QAWgQ,19098
200
+ klaude_code/tui/components/rich/markdown.py,sha256=dkSzovKFY8zMQqRhad9k-fpV3Iot1CxKvxe202aaP4w,19512
198
201
  klaude_code/tui/components/rich/quote.py,sha256=gTLwxSPQd9nlp73P1ysQIEgOb-BoTE2gzyiPBLMiHcY,3834
199
202
  klaude_code/tui/components/rich/searchable_text.py,sha256=PUe6MotKxSBY4FlPeojVjVQgxCsx_jiQ41bCzLp8WvE,2271
200
203
  klaude_code/tui/components/rich/status.py,sha256=kNt08FQGvMZJB-zUhT5UyVFA7jvuRBNqf6yDXLEhb9c,14756
@@ -203,15 +206,15 @@ klaude_code/tui/components/sub_agent.py,sha256=afkDbndByQmrxO3lvWR3rSvlbIE0wktbj
203
206
  klaude_code/tui/components/thinking.py,sha256=AXC7Xpyiu7ST-eWGLRGY7N8Dak2ny3lV3mvznmfqKmM,2890
204
207
  klaude_code/tui/components/tools.py,sha256=Up8DQbXuiPfcbiFVZD6gmZO0YBz2SExWS-tE_xeriX4,25060
205
208
  klaude_code/tui/components/user_input.py,sha256=6VHH77xwUUW0rW7yv8hOwGXsmK52HEsBg9-QZVbOm1A,3427
206
- klaude_code/tui/components/welcome.py,sha256=0IPtYLJG8h1jLp6LtcMuOvmng2FYpGLWP4eP0e2R2ZI,2367
209
+ klaude_code/tui/components/welcome.py,sha256=ZSCcT-wFdSp3L1Fq7shWWz4Rk-BAXvsKisfvIUnP8a4,3665
207
210
  klaude_code/tui/display.py,sha256=ovM1F8GDG0gTQjOV2KaXnjE9HFHf7AtThqSIXkP6JQY,3073
208
211
  klaude_code/tui/input/__init__.py,sha256=cAB38ypo7dHo_jgXUCnoBTUKHtiriVaKCv4YepSU9SU,276
209
212
  klaude_code/tui/input/clipboard.py,sha256=HjThFB9MG_YdJ76CQv7B-IUoz5JarbWUZDbUVkH1LpY,5106
210
213
  klaude_code/tui/input/completers.py,sha256=lkDBjnqYPLMgR6AZHhx2bfT_vMW-fbV6aqY9SqRwq74,32571
211
214
  klaude_code/tui/input/key_bindings.py,sha256=2uN48J1HRHeCBqq7WrH5J82NIU59oQscce0HquAiYCI,18876
212
215
  klaude_code/tui/input/prompt_toolkit.py,sha256=ZwkQodc3GufGo7SMmebaOiVopkqxkMDC48y8RFeGuLk,28551
213
- klaude_code/tui/machine.py,sha256=Mhyhz7lxeMgBfkqA_23ZEhVwv3qq7-g3XTAM6nQm7c4,24759
214
- klaude_code/tui/renderer.py,sha256=JZu892irKW0aNis3vs5Rq9aqYdcKhllrhnC2kfsC9tM,29522
216
+ klaude_code/tui/machine.py,sha256=S1OKLx1YlAIQfjUAIYFJPRK-5X8cI_1mSpBqEU0NJwM,25291
217
+ klaude_code/tui/renderer.py,sha256=SUhxIbTCHK_VR_MVfFUebRv7OaMmQG0Rrrhfgv_klGY,29485
215
218
  klaude_code/tui/runner.py,sha256=nOq8wC78HzgqHLRgHC8OgYubH--2gPcDqA6GoV913Yc,11270
216
219
  klaude_code/tui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
217
220
  klaude_code/tui/terminal/color.py,sha256=6SJR2RA8cqJINNoRz65w0HL3x9g46ydIvDOGWMeNnQU,7195
@@ -229,7 +232,7 @@ klaude_code/ui/debug_mode.py,sha256=ZvqbOx4c_rUerMbEZzOfcbNf9leqEDFjqJUlALtzF9Y,
229
232
  klaude_code/ui/terminal/__init__.py,sha256=5OeAzr994r8-peWsLON0iXsAvJ2pexwMp36JY7FKGDc,179
230
233
  klaude_code/ui/terminal/title.py,sha256=EZpLXTMhunsZPVGaxP317lH0Ad2oOh7OsjbV3yRD5is,1115
231
234
  klaude_code/update.py,sha256=QER816AZe9u3RhRvP0Z37Jh2Ch5RLy9PREyDsI0e1dA,4480
232
- klaude_code-2.5.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
233
- klaude_code-2.5.0.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
234
- klaude_code-2.5.0.dist-info/METADATA,sha256=0Gzbk9qkofuEKCdq_DADy0_TcsXBCMVXDIR3UvrAKGg,10249
235
- klaude_code-2.5.0.dist-info/RECORD,,
235
+ klaude_code-2.5.2.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
236
+ klaude_code-2.5.2.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
237
+ klaude_code-2.5.2.dist-info/METADATA,sha256=kAGfNopTOaVeDvTsAYH3-FV64kfRjSnqOpQ9iia2TuA,10249
238
+ klaude_code-2.5.2.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- ---
2
- name: jj-workspace
3
- description: Create a jj workspace before starting work to enable parallel Claude sessions. Use this skill when starting a new task that should be isolated from other concurrent work. Triggers include "jj workspace", "parallel work", "create workspace", "isolated workspace".
4
- metadata:
5
- short-description: Create jj workspace for parallel work
6
- ---
7
-
8
- # JJ Workspace
9
-
10
- Create a dedicated jj workspace before starting any task. This allows multiple Claude sessions to work in parallel without conflicts.
11
-
12
- ## Steps
13
-
14
- 1. Generate a short, descriptive workspace name based on the task (e.g., `workspace-add-login` or `workspace-fix-typo`)
15
- 2. Run `jj workspace add <workspace-name>` to create the workspace
16
- 3. Change into the workspace directory: `cd <workspace-name>`
17
- 4. Describe the change: `jj describe -m '<brief task description>'`
18
- 5. Continue all subsequent work within this workspace directory
19
-
20
- If no task is provided, ask the user for a task description.