Skip to content

Document Netsukefile macro support#1

Merged
leynos merged 5 commits intomainfrom
codex/extend-design-to-support-jinja-macros
Jul 12, 2025
Merged

Document Netsukefile macro support#1
leynos merged 5 commits intomainfrom
codex/extend-design-to-support-jinja-macros

Conversation

@leynos
Copy link
Copy Markdown
Owner

@leynos leynos commented Jul 12, 2025

Summary

  • describe new macros top-level list in the design document
  • explain how to declare user macros
  • update roadmap to include macro support

Testing

  • nixie docs/netsuke-design.md docs/roadmap.md
  • markdownlint README.md AGENTS.md docs/netsuke-design.md docs/roadmap.md (fails: MD013, MD040, MD033)
  • cargo fmt --all
  • cargo clippy --all-targets --all-features -- -D warnings (fails: lint_groups_priority, print-stdout)
  • cargo test --all-targets --all-features

https://chatgpt.com/codex/tasks/task_e_6872391fbd108322a1e3271365ce8e39

Summary by Sourcery

Document the new macros feature in the Netsukefile schema and update the project roadmap accordingly

Documentation:

  • Add a macros top-level list in the design doc for declaring user-defined Jinja macros in the manifest
  • Introduce a dedicated section detailing how to write and register user macros with a YAML example
  • Renumber subsequent design doc sections to account for the new macros section
  • Update the roadmap to include support for user-defined macros and adjust the success criteria

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Jul 12, 2025

Reviewer's Guide

Expand documentation to fully describe new Jinja macros support in the Netsukefile manifest and update the project roadmap accordingly, including spec additions, a dedicated design section with examples, section renumbering, and roadmap entries for macro support.

Entity relationship diagram for Netsukefile macros integration

erDiagram
    NETSUKEFILE {
        string netsuke_version
        map vars
        list macros
        list rules
        list targets
    }
    MACRO {
        string signature
        string body
    }
    TARGET {
        string name
        list deps
        list order_only_deps
        map vars
        list macros
    }
    NETSUKEFILE ||--o{ MACRO : contains
    NETSUKEFILE ||--o{ TARGET : contains
    TARGET ||--o{ MACRO : contains
Loading

Class diagram for Netsukefile manifest structure with macro support

classDiagram
    class Netsukefile {
        +string netsuke_version
        +map vars
        +list macros
        +list rules
        +list targets
    }
    class Macro {
        +string signature
        +string body
    }
    Netsukefile "1" --o "*" Macro : macros
    class Target {
        +string name
        +list deps
        +list order_only_deps
        +map vars
        +list macros
    }
    Netsukefile "1" --o "*" Target : targets
    Target "1" --o "*" Macro : macros
Loading

File-Level Changes

Change Details Files
Add macros declarations to manifest spec
  • Introduce optional top-level macros list with signature and body fields
  • Add optional macros property to target definitions
docs/netsuke-design.md
Add 'User-Defined Macros' section
  • Insert new section explaining manifest-based Jinja macros using YAML `
` block syntax
  • Provide an example macro definition snippet
  • Renumber subsequent design document sections
    • Change Essential Custom Functions to section 4.4
    • Change Essential Custom Filters to section 4.5
    • Change Jinja as the 'Logic Layer' to section 4.6
    docs/netsuke-design.md
    Update roadmap with macro support
    • Add checklist item for user-defined Jinja macros
    • Include macros in the success criteria alongside variables, logic, and glob
    docs/roadmap.md

    Tips and commands

    Interacting with Sourcery

    • Trigger a new review: Comment @sourcery-ai review on the pull request.
    • Continue discussions: Reply directly to Sourcery's review comments.
    • Generate a GitHub issue from a review comment: Ask Sourcery to create an
      issue from a review comment by replying to it. You can also reply to a
      review comment with @sourcery-ai issue to create an issue from it.
    • Generate a pull request title: Write @sourcery-ai anywhere in the pull
      request title to generate a title at any time. You can also comment
      @sourcery-ai title on the pull request to (re-)generate the title at any time.
    • Generate a pull request summary: Write @sourcery-ai summary anywhere in
      the pull request body to generate a PR summary at any time exactly where you
      want it. You can also comment @sourcery-ai summary on the pull request to
      (re-)generate the summary at any time.
    • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
      request to (re-)generate the reviewer's guide at any time.
    • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
      pull request to resolve all Sourcery comments. Useful if you've already
      addressed all the comments and don't want to see them anymore.
    • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
      request to dismiss all existing Sourcery reviews. Especially useful if you
      want to start fresh with a new review - don't forget to comment
      @sourcery-ai review to trigger a new review!

    Customizing Your Experience

    Access your dashboard to:

    • Enable or disable review features such as the Sourcery-generated pull request
      summary, the reviewer's guide, and others.
    • Change the review language.
    • Add, remove or edit custom review instructions.
    • Adjust other review settings.

    Getting Help

    @coderabbitai
    Copy link
    Copy Markdown
    Contributor

    coderabbitai Bot commented Jul 12, 2025

    Summary by CodeRabbit

    • Documentation
      • Expanded and reorganised design documentation for improved clarity and completeness, with detailed coverage of user-defined macros, templating integration, error handling, and CLI design.
      • Updated the roadmap to reference user-defined macros and improved readability.
    • Style
      • Minor formatting improvements, including added newline at end of main program file.

    Summary by CodeRabbit

    • Documentation
      • Expanded and reorganised design documentation for improved clarity and completeness, with detailed explanations of user-defined Jinja macros, templating integration, error handling, and CLI design.
      • Updated the roadmap to reflect support for user-defined macros and clarified success criteria for dynamic features.
      • Improved formatting consistency and added technology and future enhancements summaries.

    Walkthrough

    Update the documentation to introduce support for user-defined Jinja macros in the Netsuke manifest schema. Add a new section detailing macros, adjust section numbering, and revise the roadmap to include macros as a feature and success criterion. No code or logic changes are present.

    Changes

    File(s) Change Summary
    docs/netsuke-design.md Add documentation for user-defined Jinja macros, introduce new section, update schema and examples, expand templating and error handling details.
    docs/roadmap.md Add macros support to the roadmap and success criteria for Phase 2.
    src/main.rs Add newline at end of file; no functional changes.

    Poem

    In Netsuke’s scroll, new macros unfold,
    With Jinja’s magic, templates grow bold.
    A roadmap now marks this clever new feat,
    Where functions and filters with macros all meet.
    YAML blocks sing, reuse takes the stage—
    Hail to the scribe, and onward we page!
    🧙‍♂️✨

    ✨ Finishing Touches
    🧪 Generate unit tests
    • Create PR with unit tests
    • Post copyable unit tests in a comment
    • Commit unit tests in branch codex/extend-design-to-support-jinja-macros

    🪧 Tips

    Chat

    There are 3 ways to chat with CodeRabbit:

    • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
      • I pushed a fix in commit <commit_id>, please review it.
      • Explain this complex logic.
      • Open a follow-up GitHub issue for this discussion.
    • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
      • @coderabbitai explain this code block.
      • @coderabbitai modularize this function.
    • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
      • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
      • @coderabbitai read src/utils.ts and explain its main purpose.
      • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
      • @coderabbitai help me debug CodeRabbit configuration file.

    Support

    Need help? Create a ticket on our support page for assistance with any issues or questions.

    Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

    CodeRabbit Commands (Invoked using PR comments)

    • @coderabbitai pause to pause the reviews on a PR.
    • @coderabbitai resume to resume the paused reviews.
    • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
    • @coderabbitai full review to do a full review from scratch and review all the files again.
    • @coderabbitai summary to regenerate the summary of the PR.
    • @coderabbitai generate docstrings to generate docstrings for this PR.
    • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
    • @coderabbitai auto-generate unit tests to generate unit tests for this PR.
    • @coderabbitai resolve resolve all the CodeRabbit review comments.
    • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
    • @coderabbitai help to get help.

    Other keywords and placeholders

    • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
    • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
    • Add @coderabbitai anywhere in the PR title to generate the title automatically.

    CodeRabbit Configuration File (.coderabbit.yaml)

    • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
    • Please see the configuration documentation for more information.
    • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

    Documentation and Community

    • Visit our Documentation for detailed information on how to use CodeRabbit.
    • Join our Discord Community to get help, request features, and share feedback.
    • Follow us on X/Twitter for updates and announcements.

    Copy link
    Copy Markdown
    Contributor

    @sourcery-ai sourcery-ai Bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Hey @leynos - I've reviewed your changes - here's some feedback:

    • Update the manifest vs. Makefile comparison table (Table 2.5) to include the new macros key so it’s reflected consistently throughout the design doc.
    • Add a short example showing how to invoke a user-defined macro in a rule or target to illustrate real-world usage beyond just declaration.
    • Clarify in the macro section how Netsuke handles conflicts or overrides when a user macro name collides with built-in functions or filters.
    Prompt for AI Agents
    Please address the comments from this code review:
    ## Overall Comments
    - Update the manifest vs. Makefile comparison table (Table 2.5) to include the new `macros` key so it’s reflected consistently throughout the design doc.
    - Add a short example showing how to invoke a user-defined macro in a rule or target to illustrate real-world usage beyond just declaration.
    - Clarify in the macro section how Netsuke handles conflicts or overrides when a user macro name collides with built-in functions or filters.

    Sourcery is free for open source - if you like our reviews please consider sharing them ✨
    Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

    Copy link
    Copy Markdown
    Contributor

    @coderabbitai coderabbitai Bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Actionable comments posted: 3

    📜 Review details

    Configuration used: CodeRabbit UI
    Review profile: ASSERTIVE
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between e831db8 and e67d43d.

    📒 Files selected for processing (1)
    • docs/netsuke-design.md (5 hunks)
    🧰 Additional context used
    📓 Path-based instructions (1)
    **/*.md

    Instructions used from:

    Sources:
    ⚙️ CodeRabbit Configuration File

    🪛 LanguageTool
    docs/netsuke-design.md

    [uncategorized] ~57-~57: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
    Context: ...serializes the content into a set of strongly-typed Rust data structures. This collection o...

    (HYPHENATED_LY_ADVERB_ADJECTIVE)


    [uncategorized] ~63-~63: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
    Context: ... is traversed to construct a canonical, fully-resolved Intermediate Representation (IR) of ...

    (HYPHENATED_LY_ADVERB_ADJECTIVE)


    [uncategorized] ~135-~135: Loose punctuation mark.
    Context: ...ned top-level keys. - netsuke_version: A mandatory string that specifies the v...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~140-~140: Loose punctuation mark.
    Context: ...ted using the semver crate.4 - vars: A mapping of global key-value string pa...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~144-~144: Loose punctuation mark.
    Context: ...he Jinja templating context. - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~149-~149: Loose punctuation mark.
    Context: ...ore rendering other sections. - rules: A list of rule definitions. Each rule i...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~152-~152: Loose punctuation mark.
    Context: ...s to a Ninja rule block.2 - targets: The primary list of build targets. Each...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~156-~156: Loose punctuation mark.
    Context: ... Ninja build statement.3 - defaults: An optional list of target names to be ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~164-~164: Loose punctuation mark.
    Context: ...at defines a command template. - name: A unique string identifier for the rule...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~166-~166: Loose punctuation mark.
    Context: ...ng identifier for the rule. - command: The command string to be executed. This...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~170-~170: Loose punctuation mark.
    Context: ...and$outvariables. -description`: An optional, user-friendly string that ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~174-~174: Loose punctuation mark.
    Context: ...ility into the build process.2 - deps: An optional field to configure support ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~184-~184: Loose punctuation mark.
    Context: ... edge in the dependency graph. - name: The primary output file or files for th...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~187-~187: Loose punctuation mark.
    Context: ...e string or a list of strings. - rule: The name of the rule (from the rules ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~190-~190: Loose punctuation mark.
    Context: ...for building this target. - sources: The input files required by the command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~193-~193: Loose punctuation mark.
    Context: ... string or a list of strings. - deps: An optional list of other target names....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~198-~198: Loose punctuation mark.
    Context: ...e current target. - order_only_deps: An optional list of other target names ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~203-~203: Loose punctuation mark.
    Context: ...ied with the || operator.7 - vars: An optional mapping of local variables....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~208-~208: Loose punctuation mark.
    Context: ...'s build-local variables.3 - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~250-~250: Loose punctuation mark.
    Context: ...Rust ecosystem.10 By using serde_yaml, we can leverage serde's powerful deri...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~420-~420: Loose punctuation mark.
    Context: ... manifest files at runtime. minijinja, with its dynamic environment and runtim...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~450-~450: Possible missing comma found.
    Context: ...se are provided in a top-level macros list where each entry defines a signature ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~451-~451: Possible missing comma found.
    Context: ...ing. The body must use YAML's | block syntax so multi-line macro definitions remain ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~474-~474: Possible missing comma found.
    Context: ...nja's behaviour and follows minijinja semantics where later definitions shadow earlier ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~484-~484: Loose punctuation mark.
    Context: ...ar_name: &str) -> Result<String, Error>`: A function that reads an environment ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~488-~488: Loose punctuation mark.
    Context: ...rn: &str) -> Result<Vec, Error>`: A function that performs file path gl...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~494-~494: Loose punctuation mark.
    Context: ...quirement: &str) -> Result<bool, Error>`: An example of a domain-specific helpe...

    (UNLIKELY_OPENING_PUNCTUATION)


    [grammar] ~498-~498: Please add a punctuation mark at the end of paragraph.
    Context: ...::Command19, parse the output using the semver` crate 4, and compare it aga...

    (PUNCTUATION_PARAGRAPH_END)


    [uncategorized] ~503-~503: Loose punctuation mark.
    Context: ...requirement string (e.g., ">=3.8"). This allows for conditional logic in t...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~511-~511: Loose punctuation mark.
    Context: ...ta within templates. - | shell_escape: A filter that takes a string and escape...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~517-~517: Loose punctuation mark.
    Context: ... shell-aware quoting.22 - | to_path: A filter that converts a string into a ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~520-~520: Loose punctuation mark.
    Context: ... \ separators correctly. - | parent: A filter that takes a path string and r...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~527-~527: Consider using the typographical ellipsis character here instead.
    Context: ...owerful but often opaque functions like $(shell...) and $(wildcard...). Netsuke achieve...

    (ELLIPSIS)


    [style] ~528-~528: Consider using the typographical ellipsis character here instead.
    Context: ...opaque functions like $(shell...) and $(wildcard...). Netsuke achieves and surpasses this ...

    (ELLIPSIS)


    [uncategorized] ~552-~552: The hyphen in fully-resolved is redundant.
    Context: ...al component that serves as the static, fully-resolved, and validated representation of the en...

    (ADVERB_LY_HYPHEN_FIX)


    [uncategorized] ~830-~830: Loose punctuation mark.
    Context: ...ications and libraries.27 - thiserror: This crate will be used within Netsuk...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~864-~864: Loose punctuation mark.
    Context: ... String, }, } ``` - anyhow: This crate will be used in the main app...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~881-~881: Consider using the typographical ellipsis character here instead.
    Context: ...nction where the error occurred returns Err(IrGenError::RuleNotFound {... }.into()). The .into() call converts...

    (ELLIPSIS)


    [style] ~981-~981: Consider using the typographical ellipsis character here instead.
    Context: ...e is provided, allowing for the common* Netsuke [targets...] invocation. ### 8.3 Command Behavi...

    (ELLIPSIS)


    [uncategorized] ~988-~988: Loose punctuation mark.
    Context: ...defined: - Netsuke build [targets...]: This is the primary and default command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~995-~995: Loose punctuation mark.
    Context: ...on of the manifest. - Netsuke clean: This command provides a convenient way ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~999-~999: Loose punctuation mark.
    Context: ...s of the build rules. - Netsuke graph: This command is an introspection and de...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~1037-~1037: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
    Context: ...ile generator (ninja_gen.rs). 1. Implement the std::process::Command logic to in...

    (ENGLISH_WORD_REPEAT_BEGINNING_RULE)


    [style] ~1059-~1059: Consider using the typographical ellipsis character here instead.
    Context: ... 1. Implement basic Jinja control flow ({% if... %}, {% for... %}) and variabl...

    (ELLIPSIS)


    [style] ~1059-~1059: Consider using the typographical ellipsis character here instead.
    Context: ...asic Jinja control flow ({% if... %}, {% for... %}) and variable substitution. ...

    (ELLIPSIS)


    [typographical] ~1134-~1134: To join two clauses or introduce examples, consider using an em dash.
    Context: ...nja-build.org/> 1. Ninja (build system) - Wikipedia, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1137-~1137: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Complete Guide To The Ninja Build System - Spectra - Mathpix, accessed on July 1...

    (DASH_RULE)


    [typographical] ~1137-~1137: To join two clauses or introduce examples, consider using an em dash.
    Context: ...uide To The Ninja Build System - Spectra - Mathpix, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1141-~1141: To join two clauses or introduce examples, consider using an em dash.
    Context: ...de-to-the-ninja-build-system> 1. semver - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1145-~1145: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Cargo's flavor of Semantic Versioning - GitHub, accessed on July 12, 2025, <h...

    (DASH_RULE)


    [typographical] ~1148-~1148: To join two clauses or introduce examples, consider using an em dash.
    Context: ...://github.com/dtolnay/semver> 1. semver - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1148-~1148: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ub.com/dtolnay/semver> 1. semver - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1151-~1151: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mver/latest/semver/> 1. How Ninja works - Fuchsia, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1157-~1157: To join two clauses or introduce examples, consider using an em dash.
    Context: ...al.html> 1. Interest in new deps format - Google Groups, accessed on July 12, 2025...

    (DASH_RULE)


    [typographical] ~1162-~1162: To join two clauses or introduce examples, consider using an em dash.
    Context: ...https://serde.rs/ 1. Saphyr libraries - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1165-~1165: To join two clauses or introduce examples, consider using an em dash.
    Context: ...s.io/crates/saphyr> 1. Saphyr libraries - A set of crates dedicated to parsing YAM...

    (DASH_RULE)


    [typographical] ~1165-~1165: Consider using an em dash in dialogues and enumerations.
    Context: ...et of crates dedicated to parsing YAML. - GitHub, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1168-~1168: To join two clauses or introduce examples, consider using an em dash.
    Context: ...b.com/saphyr-rs/saphyr> 1. saphyr-serde - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1171-~1171: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1171-~1171: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1174-~1174: To join two clauses or introduce examples, consider using an em dash.
    Context: ... https://docs.rs/saphyr 1. minijinja - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1177-~1177: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/minijinja> 1. minijinja - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1177-~1177: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/minijinja> 1. minijinja - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1180-~1180: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ttps://docs.rs/minijinja/> 1. minijinja - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1186-~1186: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mplate-engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1186-~1186: To join two clauses or introduce examples, consider using an em dash.
    Context: ...engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1192-~1192: Consider using an em dash in dialogues and enumerations.
    Context: ...sion/> 1. How to check python version? - 4Geeks, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1195-~1195: To join two clauses or introduce examples, consider using an em dash.
    Context: ...to-check-python-version> 1. shell_quote - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1195-~1195: To join two clauses or introduce examples, consider using an em dash.
    Context: ...k-python-version> 1. shell_quote - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1198-~1198: To join two clauses or introduce examples, consider using an em dash.
    Context: ...te/latest/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1198-~1198: To join two clauses or introduce examples, consider using an em dash.
    Context: ...st/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1201-~1201: To join two clauses or introduce examples, consider using an em dash.
    Context: ...std/process/index.html> 1. std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1204-~1204: To join two clauses or introduce examples, consider using an em dash.
    Context: .../index.html> 1. Command in std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1207-~1207: To join two clauses or introduce examples, consider using an em dash.
    Context: ...d/process/struct.Command.html> 1. shlex - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1207-~1207: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ss/struct.Command.html> 1. shlex - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1215-~1215: To join two clauses or introduce examples, consider using an em dash.
    Context: ...es, Examples, and Advanced Techniques - Technorely, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1218-~1218: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ractical guide to Error Handling in Rust - Dev State, accessed on July 12, 2025,...

    (DASH_RULE)


    [typographical] ~1221-~1221: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rror_handling/> 1. thiserror and anyhow - Comprehensive Rust, accessed on July 12,...

    (DASH_RULE)


    [typographical] ~1224-~1224: To join two clauses or introduce examples, consider using an em dash.
    Context: ...r precondition/argument checking in Rust - Stack Overflow, accessed on July 12, ...

    (DASH_RULE)


    [typographical] ~1228-~1228: To join two clauses or introduce examples, consider using an em dash.
    Context: ...checking-in-rust> Nicer error reporting - Command Line Applications in Rust, acces...

    (DASH_RULE)

    🔇 Additional comments (1)
    docs/netsuke-design.md (1)

    5-80: Wrap prose to 80 columns.

    Multiple paragraphs and list items exceed the 80-column hard wrap required for Markdown files. Re-wrap affected lines while preserving code blocks and long URLs (where MD013 may be silenced).

    Also applies to: 236-245, 443-456, 740-796

    Comment thread docs/netsuke-design.md
    Comment thread docs/netsuke-design.md Outdated
    Comment thread docs/netsuke-design.md Outdated
    Copy link
    Copy Markdown
    Contributor

    @coderabbitai coderabbitai Bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Actionable comments posted: 3

    📜 Review details

    Configuration used: CodeRabbit UI
    Review profile: ASSERTIVE
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between e67d43d and 9d1d498.

    📒 Files selected for processing (3)
    • docs/netsuke-design.md (5 hunks)
    • docs/roadmap.md (1 hunks)
    • src/main.rs (1 hunks)
    🧰 Additional context used
    📓 Path-based instructions (2)
    **/*.rs

    Instructions used from:

    Sources:
    ⚙️ CodeRabbit Configuration File

    **/*.md

    Instructions used from:

    Sources:
    ⚙️ CodeRabbit Configuration File

    🪛 LanguageTool
    docs/netsuke-design.md

    [uncategorized] ~57-~57: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
    Context: ...serializes the content into a set of strongly-typed Rust data structures. This collection o...

    (HYPHENATED_LY_ADVERB_ADJECTIVE)


    [uncategorized] ~135-~135: Loose punctuation mark.
    Context: ...ned top-level keys. - netsuke_version: A mandatory string that specifies the v...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~140-~140: Loose punctuation mark.
    Context: ...ted using the semver crate.4 - vars: A mapping of global key-value string pa...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~144-~144: Loose punctuation mark.
    Context: ...he Jinja templating context. - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~149-~149: Loose punctuation mark.
    Context: ...ore rendering other sections. - rules: A list of rule definitions. Each rule i...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~152-~152: Loose punctuation mark.
    Context: ...s to a Ninja rule block.2 - targets: The primary list of build targets. Each...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~156-~156: Loose punctuation mark.
    Context: ... Ninja build statement.3 - defaults: An optional list of target names to be ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~164-~164: Loose punctuation mark.
    Context: ...at defines a command template. - name: A unique string identifier for the rule...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~166-~166: Loose punctuation mark.
    Context: ...ng identifier for the rule. - command: The command string to be executed. This...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~170-~170: Loose punctuation mark.
    Context: ...and$outvariables. -description`: An optional, user-friendly string that ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~174-~174: Loose punctuation mark.
    Context: ...ility into the build process.2 - deps: An optional field to configure support ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~184-~184: Loose punctuation mark.
    Context: ... edge in the dependency graph. - name: The primary output file or files for th...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~187-~187: Loose punctuation mark.
    Context: ...e string or a list of strings. - rule: The name of the rule (from the rules ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~190-~190: Loose punctuation mark.
    Context: ...for building this target. - sources: The input files required by the command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~193-~193: Loose punctuation mark.
    Context: ... string or a list of strings. - deps: An optional list of other target names....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~198-~198: Loose punctuation mark.
    Context: ...e current target. - order_only_deps: An optional list of other target names ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~203-~203: Loose punctuation mark.
    Context: ...ied with the || operator.7 - vars: An optional mapping of local variables....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~208-~208: Loose punctuation mark.
    Context: ...'s build-local variables.3 - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~417-~417: Loose punctuation mark.
    Context: ... manifest files at runtime. minijinja, with its dynamic environment and runtim...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~447-~447: Possible missing comma found.
    Context: ...se are provided in a top-level macros list where each entry defines a signature ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~448-~448: Possible missing comma found.
    Context: ...ing. The body must use YAML's | block syntax so multi-line macro definitions remain ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~471-~471: Possible missing comma found.
    Context: ...nja's behaviour and follows minijinja semantics where later definitions shadow earlier ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~481-~481: Loose punctuation mark.
    Context: ...ar_name: &str) -> Result<String, Error>`: A function that reads an environment ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~485-~485: Loose punctuation mark.
    Context: ...rn: &str) -> Result<Vec, Error>`: A function that performs file path gl...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~491-~491: Loose punctuation mark.
    Context: ...quirement: &str) -> Result<bool, Error>`: An example of a domain-specific helpe...

    (UNLIKELY_OPENING_PUNCTUATION)


    [grammar] ~495-~495: Please add a punctuation mark at the end of paragraph.
    Context: ...::Command19, parse the output using the semver` crate 4, and compare it aga...

    (PUNCTUATION_PARAGRAPH_END)


    [uncategorized] ~500-~500: Loose punctuation mark.
    Context: ...requirement string (e.g., ">=3.8"). This allows for conditional logic in t...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~508-~508: Loose punctuation mark.
    Context: ...ta within templates. - | shell_escape: A filter that takes a string and escape...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~514-~514: Loose punctuation mark.
    Context: ... shell-aware quoting.22 - | to_path: A filter that converts a string into a ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~517-~517: Loose punctuation mark.
    Context: ... \ separators correctly. - | parent: A filter that takes a path string and r...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~524-~524: Consider using the typographical ellipsis character here instead.
    Context: ...owerful but often opaque functions like $(shell...) and $(wildcard...). Netsuke achieve...

    (ELLIPSIS)


    [style] ~525-~525: Consider using the typographical ellipsis character here instead.
    Context: ...opaque functions like $(shell...) and $(wildcard...). Netsuke achieves and surpasses this ...

    (ELLIPSIS)


    [uncategorized] ~827-~827: Loose punctuation mark.
    Context: ...ications and libraries.27 - thiserror: This crate will be used within Netsuk...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~861-~861: Loose punctuation mark.
    Context: ... String, }, } ``` - anyhow: This crate will be used in the main app...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~878-~878: Consider using the typographical ellipsis character here instead.
    Context: ...nction where the error occurred returns Err(IrGenError::RuleNotFound {... }.into()). The .into() call converts...

    (ELLIPSIS)


    [style] ~978-~978: Consider using the typographical ellipsis character here instead.
    Context: ...e is provided, allowing for the common* Netsuke [targets...] invocation. ### 8.3 Command Behavi...

    (ELLIPSIS)


    [uncategorized] ~985-~985: Loose punctuation mark.
    Context: ...defined: - Netsuke build [targets...]: This is the primary and default command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~992-~992: Loose punctuation mark.
    Context: ...on of the manifest. - Netsuke clean: This command provides a convenient way ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~996-~996: Loose punctuation mark.
    Context: ...s of the build rules. - Netsuke graph: This command is an introspection and de...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~1034-~1034: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
    Context: ...ile generator (ninja_gen.rs). 1. Implement the std::process::Command logic to in...

    (ENGLISH_WORD_REPEAT_BEGINNING_RULE)


    [style] ~1056-~1056: Consider using the typographical ellipsis character here instead.
    Context: ... 1. Implement basic Jinja control flow ({% if... %}, {% for... %}) and variabl...

    (ELLIPSIS)


    [style] ~1056-~1056: Consider using the typographical ellipsis character here instead.
    Context: ...asic Jinja control flow ({% if... %}, {% for... %}) and variable substitution. ...

    (ELLIPSIS)


    [typographical] ~1131-~1131: To join two clauses or introduce examples, consider using an em dash.
    Context: ...nja-build.org/> 1. Ninja (build system) - Wikipedia, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1134-~1134: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Complete Guide To The Ninja Build System - Spectra - Mathpix, accessed on July 1...

    (DASH_RULE)


    [typographical] ~1134-~1134: To join two clauses or introduce examples, consider using an em dash.
    Context: ...uide To The Ninja Build System - Spectra - Mathpix, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1138-~1138: To join two clauses or introduce examples, consider using an em dash.
    Context: ...de-to-the-ninja-build-system> 1. semver - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1142-~1142: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Cargo's flavor of Semantic Versioning - GitHub, accessed on July 12, 2025, <h...

    (DASH_RULE)


    [typographical] ~1145-~1145: To join two clauses or introduce examples, consider using an em dash.
    Context: ...://github.com/dtolnay/semver> 1. semver - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1145-~1145: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ub.com/dtolnay/semver> 1. semver - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1148-~1148: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mver/latest/semver/> 1. How Ninja works - Fuchsia, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1154-~1154: To join two clauses or introduce examples, consider using an em dash.
    Context: ...al.html> 1. Interest in new deps format - Google Groups, accessed on July 12, 2025...

    (DASH_RULE)


    [typographical] ~1159-~1159: To join two clauses or introduce examples, consider using an em dash.
    Context: ...https://serde.rs/ 1. Saphyr libraries - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1162-~1162: To join two clauses or introduce examples, consider using an em dash.
    Context: ...s.io/crates/saphyr> 1. Saphyr libraries - A set of crates dedicated to parsing YAM...

    (DASH_RULE)


    [typographical] ~1162-~1162: Consider using an em dash in dialogues and enumerations.
    Context: ...et of crates dedicated to parsing YAML. - GitHub, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1165-~1165: To join two clauses or introduce examples, consider using an em dash.
    Context: ...b.com/saphyr-rs/saphyr> 1. saphyr-serde - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1168-~1168: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1168-~1168: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1171-~1171: To join two clauses or introduce examples, consider using an em dash.
    Context: ... https://docs.rs/saphyr 1. minijinja - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1174-~1174: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/minijinja> 1. minijinja - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1174-~1174: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/minijinja> 1. minijinja - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1177-~1177: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ttps://docs.rs/minijinja/> 1. minijinja - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1183-~1183: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mplate-engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1183-~1183: To join two clauses or introduce examples, consider using an em dash.
    Context: ...engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1189-~1189: Consider using an em dash in dialogues and enumerations.
    Context: ...sion/> 1. How to check python version? - 4Geeks, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1192-~1192: To join two clauses or introduce examples, consider using an em dash.
    Context: ...to-check-python-version> 1. shell_quote - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1192-~1192: To join two clauses or introduce examples, consider using an em dash.
    Context: ...k-python-version> 1. shell_quote - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1195-~1195: To join two clauses or introduce examples, consider using an em dash.
    Context: ...te/latest/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1195-~1195: To join two clauses or introduce examples, consider using an em dash.
    Context: ...st/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1198-~1198: To join two clauses or introduce examples, consider using an em dash.
    Context: ...std/process/index.html> 1. std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1201-~1201: To join two clauses or introduce examples, consider using an em dash.
    Context: .../index.html> 1. Command in std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1204-~1204: To join two clauses or introduce examples, consider using an em dash.
    Context: ...d/process/struct.Command.html> 1. shlex - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1204-~1204: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ss/struct.Command.html> 1. shlex - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1212-~1212: To join two clauses or introduce examples, consider using an em dash.
    Context: ...es, Examples, and Advanced Techniques - Technorely, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1215-~1215: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ractical guide to Error Handling in Rust - Dev State, accessed on July 12, 2025,...

    (DASH_RULE)


    [typographical] ~1218-~1218: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rror_handling/> 1. thiserror and anyhow - Comprehensive Rust, accessed on July 12,...

    (DASH_RULE)


    [typographical] ~1221-~1221: To join two clauses or introduce examples, consider using an em dash.
    Context: ...r precondition/argument checking in Rust - Stack Overflow, accessed on July 12, ...

    (DASH_RULE)


    [typographical] ~1225-~1225: To join two clauses or introduce examples, consider using an em dash.
    Context: ...checking-in-rust> Nicer error reporting - Command Line Applications in Rust, acces...

    (DASH_RULE)

    🔇 Additional comments (1)
    src/main.rs (1)

    3-4: Good: ensure POSIX-style newline at EOF.

    The added trailing newline prevents EOF warnings in many tooling chains.

    Comment thread src/main.rs
    Comment on lines 0 to +3
    fn main() {
    println!("Hello from Netsuke!");
    } No newline at end of file
    }
    Copy link
    Copy Markdown
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    🛠️ Refactor suggestion

    Add a module-level //! doc comment.

    Every Rust module must begin with a //! comment that explains its purpose.
    Document the high-level intent of the binary before any code.

    +//! Netsuke CLI entry point.
    +//! Prints a greeting and will later delegate to the real CLI parser.
     fn main() {
         println!("Hello from Netsuke!");
     }
    📝 Committable suggestion

    ‼️ IMPORTANT
    Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

    Suggested change
    fn main() {
    println!("Hello from Netsuke!");
    }
    \ No newline at end of file
    }
    //! Netsuke CLI entry point.
    //! Prints a greeting and will later delegate to the real CLI parser.
    fn main() {
    println!("Hello from Netsuke!");
    }
    🤖 Prompt for AI Agents
    In src/main.rs at the beginning of the file (lines 1 to 3), add a module-level
    doc comment using //! syntax before the main function. This comment should
    describe the high-level purpose of the binary, providing context for the module.
    Place the //! comment at the very top of the file, above all code.
    

    Comment thread docs/netsuke-design.md
    Comment thread docs/roadmap.md Outdated
    leynos and others added 2 commits July 12, 2025 14:33
    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
    @leynos leynos merged commit a05a7c4 into main Jul 12, 2025
    Copy link
    Copy Markdown
    Contributor

    @coderabbitai coderabbitai Bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Actionable comments posted: 2

    ♻️ Duplicate comments (1)
    docs/roadmap.md (1)

    22-24: Match manifest filename with the rest of the docs.

    Change “Netsuke.yml” to “Netsukefile” to maintain a single term across documentation.

    -  - [ ] Implement the YAML parsing logic using `serde_yaml` to deserialize a
    -    static `Netsuke.yml` file into the `NetsukeManifest` AST.
    +  - [ ] Implement the YAML parsing logic using `serde_yaml` to deserialize a
    +    static `Netsukefile` into the `NetsukeManifest` AST.
    📜 Review details

    Configuration used: CodeRabbit UI
    Review profile: ASSERTIVE
    Plan: Pro

    📥 Commits

    Reviewing files that changed from the base of the PR and between 9d1d498 and 7039bb2.

    📒 Files selected for processing (2)
    • docs/netsuke-design.md (5 hunks)
    • docs/roadmap.md (1 hunks)
    🧰 Additional context used
    📓 Path-based instructions (2)
    docs/**/*.md

    Instructions used from:

    Sources:
    📄 CodeRabbit Inference Engine

    • AGENTS.md
    **/*.md

    Instructions used from:

    Sources:
    📄 CodeRabbit Inference Engine

    • AGENTS.md

    ⚙️ CodeRabbit Configuration File

    🪛 LanguageTool
    docs/netsuke-design.md

    [uncategorized] ~58-~58: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
    Context: ... Rust data structures. into a set of strongly-typed Rust data structures. This collection o...

    (HYPHENATED_LY_ADVERB_ADJECTIVE)


    [uncategorized] ~136-~136: Loose punctuation mark.
    Context: ...ned top-level keys. - netsuke_version: A mandatory string that specifies the v...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~141-~141: Loose punctuation mark.
    Context: ...ted using the semver crate.4 - vars: A mapping of global key-value string pa...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~145-~145: Loose punctuation mark.
    Context: ...he Jinja templating context. - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~150-~150: Loose punctuation mark.
    Context: ...ore rendering other sections. - rules: A list of rule definitions. Each rule i...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~153-~153: Loose punctuation mark.
    Context: ...s to a Ninja rule block.2 - targets: The primary list of build targets. Each...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~157-~157: Loose punctuation mark.
    Context: ... Ninja build statement.3 - defaults: An optional list of target names to be ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~165-~165: Loose punctuation mark.
    Context: ...at defines a command template. - name: A unique string identifier for the rule...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~167-~167: Loose punctuation mark.
    Context: ...ng identifier for the rule. - command: The command string to be executed. This...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~171-~171: Loose punctuation mark.
    Context: ...and$outvariables. -description`: An optional, user-friendly string that ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~175-~175: Loose punctuation mark.
    Context: ...ility into the build process.2 - deps: An optional field to configure support ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~185-~185: Loose punctuation mark.
    Context: ... edge in the dependency graph. - name: The primary output file or files for th...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~188-~188: Loose punctuation mark.
    Context: ...e string or a list of strings. - rule: The name of the rule (from the rules ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~191-~191: Loose punctuation mark.
    Context: ...for building this target. - sources: The input files required by the command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~194-~194: Loose punctuation mark.
    Context: ... string or a list of strings. - deps: An optional list of other target names....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~199-~199: Loose punctuation mark.
    Context: ...e current target. - order_only_deps: An optional list of other target names ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~204-~204: Loose punctuation mark.
    Context: ...ied with the || operator.7 - vars: An optional mapping of local variables....

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~209-~209: Loose punctuation mark.
    Context: ...'s build-local variables.3 - macros: An optional list of Jinja macro definit...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~418-~418: Loose punctuation mark.
    Context: ... manifest files at runtime. minijinja, with its dynamic environment and runtim...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~448-~448: Possible missing comma found.
    Context: ...se are provided in a top-level macros list where each entry defines a signature ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~449-~449: Possible missing comma found.
    Context: ...ing. The body must use YAML's | block syntax so multi-line macro definitions remain ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~472-~472: Possible missing comma found.
    Context: ...nja's behaviour and follows minijinja semantics where later definitions shadow earlier ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~482-~482: Loose punctuation mark.
    Context: ...ar_name: &str) -> Result<String, Error>`: A function that reads an environment ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~486-~486: Loose punctuation mark.
    Context: ...rn: &str) -> Result<Vec, Error>`: A function that performs file path gl...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~492-~492: Loose punctuation mark.
    Context: ...quirement: &str) -> Result<bool, Error>`: An example of a domain-specific helpe...

    (UNLIKELY_OPENING_PUNCTUATION)


    [grammar] ~496-~496: Please add a punctuation mark at the end of paragraph.
    Context: ...::Command19, parse the output using the semver` crate 4, and compare it aga...

    (PUNCTUATION_PARAGRAPH_END)


    [uncategorized] ~501-~501: Loose punctuation mark.
    Context: ...requirement string (e.g., ">=3.8"). This allows for conditional logic in t...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~509-~509: Loose punctuation mark.
    Context: ...ta within templates. - | shell_escape: A filter that takes a string and escape...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~515-~515: Loose punctuation mark.
    Context: ... shell-aware quoting.22 - | to_path: A filter that converts a string into a ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~518-~518: Loose punctuation mark.
    Context: ... \ separators correctly. - | parent: A filter that takes a path string and r...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~525-~525: Consider using the typographical ellipsis character here instead.
    Context: ...owerful but often opaque functions like $(shell...) and $(wildcard...). Netsuke achieve...

    (ELLIPSIS)


    [style] ~526-~526: Consider using the typographical ellipsis character here instead.
    Context: ...opaque functions like $(shell...) and $(wildcard...). Netsuke achieves and surpasses this ...

    (ELLIPSIS)


    [uncategorized] ~828-~828: Loose punctuation mark.
    Context: ...ications and libraries.27 - thiserror: This crate will be used within Netsuk...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~862-~862: Loose punctuation mark.
    Context: ... String, }, } ``` - anyhow: This crate will be used in the main app...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~879-~879: Consider using the typographical ellipsis character here instead.
    Context: ...nction where the error occurred returns Err(IrGenError::RuleNotFound {... }.into()). The .into() call converts...

    (ELLIPSIS)


    [style] ~979-~979: Consider using the typographical ellipsis character here instead.
    Context: ...e is provided, allowing for the common* Netsuke [targets...] invocation. ### 8.3 Command Behavi...

    (ELLIPSIS)


    [uncategorized] ~986-~986: Loose punctuation mark.
    Context: ...defined: - Netsuke build [targets...]: This is the primary and default command...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~993-~993: Loose punctuation mark.
    Context: ...on of the manifest. - Netsuke clean: This command provides a convenient way ...

    (UNLIKELY_OPENING_PUNCTUATION)


    [uncategorized] ~997-~997: Loose punctuation mark.
    Context: ...s of the build rules. - Netsuke graph: This command is an introspection and de...

    (UNLIKELY_OPENING_PUNCTUATION)


    [style] ~1035-~1035: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
    Context: ...ile generator (ninja_gen.rs). 1. Implement the std::process::Command logic to in...

    (ENGLISH_WORD_REPEAT_BEGINNING_RULE)


    [style] ~1057-~1057: Consider using the typographical ellipsis character here instead.
    Context: ... 1. Implement basic Jinja control flow ({% if... %}, {% for... %}) and variabl...

    (ELLIPSIS)


    [style] ~1057-~1057: Consider using the typographical ellipsis character here instead.
    Context: ...asic Jinja control flow ({% if... %}, {% for... %}) and variable substitution. ...

    (ELLIPSIS)


    [typographical] ~1132-~1132: To join two clauses or introduce examples, consider using an em dash.
    Context: ...nja-build.org/> 1. Ninja (build system) - Wikipedia, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1135-~1135: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Complete Guide To The Ninja Build System - Spectra - Mathpix, accessed on July 1...

    (DASH_RULE)


    [typographical] ~1135-~1135: To join two clauses or introduce examples, consider using an em dash.
    Context: ...uide To The Ninja Build System - Spectra - Mathpix, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1139-~1139: To join two clauses or introduce examples, consider using an em dash.
    Context: ...de-to-the-ninja-build-system> 1. semver - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1143-~1143: To join two clauses or introduce examples, consider using an em dash.
    Context: ...Cargo's flavor of Semantic Versioning - GitHub, accessed on July 12, 2025, <h...

    (DASH_RULE)


    [typographical] ~1146-~1146: To join two clauses or introduce examples, consider using an em dash.
    Context: ...://github.com/dtolnay/semver> 1. semver - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1146-~1146: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ub.com/dtolnay/semver> 1. semver - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1149-~1149: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mver/latest/semver/> 1. How Ninja works - Fuchsia, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1155-~1155: To join two clauses or introduce examples, consider using an em dash.
    Context: ...al.html> 1. Interest in new deps format - Google Groups, accessed on July 12, 2025...

    (DASH_RULE)


    [typographical] ~1160-~1160: To join two clauses or introduce examples, consider using an em dash.
    Context: ...https://serde.rs/ 1. Saphyr libraries - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1163-~1163: To join two clauses or introduce examples, consider using an em dash.
    Context: ...s.io/crates/saphyr> 1. Saphyr libraries - A set of crates dedicated to parsing YAM...

    (DASH_RULE)


    [typographical] ~1163-~1163: Consider using an em dash in dialogues and enumerations.
    Context: ...et of crates dedicated to parsing YAML. - GitHub, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1166-~1166: To join two clauses or introduce examples, consider using an em dash.
    Context: ...b.com/saphyr-rs/saphyr> 1. saphyr-serde - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1169-~1169: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1169-~1169: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/saphyr-serde> 1. saphyr - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1172-~1172: To join two clauses or introduce examples, consider using an em dash.
    Context: ... https://docs.rs/saphyr 1. minijinja - crates.io: Rust Pack...

    (DASH_RULE)


    [typographical] ~1175-~1175: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rates.io/crates/minijinja> 1. minijinja - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1175-~1175: To join two clauses or introduce examples, consider using an em dash.
    Context: ...o/crates/minijinja> 1. minijinja - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1178-~1178: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ttps://docs.rs/minijinja/> 1. minijinja - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1184-~1184: To join two clauses or introduce examples, consider using an em dash.
    Context: ...mplate-engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1184-~1184: To join two clauses or introduce examples, consider using an em dash.
    Context: ...engine> 1. std::process::Command - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1190-~1190: Consider using an em dash in dialogues and enumerations.
    Context: ...sion/> 1. How to check python version? - 4Geeks, accessed on July 12, 2025, <...

    (DASH_RULE)


    [typographical] ~1193-~1193: To join two clauses or introduce examples, consider using an em dash.
    Context: ...to-check-python-version> 1. shell_quote - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1193-~1193: To join two clauses or introduce examples, consider using an em dash.
    Context: ...k-python-version> 1. shell_quote - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1196-~1196: To join two clauses or introduce examples, consider using an em dash.
    Context: ...te/latest/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1196-~1196: To join two clauses or introduce examples, consider using an em dash.
    Context: ...st/shell_quote/> 1. std::process - Rust - MIT, accessed on July 12, 2025, <http...

    (DASH_RULE)


    [typographical] ~1199-~1199: To join two clauses or introduce examples, consider using an em dash.
    Context: ...std/process/index.html> 1. std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1202-~1202: To join two clauses or introduce examples, consider using an em dash.
    Context: .../index.html> 1. Command in std::process - Rust, accessed on July 12, 2025, <htt...

    (DASH_RULE)


    [typographical] ~1205-~1205: To join two clauses or introduce examples, consider using an em dash.
    Context: ...d/process/struct.Command.html> 1. shlex - Rust - Docs.rs, access...

    (DASH_RULE)


    [typographical] ~1205-~1205: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ss/struct.Command.html> 1. shlex - Rust - Docs.rs, accessed on J...

    (DASH_RULE)


    [typographical] ~1213-~1213: To join two clauses or introduce examples, consider using an em dash.
    Context: ...es, Examples, and Advanced Techniques - Technorely, accessed on July 12, 2025, ...

    (DASH_RULE)


    [typographical] ~1216-~1216: To join two clauses or introduce examples, consider using an em dash.
    Context: ...ractical guide to Error Handling in Rust - Dev State, accessed on July 12, 2025,...

    (DASH_RULE)


    [typographical] ~1219-~1219: To join two clauses or introduce examples, consider using an em dash.
    Context: ...rror_handling/> 1. thiserror and anyhow - Comprehensive Rust, accessed on July 12,...

    (DASH_RULE)


    [typographical] ~1222-~1222: To join two clauses or introduce examples, consider using an em dash.
    Context: ...r precondition/argument checking in Rust - Stack Overflow, accessed on July 12, ...

    (DASH_RULE)


    [typographical] ~1226-~1226: To join two clauses or introduce examples, consider using an em dash.
    Context: ...checking-in-rust> Nicer error reporting - Command Line Applications in Rust, acces...

    (DASH_RULE)

    Comment thread docs/netsuke-design.md
    Comment on lines +448 to +451
    These are provided in a top-level `macros` list where each entry defines a
    `signature` and a `body` string. The body must use YAML's `|` block syntax so
    multi-line macro definitions remain readable. All macros are registered with the
    template environment before any other section is rendered.
    Copy link
    Copy Markdown
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    🧹 Nitpick (assertive)

    Insert a comma after the introductory phrase.

    Add a comma after “list” to prevent the run-on.

    -These are provided in a top-level `macros` list where each entry defines a
    +These are provided in a top-level `macros` list, where each entry defines a
    📝 Committable suggestion

    ‼️ IMPORTANT
    Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

    Suggested change
    These are provided in a top-level `macros` list where each entry defines a
    `signature` and a `body` string. The body must use YAML's `|` block syntax so
    multi-line macro definitions remain readable. All macros are registered with the
    template environment before any other section is rendered.
    These are provided in a top-level `macros` list, where each entry defines a
    `signature` and a `body` string. The body must use YAML's `|` block syntax so
    multi-line macro definitions remain readable. All macros are registered with the
    template environment before any other section is rendered.
    🧰 Tools
    🪛 LanguageTool

    [uncategorized] ~448-~448: Possible missing comma found.
    Context: ...se are provided in a top-level macros list where each entry defines a signature ...

    (AI_HYDRA_LEO_MISSING_COMMA)


    [uncategorized] ~449-~449: Possible missing comma found.
    Context: ...ing. The body must use YAML's | block syntax so multi-line macro definitions remain ...

    (AI_HYDRA_LEO_MISSING_COMMA)

    🤖 Prompt for AI Agents
    In docs/netsuke-design.md around lines 448 to 451, add a comma after the word
    "list" in the phrase "top-level `macros` list" to separate the introductory
    phrase and prevent a run-on sentence.
    

    Comment thread docs/netsuke-design.md
    Comment on lines +55 to +60
    The static YAML string generated in the previous stage is passed to a YAML
    parser. This parser validates the YAML syntax and deserializes the content
    into a set of strongly typed Rust data structures.
    into a set of strongly-typed Rust data structures. This collection of
    structs, which directly mirrors the YAML schema, can be considered an
    "unprocessed" Abstract Syntax Tree (AST) of the build plan.
    Copy link
    Copy Markdown
    Contributor

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    🧹 Nitpick (assertive)

    Eliminate the duplicated sentence and incorrect “-ly” hyphen.

    The paragraph repeats the same sentence twice and the second copy mis-uses the -ly-adverb hyphen (“strongly-typed”). Keep the first occurrence, drop the second.

    -   into a set of strongly-typed Rust data structures. This collection of

    Committable suggestion skipped: line range outside the PR's diff.

    🧰 Tools
    🪛 LanguageTool

    [uncategorized] ~58-~58: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
    Context: ... Rust data structures. into a set of strongly-typed Rust data structures. This collection o...

    (HYPHENATED_LY_ADVERB_ADJECTIVE)

    🤖 Prompt for AI Agents
    In docs/netsuke-design.md around lines 55 to 60, remove the duplicated sentence
    that describes the YAML parser deserializing content into Rust data structures.
    Keep only the first occurrence and eliminate the second one that incorrectly
    uses the hyphen in "strongly-typed."
    

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    1 participant