1bcoder 0.1.5__tar.gz → 0.1.6__tar.gz

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 (91) hide show
  1. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/PKG-INFO +26 -1
  2. {1bcoder-0.1.5 → 1bcoder-0.1.6}/PKG-INFO +26 -1
  3. {1bcoder-0.1.5 → 1bcoder-0.1.6}/README.md +25 -0
  4. {1bcoder-0.1.5 → 1bcoder-0.1.6}/chat.py +114 -1
  5. {1bcoder-0.1.5 → 1bcoder-0.1.6}/pyproject.toml +1 -1
  6. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/SOURCES.txt +0 -0
  7. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/dependency_links.txt +0 -0
  8. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/entry_points.txt +0 -0
  9. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/requires.txt +0 -0
  10. {1bcoder-0.1.5 → 1bcoder-0.1.6}/1bcoder.egg-info/top_level.txt +0 -0
  11. {1bcoder-0.1.5 → 1bcoder-0.1.6}/LICENSE +0 -0
  12. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/__init__.py +0 -0
  13. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/advance.txt +0 -0
  14. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/ask.txt +0 -0
  15. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/compact.txt +0 -0
  16. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/concepts.txt +0 -0
  17. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/fill.txt +0 -0
  18. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/planning.txt +0 -0
  19. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/scan.txt +0 -0
  20. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/agents/sqlite.txt +0 -0
  21. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/aliases.txt +0 -0
  22. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/doc/MCP.md +0 -0
  23. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/doc/OLLAMA_SERVER_PARAM.md +0 -0
  24. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/doc/PARAM.md +0 -0
  25. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/doc/PROC.md +0 -0
  26. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/map.txt +0 -0
  27. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/action-required.py +0 -0
  28. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/add-save.py +0 -0
  29. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/assist.py +0 -0
  30. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/collect-files.py +0 -0
  31. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/ctx_cut.py +0 -0
  32. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/extract-code.py +0 -0
  33. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/extract-files.py +0 -0
  34. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/extract-list.py +0 -0
  35. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/grounding-check.py +0 -0
  36. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/md.py +0 -0
  37. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/mdx.py +0 -0
  38. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/pattern-gate.py +0 -0
  39. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/regexp-extract.py +0 -0
  40. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/rude_words.py +0 -0
  41. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/scan-save.py +0 -0
  42. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/secret_check.py +0 -0
  43. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/sql_readonly_guard.py +0 -0
  44. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/proc/tempctx-cut.py +0 -0
  45. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/profiles.txt +0 -0
  46. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/prompts/analysis.txt +0 -0
  47. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/prompts/sumarise.txt +0 -0
  48. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/prompts.txt +0 -0
  49. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/AddFunction.txt +0 -0
  50. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/AskProject.txt +0 -0
  51. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/CheckRequirements.txt +0 -0
  52. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/DockerMySQL.txt +0 -0
  53. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/DockerNginx.txt +0 -0
  54. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/DockerPython.txt +0 -0
  55. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/DockerStack.txt +0 -0
  56. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/DuckDuckGoInstant.txt +0 -0
  57. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/EnvTemplate.txt +0 -0
  58. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/Explain.txt +0 -0
  59. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/ExploreProjectStructure.txt +0 -0
  60. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/GitIgnorePython.txt +0 -0
  61. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/MySQLDump.txt +0 -0
  62. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/NewScript.txt +0 -0
  63. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/PipFreeze.txt +0 -0
  64. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/PyPI.txt +0 -0
  65. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/Refactor.txt +0 -0
  66. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/RunAndFix.txt +0 -0
  67. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/SQLiteSchema.txt +0 -0
  68. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/WikiPage.txt +0 -0
  69. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/WikiSearch.txt +0 -0
  70. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/auto-bkup.txt +0 -0
  71. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/edit-control.txt +0 -0
  72. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/parallel_call.txt +0 -0
  73. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/personal/content/create-regular-content.txt +0 -0
  74. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/personal/content/plan.txt +0 -0
  75. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/personal/test/collect-data-from-test-environment.txt +0 -0
  76. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/plan.txt +0 -0
  77. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/remote/create-content-on-remote-server.txt +0 -0
  78. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/set_ctx.txt +0 -0
  79. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/simargl-cli_index_files.txt +0 -0
  80. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/simargl-cli_index_units.txt +0 -0
  81. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/simargl-cli_search.txt +0 -0
  82. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/team-map-worker.txt +0 -0
  83. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/team-search-worker.txt +0 -0
  84. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/team-summarize.txt +0 -0
  85. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/team-tree-worker.txt +0 -0
  86. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/scripts/test.txt +0 -0
  87. {1bcoder-0.1.5 → 1bcoder-0.1.6}/_bcoder_data/teams/code-analysis.yaml +0 -0
  88. {1bcoder-0.1.5 → 1bcoder-0.1.6}/map_index.py +0 -0
  89. {1bcoder-0.1.5 → 1bcoder-0.1.6}/map_query.py +0 -0
  90. {1bcoder-0.1.5 → 1bcoder-0.1.6}/setup.cfg +0 -0
  91. {1bcoder-0.1.5 → 1bcoder-0.1.6}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 1bcoder
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: AI coding assistant agent for 1B–7B local models (Ollama, LMStudio, llama.cpp). Terminal REPL with file editing, project map, agents, scripts, and parallel multi-model queries.
5
5
  Project-URL: Homepage, https://github.com/szholobetsky/1bcoder
6
6
  Project-URL: Repository, https://github.com/szholobetsky/1bcoder
@@ -303,6 +303,31 @@ Examples:
303
303
 
304
304
  ## Command Reference
305
305
 
306
+ ### Multi-line input
307
+
308
+ `/text` opens a full multi-line editor inside the terminal and sends the composed text to the AI as a regular message.
309
+
310
+ | Key / Command | Action |
311
+ |---|---|
312
+ | Enter | New line |
313
+ | Ctrl+D | Submit without saving |
314
+ | `/end` on its own line + Enter | Submit without saving |
315
+ | `/save` on its own line + Enter | Save to `.1bcoder/task.txt` and submit |
316
+ | `/save filename.txt` on its own line + Enter | Save to custom file and submit |
317
+ | Ctrl+C | Cancel without sending |
318
+
319
+ Requires `prompt_toolkit` for full editing (arrow keys, Home/End, scroll). Falls back to plain line-by-line input if not installed.
320
+
321
+ ```
322
+ > /text
323
+ ··· Describe the bug in detail here.
324
+ ··· Paste stack traces, requirements, anything long.
325
+ ··· /save
326
+ [text] saved → .1bcoder/task.txt
327
+ ```
328
+
329
+ ---
330
+
306
331
  ### File operations
307
332
 
308
333
  | Command | Description |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 1bcoder
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: AI coding assistant agent for 1B–7B local models (Ollama, LMStudio, llama.cpp). Terminal REPL with file editing, project map, agents, scripts, and parallel multi-model queries.
5
5
  Project-URL: Homepage, https://github.com/szholobetsky/1bcoder
6
6
  Project-URL: Repository, https://github.com/szholobetsky/1bcoder
@@ -303,6 +303,31 @@ Examples:
303
303
 
304
304
  ## Command Reference
305
305
 
306
+ ### Multi-line input
307
+
308
+ `/text` opens a full multi-line editor inside the terminal and sends the composed text to the AI as a regular message.
309
+
310
+ | Key / Command | Action |
311
+ |---|---|
312
+ | Enter | New line |
313
+ | Ctrl+D | Submit without saving |
314
+ | `/end` on its own line + Enter | Submit without saving |
315
+ | `/save` on its own line + Enter | Save to `.1bcoder/task.txt` and submit |
316
+ | `/save filename.txt` on its own line + Enter | Save to custom file and submit |
317
+ | Ctrl+C | Cancel without sending |
318
+
319
+ Requires `prompt_toolkit` for full editing (arrow keys, Home/End, scroll). Falls back to plain line-by-line input if not installed.
320
+
321
+ ```
322
+ > /text
323
+ ··· Describe the bug in detail here.
324
+ ··· Paste stack traces, requirements, anything long.
325
+ ··· /save
326
+ [text] saved → .1bcoder/task.txt
327
+ ```
328
+
329
+ ---
330
+
306
331
  ### File operations
307
332
 
308
333
  | Command | Description |
@@ -288,6 +288,31 @@ Examples:
288
288
 
289
289
  ## Command Reference
290
290
 
291
+ ### Multi-line input
292
+
293
+ `/text` opens a full multi-line editor inside the terminal and sends the composed text to the AI as a regular message.
294
+
295
+ | Key / Command | Action |
296
+ |---|---|
297
+ | Enter | New line |
298
+ | Ctrl+D | Submit without saving |
299
+ | `/end` on its own line + Enter | Submit without saving |
300
+ | `/save` on its own line + Enter | Save to `.1bcoder/task.txt` and submit |
301
+ | `/save filename.txt` on its own line + Enter | Save to custom file and submit |
302
+ | Ctrl+C | Cancel without sending |
303
+
304
+ Requires `prompt_toolkit` for full editing (arrow keys, Home/End, scroll). Falls back to plain line-by-line input if not installed.
305
+
306
+ ```
307
+ > /text
308
+ ··· Describe the bug in detail here.
309
+ ··· Paste stack traces, requirements, anything long.
310
+ ··· /save
311
+ [text] saved → .1bcoder/task.txt
312
+ ```
313
+
314
+ ---
315
+
291
316
  ### File operations
292
317
 
293
318
  | Command | Description |
@@ -42,6 +42,85 @@ def _info(msg: str): print(f"{_CYAN}{msg}{_R}")
42
42
  def _warn(msg: str): print(f"{_YELL}{msg}{_R}")
43
43
 
44
44
 
45
+ def _multiline_input() -> str:
46
+ """Open a multi-line text editor in the terminal.
47
+
48
+ Uses prompt_toolkit if available (Alt+Enter / Esc→Enter to submit).
49
+ Falls back to a line-by-line collector terminated by '/end' on its own line.
50
+ Returns the composed text, or empty string on Ctrl+C / cancel.
51
+ """
52
+ try:
53
+ from prompt_toolkit import prompt as _pt_prompt
54
+ from prompt_toolkit.key_binding import KeyBindings as _KB
55
+
56
+ kb = _KB()
57
+ _QUICKSAVE_FILE = os.path.join('.1bcoder', 'task.txt')
58
+
59
+ @kb.add('c-d')
60
+ def _submit(event):
61
+ event.current_buffer.validate_and_handle()
62
+
63
+ @kb.add('enter')
64
+ def _enter_or_end(event):
65
+ buf = event.current_buffer
66
+ current_line = buf.document.current_line.strip()
67
+ if current_line in ('/end', '/save') or current_line.startswith('/save '):
68
+ buf.validate_and_handle()
69
+ else:
70
+ buf.newline()
71
+
72
+ print(f"[multiline — Enter = new line · Ctrl+D or /end to submit · /save to save to .1bcoder/task.txt · /save filename.txt for custom name · Ctrl+C to cancel]")
73
+ try:
74
+ text = _pt_prompt('··· ', multiline=True, key_bindings=kb)
75
+ except KeyboardInterrupt:
76
+ print()
77
+ return ""
78
+
79
+ # strip trailing empty lines, check for /end or /save command
80
+ lines = text.split('\n')
81
+ while lines and lines[-1].strip() == '':
82
+ lines.pop()
83
+
84
+ save_filename = None
85
+ if lines:
86
+ last = lines[-1].strip()
87
+ if last == '/end':
88
+ lines.pop()
89
+ elif last == '/save':
90
+ save_filename = ''
91
+ lines.pop()
92
+ elif last.startswith('/save '):
93
+ save_filename = last[6:].strip()
94
+ lines.pop()
95
+
96
+ text = '\n'.join(lines)
97
+
98
+ if save_filename == '' and text.strip():
99
+ os.makedirs('.1bcoder', exist_ok=True)
100
+ with open(_QUICKSAVE_FILE, 'w', encoding='utf-8') as _f:
101
+ _f.write(text)
102
+ print(f" [text] saved → {_QUICKSAVE_FILE}")
103
+ elif save_filename and text.strip():
104
+ with open(save_filename, 'w', encoding='utf-8') as _f:
105
+ _f.write(text)
106
+ print(f" [text] saved → {save_filename}")
107
+ return text
108
+
109
+ except ImportError:
110
+ print("[multiline — type /end on its own line to submit · Ctrl+C to cancel]")
111
+ lines = []
112
+ while True:
113
+ try:
114
+ line = input("··· ")
115
+ except (EOFError, KeyboardInterrupt):
116
+ print()
117
+ return ""
118
+ if line.strip() == "/end":
119
+ break
120
+ lines.append(line)
121
+ return "\n".join(lines)
122
+
123
+
45
124
  def _fts_rank(terms: list, file_contents: dict, top_k: int = 10) -> list:
46
125
  """Rank files by BM25 using in-memory FTS5.
47
126
 
@@ -326,6 +405,18 @@ Commands
326
405
  /readln models.py 40-60
327
406
  /readln {{find_files}}
328
407
 
408
+ /text
409
+ Open a multi-line text editor and send the composed text to the AI.
410
+ Enter = new line. To submit, use one of:
411
+ Ctrl+D — submit without saving
412
+ /end — submit without saving (type on its own line, then Enter)
413
+ /save — save to .1bcoder/task.txt and submit
414
+ /save <filename> — save to custom file and submit
415
+ Ctrl+C cancels without sending.
416
+ If prompt_toolkit is installed: full editing with arrow keys, Home/End, scroll.
417
+ Fallback (no prompt_toolkit): same commands work line by line.
418
+ Useful for pasting multi-paragraph task descriptions, code snippets, or long instructions.
419
+
329
420
  /edit <file> <line>
330
421
  Manually replace a line. Type new content when prompted.
331
422
  e.g. /edit main.py 15
@@ -1855,7 +1946,7 @@ _KNOWN_CMDS = [
1855
1946
  "/find", "/map", "/ctx", "/think", "/format", "/param", "/model",
1856
1947
  "/host", "/help", "/init", "/clear", "/exit",
1857
1948
  "/prompt", "/proc", "/team", "/var", "/config", "/alias",
1858
- "/doc", "/tempctx", "/proj",
1949
+ "/doc", "/tempctx", "/proj", "/text", "/role", "/ask",
1859
1950
  ]
1860
1951
 
1861
1952
  # file_idx : position of the file-path argument (None = no file arg)
@@ -2547,6 +2638,8 @@ class CoderCLI:
2547
2638
  self._cmd_team(user_input)
2548
2639
  elif user_input.startswith("/var"):
2549
2640
  self._cmd_var(user_input)
2641
+ elif user_input.startswith("/text"):
2642
+ self._cmd_note()
2550
2643
  elif user_input.startswith("/role"):
2551
2644
  self._cmd_role(user_input)
2552
2645
  elif user_input.startswith("/config"):
@@ -4913,6 +5006,26 @@ advanced_tools =
4913
5006
  else:
4914
5007
  print("usage: /proc list | run <name> | on <name> | off | new <name>")
4915
5008
 
5009
+ # ── /text ───────────────────────────────────────────────────────────────────
5010
+
5011
+ def _cmd_note(self):
5012
+ """Open multi-line editor, then send the composed text to the AI."""
5013
+ text = _multiline_input()
5014
+ if not text.strip():
5015
+ print("[note] empty — nothing sent")
5016
+ return
5017
+ self.messages.append({"role": "user", "content": text})
5018
+ self._sep("AI")
5019
+ reply = self._stream_chat(self.messages)
5020
+ if reply:
5021
+ self.last_reply = reply
5022
+ self._last_output = reply
5023
+ self.messages.append({"role": "assistant", "content": reply})
5024
+ for _proc in self._proc_active:
5025
+ self._run_proc(_proc, auto=True)
5026
+ elif self.messages:
5027
+ self.messages.pop()
5028
+
4916
5029
  # ── /var ────────────────────────────────────────────────────────────────────
4917
5030
 
4918
5031
  def _cmd_role(self, user_input: str):
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "1bcoder"
7
- version = "0.1.5"
7
+ version = "0.1.6"
8
8
  description = "AI coding assistant agent for 1B–7B local models (Ollama, LMStudio, llama.cpp). Terminal REPL with file editing, project map, agents, scripts, and parallel multi-model queries."
9
9
  requires-python = ">=3.10"
10
10
  readme = {file = "README.md", content-type = "text/markdown"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes