kward 0.84.0 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/Gemfile.lock +2 -2
  4. data/README.md +2 -2
  5. data/doc/agent-tools.md +13 -1
  6. data/doc/api.md +17 -2
  7. data/doc/composer.md +1 -1
  8. data/doc/configuration.md +27 -4
  9. data/doc/extensibility.md +2 -1
  10. data/doc/git.md +3 -1
  11. data/doc/pan.md +6 -0
  12. data/doc/permissions.md +4 -4
  13. data/doc/plugins.md +464 -15
  14. data/doc/rpc.md +154 -16
  15. data/doc/sandboxing.md +11 -5
  16. data/doc/security.md +7 -1
  17. data/doc/session-management.md +5 -4
  18. data/doc/tabs.md +6 -2
  19. data/doc/transports.md +15 -0
  20. data/doc/usage.md +4 -1
  21. data/doc/workspace-tools.md +9 -0
  22. data/examples/plugins/space_invaders.rb +1 -1
  23. data/examples/plugins/stardate_footer.rb +2 -2
  24. data/examples/plugins/telegram/plugin.rb +1 -1
  25. data/lib/kward/agent.rb +24 -11
  26. data/lib/kward/cli/compaction.rb +9 -3
  27. data/lib/kward/cli/plugins.rb +81 -12
  28. data/lib/kward/cli/prompt_interface.rb +25 -5
  29. data/lib/kward/cli/rendering.rb +3 -0
  30. data/lib/kward/cli/runtime_helpers.rb +121 -27
  31. data/lib/kward/cli/sessions.rb +9 -5
  32. data/lib/kward/cli/settings/menus.rb +745 -0
  33. data/lib/kward/cli/settings/model.rb +327 -0
  34. data/lib/kward/cli/settings.rb +6 -1055
  35. data/lib/kward/cli/slash_commands.rb +45 -4
  36. data/lib/kward/cli/tabs.rb +167 -27
  37. data/lib/kward/{cli_transcript_formatter.rb → cli/transcript_formatter.rb} +3 -3
  38. data/lib/kward/cli/worktrees.rb +65 -2
  39. data/lib/kward/cli.rb +26 -24
  40. data/lib/kward/compactor.rb +18 -7
  41. data/lib/kward/config/core.rb +389 -0
  42. data/lib/kward/config/extensions.rb +96 -0
  43. data/lib/kward/config/prompts.rb +313 -0
  44. data/lib/kward/config/settings.rb +250 -0
  45. data/lib/kward/config_files.rb +14 -1008
  46. data/lib/kward/conversation.rb +31 -2
  47. data/lib/kward/image_attachments.rb +1 -1
  48. data/lib/kward/model/client.rb +2 -2
  49. data/lib/kward/model/copilot_models.rb +2 -2
  50. data/lib/kward/model/model_info.rb +20 -3
  51. data/lib/kward/{openrouter_model_cache.rb → model/openrouter_model_cache.rb} +3 -3
  52. data/lib/kward/model/payloads.rb +12 -3
  53. data/lib/kward/model/typesafe_client.rb +78 -0
  54. data/lib/kward/pan/server.rb +10 -7
  55. data/lib/kward/permissions/policy.rb +6 -2
  56. data/lib/kward/plugin_registry.rb +2 -659
  57. data/lib/kward/plugins/actions.rb +453 -0
  58. data/lib/kward/plugins/chat_contract.rb +121 -0
  59. data/lib/kward/{plugin_chat_runtime.rb → plugins/chat_runtime.rb} +62 -18
  60. data/lib/kward/plugins/host.rb +232 -0
  61. data/lib/kward/plugins/registry.rb +1190 -0
  62. data/lib/kward/plugins/resources.rb +206 -0
  63. data/lib/kward/plugins/turn_request.rb +36 -0
  64. data/lib/kward/plugins/ui.rb +219 -0
  65. data/lib/kward/prompt_interface/composer_renderer.rb +1 -1
  66. data/lib/kward/prompt_interface/composer_state.rb +1 -1
  67. data/lib/kward/prompt_interface/editor/controller.rb +1 -1
  68. data/lib/kward/prompt_interface/editor/runner.rb +1 -1
  69. data/lib/kward/prompt_interface/editor/state.rb +1 -1
  70. data/lib/kward/prompt_interface/layout.rb +1 -1
  71. data/lib/kward/prompt_interface/overlay_renderer.rb +1 -1
  72. data/lib/kward/prompt_interface/plugin_ui_requests.rb +82 -0
  73. data/lib/kward/prompt_interface/runtime_state.rb +6 -1
  74. data/lib/kward/prompt_interface/screen.rb +9 -2
  75. data/lib/kward/prompt_interface.rb +60 -11
  76. data/lib/kward/prompts/commands.rb +2 -1
  77. data/lib/kward/{adaptive_pty_output_sink.rb → pty/adaptive_output_sink.rb} +1 -1
  78. data/lib/kward/{interactive_pty_runner.rb → pty/interactive_runner.rb} +2 -2
  79. data/lib/kward/{local_command_runner.rb → pty/local_command_runner.rb} +1 -1
  80. data/lib/kward/{local_pty_command_runner.rb → pty/local_pty_runner.rb} +3 -9
  81. data/lib/kward/{pty_output_sink.rb → pty/output_sink.rb} +9 -4
  82. data/lib/kward/{pty_transcript_normalizer.rb → pty/transcript_normalizer.rb} +1 -1
  83. data/lib/kward/rpc/plugin_chat_manager.rb +30 -10
  84. data/lib/kward/rpc/prompt_bridge.rb +25 -0
  85. data/lib/kward/rpc/server.rb +91 -12
  86. data/lib/kward/rpc/session_manager.rb +147 -44
  87. data/lib/kward/rpc/session_tree_rows.rb +2 -2
  88. data/lib/kward/rpc/tool_metadata.rb +1 -1
  89. data/lib/kward/sandbox/command_runner.rb +1 -1
  90. data/lib/kward/{session_catalog.rb → sessions/catalog.rb} +1 -1
  91. data/lib/kward/{session_store.rb → sessions/store.rb} +9 -9
  92. data/lib/kward/{session_tree_nodes.rb → sessions/tree_nodes.rb} +3 -3
  93. data/lib/kward/{session_tree_renderer.rb → sessions/tree_renderer.rb} +4 -4
  94. data/lib/kward/{session_tree_tool_display.rb → sessions/tree_tool_display.rb} +1 -1
  95. data/lib/kward/{kwsh.rb → shell/kwsh.rb} +3 -3
  96. data/lib/kward/{persistent_shell_session.rb → shell/persistent_session.rb} +3 -3
  97. data/lib/kward/{shell_prompt_session.rb → shell/prompt_session.rb} +1 -1
  98. data/lib/kward/skills/trust_store.rb +1 -1
  99. data/lib/kward/tabs/driver.rb +194 -0
  100. data/lib/kward/{tab_store.rb → tabs/store.rb} +2 -2
  101. data/lib/kward/{clipboard.rb → terminal/clipboard.rb} +1 -1
  102. data/lib/kward/{terminal_image_support.rb → terminal/image_support.rb} +1 -1
  103. data/lib/kward/tools/base.rb +18 -0
  104. data/lib/kward/tools/context_for_task.rb +15 -6
  105. data/lib/kward/tools/edit_file.rb +9 -6
  106. data/lib/kward/tools/git_commit.rb +13 -7
  107. data/lib/kward/tools/list_directory.rb +4 -4
  108. data/lib/kward/tools/plugin_tool.rb +41 -0
  109. data/lib/kward/tools/prepare_shell_command.rb +1 -1
  110. data/lib/kward/tools/read_file.rb +7 -6
  111. data/lib/kward/tools/registry.rb +96 -13
  112. data/lib/kward/tools/run_shell_command.rb +10 -8
  113. data/lib/kward/tools/search/code.rb +1 -1
  114. data/lib/kward/tools/summarize_file_structure.rb +5 -5
  115. data/lib/kward/tools/tool_call.rb +2 -1
  116. data/lib/kward/tools/typesafe_evaluate.rb +81 -0
  117. data/lib/kward/tools/workspace_targets.rb +58 -0
  118. data/lib/kward/tools/write_file.rb +9 -6
  119. data/lib/kward/{export_path.rb → transcripts/export_path.rb} +1 -1
  120. data/lib/kward/{markdown_transcript.rb → transcripts/markdown_transcript.rb} +2 -2
  121. data/lib/kward/transport/contracts.rb +200 -0
  122. data/lib/kward/transport/gateway.rb +79 -35
  123. data/lib/kward/transport/plugin_chat_gateway.rb +3 -2
  124. data/lib/kward/transport.rb +1 -200
  125. data/lib/kward/version.rb +1 -1
  126. data/lib/kward/{workspace_factory.rb → workspace/factory.rb} +2 -2
  127. data/lib/kward/{git_worktree_manager.rb → workspace/git_worktree_manager.rb} +28 -0
  128. data/lib/kward/{workspace.rb → workspace/workspace.rb} +3 -3
  129. data/templates/default/fulldoc/html/css/kward.css +125 -0
  130. data/templates/default/fulldoc/html/images/kward_screen_1.png +0 -0
  131. data/templates/default/fulldoc/html/setup.rb +1 -1
  132. data/templates/default/layout/html/layout.erb +16 -4
  133. metadata +67 -48
  134. data/lib/kward/tab_driver.rb +0 -90
  135. data/templates/default/fulldoc/html/images/kward_workflow.svg +0 -52
  136. /data/lib/kward/{editor_prompt.rb → cli/editor_prompt.rb} +0 -0
  137. /data/lib/kward/{editor_prompt_session.rb → cli/editor_prompt_session.rb} +0 -0
  138. /data/lib/kward/{diff_view_mode.rb → prompt_interface/editor/diff_view_mode.rb} +0 -0
  139. /data/lib/kward/{editor_mode.rb → prompt_interface/editor/editor_mode.rb} +0 -0
  140. /data/lib/kward/{markdown_code_block.rb → prompt_interface/editor/markdown_code_block.rb} +0 -0
  141. /data/lib/kward/{scratchpad_languages.rb → prompt_interface/editor/scratchpad_languages.rb} +0 -0
  142. /data/lib/kward/{scratchpad_runner.rb → prompt_interface/editor/scratchpad_runner.rb} +0 -0
  143. /data/lib/kward/{detached_run.rb → pty/detached_run.rb} +0 -0
  144. /data/lib/kward/{session_diff.rb → sessions/diff.rb} +0 -0
  145. /data/lib/kward/{session_naming.rb → sessions/naming.rb} +0 -0
  146. /data/lib/kward/{session_trash.rb → sessions/trash.rb} +0 -0
  147. /data/lib/kward/{kwshrc.rb → shell/kwshrc.rb} +0 -0
  148. /data/lib/kward/{shell_prompt.rb → shell/prompt.rb} +0 -0
  149. /data/lib/kward/{ansi.rb → terminal/ansi.rb} +0 -0
  150. /data/lib/kward/{terminal_keys.rb → terminal/keys.rb} +0 -0
  151. /data/lib/kward/{terminal_sequences.rb → terminal/sequences.rb} +0 -0
  152. /data/lib/kward/{terminal_text.rb → terminal/text.rb} +0 -0
  153. /data/lib/kward/{transcript_export.rb → transcripts/transcript_export.rb} +0 -0
  154. /data/lib/kward/{project_files.rb → workspace/files.rb} +0 -0
  155. /data/lib/kward/{path_guard.rb → workspace/path_guard.rb} +0 -0
@@ -570,6 +570,127 @@ body.kward-docs #footer {
570
570
  color: var(--kward-accent-bright);
571
571
  }
572
572
 
573
+ /*
574
+ Hero tagline "swosh": cycles each line through three phrases. The first
575
+ line moves right-to-left: "Your terminal.", "Your RPC frontend.", then
576
+ "Your workflow." The second line mirrors it left-to-right: "Your agent.",
577
+ "Your LLM engine.", then "Your harness." Pure CSS — no JS. The global
578
+ @media (prefers-reduced-motion) rule above collapses the animation to
579
+ the static original copy ("Your terminal. Your agent.") so it remains
580
+ accessible and calm.
581
+ */
582
+ .kward-swosh {
583
+ box-sizing: content-box;
584
+ display: inline-block;
585
+ height: 0.98em;
586
+ line-height: 0.98;
587
+ margin: -0.16em -0.08em;
588
+ overflow: hidden;
589
+ padding: 0.16em 0.08em;
590
+ position: relative;
591
+ vertical-align: top;
592
+ }
593
+
594
+ .kward-hero h1 .kward-swosh-text {
595
+ color: var(--kward-ink);
596
+ display: inline-block;
597
+ line-height: 0.98;
598
+ white-space: nowrap;
599
+ will-change: transform, opacity;
600
+ }
601
+
602
+ /* The longest text ("Your RPC frontend.") stays in flow to size the box;
603
+ the shorter phrases overlay it absolutely. */
604
+ .kward-swosh-text-a,
605
+ .kward-swosh-text-e {
606
+ left: 0.08em;
607
+ position: absolute;
608
+ top: 0.16em;
609
+ }
610
+
611
+ .kward-swosh-text-a {
612
+ animation: kward-swosh-a 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
613
+ }
614
+
615
+ .kward-swosh-text-b {
616
+ animation: kward-swosh-b 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
617
+ position: relative;
618
+ }
619
+
620
+ .kward-swosh-text-e {
621
+ animation: kward-swosh-e 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
622
+ }
623
+
624
+ @keyframes kward-swosh-a {
625
+ 0%, 25% { transform: translateX(0); opacity: 1; filter: none; }
626
+ 33% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
627
+ 34%, 92% { transform: translateX(140%); opacity: 0; filter: none; }
628
+ 100% { transform: translateX(0); opacity: 1; filter: none; }
629
+ }
630
+
631
+ @keyframes kward-swosh-b {
632
+ 0%, 25% { transform: translateX(140%); opacity: 0; filter: none; }
633
+ 33% { transform: translateX(0); opacity: 1; filter: none; }
634
+ 58% { transform: translateX(0); opacity: 1; filter: none; }
635
+ 66% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
636
+ 67%, 100% { transform: translateX(140%); opacity: 0; filter: none; }
637
+ }
638
+
639
+ @keyframes kward-swosh-e {
640
+ 0%, 58% { transform: translateX(140%); opacity: 0; filter: none; }
641
+ 66% { transform: translateX(0); opacity: 1; filter: none; }
642
+ 92% { transform: translateX(0); opacity: 1; filter: none; }
643
+ 100% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
644
+ }
645
+
646
+ /*
647
+ Second line, mirrored left-to-right. All texts keep the accent-bright
648
+ color of the original "Your agent." span.
649
+ */
650
+ .kward-hero h1 .kward-swosh-text-c,
651
+ .kward-hero h1 .kward-swosh-text-f {
652
+ color: var(--kward-accent-bright);
653
+ left: 0.08em;
654
+ position: absolute;
655
+ top: 0.16em;
656
+ }
657
+
658
+ .kward-hero h1 .kward-swosh-text-c {
659
+ animation: kward-swosh-c 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
660
+ }
661
+
662
+ .kward-hero h1 .kward-swosh-text-d {
663
+ animation: kward-swosh-d 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
664
+ color: var(--kward-accent-bright);
665
+ position: relative;
666
+ }
667
+
668
+ .kward-hero h1 .kward-swosh-text-f {
669
+ animation: kward-swosh-f 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
670
+ }
671
+
672
+ @keyframes kward-swosh-c {
673
+ 0%, 25% { transform: translateX(0); opacity: 1; filter: none; }
674
+ 33% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
675
+ 34%, 92% { transform: translateX(-140%); opacity: 0; filter: none; }
676
+ 100% { transform: translateX(0); opacity: 1; filter: none; }
677
+ }
678
+
679
+ @keyframes kward-swosh-d {
680
+ 0%, 25% { transform: translateX(-140%); opacity: 0; filter: none; }
681
+ 33% { transform: translateX(0); opacity: 1; filter: none; }
682
+ 58% { transform: translateX(0); opacity: 1; filter: none; }
683
+ 66% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
684
+ 67%, 100% { transform: translateX(-140%); opacity: 0; filter: none; }
685
+ }
686
+
687
+ @keyframes kward-swosh-f {
688
+ 0%, 58% { transform: translateX(-140%); opacity: 0; filter: none; }
689
+ 66% { transform: translateX(0); opacity: 1; filter: none; }
690
+ 92% { transform: translateX(0); opacity: 1; filter: none; }
691
+ 100% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
692
+ }
693
+
573
694
  .kward-lede {
574
695
  color: var(--kward-ink);
575
696
  font-size: 19px;
@@ -920,6 +1041,10 @@ body.kward-docs .kward-home #footer p {
920
1041
  font-size: clamp(32px, 10vw, 38px);
921
1042
  }
922
1043
 
1044
+ .kward-swosh {
1045
+ max-width: 100%;
1046
+ }
1047
+
923
1048
  .kward-feature-strip,
924
1049
  .kward-capabilities ul {
925
1050
  grid-template-columns: 1fr;
@@ -9,7 +9,7 @@ def generate_assets
9
9
  asset('css/kward.css', file('css/kward.css', true))
10
10
  asset('js/kward.js', file('js/kward.js', true))
11
11
  asset('images/kward_logo.png', file('images/kward_logo.png', true))
12
- asset('images/kward_workflow.svg', file('images/kward_workflow.svg', true))
12
+ asset('images/kward_screen_1.png', file('images/kward_screen_1.png', true))
13
13
  end
14
14
 
15
15
  def stylesheets_full_list
@@ -80,9 +80,21 @@
80
80
  <main id="main" class="kward-home">
81
81
  <section class="kward-hero">
82
82
  <div class="kward-hero-copy">
83
- <p class="kward-eyebrow">⌘ Ruby-native coding agent</p>
84
- <h1>A coding agent that works <span>where you do.</span></h1>
85
- <p class="kward-lede">Inspect code, edit files, run tests, and resume work from your terminal—with your choice of model provider.</p>
83
+ <p class="kward-eyebrow">⌘ Ruby CLI Coding Agent</p>
84
+ <h1>
85
+ <span class="kward-swosh" aria-label="Your terminal. Your RPC frontend. Your workflow.">
86
+ <span class="kward-swosh-text kward-swosh-text-a" aria-hidden="true">Your terminal.</span>
87
+ <span class="kward-swosh-text kward-swosh-text-b" aria-hidden="true">Your RPC frontend.</span>
88
+ <span class="kward-swosh-text kward-swosh-text-e" aria-hidden="true">Your workflow.</span>
89
+ </span>
90
+ <br>
91
+ <span class="kward-swosh" aria-label="Your agent. Your LLM engine. Your harness.">
92
+ <span class="kward-swosh-text kward-swosh-text-c" aria-hidden="true">Your agent.</span>
93
+ <span class="kward-swosh-text kward-swosh-text-d" aria-hidden="true">Your LLM engine.</span>
94
+ <span class="kward-swosh-text kward-swosh-text-f" aria-hidden="true">Your harness.</span>
95
+ </span>
96
+ </h1>
97
+ <p class="kward-lede">Kward is a general-purpose coding agent written in Ruby: terminal-native, project-aware, pipeable, and designed around your workflow.</p>
86
98
  <div class="kward-actions">
87
99
  <a class="kward-primary-button" href="<%= url_for('file.getting-started.html') %>">Get Started ›</a>
88
100
  <a class="kward-secondary-button" href="https://github.com/kaiwood/kward" target="_blank" rel="noopener noreferrer">View on GitHub</a>
@@ -113,7 +125,7 @@
113
125
  <a href="<%= url_for('file.getting-started.html') %>">View full installation docs →</a>
114
126
  </div>
115
127
  <div class="kward-screen-card">
116
- <img src="<%= url_for('images/kward_workflow.svg') %>" alt="Kward completing a focused coding change and test run">
128
+ <img src="<%= url_for('images/kward_screen_1.png') %>" alt="Kward terminal interface screenshot">
117
129
  </div>
118
130
  </section>
119
131
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kward
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.84.0
4
+ version: 0.85.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kai Wood
@@ -185,9 +185,7 @@ files:
185
185
  - exe/kward
186
186
  - kward.gemspec
187
187
  - lib/kward.rb
188
- - lib/kward/adaptive_pty_output_sink.rb
189
188
  - lib/kward/agent.rb
190
- - lib/kward/ansi.rb
191
189
  - lib/kward/auth/anthropic_oauth.rb
192
190
  - lib/kward/auth/api_key_store.rb
193
191
  - lib/kward/auth/file.rb
@@ -201,6 +199,8 @@ files:
201
199
  - lib/kward/cli/commands.rb
202
200
  - lib/kward/cli/compaction.rb
203
201
  - lib/kward/cli/doctor.rb
202
+ - lib/kward/cli/editor_prompt.rb
203
+ - lib/kward/cli/editor_prompt_session.rb
204
204
  - lib/kward/cli/git.rb
205
205
  - lib/kward/cli/hook_commands.rb
206
206
  - lib/kward/cli/interactive_turn.rb
@@ -214,31 +214,29 @@ files:
214
214
  - lib/kward/cli/runtime_helpers.rb
215
215
  - lib/kward/cli/sessions.rb
216
216
  - lib/kward/cli/settings.rb
217
+ - lib/kward/cli/settings/menus.rb
218
+ - lib/kward/cli/settings/model.rb
217
219
  - lib/kward/cli/slash_commands.rb
218
220
  - lib/kward/cli/stats.rb
219
221
  - lib/kward/cli/sysprompt.rb
220
222
  - lib/kward/cli/tabs.rb
221
223
  - lib/kward/cli/tool_summaries.rb
224
+ - lib/kward/cli/transcript_formatter.rb
222
225
  - lib/kward/cli/transports.rb
223
226
  - lib/kward/cli/worktrees.rb
224
- - lib/kward/cli_transcript_formatter.rb
225
- - lib/kward/clipboard.rb
226
227
  - lib/kward/compaction/file_operation_tracker.rb
227
228
  - lib/kward/compaction/token_estimator.rb
228
229
  - lib/kward/compactor.rb
230
+ - lib/kward/config/core.rb
231
+ - lib/kward/config/extensions.rb
232
+ - lib/kward/config/prompts.rb
233
+ - lib/kward/config/settings.rb
229
234
  - lib/kward/config_files.rb
230
235
  - lib/kward/context_budget_meter.rb
231
236
  - lib/kward/conversation.rb
232
237
  - lib/kward/deep_copy.rb
233
- - lib/kward/detached_run.rb
234
- - lib/kward/diff_view_mode.rb
235
- - lib/kward/editor_mode.rb
236
- - lib/kward/editor_prompt.rb
237
- - lib/kward/editor_prompt_session.rb
238
238
  - lib/kward/events.rb
239
- - lib/kward/export_path.rb
240
239
  - lib/kward/frontmatter.rb
241
- - lib/kward/git_worktree_manager.rb
242
240
  - lib/kward/hooks.rb
243
241
  - lib/kward/hooks/audit_log.rb
244
242
  - lib/kward/hooks/catalog.rb
@@ -251,13 +249,6 @@ files:
251
249
  - lib/kward/hooks/matcher.rb
252
250
  - lib/kward/http.rb
253
251
  - lib/kward/image_attachments.rb
254
- - lib/kward/interactive_pty_runner.rb
255
- - lib/kward/kwsh.rb
256
- - lib/kward/kwshrc.rb
257
- - lib/kward/local_command_runner.rb
258
- - lib/kward/local_pty_command_runner.rb
259
- - lib/kward/markdown_code_block.rb
260
- - lib/kward/markdown_transcript.rb
261
252
  - lib/kward/mcp/client.rb
262
253
  - lib/kward/mcp/server_config.rb
263
254
  - lib/kward/mcp/stdio_transport.rb
@@ -273,22 +264,27 @@ files:
273
264
  - lib/kward/model/context_usage.rb
274
265
  - lib/kward/model/copilot_models.rb
275
266
  - lib/kward/model/model_info.rb
267
+ - lib/kward/model/openrouter_model_cache.rb
276
268
  - lib/kward/model/payloads.rb
277
269
  - lib/kward/model/provider_catalog.rb
278
270
  - lib/kward/model/retry_message.rb
279
271
  - lib/kward/model/sources.rb
280
272
  - lib/kward/model/stream_parser.rb
281
- - lib/kward/openrouter_model_cache.rb
273
+ - lib/kward/model/typesafe_client.rb
282
274
  - lib/kward/pan/index.html.erb
283
275
  - lib/kward/pan/kward_logo.png
284
276
  - lib/kward/pan/server.rb
285
- - lib/kward/path_guard.rb
286
277
  - lib/kward/permissions/policy.rb
287
- - lib/kward/persistent_shell_session.rb
288
- - lib/kward/plugin_chat_runtime.rb
289
278
  - lib/kward/plugin_registry.rb
279
+ - lib/kward/plugins/actions.rb
280
+ - lib/kward/plugins/chat_contract.rb
281
+ - lib/kward/plugins/chat_runtime.rb
282
+ - lib/kward/plugins/host.rb
283
+ - lib/kward/plugins/registry.rb
284
+ - lib/kward/plugins/resources.rb
285
+ - lib/kward/plugins/turn_request.rb
286
+ - lib/kward/plugins/ui.rb
290
287
  - lib/kward/private_file.rb
291
- - lib/kward/project_files.rb
292
288
  - lib/kward/prompt_history.rb
293
289
  - lib/kward/prompt_interface.rb
294
290
  - lib/kward/prompt_interface/approval_prompt.rb
@@ -300,10 +296,13 @@ files:
300
296
  - lib/kward/prompt_interface/editor/auto_indent.rb
301
297
  - lib/kward/prompt_interface/editor/buffer.rb
302
298
  - lib/kward/prompt_interface/editor/controller.rb
299
+ - lib/kward/prompt_interface/editor/diff_view_mode.rb
300
+ - lib/kward/prompt_interface/editor/editor_mode.rb
303
301
  - lib/kward/prompt_interface/editor/endwise.rb
304
302
  - lib/kward/prompt_interface/editor/file_marker.rb
305
303
  - lib/kward/prompt_interface/editor/indent_navigation.rb
306
304
  - lib/kward/prompt_interface/editor/kill_ring.rb
305
+ - lib/kward/prompt_interface/editor/markdown_code_block.rb
307
306
  - lib/kward/prompt_interface/editor/modes/emacs.rb
308
307
  - lib/kward/prompt_interface/editor/modes/modern.rb
309
308
  - lib/kward/prompt_interface/editor/modes/vibe.rb
@@ -311,6 +310,8 @@ files:
311
310
  - lib/kward/prompt_interface/editor/renderer.rb
312
311
  - lib/kward/prompt_interface/editor/runner.rb
313
312
  - lib/kward/prompt_interface/editor/runner_state.rb
313
+ - lib/kward/prompt_interface/editor/scratchpad_languages.rb
314
+ - lib/kward/prompt_interface/editor/scratchpad_runner.rb
314
315
  - lib/kward/prompt_interface/editor/search.rb
315
316
  - lib/kward/prompt_interface/editor/selections.rb
316
317
  - lib/kward/prompt_interface/editor/state.rb
@@ -327,6 +328,7 @@ files:
327
328
  - lib/kward/prompt_interface/key_handler.rb
328
329
  - lib/kward/prompt_interface/layout.rb
329
330
  - lib/kward/prompt_interface/overlay_renderer.rb
331
+ - lib/kward/prompt_interface/plugin_ui_requests.rb
330
332
  - lib/kward/prompt_interface/project_browser.rb
331
333
  - lib/kward/prompt_interface/prompt_renderer.rb
332
334
  - lib/kward/prompt_interface/question_prompt.rb
@@ -340,8 +342,13 @@ files:
340
342
  - lib/kward/prompts.rb
341
343
  - lib/kward/prompts/commands.rb
342
344
  - lib/kward/prompts/templates.rb
343
- - lib/kward/pty_output_sink.rb
344
- - lib/kward/pty_transcript_normalizer.rb
345
+ - lib/kward/pty/adaptive_output_sink.rb
346
+ - lib/kward/pty/detached_run.rb
347
+ - lib/kward/pty/interactive_runner.rb
348
+ - lib/kward/pty/local_command_runner.rb
349
+ - lib/kward/pty/local_pty_runner.rb
350
+ - lib/kward/pty/output_sink.rb
351
+ - lib/kward/pty/transcript_normalizer.rb
345
352
  - lib/kward/question_contract.rb
346
353
  - lib/kward/rpc/attachment_normalizer.rb
347
354
  - lib/kward/rpc/auth_manager.rb
@@ -372,32 +379,35 @@ files:
372
379
  - lib/kward/sandbox/policy.rb
373
380
  - lib/kward/sandbox/runner_factory.rb
374
381
  - lib/kward/sandbox/unavailable_runner.rb
375
- - lib/kward/scratchpad_languages.rb
376
- - lib/kward/scratchpad_runner.rb
377
- - lib/kward/session_catalog.rb
378
- - lib/kward/session_diff.rb
379
- - lib/kward/session_naming.rb
380
- - lib/kward/session_store.rb
381
- - lib/kward/session_trash.rb
382
- - lib/kward/session_tree_nodes.rb
383
- - lib/kward/session_tree_renderer.rb
384
- - lib/kward/session_tree_tool_display.rb
385
- - lib/kward/shell_prompt.rb
386
- - lib/kward/shell_prompt_session.rb
382
+ - lib/kward/sessions/catalog.rb
383
+ - lib/kward/sessions/diff.rb
384
+ - lib/kward/sessions/naming.rb
385
+ - lib/kward/sessions/store.rb
386
+ - lib/kward/sessions/trash.rb
387
+ - lib/kward/sessions/tree_nodes.rb
388
+ - lib/kward/sessions/tree_renderer.rb
389
+ - lib/kward/sessions/tree_tool_display.rb
390
+ - lib/kward/shell/kwsh.rb
391
+ - lib/kward/shell/kwshrc.rb
392
+ - lib/kward/shell/persistent_session.rb
393
+ - lib/kward/shell/prompt.rb
394
+ - lib/kward/shell/prompt_session.rb
387
395
  - lib/kward/skills/capture.rb
388
396
  - lib/kward/skills/registry.rb
389
397
  - lib/kward/skills/trust_coordinator.rb
390
398
  - lib/kward/skills/trust_store.rb
391
399
  - lib/kward/starter_pack_installer.rb
392
400
  - lib/kward/steering.rb
393
- - lib/kward/tab_driver.rb
394
- - lib/kward/tab_store.rb
401
+ - lib/kward/tabs/driver.rb
402
+ - lib/kward/tabs/store.rb
395
403
  - lib/kward/telemetry/logger.rb
396
404
  - lib/kward/telemetry/stats.rb
397
- - lib/kward/terminal_image_support.rb
398
- - lib/kward/terminal_keys.rb
399
- - lib/kward/terminal_sequences.rb
400
- - lib/kward/terminal_text.rb
405
+ - lib/kward/terminal/ansi.rb
406
+ - lib/kward/terminal/clipboard.rb
407
+ - lib/kward/terminal/image_support.rb
408
+ - lib/kward/terminal/keys.rb
409
+ - lib/kward/terminal/sequences.rb
410
+ - lib/kward/terminal/text.rb
401
411
  - lib/kward/text_boundary.rb
402
412
  - lib/kward/text_matcher.rb
403
413
  - lib/kward/tool_output_compactor.rb
@@ -413,6 +423,7 @@ files:
413
423
  - lib/kward/tools/list_directory.rb
414
424
  - lib/kward/tools/mcp_tool.rb
415
425
  - lib/kward/tools/open_editor.rb
426
+ - lib/kward/tools/plugin_tool.rb
416
427
  - lib/kward/tools/prepare_shell_command.rb
417
428
  - lib/kward/tools/read_file.rb
418
429
  - lib/kward/tools/read_skill.rb
@@ -425,10 +436,15 @@ files:
425
436
  - lib/kward/tools/search/web_fetch.rb
426
437
  - lib/kward/tools/summarize_file_structure.rb
427
438
  - lib/kward/tools/tool_call.rb
439
+ - lib/kward/tools/typesafe_evaluate.rb
428
440
  - lib/kward/tools/web_search.rb
441
+ - lib/kward/tools/workspace_targets.rb
429
442
  - lib/kward/tools/write_file.rb
430
- - lib/kward/transcript_export.rb
443
+ - lib/kward/transcripts/export_path.rb
444
+ - lib/kward/transcripts/markdown_transcript.rb
445
+ - lib/kward/transcripts/transcript_export.rb
431
446
  - lib/kward/transport.rb
447
+ - lib/kward/transport/contracts.rb
432
448
  - lib/kward/transport/gateway.rb
433
449
  - lib/kward/transport/host.rb
434
450
  - lib/kward/transport/manager.rb
@@ -437,13 +453,16 @@ files:
437
453
  - lib/kward/transport/store.rb
438
454
  - lib/kward/update_check.rb
439
455
  - lib/kward/version.rb
440
- - lib/kward/workspace.rb
441
- - lib/kward/workspace_factory.rb
456
+ - lib/kward/workspace/factory.rb
457
+ - lib/kward/workspace/files.rb
458
+ - lib/kward/workspace/git_worktree_manager.rb
459
+ - lib/kward/workspace/path_guard.rb
460
+ - lib/kward/workspace/workspace.rb
442
461
  - lib/main.rb
443
462
  - templates/default/fulldoc/html/css/kward.css
444
463
  - templates/default/fulldoc/html/full_list.erb
445
464
  - templates/default/fulldoc/html/images/kward_logo.png
446
- - templates/default/fulldoc/html/images/kward_workflow.svg
465
+ - templates/default/fulldoc/html/images/kward_screen_1.png
447
466
  - templates/default/fulldoc/html/js/kward.js
448
467
  - templates/default/fulldoc/html/setup.rb
449
468
  - templates/default/kward_navigation.rb
@@ -1,90 +0,0 @@
1
- # Namespace for the Kward CLI agent runtime.
2
- module Kward
3
- # Adapts a session-backed agent to the tab runtime interface. Plugin tab
4
- # drivers implement the same small surface without becoming Kward sessions.
5
- class SessionTabDriver
6
- attr_reader :session, :agent, :worktree
7
-
8
- def initialize(session:, agent:, worktree: nil)
9
- @session = session
10
- @agent = agent
11
- @worktree = worktree
12
- end
13
-
14
- def messages
15
- agent.conversation.messages
16
- end
17
-
18
- def conversation
19
- agent.conversation
20
- end
21
-
22
- def submit(input, display_input:, cancellation:, steering: nil, &block)
23
- options = { cancellation: cancellation }
24
- options[:display_input] = display_input unless display_input.nil?
25
- options[:steering] = steering if steering
26
- agent.ask(input, **options, &block)
27
- end
28
-
29
- def descriptor
30
- descriptor = { "kind" => "session", "session_path" => session.path }
31
- descriptor["worktree"] = worktree.descriptor if worktree
32
- descriptor
33
- end
34
-
35
- def session?
36
- true
37
- end
38
-
39
- def supports_steering?
40
- true
41
- end
42
-
43
- def assistant_label
44
- nil
45
- end
46
- end
47
-
48
- # Represents a persisted plugin tab whose provider plugin is unavailable.
49
- # Its descriptor is retained so reinstalling the plugin restores the tab.
50
- class UnavailableTabDriver
51
- attr_reader :descriptor
52
-
53
- def initialize(descriptor:, message:)
54
- @descriptor = descriptor
55
- @message = message
56
- end
57
-
58
- def messages
59
- [{ role: "assistant", content: @message }]
60
- end
61
-
62
- def submit(*)
63
- raise @message
64
- end
65
-
66
- def session?
67
- false
68
- end
69
-
70
- def supports_steering?
71
- false
72
- end
73
-
74
- def assistant_label
75
- "Plugin"
76
- end
77
- end
78
-
79
- # Dependencies made available to a plugin tab factory. The host deliberately
80
- # exposes provider transport and frontend-neutral facts, not CLI internals or
81
- # workspace session state.
82
- class PluginTabHost
83
- attr_reader :client, :workspace_root
84
-
85
- def initialize(client:, workspace_root:)
86
- @client = client
87
- @workspace_root = workspace_root
88
- end
89
- end
90
- end
@@ -1,52 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700" role="img" aria-labelledby="title description">
2
- <title id="title">Kward coding workflow</title>
3
- <desc id="description">A Kward terminal session reads and edits the CLI, runs focused tests, and reports a successful authentication error-handling change.</desc>
4
- <defs>
5
- <linearGradient id="background" x1="0" y1="0" x2="1" y2="1">
6
- <stop offset="0" stop-color="#11170f"/>
7
- <stop offset="1" stop-color="#070b07"/>
8
- </linearGradient>
9
- <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
10
- <feDropShadow dx="0" dy="18" stdDeviation="22" flood-color="#000" flood-opacity=".45"/>
11
- </filter>
12
- </defs>
13
- <rect width="1200" height="700" fill="#070b07"/>
14
- <rect x="28" y="28" width="1144" height="644" rx="20" fill="url(#background)" stroke="#465035" stroke-width="2" filter="url(#shadow)"/>
15
- <path d="M28 82h1144" stroke="#293024" stroke-width="2"/>
16
- <circle cx="62" cy="55" r="8" fill="#ff5f57"/>
17
- <circle cx="88" cy="55" r="8" fill="#febc2e"/>
18
- <circle cx="114" cy="55" r="8" fill="#28c840"/>
19
- <text x="600" y="63" text-anchor="middle" fill="#777c68" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="18">kward · ~/code/kward</text>
20
-
21
- <g font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">
22
- <circle cx="65" cy="119" r="7" fill="#9caf35"/>
23
- <text x="84" y="126" fill="#efe8d0" font-size="20" font-weight="700">Kward v0.83.0 is online.</text>
24
- <text x="64" y="159" fill="#777c68" font-size="16">Workspace</text>
25
- <text x="180" y="159" fill="#d2df62" font-size="16">kaiwood/kward</text>
26
- <text x="64" y="184" fill="#777c68" font-size="16">Branch</text>
27
- <text x="180" y="184" fill="#d2df62" font-size="16">main</text>
28
- <text x="64" y="219" fill="#efe8d0" font-size="18" font-weight="700">State your business.</text>
29
-
30
- <text x="64" y="276" fill="#afa88f" font-size="16" font-weight="700">You&gt;</text>
31
- <text x="126" y="276" fill="#efe8d0" font-size="18">Make one-shot authentication failures concise and add focused tests.</text>
32
-
33
- <rect x="64" y="309" width="1072" height="164" rx="12" fill="#0d120d" stroke="#293024"/>
34
- <text x="88" y="342" fill="#9caf35" font-size="15" font-weight="700">TOOL ACTIVITY</text>
35
- <text x="88" y="378" fill="#d2df62" font-size="17">Read</text>
36
- <text x="174" y="378" fill="#efe8d0" font-size="17">lib/kward/cli.rb</text>
37
- <text x="88" y="414" fill="#d2df62" font-size="17">Edit</text>
38
- <text x="174" y="414" fill="#efe8d0" font-size="17">lib/kward/cli.rb</text>
39
- <text x="1016" y="414" text-anchor="end" fill="#9caf35" font-size="16">+34</text>
40
- <text x="88" y="450" fill="#d2df62" font-size="17">Test</text>
41
- <text x="174" y="450" fill="#efe8d0" font-size="17">3 runs · 26 assertions</text>
42
- <text x="1110" y="450" text-anchor="end" fill="#9caf35" font-size="17" font-weight="700">0 failures</text>
43
-
44
- <text x="64" y="526" fill="#9caf35" font-size="16" font-weight="700">Kward&gt;</text>
45
- <text x="154" y="526" fill="#efe8d0" font-size="18">Authentication failures now return an actionable message without a traceback.</text>
46
- <text x="154" y="559" fill="#afa88f" font-size="17">Debug backtraces remain available with KWARD_DEBUG=1.</text>
47
-
48
- <path d="M52 608h1096" stroke="#293024"/>
49
- <text x="64" y="642" fill="#afa88f" font-size="15">main*</text>
50
- <text x="1128" y="642" text-anchor="end" fill="#777c68" font-size="15">18% · Codex gpt-5.6-sol · medium</text>
51
- </g>
52
- </svg>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes