jac-coder 0.2.3__tar.gz → 0.2.4__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.
- {jac_coder-0.2.3 → jac_coder-0.2.4}/PKG-INFO +1 -1
- {jac_coder-0.2.3 → jac_coder-0.2.4}/README.md +3 -3
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/api.impl.jac +52 -35
- jac_coder-0.2.4/jac_coder/cli.impl.jac +696 -0
- jac_coder-0.2.4/jac_coder/cli.jac +180 -0
- jac_coder-0.2.4/jac_coder/cli_entry.py +27 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/core/nodes.jac +44 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/core/walkers.impl.jac +18 -42
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/config.impl.jac +7 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/config.jac +4 -0
- jac_coder-0.2.4/jac_coder/infra/events.jac +268 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/lib/coder.impl.jac +302 -30
- jac_coder-0.2.4/jac_coder/runtime/compaction.jac +301 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-cl-components/SKILL.md +12 -11
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-cl-organization/SKILL.md +1 -1
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-core-cheatsheet/SKILL.md +25 -2
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-sv-persistence/SKILL.md +1 -1
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-types/SKILL.md +27 -1
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/filesystem.impl.jac +34 -10
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/jac_tools.impl.jac +38 -19
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/PKG-INFO +1 -1
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/SOURCES.txt +4 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/pyproject.toml +1 -1
- jac_coder-0.2.3/jac_coder/cli_entry.py +0 -25
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/__init__.py +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/api.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/core/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/core/nodes.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/core/walkers.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/kv.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/mcp_manager.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/infra/mcp_manager.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/lib/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/lib/coder.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/context.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/context.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/cost_tracker.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/cost_tracker.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/events.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/file_logger.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/memory.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/memory.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/permission.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/permission.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/prompt.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/prompt.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/skills.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/runtime/skills.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/serve_entry.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/server.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/ROADMAP.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-by-llm/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-cl-auth/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-cl-routing/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-cl-styling/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-fullstack-patterns/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-has-fields/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-impl-files/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-node-edge-patterns/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-npm-packages/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-scaffold/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-shadcn-components/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-sv-auth/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-sv-endpoints/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/skills/jac-walker-patterns/SKILL.md +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/git.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/git.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/mcp.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/mcp.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/delegation.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/delegation.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/question.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/question.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/task.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/task.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/think.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/think.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/todo.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/todo.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/validate.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/meta/validate.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/net/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/net/preview.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/net/preview.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/net/web.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/net/web.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/filesystem.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/jac_analyzer.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/jac_analyzer.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/load_jac_skill.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/load_jac_skill.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/search.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/read/search.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/guarded.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/guarded.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/jac_tools.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/shell.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/run/shell.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/write/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/write/checked.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/tool/write/checked.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/__init__.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/colors.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/sandbox.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/sandbox.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/tool_output.impl.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder/util/tool_output.jac +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/dependency_links.txt +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/entry_points.txt +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/requires.txt +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/jac_coder.egg-info/top_level.txt +0 -0
- {jac_coder-0.2.3 → jac_coder-0.2.4}/setup.cfg +0 -0
|
@@ -40,13 +40,13 @@ Dependencies (auto-installed): `jaclang`, `byllm`, `mcp>=1.0.0`, `jac-mcp`, `pyt
|
|
|
40
40
|
export OPENAI_API_KEY="sk-..."
|
|
41
41
|
|
|
42
42
|
# Interactive REPL
|
|
43
|
-
jac
|
|
43
|
+
jac-coder
|
|
44
44
|
|
|
45
45
|
# Single prompt (non-interactive)
|
|
46
|
-
jac
|
|
46
|
+
jac-coder run "build a hello world jac app at /tmp/myapp"
|
|
47
47
|
|
|
48
48
|
# Resume a session
|
|
49
|
-
jac
|
|
49
|
+
jac-coder session <id-prefix>
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
## Architecture
|
|
@@ -257,15 +257,24 @@ impl chat(
|
|
|
257
257
|
# role=system dicts to session.chat_history without them persisting stale.
|
|
258
258
|
prefix_parts: list[str] = [];
|
|
259
259
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
260
|
+
# Tell the LLM the actual working directory — without this, relative
|
|
261
|
+
# paths are unresolvable and the model guesses (e.g. "/home/user").
|
|
262
|
+
if work_dir {
|
|
263
|
+
prefix_parts.append(
|
|
264
|
+
f"Working directory: {work_dir}\n"
|
|
265
|
+
"Default to this directory: resolve relative paths and deictic "
|
|
266
|
+
"references (e.g. 'here', 'this folder', '.', './sub') against it. "
|
|
267
|
+
"Use absolute paths for anything outside it."
|
|
266
268
|
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if session.project_summary {
|
|
267
272
|
prefix_parts.append(
|
|
268
|
-
|
|
273
|
+
"[INTERNAL — background context from .jaccoder/progress.md. "
|
|
274
|
+
"Do NOT acknowledge, summarize, or volunteer this to the user "
|
|
275
|
+
"unless they explicitly ask about the project. Use it only to "
|
|
276
|
+
"inform your decisions on real work prompts.]\n"
|
|
277
|
+
f"Project progress (.jaccoder/progress.md):\n{session.project_summary}"
|
|
269
278
|
);
|
|
270
279
|
}
|
|
271
280
|
if session.active_files {
|
|
@@ -373,13 +382,18 @@ impl chat(
|
|
|
373
382
|
} else {
|
|
374
383
|
session.pending_errors = [];
|
|
375
384
|
}
|
|
376
|
-
if
|
|
377
|
-
|
|
378
|
-
if
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
385
|
+
if session.directory {
|
|
386
|
+
_progress_path = os.path.join(session.directory, ".jaccoder", "progress.md");
|
|
387
|
+
if os.path.isfile(_progress_path) {
|
|
388
|
+
try {
|
|
389
|
+
with open(_progress_path, "r", encoding="utf-8") as _pf {
|
|
390
|
+
_pc = _pf.read();
|
|
391
|
+
}
|
|
392
|
+
if len(_pc) > 4000 {
|
|
393
|
+
_pc = _pc[:4000] + "\n\n[... truncated]";
|
|
394
|
+
}
|
|
395
|
+
session.project_summary = _pc;
|
|
396
|
+
} except Exception { }
|
|
383
397
|
}
|
|
384
398
|
}
|
|
385
399
|
|
|
@@ -443,21 +457,19 @@ def _ensure_memory(session: Session, work_dir: str) -> None {
|
|
|
443
457
|
if not work_dir or session.project_summary {
|
|
444
458
|
return;
|
|
445
459
|
}
|
|
446
|
-
|
|
447
|
-
if not
|
|
460
|
+
progress_path = os.path.join(work_dir, ".jaccoder", "progress.md");
|
|
461
|
+
if not os.path.isfile(progress_path) {
|
|
448
462
|
return;
|
|
449
463
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
session.project_summary = summary;
|
|
460
|
-
}
|
|
464
|
+
try {
|
|
465
|
+
with open(progress_path, "r", encoding="utf-8") as f {
|
|
466
|
+
content = f.read();
|
|
467
|
+
}
|
|
468
|
+
if len(content) > 4000 {
|
|
469
|
+
content = content[:4000] + "\n\n[... truncated]";
|
|
470
|
+
}
|
|
471
|
+
session.project_summary = content;
|
|
472
|
+
} except Exception { }
|
|
461
473
|
}
|
|
462
474
|
|
|
463
475
|
|
|
@@ -484,14 +496,19 @@ def _post_process(session: Session, response_obj: Any) -> None {
|
|
|
484
496
|
session.pending_errors = [];
|
|
485
497
|
}
|
|
486
498
|
|
|
487
|
-
#
|
|
488
|
-
if
|
|
489
|
-
|
|
490
|
-
if
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
499
|
+
# Refresh project_summary from progress.md (agent may have updated it).
|
|
500
|
+
if session.directory {
|
|
501
|
+
progress_path = os.path.join(session.directory, ".jaccoder", "progress.md");
|
|
502
|
+
if os.path.isfile(progress_path) {
|
|
503
|
+
try {
|
|
504
|
+
with open(progress_path, "r", encoding="utf-8") as f {
|
|
505
|
+
pc = f.read();
|
|
506
|
+
}
|
|
507
|
+
if len(pc) > 4000 {
|
|
508
|
+
pc = pc[:4000] + "\n\n[... truncated]";
|
|
509
|
+
}
|
|
510
|
+
session.project_summary = pc;
|
|
511
|
+
} except Exception { }
|
|
495
512
|
}
|
|
496
513
|
}
|
|
497
514
|
|