Repository navigation
Consolidate binaries into gunbc-dag package - #4
Merged
Merged
Conversation
…kage gunbc-ci, gunbc-makegen, and gunbc-bootstrap are [[bin]] entries in the gunbc-dag package, not standalone workspace packages. The code generators were producing `cargo run -p gunbc-ci` which fails with "package not found". Fixed to produce `cargo run -p gunbc-dag --bin gunbc-ci`. Changes: - Add package_name field to ToolInfo for binaries in other packages - Add tool_package field to RenderConfig for CI YAML generation - Update render_tool_target/render_dry_run_target to use cargo_run_args() - Regenerate ci.yml, .gitlab-ci.yml, and Makefile with correct commands https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
…invocation ToolInfo and RenderConfig independently duplicated the logic for resolving `cargo run -p <package> --bin <binary>` vs `cargo run -p <binary>`. This created a maintenance burden where both had to be updated in sync. CargoInvocation (core/ir/src/cargo.rs) is now the canonical type that both Makefile rendering and CI YAML rendering consume. ToolInfo.invocation and RenderConfig.tool both hold a CargoInvocation, eliminating the duplication. - ToolInfo: replaced crate_name + package_name with invocation field - ToolInfo::in_package(): new constructor for binaries in other packages - RenderConfig: replaced tool_binary + tool_package with tool field - SharedStep: replaced tool_binary with tool (CargoInvocation) - CI providers: use tool.command() instead of bare binary name https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
Replace hardcoded "gunbc-*" binary/package name strings with composition
helpers throughout the codebase. All binary names now follow the
{PREFIX}-{component} pattern via cargo::name(), CargoInvocation::standalone(),
and CargoInvocation::composed().
Key changes:
- Add cargo::PREFIX constant and cargo::name() composition function
- Add CargoInvocation::standalone(component) and ::composed(bin, pkg) constructors
- Add ToolInfo::standalone(component) and ::composed(component, pkg) constructors
- Change BuildConfig command vecs from Vec<&'static str> to Vec<String>
to support dynamically composed binary names
- Update all tool registrations, CI generation, and renderers to use
composition instead of hardcoded full names
- Where &'static str is required (Renderable trait), use named constants
with tests verifying they match the composed names
https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
…run mocks
Node outputs were printed in a flat summary after all CI groups closed,
making collapsible sections empty. Move output printing into execute_flat
so each node's outputs appear inside its group. Also fix dry-run by
providing properly-typed TransportResponse mocks instead of the default
Value::Str("<DRY-RUN>") which downstream parse nodes cannot interpret.
https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
Replace hardcoded "cargo run -p ..." strings with CargoInvocation.command() throughout the rendering pipeline: render.rs tool/dry-run targets, BuildConfig command vectors, mock data in ops.rs/graph_mock.rs, CI graph workflow config, and codegen template comments. Add command_parts() and run_with_args() to CargoInvocation for Vec<String> contexts. https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
Wire build_stderr, test_stderr, and lint_stderr from parse nodes into the report node. When a stage fails, its stderr is appended below the summary so developers can see what went wrong directly in the report group. Also fix print_log_entry to print multi-line values in full instead of truncating at 120 chars, and fix a clippy needless-borrow lint in ci_workflow_config. https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
Move generator_name and regenerate_command into RenderConfig so that
CI YAML file headers ("Generated by …" / "DO NOT EDIT — regenerate
with: …") are determined programmatically from the rendering context
rather than duplicated as string literals in each template function.
https://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9
briansrls
pushed a commit
that referenced
this pull request
Feb 3, 2026
…fragility TODO_hacks.md: - Hack #5: cardinality Empty tests use concrete empty values (false/0/"") not actual absence. BoundaryMocks has no way to represent "absent." Blocks meaningful B.3 boundary testing for scalar types. - Hack #4 amendment: Value::List filter_map silently drops non-string elements (separate from catch-all issue). - Hack #3 note: runtime check() already handles lists correctly; codegen to_check_code() just needs to mirror it. - Notes: typed matchers as finite logic language; Hack #5 priority. consolidation.md: - §5: type_id == "List" dual encoding across 4+ locations. Canonical model is element type + cardinality. Migration strategy documented. - §6: Codebase fragility — builder functions as strings (rename-unsafe), buck-out/gen in 16 locations (no single constant), CODEGEN_SOURCES hardcoded directory list (staleness gap). - Tasks updated for all new items. https://claude.ai/code/session_01FcPT2VEZdE1W7QdL7SjJgC
briansrls
pushed a commit
that referenced
this pull request
Feb 13, 2026
Addresses feedback from 2026-02-12 PR review across 6 key areas: 1. Fix probe→observer recursion (#1): Intermediate observers are now promoted to probes unconditionally (not gated on Exact matchers). Tests are seeded from baseline DryRun, so concrete values aren't needed. This enables compositional segment testing A→B + B→C. 2. Fix extract_observers() seen/merge bug (#2): NodeExamples with only input-dependent matchers (Exact/Contains) no longer suppress valid chain-safe matchers from live_expected_outputs for the same node. Switched to merge-by-node approach using BTreeMap union. 3. Make gaps fail CI (#3): Coverage gaps now generate a failing test_observability_invariant_no_gaps test instead of just a header comment. Aligns behavior with the stated invariant. 4. Make lowering failures loud (#4): DAG lowering errors now generate a failing test_probe_observer_lowering_failed test instead of silently returning None and skipping all chain tests. 5. Seed policy fail-closed (#5/#8): Inverted seed_policy_for_type to whitelist known-safe primitive types (String, Bool, Int, etc.) and default unknown types to ExplicitSeedRequired. New types and aliases no longer silently fall into placeholder generation. 6. Additional hardening: - Add input_mocks as a probe source (#6) for DAGs seeded via entry input ports - Track weak observers (Any/IsRequest/IsResponse) in coverage reports (#5) so teams can identify low-value assertions - Promoted probes now appear in analysis results - ParamType::from(&str) panics on unknown types instead of silently defaulting to Str (#9) - Int parsing returns ParseError::InvalidInt instead of unwrap_or(0) https://claude.ai/code/session_014cTfu4arnDzFZCELaR26P4
briansrls
added a commit
that referenced
this pull request
Mar 1, 2026
Hack #1 - PipeMethod stringly-typed spread: Add PipeMethod::as_str() and Display impl as single source of truth. Delete three duplicate pipe_method_name() functions from lib.rs, expr.rs, fn_codegen.rs. All callsites now use method.as_str(). Hack #2 - Silent fallbacks in resource_defs.rs: Replace silent return-fallback with .expect() on compile_from_context, data_values.get, and serde_json::from_value. Delete ResourceDslData::fallback() and three FALLBACK_* constants. DSL syntax errors now fail the build immediately. Same treatment applied to gitignore.rs: silent fallback → expect(). Hack #3 - #[path] crate boundary (documented): core/resolve uses #[path] to compile resolve_service.rs from gunbc-dag. Physical move requires extracting gunbc-dag dependencies from the module first (use super::* reverse dependency). Documented as Lane A task. Hack #4 - compile-on-demand spread (documented): 7 files use compile_from_context at runtime. Now all fail-closed (no silent fallbacks). The include_str!/StdLibHost migration is a Lane A Phase A3 task. Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
briansrls
added a commit
that referenced
this pull request
Mar 1, 2026
#2 (pragma_lint silent fallback): Delete default_pragma_lint_policy() and hardcoded fallback. Policy file must exist — panic with actionable message. #3 (param_source_ string heuristic): Add NodeKind::ParamSource variant. Lowerer tags param_source nodes. Executor checks node.kind instead of node_id.starts_with("param_source_"). #4 (Value::Skipped coercion): map/join over Skipped produce empty list/string (temporary — required until C10-full wires all return expressions). Tagged as RT-N workaround. LowerError::InvalidFileOp from previous commit now fail-closed. Note: pragma-lint-policy.txt needs regeneration (gunbc-pragma blocked by C10). Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
briansrls
added a commit
that referenced
this pull request
Mar 1, 2026
Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
briansrls
pushed a commit
that referenced
this pull request
Mar 1, 2026
…ord, service move, clippy - Fix #4: Add Value::Json field access support in eval.rs - Fix #5: Scope validate_no_operation_overlap to freshness-vs-tool intersection only - Fix #6: Nuanced passthrough enforcement — fail-closed when at least one passthrough was wired (partial lowerer gap), fall back to Skipped when zero passthroughs were wired (C10 gap) - Fix #7: Physically move resolve_service.rs from gunbc-dag to core/resolve/src/service_ops/service_ops_impl.rs (removes #[path] hack) - Fix #8: Change RateLimitConfig from sustained_per_minute to (requests, window_seconds) for lossless precision - Hermetic keyword: downgrade from fatal parse error to silently accepted no-op - Clippy: fix needless borrow and redundant closure in daglang-lower - Fix shell.dag codegen invocation (--mode=ensure → codegen) - Update pragma lint allowlists for moved service_ops file https://claude.ai/code/session_014KdJPWApYizp7SDWHGEsmo
briansrls
added a commit
that referenced
this pull request
Mar 13, 2026
…nt Map Addresses review invariant #3 (No fallbacks that fabricate). extract_projection previously fabricated a Value::Map from the output when the expected field wasn't found. Now returns Result<Value, String> so callers handle the error explicitly. PopResult gains an Error variant; run_machine propagates it. Also confirms all 5 review findings against the code: 1. Three parallel stmt evaluators (eval_body, eval_block_as_body, eval_pure_block_stmts) — No parallel implementations violation 2. ANF verifier permits Calls in Blocks — Boundary contract loophole 3. Projection fabrication — Fixed in this commit 4. Duplicate PC (heap vs native stack) — Architecture issue 5. O(N) Rc clone — Performance issue The correct fix for #1, #2, #4 is slice-based continuations (stack bubbling), documented in DESIGN-eval-redesign.md as the next step. Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
briansrls
added a commit
that referenced
this pull request
Mar 23, 2026
…map feedback (#193) * Remove aspirational tests that describe target state not yet implemented Delete 4 failing tests and their 5 now-dead helper functions: - phase6_fold_lambda_uses_reconciled_accumulator_type (R3: fold type refinement) - phase6_anonymous_record_literal_fails_closed_without_named_type (R2) - phase6_anonymous_record_literal_does_not_rank_shape_candidates (R2) - phase6_go_runtime_bridge_methods_keep_method_style_receivers (P1.10) These tests were written to describe Phase 1 target behavior. They will be re-added when the corresponding roadmap items (R2, R3, P1.10) land. Co-authored-by: briansrls <briansrls@gmail.com> * Fix lingering v2.compiler.pipeline references to v2.compiler.compile M1 naming cleanup renamed 06_pipeline.dag to compile.dag (module v2.compiler.compile), but emit_main_rs, emit_main_mod_uses, and emit_compile_match_arm still referenced the old module name. Co-authored-by: briansrls <briansrls@gmail.com> * Align L1 ratchet script categories with ROADMAP.md Break the connective count into '.connective direct access' and 'Conj/Disj references' (previously double-counted). Add classify_type_structure as a separate tracked category. Fix set -euo pipefail + grep exit code interaction via || true. Script and roadmap table now measure the same 7 categories. Ratchet set to 374 (current actual total). Co-authored-by: briansrls <briansrls@gmail.com> * Clarify milestone status labels: tree-green vs prior-branch vs structural Feedback #2: readers could not tell which milestones are verified on the current tree versus achieved on an earlier green branch. Added a status column and a note explaining that prior-branch milestones re-verify once stage0 self-compile is green. Updated P3.1 and M1 accordingly. Co-authored-by: briansrls <briansrls@gmail.com> * Add InferredNode migration boundary subsection (P1.9) Feedback #3: the representation change was conceptually clear but the mechanical migration plan was implicit. Added a table listing every type, API, and layer that changes when P1.9 lands, plus the ordering constraint that it must be an atomic commit. Co-authored-by: briansrls <briansrls@gmail.com> * Split normalization scope: Phase 1 (hardcoded arity) vs Phase 3 (declarations) Feedback #4: the roadmap described normalization as populating structural properties from .dag declarations, but P1.14 defers declaration-driven population to Phase 3. Made the two scopes explicit so readers see that Phase 1 normalization uses the hardcoded arity bridge, and Phase 3 normalization replaces it with generic slot substitution. Co-authored-by: briansrls <briansrls@gmail.com> * Narrow Phase 1 fabrication gate to Rust bootstrap-critical path Feedback #5: 'no emit fabrication sites' in the Phase 1 checklist was overstated — the document defers Go interface{}, Python _unimplemented(), and Go unhandled-expr to Phase 4. Narrowed the Phase 1 state and exit criteria to specify 'no silent/fail-open fabrication on the bootstrap- critical Rust emit path' and explicitly list the Phase 4 deferrals. Co-authored-by: briansrls <briansrls@gmail.com> * Sharpen v1 retirement gate and scrambled-name test definition Feedback #6: - Phase 3 gate now includes a concrete feature-off proof (build + test without v1-bootstrap) rather than just saying 'can be removed.' - Scrambled-name test explicitly defined as comparing inferred structure (typed graph shapes), not emitted artifacts. Emit is excluded because it legitimately reads names for target-language identifiers. Co-authored-by: briansrls <briansrls@gmail.com> * Add LanguageSpec checklist, DAG artifact schema, and TypeVar name-opacity note Feedback #7: Phase 4 contracts were named but not specified. Added: - P4.1 Contract: compact checklist of what belongs in LanguageSpec, grouped by purpose, with completeness test and existing values. - P4.4 Contract: DAG artifact schema (version + modules + diagnostics), versioning mechanism, and note that it reuses the existing Value serialization format. - TypeVar name-opacity explanation in generics design: slot names are structural placeholders consumed by normalization pre-inference, not type identities that inference branches on. Co-authored-by: briansrls <briansrls@gmail.com> * R2: Anonymous record tuple index emits compile_error!() for index >= 4 Stopgap: the hardcoded 0-3 index mapping now emits compile_error!() instead of silently falling back to "0" for higher indices and for field-not-found. The real fix (proper field access for any arity) remains a backlog item. Co-authored-by: briansrls <briansrls@gmail.com> * R4: map_insert reads key type from actual argument instead of hardcoding String The ExprCall bridge path for map_insert on a bare Map receiver now reads the key type from the first argument (remaining |> first) rather than fabricating leaf_node(name: "String"). The leaf_node fallback remains only for the unreachable None branch (count >= 2 guard). Co-authored-by: briansrls <briansrls@gmail.com> * R3: Extract shared refine_collection_result_type for map/flat_map/fold Both ExprCall (bridge path) and ExprMethodCall computed map/flat_map/fold result types through independent inline blocks (~20 lines each). Extracted into a single refine_collection_result_type helper that both paths call. The ExprCall path still owns map_insert/map_merge refinement (those are Call-bridge-specific, not duplicated in MethodCall). Co-authored-by: briansrls <briansrls@gmail.com> * P1.10: Delete dead runtime_bridge_method_name from core The function had zero callers — each emitter owns its own per-target bridge method name rendering (rust_bridge_fn_name, go_bridge_method_name, py_bridge_method_name). These per-target maps are legitimate rendering decisions (Go=PascalCase, Python=with_update for BridgeWith) and remain as-is. The 4-parallel-map problem is now 3 per-target maps with no dead shared intermediary. Co-authored-by: briansrls <briansrls@gmail.com> * P1.19: Delete duplicate mock extraction; import has_mock_prefix from shared emit Deleted starts_with_prefix (duplicated has_mock_prefix from 05_emit.dag). extract_mock_props now uses the imported has_mock_prefix. The Rust-only copy of mock prefix detection is eliminated. Co-authored-by: briansrls <briansrls@gmail.com> * P1.20: Replace testgen fabrication sites with compile_error!() - emit_simple_expr wildcard: todo!() -> compile_error!() - emit_data_value_json wildcard: "null" -> {"__error__": ...} - Default::default() dry-run fallbacks -> compile_error!() All three silent fabrication sites now fail loudly instead of producing valid-looking but wrong test/mock code. Co-authored-by: briansrls <briansrls@gmail.com> * P1.21: Add testgen verification gate + fix emit_typed_data_value_json fabrication New test v2_testgen_emits_valid_rust verifies: - emit_simple_expr uses compile_error!() not todo!() - dry-run fallbacks use compile_error!() not Default::default() - mock extraction uses shared has_mock_prefix, not Rust-only duplicate - shared emit defines TestProjection and extract_test_projections - emit_data_value_json does not silently fabricate "null" Also fixes emit_typed_data_value_json wildcard (second copy of the same fabrication pattern, line 438 in 05_emit.dag). Co-authored-by: briansrls <briansrls@gmail.com> * R1: Delete 30-line RC3 emit safety net for Optional field access field_summary_for_type in inference already correctly produces OptionalUnwrap for .value on Optional bases. The emit-side compensation (checking return_type and base_summary for Optional) was dead code — no test exercises a path where StoredField is produced for .value on an Optional base. All 116 tests pass. Co-authored-by: briansrls <briansrls@gmail.com> * Tighten L1 ratchet 374 -> 372 after R1 emit safety net deletion Co-authored-by: briansrls <briansrls@gmail.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
briansrls
added a commit
that referenced
this pull request
Mar 27, 2026
Review fixes: - Fix variable shadowing: let_value/let_body renamed to val_expr/body_expr in 04_infer.dag ExprLet handling (reviewer comment #1) - Delete 4 unused accessor functions: call_arg_nodes, record_field_nodes, list_elements, string_interp_parts (reviewer comment #2) - Comments #3 (collection kind match) and #4 (variant connective) were already fixed in earlier commits Documentation: - Updated Phase 5 Exit Criteria with full breakdown of remaining 147: - 8 type-name comparisons: 5 access (blocked on inline test std loading), 1 is_kernel_type, 1 string element, 1 Tuple - 139 type constructors: factory functions (bridge debt) - Documented the specific blocker: inline tests don't load std modules, so types resolve as bare kernel seed leaves, not algebra compositions. The algebra infrastructure exists (FreeMonoid.index, OrderedRing, structural method lookup B4) but can't be verified end-to-end in inline tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
briansrls
added a commit
that referenced
this pull request
Apr 1, 2026
…zy_static Addresses review violation #4 (per-call rebuild overhead): - Replace registry_for_target() value return with &'static references to lazy_static singletons (RUST_REGISTRY, PYTHON_REGISTRY, etc.) - Registries built once at first access, O(1) thereafter Also addresses violation #5 (tautological test): - Delete coercion_parity_with_legacy_type_maps test — target_primitive_type now delegates to coerce_primitive_type, making it a self-comparison Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
4 tasks done
briansrls
added a commit
that referenced
this pull request
Apr 2, 2026
Reviewer correctly flagged three items as overclaimed: - #1 child_inferred_or_empty: DONE→PARTIAL (None-path still leaks) - #2 authored_name_at: DONE→PARTIAL (wrapper migration, not structural) - #4 transport kind: DONE→PARTIAL (config keys centralized, kind still name-based) Updated bootstrap health dashboard to reflect current reality: - Bootstrap B: 41 Rc::new(HashMap) scaffolding (not true fixes) - Bootstrap C: 548 typed errors from Callable regression, 3 perf fixes shipped (tokenizer O(n^2), dag_syntax cache, shape binop) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3 tasks
briansrls
added a commit
that referenced
this pull request
Apr 7, 2026
External functions (not in func_index) are outside the proof boundary.
Their cost is opaque, not zero. CostExtern { name } represents this
honestly — "I can't measure this" is distinct from "this costs 0."
- Add CostExtern variant to CostExpr
- get_or_compute_summary returns CostExtern for unknown functions
- Formatting: O(extern(func_name)), composes as extern(f) in expressions
- simplify_cost, normalize_constants, format_cost_class all handle it
- Slot for future declared costs (like C++ std O(n log n) for sort)
Addresses review comment #4: "fabricates a concrete O(1) bound for
potentially non-trivial calls."
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5 tasks done
briansrls
added a commit
that referenced
this pull request
Apr 9, 2026
…MAP (review feedback) #2 ExprLet scope: annotate_descent gave the value initializer access to its own binding (inner_ctx applied to all children). Fixed: value sees outer ctx, only body sees inner_ctx. Ratchet 528→485 (43 false descent evidence entries eliminated). Regression test added. #3 ROADMAP sync: KF-8 marked DEFERRED, heap-space marked TODO, binary search stack corrected to O(1) via TCO (not O(log n)). #4 Rename: time_bound → recurrence_bound. This is a structural recurrence bound (work_exponent=0), not full runtime. Full time = recurrence * per_step_cost. #5 TCO guarantee: documented that stack O(1) for tail-recursive functions assumes the target language guarantees tail-call elimination. 365 tests pass, clippy clean, stage0 fixed point verified (485 diagnostics). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This was referenced Apr 11, 2026
briansrls
added a commit
that referenced
this pull request
Apr 14, 2026
Full inventory: ~280 coproducts categorized: - 11 already dissolved (design complete) - 8 dissolve when v3 lands (no action needed) - 8 need design decisions (v3-relevant) - ~70 domain modeling (external facts, leave as-is) - ~40 std/ modeling (audit individually) - ~30 compiler infrastructure (v3 replaces entirely) TokenShape atomic cases pressure-tested per reviewer feedback: - Unknown → fact placement (#1), not a token. Error state in success type. Moves to tokenization diagnostic table. - Newline/Eof → dimensional (#4): Marker { kind: StatementEnd | FileEnd }. Shared role as boundary markers. - Each remaining atom gets one-sentence structural justification - Stopping rule made explicit: stop when no cross-variant query would be cleaner as a field read - 35 → ~9 (down from ~12 after pressure-testing atomics) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5 tasks
This was referenced May 21, 2026
This was referenced Jun 1, 2026
Merged
This was referenced Jun 8, 2026
This was referenced Jun 25, 2026
This was referenced Jul 5, 2026
3 of 4 tasks
5 tasks done
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Consolidates
gunbc-ci,gunbc-makegen, andgunbc-bootstrapbinaries into thegunbc-dagpackage as separate binary targets, rather than maintaining them as separate crates. This simplifies the workspace structure while maintaining the same functionality.Key Changes
gunbc-ci,gunbc-makegen, andgunbc-bootstrapbinaries intogunbc-dagas[[bin]]targets-p gunbc-dag --bin <binary-name>format instead of-p <binary-name>ToolInfo::with_package()andcargo_run_args()methods to support binaries in different packagesdag-viztarget (no longer needed)-fixtargets for auto-fixing (fmt-fix, lint-fix, test-fix, check-fix, clippy-fix)tool_packagefield andcargo_run_command()method to support CI template generation with the new package structureImplementation Details
ToolInfostruct now tracks an optionalpackage_namefield, allowing tools to specify when their binary lives in a different packageRenderConfigstruct similarly gainedtool_packagesupport for CI workflow generationhttps://claude.ai/code/session_01D4iQXU8qA3HX4JYoYaFHt9