kward 0.71.0 → 0.73.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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +30 -0
  3. data/CHANGELOG.md +93 -0
  4. data/Gemfile.lock +2 -2
  5. data/README.md +4 -0
  6. data/doc/agent-tools.md +15 -6
  7. data/doc/authentication.md +22 -1
  8. data/doc/code-search.md +42 -2
  9. data/doc/configuration.md +106 -3
  10. data/doc/context-budgeting.md +136 -0
  11. data/doc/context-tools.md +16 -3
  12. data/doc/editor.md +415 -0
  13. data/doc/extensibility.md +16 -7
  14. data/doc/files.md +100 -0
  15. data/doc/getting-started.md +25 -18
  16. data/doc/git.md +123 -0
  17. data/doc/memory.md +24 -4
  18. data/doc/personas.md +34 -5
  19. data/doc/plugins.md +72 -1
  20. data/doc/releasing.md +37 -9
  21. data/doc/rpc.md +75 -5
  22. data/doc/session-management.md +35 -1
  23. data/doc/shell.md +332 -0
  24. data/doc/tabs.md +122 -0
  25. data/doc/troubleshooting.md +77 -1
  26. data/doc/usage.md +79 -7
  27. data/doc/web-search.md +12 -4
  28. data/doc/workspace-tools.md +51 -12
  29. data/examples/plugins/space_invaders.rb +377 -0
  30. data/lib/kward/agent.rb +1 -1
  31. data/lib/kward/ansi.rb +62 -23
  32. data/lib/kward/cli/commands.rb +33 -2
  33. data/lib/kward/cli/git.rb +150 -0
  34. data/lib/kward/cli/interactive_turn.rb +73 -9
  35. data/lib/kward/cli/plugins.rb +54 -4
  36. data/lib/kward/cli/prompt_interface.rb +32 -1
  37. data/lib/kward/cli/rendering.rb +4 -1
  38. data/lib/kward/cli/runtime_helpers.rb +268 -4
  39. data/lib/kward/cli/sessions.rb +2 -2
  40. data/lib/kward/cli/settings.rb +217 -9
  41. data/lib/kward/cli/slash_commands.rb +628 -2
  42. data/lib/kward/cli/tabs.rb +725 -0
  43. data/lib/kward/cli/tool_summaries.rb +6 -0
  44. data/lib/kward/cli.rb +150 -26
  45. data/lib/kward/clipboard.rb +2 -3
  46. data/lib/kward/compactor.rb +7 -19
  47. data/lib/kward/config_files.rb +145 -1
  48. data/lib/kward/context_budget_meter.rb +44 -0
  49. data/lib/kward/conversation.rb +12 -4
  50. data/lib/kward/editor_mode.rb +25 -0
  51. data/lib/kward/ekwsh.rb +559 -0
  52. data/lib/kward/image_attachments.rb +3 -1
  53. data/lib/kward/interactive_pty_runner.rb +151 -0
  54. data/lib/kward/local_command_runner.rb +155 -0
  55. data/lib/kward/local_pty_command_runner.rb +171 -0
  56. data/lib/kward/model/context_usage.rb +2 -2
  57. data/lib/kward/model/payloads.rb +2 -5
  58. data/lib/kward/plugin_registry.rb +61 -0
  59. data/lib/kward/project_files.rb +52 -0
  60. data/lib/kward/prompt_history.rb +84 -0
  61. data/lib/kward/prompt_interface/composer_controller.rb +69 -1
  62. data/lib/kward/prompt_interface/composer_renderer.rb +109 -13
  63. data/lib/kward/prompt_interface/composer_state.rb +96 -27
  64. data/lib/kward/prompt_interface/editor/auto_close_pairs.rb +123 -0
  65. data/lib/kward/prompt_interface/editor/auto_indent.rb +510 -0
  66. data/lib/kward/prompt_interface/editor/buffer.rb +109 -0
  67. data/lib/kward/prompt_interface/editor/controller.rb +1218 -0
  68. data/lib/kward/prompt_interface/editor/endwise.rb +321 -0
  69. data/lib/kward/prompt_interface/editor/file_marker.rb +40 -0
  70. data/lib/kward/prompt_interface/editor/indent_navigation.rb +61 -0
  71. data/lib/kward/prompt_interface/editor/kill_ring.rb +78 -0
  72. data/lib/kward/prompt_interface/editor/modes/emacs.rb +259 -0
  73. data/lib/kward/prompt_interface/editor/modes/modern.rb +354 -0
  74. data/lib/kward/prompt_interface/editor/modes/vibe.rb +1812 -0
  75. data/lib/kward/prompt_interface/editor/modes/vibe_insert_readline.rb +166 -0
  76. data/lib/kward/prompt_interface/editor/renderer.rb +244 -0
  77. data/lib/kward/prompt_interface/editor/search.rb +76 -0
  78. data/lib/kward/prompt_interface/editor/selections.rb +120 -0
  79. data/lib/kward/prompt_interface/editor/state.rb +1271 -0
  80. data/lib/kward/prompt_interface/editor/status_text.rb +23 -0
  81. data/lib/kward/prompt_interface/editor/syntax_highlighter.rb +422 -0
  82. data/lib/kward/prompt_interface/editor/undo_history.rb +46 -0
  83. data/lib/kward/prompt_interface/editor/vibe_state.rb +44 -0
  84. data/lib/kward/prompt_interface/file_overlay.rb +211 -0
  85. data/lib/kward/prompt_interface/git_prompt.rb +288 -0
  86. data/lib/kward/prompt_interface/interactive/controller.rb +186 -0
  87. data/lib/kward/prompt_interface/interactive/renderer.rb +71 -0
  88. data/lib/kward/prompt_interface/interactive/state.rb +62 -0
  89. data/lib/kward/prompt_interface/key_handler.rb +451 -57
  90. data/lib/kward/prompt_interface/overlay_renderer.rb +21 -2
  91. data/lib/kward/prompt_interface/project_browser.rb +524 -0
  92. data/lib/kward/prompt_interface/question_prompt.rb +99 -56
  93. data/lib/kward/prompt_interface/runtime_state.rb +43 -0
  94. data/lib/kward/prompt_interface/screen.rb +19 -3
  95. data/lib/kward/prompt_interface/selection_prompt.rb +10 -19
  96. data/lib/kward/prompt_interface/slash_overlay.rb +2 -0
  97. data/lib/kward/prompt_interface/stream_state.rb +7 -0
  98. data/lib/kward/prompt_interface/transcript_buffer.rb +6 -0
  99. data/lib/kward/prompt_interface.rb +366 -222
  100. data/lib/kward/prompts/commands.rb +9 -0
  101. data/lib/kward/prompts.rb +2 -0
  102. data/lib/kward/rpc/memory_methods.rb +83 -0
  103. data/lib/kward/rpc/server.rb +169 -83
  104. data/lib/kward/rpc/session_manager.rb +45 -121
  105. data/lib/kward/rpc/session_tree_rows.rb +9 -115
  106. data/lib/kward/rpc/tool_event_normalizer.rb +1 -1
  107. data/lib/kward/rpc/tool_metadata.rb +11 -0
  108. data/lib/kward/rpc/transcript_normalizer.rb +4 -39
  109. data/lib/kward/scratchpad_runner.rb +56 -0
  110. data/lib/kward/session_diff.rb +20 -3
  111. data/lib/kward/session_naming.rb +11 -0
  112. data/lib/kward/session_store.rb +44 -0
  113. data/lib/kward/session_tree_nodes.rb +136 -0
  114. data/lib/kward/session_tree_renderer.rb +9 -131
  115. data/lib/kward/tab_store.rb +47 -0
  116. data/lib/kward/terminal_keys.rb +84 -0
  117. data/lib/kward/terminal_sequences.rb +42 -0
  118. data/lib/kward/text_boundary.rb +25 -0
  119. data/lib/kward/tools/context_budget_stats.rb +54 -0
  120. data/lib/kward/tools/context_for_task.rb +204 -0
  121. data/lib/kward/tools/read_file.rb +8 -4
  122. data/lib/kward/tools/registry.rb +62 -16
  123. data/lib/kward/tools/tool_call.rb +10 -0
  124. data/lib/kward/version.rb +1 -1
  125. data/lib/kward/workers/git_guard.rb +93 -0
  126. data/lib/kward/workers/job.rb +99 -0
  127. data/lib/kward/workers/live_view.rb +49 -0
  128. data/lib/kward/workers/manager.rb +288 -0
  129. data/lib/kward/workers/queue_runner.rb +166 -0
  130. data/lib/kward/workers/queue_store.rb +112 -0
  131. data/lib/kward/workers/store.rb +72 -0
  132. data/lib/kward/workers/tool_policy.rb +23 -0
  133. data/lib/kward/workers/worker.rb +82 -0
  134. data/lib/kward/workers/write_lock.rb +38 -0
  135. data/lib/kward/workers.rb +10 -0
  136. data/lib/kward/workspace.rb +125 -87
  137. data/templates/default/fulldoc/html/css/kward.css +140 -36
  138. data/templates/default/fulldoc/html/images/kward_screen_1.png +0 -0
  139. data/templates/default/fulldoc/html/setup.rb +1 -0
  140. data/templates/default/kward_navigation.rb +12 -1
  141. data/templates/default/layout/html/layout.erb +23 -34
  142. data/templates/default/layout/html/setup.rb +6 -0
  143. metadata +67 -1
@@ -341,7 +341,41 @@ body.kward-docs a {
341
341
  color: var(--kward-accent-bright);
342
342
  }
343
343
 
344
- body.kward-docs pre {
344
+ body.kward-docs #content quote,
345
+ body.kward-docs #filecontents quote {
346
+ border-left: 3px solid var(--kward-accent);
347
+ color: var(--kward-ink);
348
+ display: block;
349
+ font-style: italic;
350
+ font-size: 18px;
351
+ line-height: 1.8;
352
+ margin: 28px 0;
353
+ padding: 8px 0 8px 46px;
354
+ position: relative;
355
+ }
356
+
357
+ body.kward-docs #content quote::before,
358
+ body.kward-docs #filecontents quote::before {
359
+ color: var(--kward-accent);
360
+ content: "\201C";
361
+ font-family: Georgia, "Times New Roman", serif;
362
+ font-size: 80px;
363
+ font-style: normal;
364
+ left: 4px;
365
+ line-height: 1;
366
+ opacity: 0.55;
367
+ position: absolute;
368
+ top: -10px;
369
+ }
370
+
371
+ body.kward-docs #content quote br,
372
+ body.kward-docs #filecontents quote br {
373
+ content: "";
374
+ display: block;
375
+ margin-bottom: 4px;
376
+ }
377
+
378
+ body.kward-docs #content pre {
345
379
  background: var(--kward-code);
346
380
  border: 1px solid rgba(149, 169, 52, 0.22);
347
381
  border-radius: 10px;
@@ -537,11 +571,10 @@ body.kward-docs #footer {
537
571
  }
538
572
 
539
573
  /*
540
- Hero tagline "swosh": "Your terminal." flies out to the left and is
541
- replaced by "Your RPC frontend." flying in from the right, then cycles
542
- back. The second line mirrors it from the opposite side — "Your agent."
543
- flies out to the right and is replaced by "Your engine." flying in from
544
- the left — both lines swap in sync. Pure CSS — no JS. The global
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
545
578
  @media (prefers-reduced-motion) rule above collapses the animation to
546
579
  the static original copy ("Your terminal. Your agent.") so it remains
547
580
  accessible and calm.
@@ -566,68 +599,95 @@ body.kward-docs #footer {
566
599
  will-change: transform, opacity;
567
600
  }
568
601
 
569
- /* The longer text ("Your RPC frontend.") stays in flow to size the box;
570
- the shorter "Your terminal." overlays it absolutely. */
571
- .kward-swosh-text-a {
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 {
572
606
  left: 0.08em;
573
607
  position: absolute;
574
608
  top: 0.16em;
575
609
  }
576
610
 
577
611
  .kward-swosh-text-a {
578
- animation: kward-swosh-a 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
612
+ animation: kward-swosh-a 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
579
613
  }
580
614
 
581
615
  .kward-swosh-text-b {
582
- animation: kward-swosh-b 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
616
+ animation: kward-swosh-b 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
583
617
  position: relative;
584
618
  }
585
619
 
620
+ .kward-swosh-text-e {
621
+ animation: kward-swosh-e 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
622
+ }
623
+
586
624
  @keyframes kward-swosh-a {
587
- 0%, 40% { transform: translateX(0); opacity: 1; filter: none; }
588
- 50% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
589
- 51%, 88% { transform: translateX(140%); opacity: 0; filter: none; }
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; }
590
628
  100% { transform: translateX(0); opacity: 1; filter: none; }
591
629
  }
592
630
 
593
631
  @keyframes kward-swosh-b {
594
- 0%, 40% { transform: translateX(140%); opacity: 0; filter: none; }
595
- 50% { transform: translateX(0); opacity: 1; filter: none; }
596
- 88% { transform: translateX(0); opacity: 1; filter: none; }
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; }
597
643
  100% { transform: translateX(-140%); opacity: 0; filter: blur(3px); }
598
644
  }
599
645
 
600
646
  /*
601
- Second line, mirrored: "Your agent." exits to the right while
602
- "Your LLM engine." enters from the left (left-to-right), in sync with
603
- the first swosh. Both texts keep the accent-bright color of the
604
- original "Your agent." span.
647
+ Second line, mirrored left-to-right. All texts keep the accent-bright
648
+ color of the original "Your agent." span.
605
649
  */
606
- .kward-hero h1 .kward-swosh-text-c {
607
- animation: kward-swosh-c 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
650
+ .kward-hero h1 .kward-swosh-text-c,
651
+ .kward-hero h1 .kward-swosh-text-f {
608
652
  color: var(--kward-accent-bright);
609
653
  left: 0.08em;
610
654
  position: absolute;
611
655
  top: 0.16em;
612
656
  }
613
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
+
614
662
  .kward-hero h1 .kward-swosh-text-d {
615
- animation: kward-swosh-d 12s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
663
+ animation: kward-swosh-d 18s cubic-bezier(0.22, 0.61, 0.36, 1) infinite;
616
664
  color: var(--kward-accent-bright);
617
665
  position: relative;
618
666
  }
619
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
+
620
672
  @keyframes kward-swosh-c {
621
- 0%, 40% { transform: translateX(0); opacity: 1; filter: none; }
622
- 50% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
623
- 51%, 88% { transform: translateX(-140%); opacity: 0; filter: none; }
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; }
624
676
  100% { transform: translateX(0); opacity: 1; filter: none; }
625
677
  }
626
678
 
627
679
  @keyframes kward-swosh-d {
628
- 0%, 40% { transform: translateX(-140%); opacity: 0; filter: none; }
629
- 50% { transform: translateX(0); opacity: 1; filter: none; }
630
- 88% { transform: translateX(0); opacity: 1; filter: none; }
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; }
631
691
  100% { transform: translateX(140%); opacity: 0; filter: blur(3px); }
632
692
  }
633
693
 
@@ -819,6 +879,39 @@ body.kward-docs #footer {
819
879
  margin: 0;
820
880
  }
821
881
 
882
+ .kward-screen-card {
883
+ align-self: center;
884
+ background: linear-gradient(180deg, rgba(31, 38, 27, 0.98), rgba(5, 8, 5, 0.98));
885
+ border: 1px solid rgba(156, 175, 53, 0.42);
886
+ border-radius: 14px;
887
+ box-shadow: 0 24px 70px rgba(0, 0, 0, 0.34);
888
+ box-sizing: border-box;
889
+ max-width: 100%;
890
+ overflow: hidden;
891
+ padding-top: 34px;
892
+ position: relative;
893
+ }
894
+
895
+ .kward-screen-card::before {
896
+ background:
897
+ radial-gradient(circle at 12px 50%, #ff5f57 0 5px, transparent 5.5px),
898
+ radial-gradient(circle at 32px 50%, #febc2e 0 5px, transparent 5.5px),
899
+ radial-gradient(circle at 52px 50%, #28c840 0 5px, transparent 5.5px);
900
+ border-bottom: 1px solid rgba(149, 169, 52, 0.22);
901
+ content: "";
902
+ height: 34px;
903
+ left: 0;
904
+ position: absolute;
905
+ right: 0;
906
+ top: 0;
907
+ }
908
+
909
+ .kward-screen-card img {
910
+ display: block;
911
+ height: auto;
912
+ max-width: 100%;
913
+ }
914
+
822
915
  .kward-capabilities {
823
916
  padding: 28px;
824
917
  }
@@ -1193,7 +1286,7 @@ body.kward-docs .kward-home #footer {
1193
1286
  box-shadow: 0 24px 70px rgba(0, 0, 0, 0.48);
1194
1287
  display: none;
1195
1288
  gap: 16px;
1196
- grid-template-columns: repeat(2, minmax(160px, 220px));
1289
+ grid-template-columns: repeat(3, minmax(160px, 220px));
1197
1290
  left: 50%;
1198
1291
  max-width: calc(100vw - 48px);
1199
1292
  opacity: 0;
@@ -1549,17 +1642,14 @@ body.kward-docs #main.kward-home {
1549
1642
  justify-content: center;
1550
1643
  }
1551
1644
 
1552
- /* The generated YARD TOC is useful for API pages but too noisy on guide pages. */
1553
- .kward-guide-page #toc {
1554
- display: none;
1555
- }
1645
+ /* The generated YARD TOC is shown on all docs pages. Use the `kward-no-toc` marker to suppress it per page. */
1556
1646
 
1557
1647
 
1558
1648
  /* Code blocks own their copy action. */
1559
1649
  body.kward-docs .code-copy-wrapper {
1650
+ display: flow-root;
1560
1651
  margin: 16px 0 24px;
1561
1652
  position: relative;
1562
- width: 100%;
1563
1653
  }
1564
1654
 
1565
1655
  body.kward-docs .code-copy-wrapper pre,
@@ -1571,11 +1661,14 @@ body.kward-docs .code-copy-wrapper pre.code {
1571
1661
  }
1572
1662
 
1573
1663
  body.kward-docs .code-copy-wrapper .copy-code-button {
1664
+ background: #020503;
1665
+ box-shadow: 0 0 0 4px #020503;
1574
1666
  float: none;
1575
1667
  margin: 0;
1576
1668
  position: absolute;
1577
1669
  right: 12px;
1578
1670
  top: 12px;
1671
+ z-index: 2;
1579
1672
  }
1580
1673
 
1581
1674
 
@@ -1986,6 +2079,17 @@ body.kward-docs ul.toplevel a:active {
1986
2079
  color: #000;
1987
2080
  }
1988
2081
 
2082
+ body.kward-docs #content quote,
2083
+ body.kward-docs #filecontents quote {
2084
+ border-left-color: #999;
2085
+ color: #000;
2086
+ }
2087
+
2088
+ body.kward-docs #content quote::before,
2089
+ body.kward-docs #filecontents quote::before {
2090
+ color: #999;
2091
+ }
2092
+
1989
2093
  .kward-page {
1990
2094
  padding: 0;
1991
2095
  max-width: none;
@@ -9,6 +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_screen_1.png', file('images/kward_screen_1.png', true))
12
13
  end
13
14
 
14
15
  def stylesheets_full_list
@@ -16,9 +16,19 @@ module KwardDocsNavigationData
16
16
  "Feature guides",
17
17
  [
18
18
  ["Sessions", "file.session-management.html"],
19
+ ["Tabs", "file.tabs.html"],
19
20
  ["Memory", "file.memory.html"],
20
21
  ["Personas", "file.personas.html"]
21
22
  ]
23
+ ],
24
+ [
25
+ "User Tools",
26
+ [
27
+ ["Project files", "file.files.html"],
28
+ ["Integrated Editor", "file.editor.html"],
29
+ ["Git", "file.git.html"],
30
+ ["Shell", "file.shell.html"]
31
+ ]
22
32
  ]
23
33
  ].freeze
24
34
 
@@ -44,7 +54,8 @@ module KwardDocsNavigationData
44
54
  ["Workspace tools", "file.workspace-tools.html"],
45
55
  ["Web search", "file.web-search.html"],
46
56
  ["Code search", "file.code-search.html"],
47
- ["Context tools", "file.context-tools.html"]
57
+ ["Context tools", "file.context-tools.html"],
58
+ ["Context budgeting", "file.context-budgeting.html"]
48
59
  ]
49
60
  ]
50
61
  ].freeze
@@ -82,17 +82,19 @@
82
82
  <div class="kward-hero-copy">
83
83
  <p class="kward-eyebrow">⌘ Ruby CLI Coding Agent</p>
84
84
  <h1>
85
- <span class="kward-swosh" aria-label="Your terminal.">
85
+ <span class="kward-swosh" aria-label="Your terminal. Your RPC frontend. Your workflow.">
86
86
  <span class="kward-swosh-text kward-swosh-text-a" aria-hidden="true">Your terminal.</span>
87
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>
88
89
  </span>
89
90
  <br>
90
- <span class="kward-swosh" aria-label="Your agent.">
91
+ <span class="kward-swosh" aria-label="Your agent. Your LLM engine. Your harness.">
91
92
  <span class="kward-swosh-text kward-swosh-text-c" aria-hidden="true">Your agent.</span>
92
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>
93
95
  </span>
94
96
  </h1>
95
- <p class="kward-lede">Kward is an extendable Ruby CLI coding agent that helps you understand your project, edit files, run commands, search the web, and automate workflows—right from your terminal.</p>
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>
96
98
  <div class="kward-actions">
97
99
  <a class="kward-primary-button" href="<%= url_for('file.README.html') %>">Get Started ›</a>
98
100
  <a class="kward-secondary-button" href="https://github.com/kaiwood/kward" target="_blank" rel="noopener noreferrer">View on GitHub</a>
@@ -105,12 +107,12 @@
105
107
  </section>
106
108
 
107
109
  <section id="features" class="kward-feature-strip" aria-label="Feature summary">
108
- <article><strong>☏</strong><h2>Chat in your terminal</h2><p>Multi-turn coding conversations.</p></article>
109
- <article><strong>▤</strong><h2>Read, write, edit files</h2><p>With read-before-write guardrails.</p></article>
110
- <article><strong>›_</strong><h2>Run shell commands</h2><p>Execute local commands safely.</p></article>
111
- <article><strong>◎</strong><h2>Search the web</h2><p>Get live answers and inspect repos.</p></article>
112
- <article><strong>✣</strong><h2>Extend with plugins</h2><p>Trusted Ruby plugins for workflows.</p></article>
113
- <article><strong>▰</strong><h2>Sessions &amp; memory</h2><p>Save, resume, clone, compact, export.</p></article>
110
+ <article><strong>⌘</strong><h2>Project-aware agent loop</h2><p>Inspect, reason, patch, verify.</p></article>
111
+ <article><strong>▤</strong><h2>Unix filter mode</h2><p>Pipe diffs, logs, and code through Kward.</p></article>
112
+ <article><strong>▰</strong><h2>Branchable sessions</h2><p>Resume, rewind, fork, compact, export.</p></article>
113
+ <article><strong>›_</strong><h2>Worker pipelines</h2><p>Queue focused agent tasks from the TUI.</p></article>
114
+ <article><strong>◎</strong><h2>Live source intelligence</h2><p>Search the web and read public repos.</p></article>
115
+ <article><strong>✣</strong><h2>Ruby-native extensions</h2><p>Shape Kward with plugins, skills, and prompts.</p></article>
114
116
  </section>
115
117
 
116
118
  <section class="kward-install-card">
@@ -122,36 +124,23 @@
122
124
  <pre><code>kward init</code></pre>
123
125
  <a href="<%= url_for('file.getting-started.html') %>">View full installation docs →</a>
124
126
  </div>
125
- <div class="kward-terminal-card">
126
- <div class="kward-tabs"><span>Quick Start</span><span>Run from Source</span></div>
127
- <pre><code># Start an interactive chat
128
- kward
129
-
130
- # Show available commands and examples
131
- kward help
132
-
133
- # Sign in or save provider credentials
134
- kward login
135
-
136
- # Run one prompt and exit
137
- kward "Explain this project"
138
-
139
- # Use a specific working directory
140
- kward --working-directory ~/code/project "Explain this project"</code></pre>
127
+ <div class="kward-screen-card">
128
+ <img src="<%= url_for('images/kward_screen_1.png') %>" alt="Kward terminal interface screenshot">
141
129
  </div>
142
130
  </section>
143
131
 
144
132
  <section class="kward-capabilities">
145
- <h2>⌘ What Kward can do</h2>
133
+ <h2>⌘ Built for real development loops</h2>
146
134
  <ul>
147
- <li>Keep a multi-turn coding conversation in your terminal.</li>
148
- <li>Read, write, and edit workspace files with read-before-write guardrails.</li>
149
- <li>Run local shell commands from the workspace.</li>
150
- <li>Search the live web and inspect cached public GitHub repositories.</li>
151
- <li>Save, resume, clone, compact, and export sessions.</li>
152
- <li>Use optional memory, personas, prompt templates, and skills.</li>
153
- <li>Extend the Agent with trusted Ruby plugins for custom workflows.</li>
154
- <li>Serve an experimental JSON-RPC backend for UI clients.</li>
135
+ <li>Inspect, patch, verify, repeat against a real workspace.</li>
136
+ <li>Edit files in Kward’s built-in editor with syntax highlighting, search, undo, and familiar keybindings.</li>
137
+ <li>Review diffs, stage files, and commit changes from the integrated Git workflow.</li>
138
+ <li>Pipe diffs, logs, code, and generated text through Kward as a Unix filter.</li>
139
+ <li>Organize long-running work with tabs, sessions, rewind, forks, compaction, and exports.</li>
140
+ <li>Dispatch worker tasks, leave them running, review the results later.</li>
141
+ <li>Ground answers with live web search and public source repositories before guessing.</li>
142
+ <li>Shape Kward with memory, skills, prompts, personas, and trusted Ruby plugins.</li>
143
+ <li>Build custom UIs on top of Kward’s JSON-RPC backend.</li>
155
144
  </ul>
156
145
  </section>
157
146
 
@@ -31,12 +31,18 @@ module KwardDocsNavigation
31
31
  "doc/authentication.md" => "file.authentication.html",
32
32
  "doc/troubleshooting.md" => "file.troubleshooting.html",
33
33
  "doc/session-management.md" => "file.session-management.html",
34
+ "doc/tabs.md" => "file.tabs.html",
35
+ "doc/files.md" => "file.files.html",
36
+ "doc/editor.md" => "file.editor.html",
37
+ "doc/git.md" => "file.git.html",
38
+ "doc/shell.md" => "file.shell.html",
34
39
  "doc/memory.md" => "file.memory.html",
35
40
  "doc/personas.md" => "file.personas.html",
36
41
  "doc/extensibility.md" => "file.extensibility.html",
37
42
  "doc/plugins.md" => "file.plugins.html",
38
43
  "doc/agent-tools.md" => "file.agent-tools.html",
39
44
  "doc/workspace-tools.md" => "file.workspace-tools.html",
45
+ "doc/context-budgeting.md" => "file.context-budgeting.html",
40
46
  "doc/web-search.md" => "file.web-search.html",
41
47
  "doc/code-search.md" => "file.code-search.html",
42
48
  "doc/context-tools.md" => "file.context-tools.html",
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.71.0
4
+ version: 0.73.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kai Wood
@@ -116,6 +116,7 @@ executables:
116
116
  extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
+ - ".github/workflows/ci.yml"
119
120
  - ".github/workflows/pages.yml"
120
121
  - ".yardopts"
121
122
  - CHANGELOG.md
@@ -129,19 +130,26 @@ files:
129
130
  - doc/authentication.md
130
131
  - doc/code-search.md
131
132
  - doc/configuration.md
133
+ - doc/context-budgeting.md
132
134
  - doc/context-tools.md
135
+ - doc/editor.md
133
136
  - doc/extensibility.md
137
+ - doc/files.md
134
138
  - doc/getting-started.md
139
+ - doc/git.md
135
140
  - doc/memory.md
136
141
  - doc/personas.md
137
142
  - doc/plugins.md
138
143
  - doc/releasing.md
139
144
  - doc/rpc.md
140
145
  - doc/session-management.md
146
+ - doc/shell.md
147
+ - doc/tabs.md
141
148
  - doc/troubleshooting.md
142
149
  - doc/usage.md
143
150
  - doc/web-search.md
144
151
  - doc/workspace-tools.md
152
+ - examples/plugins/space_invaders.rb
145
153
  - exe/kward
146
154
  - kward.gemspec
147
155
  - lib/kward.rb
@@ -158,6 +166,7 @@ files:
158
166
  - lib/kward/cli/commands.rb
159
167
  - lib/kward/cli/compaction.rb
160
168
  - lib/kward/cli/doctor.rb
169
+ - lib/kward/cli/git.rb
161
170
  - lib/kward/cli/interactive_turn.rb
162
171
  - lib/kward/cli/memory_commands.rb
163
172
  - lib/kward/cli/openrouter_commands.rb
@@ -170,16 +179,23 @@ files:
170
179
  - lib/kward/cli/slash_commands.rb
171
180
  - lib/kward/cli/stats.rb
172
181
  - lib/kward/cli/sysprompt.rb
182
+ - lib/kward/cli/tabs.rb
173
183
  - lib/kward/cli/tool_summaries.rb
174
184
  - lib/kward/cli_transcript_formatter.rb
175
185
  - lib/kward/clipboard.rb
176
186
  - lib/kward/compaction/file_operation_tracker.rb
177
187
  - lib/kward/compactor.rb
178
188
  - lib/kward/config_files.rb
189
+ - lib/kward/context_budget_meter.rb
179
190
  - lib/kward/conversation.rb
191
+ - lib/kward/editor_mode.rb
192
+ - lib/kward/ekwsh.rb
180
193
  - lib/kward/events.rb
181
194
  - lib/kward/export_path.rb
182
195
  - lib/kward/image_attachments.rb
196
+ - lib/kward/interactive_pty_runner.rb
197
+ - lib/kward/local_command_runner.rb
198
+ - lib/kward/local_pty_command_runner.rb
183
199
  - lib/kward/markdown_transcript.rb
184
200
  - lib/kward/memory/manager.rb
185
201
  - lib/kward/message_access.rb
@@ -197,14 +213,42 @@ files:
197
213
  - lib/kward/pan/server.rb
198
214
  - lib/kward/plugin_registry.rb
199
215
  - lib/kward/private_file.rb
216
+ - lib/kward/project_files.rb
217
+ - lib/kward/prompt_history.rb
200
218
  - lib/kward/prompt_interface.rb
201
219
  - lib/kward/prompt_interface/banner.rb
202
220
  - lib/kward/prompt_interface/composer_controller.rb
203
221
  - lib/kward/prompt_interface/composer_renderer.rb
204
222
  - lib/kward/prompt_interface/composer_state.rb
223
+ - lib/kward/prompt_interface/editor/auto_close_pairs.rb
224
+ - lib/kward/prompt_interface/editor/auto_indent.rb
225
+ - lib/kward/prompt_interface/editor/buffer.rb
226
+ - lib/kward/prompt_interface/editor/controller.rb
227
+ - lib/kward/prompt_interface/editor/endwise.rb
228
+ - lib/kward/prompt_interface/editor/file_marker.rb
229
+ - lib/kward/prompt_interface/editor/indent_navigation.rb
230
+ - lib/kward/prompt_interface/editor/kill_ring.rb
231
+ - lib/kward/prompt_interface/editor/modes/emacs.rb
232
+ - lib/kward/prompt_interface/editor/modes/modern.rb
233
+ - lib/kward/prompt_interface/editor/modes/vibe.rb
234
+ - lib/kward/prompt_interface/editor/modes/vibe_insert_readline.rb
235
+ - lib/kward/prompt_interface/editor/renderer.rb
236
+ - lib/kward/prompt_interface/editor/search.rb
237
+ - lib/kward/prompt_interface/editor/selections.rb
238
+ - lib/kward/prompt_interface/editor/state.rb
239
+ - lib/kward/prompt_interface/editor/status_text.rb
240
+ - lib/kward/prompt_interface/editor/syntax_highlighter.rb
241
+ - lib/kward/prompt_interface/editor/undo_history.rb
242
+ - lib/kward/prompt_interface/editor/vibe_state.rb
243
+ - lib/kward/prompt_interface/file_overlay.rb
244
+ - lib/kward/prompt_interface/git_prompt.rb
245
+ - lib/kward/prompt_interface/interactive/controller.rb
246
+ - lib/kward/prompt_interface/interactive/renderer.rb
247
+ - lib/kward/prompt_interface/interactive/state.rb
205
248
  - lib/kward/prompt_interface/key_handler.rb
206
249
  - lib/kward/prompt_interface/layout.rb
207
250
  - lib/kward/prompt_interface/overlay_renderer.rb
251
+ - lib/kward/prompt_interface/project_browser.rb
208
252
  - lib/kward/prompt_interface/prompt_renderer.rb
209
253
  - lib/kward/prompt_interface/question_prompt.rb
210
254
  - lib/kward/prompt_interface/runtime_state.rb
@@ -221,6 +265,7 @@ files:
221
265
  - lib/kward/rpc/attachment_normalizer.rb
222
266
  - lib/kward/rpc/auth_manager.rb
223
267
  - lib/kward/rpc/config_manager.rb
268
+ - lib/kward/rpc/memory_methods.rb
224
269
  - lib/kward/rpc/prompt_bridge.rb
225
270
  - lib/kward/rpc/redactor.rb
226
271
  - lib/kward/rpc/runtime_payloads.rb
@@ -233,20 +278,29 @@ files:
233
278
  - lib/kward/rpc/tool_metadata.rb
234
279
  - lib/kward/rpc/transcript_normalizer.rb
235
280
  - lib/kward/rpc/transport.rb
281
+ - lib/kward/scratchpad_runner.rb
236
282
  - lib/kward/session_diff.rb
283
+ - lib/kward/session_naming.rb
237
284
  - lib/kward/session_store.rb
238
285
  - lib/kward/session_trash.rb
286
+ - lib/kward/session_tree_nodes.rb
239
287
  - lib/kward/session_tree_renderer.rb
240
288
  - lib/kward/session_tree_tool_display.rb
241
289
  - lib/kward/skills/registry.rb
242
290
  - lib/kward/starter_pack_installer.rb
243
291
  - lib/kward/steering.rb
292
+ - lib/kward/tab_store.rb
244
293
  - lib/kward/telemetry/logger.rb
245
294
  - lib/kward/telemetry/stats.rb
295
+ - lib/kward/terminal_keys.rb
296
+ - lib/kward/terminal_sequences.rb
297
+ - lib/kward/text_boundary.rb
246
298
  - lib/kward/tool_output_compactor.rb
247
299
  - lib/kward/tools/ask_user_question.rb
248
300
  - lib/kward/tools/base.rb
249
301
  - lib/kward/tools/code_search.rb
302
+ - lib/kward/tools/context_budget_stats.rb
303
+ - lib/kward/tools/context_for_task.rb
250
304
  - lib/kward/tools/edit_file.rb
251
305
  - lib/kward/tools/fetch_content.rb
252
306
  - lib/kward/tools/fetch_raw.rb
@@ -265,11 +319,23 @@ files:
265
319
  - lib/kward/tools/write_file.rb
266
320
  - lib/kward/transcript_export.rb
267
321
  - lib/kward/version.rb
322
+ - lib/kward/workers.rb
323
+ - lib/kward/workers/git_guard.rb
324
+ - lib/kward/workers/job.rb
325
+ - lib/kward/workers/live_view.rb
326
+ - lib/kward/workers/manager.rb
327
+ - lib/kward/workers/queue_runner.rb
328
+ - lib/kward/workers/queue_store.rb
329
+ - lib/kward/workers/store.rb
330
+ - lib/kward/workers/tool_policy.rb
331
+ - lib/kward/workers/worker.rb
332
+ - lib/kward/workers/write_lock.rb
268
333
  - lib/kward/workspace.rb
269
334
  - lib/main.rb
270
335
  - templates/default/fulldoc/html/css/kward.css
271
336
  - templates/default/fulldoc/html/full_list.erb
272
337
  - templates/default/fulldoc/html/images/kward_logo.png
338
+ - templates/default/fulldoc/html/images/kward_screen_1.png
273
339
  - templates/default/fulldoc/html/js/kward.js
274
340
  - templates/default/fulldoc/html/setup.rb
275
341
  - templates/default/kward_navigation.rb