kward 0.81.0 → 0.83.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -0
  3. data/Gemfile.lock +2 -2
  4. data/README.md +1 -1
  5. data/Rakefile +44 -4
  6. data/doc/agent-tools.md +1 -0
  7. data/doc/composer.md +2 -2
  8. data/doc/configuration.md +18 -3
  9. data/doc/editor.md +20 -10
  10. data/doc/files.md +12 -5
  11. data/doc/permissions.md +1 -0
  12. data/doc/releasing.md +79 -38
  13. data/doc/rpc.md +2 -2
  14. data/doc/sandboxing.md +5 -1
  15. data/doc/security.md +2 -2
  16. data/doc/shell.md +42 -18
  17. data/doc/tabs.md +3 -0
  18. data/doc/usage.md +3 -2
  19. data/kward.gemspec +1 -1
  20. data/lib/kward/adaptive_pty_output_sink.rb +183 -0
  21. data/lib/kward/agent.rb +1 -0
  22. data/lib/kward/auth/anthropic_oauth.rb +7 -7
  23. data/lib/kward/cli/git.rb +5 -1
  24. data/lib/kward/cli/interactive_turn.rb +101 -19
  25. data/lib/kward/cli/rendering.rb +14 -2
  26. data/lib/kward/cli/runtime_helpers.rb +252 -46
  27. data/lib/kward/cli/settings.rb +5 -13
  28. data/lib/kward/cli/slash_commands.rb +12 -1
  29. data/lib/kward/cli/tabs.rb +71 -9
  30. data/lib/kward/cli.rb +12 -0
  31. data/lib/kward/compaction/token_estimator.rb +12 -6
  32. data/lib/kward/config_files.rb +17 -0
  33. data/lib/kward/editor_prompt.rb +46 -0
  34. data/lib/kward/editor_prompt_session.rb +28 -0
  35. data/lib/kward/ekwsh.rb +70 -10
  36. data/lib/kward/image_attachments.rb +98 -15
  37. data/lib/kward/interactive_pty_runner.rb +25 -19
  38. data/lib/kward/model/client.rb +1 -17
  39. data/lib/kward/model/model_info.rb +3 -2
  40. data/lib/kward/model/payloads.rb +0 -2
  41. data/lib/kward/persistent_shell_session.rb +750 -0
  42. data/lib/kward/project_files.rb +18 -5
  43. data/lib/kward/prompt_interface/composer_controller.rb +3 -3
  44. data/lib/kward/prompt_interface/composer_renderer.rb +28 -1
  45. data/lib/kward/prompt_interface/editor/auto_indent.rb +3 -0
  46. data/lib/kward/prompt_interface/editor/controller.rb +75 -6
  47. data/lib/kward/prompt_interface/editor/modes/emacs.rb +2 -2
  48. data/lib/kward/prompt_interface/editor/modes/modern.rb +4 -0
  49. data/lib/kward/prompt_interface/editor/modes/vibe.rb +12 -6
  50. data/lib/kward/prompt_interface/editor/renderer.rb +1 -0
  51. data/lib/kward/prompt_interface/editor/state.rb +11 -0
  52. data/lib/kward/prompt_interface/editor/word_completion.rb +124 -0
  53. data/lib/kward/prompt_interface/file_overlay.rb +21 -7
  54. data/lib/kward/prompt_interface/git_prompt.rb +1 -1
  55. data/lib/kward/prompt_interface/key_handler.rb +30 -0
  56. data/lib/kward/prompt_interface/overlay_renderer.rb +1 -0
  57. data/lib/kward/prompt_interface/project_browser.rb +192 -8
  58. data/lib/kward/prompt_interface/prompt_renderer.rb +15 -6
  59. data/lib/kward/prompt_interface/question_prompt.rb +1 -1
  60. data/lib/kward/prompt_interface/runtime_state.rb +5 -1
  61. data/lib/kward/prompt_interface/screen.rb +40 -20
  62. data/lib/kward/prompt_interface/selection_prompt.rb +5 -5
  63. data/lib/kward/prompt_interface/transcript_renderer.rb +4 -4
  64. data/lib/kward/prompt_interface.rb +159 -32
  65. data/lib/kward/prompts/commands.rb +1 -0
  66. data/lib/kward/pty_output_sink.rb +45 -0
  67. data/lib/kward/pty_transcript_normalizer.rb +93 -0
  68. data/lib/kward/rpc/auth_manager.rb +1 -1
  69. data/lib/kward/rpc/server.rb +2 -1
  70. data/lib/kward/session_catalog.rb +87 -0
  71. data/lib/kward/session_store.rb +94 -5
  72. data/lib/kward/shell_prompt.rb +50 -0
  73. data/lib/kward/shell_prompt_session.rb +58 -0
  74. data/lib/kward/terminal_image_support.rb +116 -0
  75. data/lib/kward/terminal_keys.rb +1 -0
  76. data/lib/kward/terminal_sequences.rb +43 -0
  77. data/lib/kward/tools/prepare_shell_command.rb +28 -0
  78. data/lib/kward/tools/registry.rb +63 -5
  79. data/lib/kward/tools/replace_editor_buffer.rb +30 -0
  80. data/lib/kward/tools/run_shell_command.rb +24 -6
  81. data/lib/kward/version.rb +1 -1
  82. data/templates/default/layout/html/layout.erb +1 -1
  83. metadata +15 -4
  84. data/.github/workflows/ci.yml +0 -48
  85. data/.github/workflows/pages.yml +0 -48
@@ -5,17 +5,27 @@ require_relative "../workspace"
5
5
  module Kward
6
6
  # Model-callable tool wrappers and their argument schemas.
7
7
  module Tools
8
- # Tool wrapper for bounded shell commands in the workspace.
8
+ # Tool wrapper for bounded shell commands in the workspace or active shell.
9
9
  class RunShellCommand < Base
10
10
  # Builds the tool schema and stores the execution dependency.
11
- def initialize(workspace:)
11
+ def initialize(workspace: nil, shell_prompt_session: nil)
12
+ raise ArgumentError, "RunShellCommand requires a workspace or shell session" unless workspace || shell_prompt_session
13
+ raise ArgumentError, "RunShellCommand accepts only one execution target" if workspace && shell_prompt_session
14
+
12
15
  @workspace = workspace
16
+ @shell_prompt_session = shell_prompt_session
17
+ description = shell_prompt_session ?
18
+ "Run a bounded noninteractive command in the active embedded shell session." :
19
+ "Run a shell command from the workspace root."
20
+ timeout_description = shell_prompt_session ?
21
+ "Timeout seconds; defaults to the embedded shell setting." :
22
+ "Timeout seconds; default 30."
13
23
  super(
14
24
  "run_shell_command",
15
- "Run a shell command from the workspace root.",
25
+ description,
16
26
  properties: {
17
27
  command: { type: "string", description: "Command to run." },
18
- timeout_seconds: { type: "integer", description: "Timeout seconds; default 30." }
28
+ timeout_seconds: { type: "integer", description: timeout_description }
19
29
  },
20
30
  required: ["command"]
21
31
  )
@@ -24,9 +34,17 @@ module Kward
24
34
  # Executes the tool and returns model-facing output text.
25
35
  def call(args, _conversation, cancellation: nil)
26
36
  command = argument(args, :command, "")
27
- timeout_seconds = argument(args, :timeout_seconds, Workspace::DEFAULT_COMMAND_TIMEOUT_SECONDS)
37
+ timeout_seconds = argument(
38
+ args,
39
+ :timeout_seconds,
40
+ @shell_prompt_session ? @shell_prompt_session.timeout_seconds : Workspace::DEFAULT_COMMAND_TIMEOUT_SECONDS
41
+ )
28
42
 
29
- @workspace.run_shell_command(command, timeout_seconds: timeout_seconds, cancellation: cancellation)
43
+ if @shell_prompt_session
44
+ @shell_prompt_session.run(command, timeout_seconds: timeout_seconds, cancellation: cancellation)
45
+ else
46
+ @workspace.run_shell_command(command, timeout_seconds: timeout_seconds, cancellation: cancellation)
47
+ end
30
48
  end
31
49
  end
32
50
  end
data/lib/kward/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # Namespace for the Kward CLI agent runtime.
2
2
  module Kward
3
3
  # Current gem version.
4
- VERSION = "0.81.0"
4
+ VERSION = "0.83.0"
5
5
  end
@@ -110,7 +110,7 @@
110
110
  <article><strong>⌘</strong><h2>Project-aware agent loop</h2><p>Inspect, reason, patch, verify.</p></article>
111
111
  <article><strong>▤</strong><h2>Unix filter mode</h2><p>Pipe diffs, logs, and code through Kward.</p></article>
112
112
  <article><strong>▰</strong><h2>Branchable sessions</h2><p>Resume, rewind, fork, compact, export.</p></article>
113
- <article><strong>◈</strong><h2>Human-in-the-loop permissions</h2><p>Optionally approve edits, commands, web, and MCP calls.</p></article>
113
+ <article><strong>⌗</strong><h2>Builtin shell and editor</h2><p>Run commands and edit files safely in the workspace.</p></article>
114
114
  <article><strong>◎</strong><h2>Live source intelligence</h2><p>Search the web and read public repos.</p></article>
115
115
  <article><strong>✣</strong><h2>Ruby-native extensions</h2><p>Shape Kward with plugins, skills, and prompts.</p></article>
116
116
  </section>
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.81.0
4
+ version: 0.83.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kai Wood
@@ -116,8 +116,6 @@ executables:
116
116
  extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
- - ".github/workflows/ci.yml"
120
- - ".github/workflows/pages.yml"
121
119
  - ".yardopts"
122
120
  - CHANGELOG.md
123
121
  - Gemfile
@@ -170,6 +168,7 @@ files:
170
168
  - exe/kward
171
169
  - kward.gemspec
172
170
  - lib/kward.rb
171
+ - lib/kward/adaptive_pty_output_sink.rb
173
172
  - lib/kward/agent.rb
174
173
  - lib/kward/ansi.rb
175
174
  - lib/kward/auth/anthropic_oauth.rb
@@ -216,6 +215,8 @@ files:
216
215
  - lib/kward/deep_copy.rb
217
216
  - lib/kward/diff_view_mode.rb
218
217
  - lib/kward/editor_mode.rb
218
+ - lib/kward/editor_prompt.rb
219
+ - lib/kward/editor_prompt_session.rb
219
220
  - lib/kward/ekwsh.rb
220
221
  - lib/kward/events.rb
221
222
  - lib/kward/export_path.rb
@@ -263,6 +264,7 @@ files:
263
264
  - lib/kward/pan/server.rb
264
265
  - lib/kward/path_guard.rb
265
266
  - lib/kward/permissions/policy.rb
267
+ - lib/kward/persistent_shell_session.rb
266
268
  - lib/kward/plugin_chat_runtime.rb
267
269
  - lib/kward/plugin_registry.rb
268
270
  - lib/kward/private_file.rb
@@ -294,6 +296,7 @@ files:
294
296
  - lib/kward/prompt_interface/editor/syntax_highlighter.rb
295
297
  - lib/kward/prompt_interface/editor/undo_history.rb
296
298
  - lib/kward/prompt_interface/editor/vibe_state.rb
299
+ - lib/kward/prompt_interface/editor/word_completion.rb
297
300
  - lib/kward/prompt_interface/file_overlay.rb
298
301
  - lib/kward/prompt_interface/git_prompt.rb
299
302
  - lib/kward/prompt_interface/interactive/controller.rb
@@ -315,6 +318,8 @@ files:
315
318
  - lib/kward/prompts.rb
316
319
  - lib/kward/prompts/commands.rb
317
320
  - lib/kward/prompts/templates.rb
321
+ - lib/kward/pty_output_sink.rb
322
+ - lib/kward/pty_transcript_normalizer.rb
318
323
  - lib/kward/question_contract.rb
319
324
  - lib/kward/rpc/attachment_normalizer.rb
320
325
  - lib/kward/rpc/auth_manager.rb
@@ -346,6 +351,7 @@ files:
346
351
  - lib/kward/sandbox/runner_factory.rb
347
352
  - lib/kward/sandbox/unavailable_runner.rb
348
353
  - lib/kward/scratchpad_runner.rb
354
+ - lib/kward/session_catalog.rb
349
355
  - lib/kward/session_diff.rb
350
356
  - lib/kward/session_naming.rb
351
357
  - lib/kward/session_store.rb
@@ -353,6 +359,8 @@ files:
353
359
  - lib/kward/session_tree_nodes.rb
354
360
  - lib/kward/session_tree_renderer.rb
355
361
  - lib/kward/session_tree_tool_display.rb
362
+ - lib/kward/shell_prompt.rb
363
+ - lib/kward/shell_prompt_session.rb
356
364
  - lib/kward/skills/capture.rb
357
365
  - lib/kward/skills/registry.rb
358
366
  - lib/kward/skills/trust_coordinator.rb
@@ -363,6 +371,7 @@ files:
363
371
  - lib/kward/tab_store.rb
364
372
  - lib/kward/telemetry/logger.rb
365
373
  - lib/kward/telemetry/stats.rb
374
+ - lib/kward/terminal_image_support.rb
366
375
  - lib/kward/terminal_keys.rb
367
376
  - lib/kward/terminal_sequences.rb
368
377
  - lib/kward/text_boundary.rb
@@ -378,9 +387,11 @@ files:
378
387
  - lib/kward/tools/git_commit.rb
379
388
  - lib/kward/tools/list_directory.rb
380
389
  - lib/kward/tools/mcp_tool.rb
390
+ - lib/kward/tools/prepare_shell_command.rb
381
391
  - lib/kward/tools/read_file.rb
382
392
  - lib/kward/tools/read_skill.rb
383
393
  - lib/kward/tools/registry.rb
394
+ - lib/kward/tools/replace_editor_buffer.rb
384
395
  - lib/kward/tools/retrieve_tool_output.rb
385
396
  - lib/kward/tools/run_shell_command.rb
386
397
  - lib/kward/tools/search/code.rb
@@ -436,7 +447,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
436
447
  - !ruby/object:Gem::Version
437
448
  version: '0'
438
449
  requirements: []
439
- rubygems_version: 4.0.6
450
+ rubygems_version: 3.6.9
440
451
  specification_version: 4
441
452
  summary: An extendable Ruby CLI coding agent.
442
453
  test_files: []
@@ -1,48 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
- workflow_dispatch:
9
-
10
- permissions:
11
- contents: read
12
-
13
- jobs:
14
- test:
15
- runs-on: ubuntu-latest
16
- strategy:
17
- fail-fast: false
18
- matrix:
19
- ruby-version: ['3.4', 'ruby']
20
- steps:
21
- - name: Checkout
22
- uses: actions/checkout@v4
23
-
24
- - name: Set up Ruby
25
- uses: ruby/setup-ruby@v1
26
- with:
27
- ruby-version: ${{ matrix.ruby-version }}
28
- bundler-cache: true
29
-
30
- - name: Install sandbox test dependency
31
- run: sudo apt-get update && sudo apt-get install --yes bubblewrap
32
-
33
- - name: Enable Bubblewrap namespaces
34
- run: |
35
- sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
36
- sudo sysctl -w kernel.unprivileged_userns_clone=1
37
- bwrap --ro-bind / / --unshare-net true
38
-
39
- - name: Check syntax
40
- run: find lib test -name '*.rb' -print0 | xargs -0 ruby -c
41
-
42
- - name: Check runtime warnings
43
- run: bundle exec ruby -w -Ilib -e 'require "kward"'
44
-
45
- - name: Run tests
46
- env:
47
- KWARD_RUN_BUBBLEWRAP_TESTS: "1"
48
- run: bundle exec rake test
@@ -1,48 +0,0 @@
1
- name: Deploy documentation
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- workflow_dispatch:
8
-
9
- permissions:
10
- contents: read
11
- pages: write
12
- id-token: write
13
-
14
- concurrency:
15
- group: pages
16
- cancel-in-progress: false
17
-
18
- jobs:
19
- build:
20
- runs-on: ubuntu-latest
21
- steps:
22
- - name: Checkout
23
- uses: actions/checkout@v4
24
-
25
- - name: Set up Ruby
26
- uses: ruby/setup-ruby@v1
27
- with:
28
- ruby-version: '3.4'
29
- bundler-cache: true
30
-
31
- - name: Build documentation
32
- run: bundle exec rake docs:build
33
-
34
- - name: Upload Pages artifact
35
- uses: actions/upload-pages-artifact@v3
36
- with:
37
- path: _yardoc
38
-
39
- deploy:
40
- environment:
41
- name: github-pages
42
- url: ${{ steps.deployment.outputs.page_url }}
43
- runs-on: ubuntu-latest
44
- needs: build
45
- steps:
46
- - name: Deploy to GitHub Pages
47
- id: deployment
48
- uses: actions/deploy-pages@v4