Add target descriptions and netsuke help targets (#551) - #555
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Summary
WalkthroughThis change adds optional target and action descriptions and introduces ChangesTarget descriptions and help command
Sequence Diagram(s)sequenceDiagram
participant User
participant CLI
participant HelpRunner
participant ManifestQuery
participant Output
User->>CLI: Run netsuke help targets
CLI->>HelpRunner: Dispatch help topic
HelpRunner->>ManifestQuery: Load, expand, and validate manifest
ManifestQuery-->>HelpRunner: Actions, targets, descriptions, defaults
HelpRunner->>Output: Render text or JSON catalogue
Output-->>User: Display catalogue without running recipes
Poem
Caution Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional.
❌ Failed checks (2 errors, 1 warning, 4 inconclusive)
✅ Passed checks (13 passed)
📋 Issue PlannerBuilt with CodeRabbit's Coding Plans for faster development and fewer bugs. View plan used: ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Reviewer's GuideAdds an optional description field to manifest targets/actions and introduces a localized Sequence diagram for
|
| Change | Details | Files |
|---|---|---|
| Introduce optional discovery descriptions on targets and actions, including render/expand behaviour and AST validation. |
|
src/ast.rssrc/manifest/render.rssrc/manifest/expand_tests.rssrc/manifest/expand_test_cases/description_cases.rstests/ast_tests.rstests/ast_tests/descriptions.rstests/ast_tests/actions.rs |
Add netsuke help subcommand with topic-based dispatch, including help targets catalogue rendering and JSON output. |
|
src/cli/help.rssrc/cli/mod.rssrc/cli/parser.rssrc/runner/mod.rssrc/runner/dispatch.rssrc/runner/help.rssrc/localization/keys.rssrc/output_prefs.rs |
| Extend localization for the new help subcommand and catalogue headings across all locales and status reporting. |
|
src/localization/keys.rssrc/cli_l10n.rslocales/ar/messages.ftllocales/cs/messages.ftllocales/cy/messages.ftllocales/da/messages.ftllocales/de/messages.ftllocales/el/messages.ftllocales/en-GB/messages.ftllocales/en-US/messages.ftllocales/es-419/messages.ftllocales/es-ES/messages.ftllocales/fa/messages.ftllocales/fi/messages.ftllocales/fr/messages.ftllocales/gd/messages.ftllocales/he/messages.ftllocales/hi/messages.ftllocales/hu/messages.ftllocales/id/messages.ftllocales/it/messages.ftllocales/ja/messages.ftllocales/ko/messages.ftllocales/nb/messages.ftllocales/nl/messages.ftllocales/pl/messages.ftllocales/pt-BR/messages.ftllocales/pt-PT/messages.ftllocales/ro/messages.ftllocales/ru/messages.ftllocales/sv/messages.ftllocales/th/messages.ftllocales/tr/messages.ftllocales/uk/messages.ftllocales/vi/messages.ftllocales/zh-Hans/messages.ftllocales/zh-Hant/messages.ftl |
Add tests and BDD coverage for parsing and running netsuke help/help targets, including snapshots and integration tests. |
|
tests/bdd/steps/cli_verify.rstests/features/cli.featuretests/bdd/steps/cli.rstests/bdd/steps/help_targets.rstests/features/help_targets.featuretests/documentation_examples_tests.rstests/runner_help_targets_tests.rssrc/runner/help_tests.rssrc/snapshots/help_targets/netsuke__runner__help__tests__accessible_catalogue.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__json_catalogue.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__localized_catalogue_es_es.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__text_catalogue.snapsrc/snapshots/cli/netsuke__cli__parser__tests__help_en_us.snapsrc/snapshots/cli/netsuke__cli__parser__tests__help_es_es.snaptests/ast_tests/actions.rstests/ast_tests/descriptions.rstests/ast_tests.rstests/manifest_command.rstests/bdd/steps/manifest_command_helpers.rstests/bdd/steps/mod.rsdylint.toml |
| Update user documentation and execution plan to describe target descriptions and the new help targets subcommand. |
|
docs/users-guide.mddocs/execplans/fef13161.md |
Assessment against linked issues
| Issue | Objective | Addressed | Explanation |
|---|---|---|---|
| #551 | Extend the manifest, AST, rendering, expansion, and parsing so that targets and actions support an optional description field that is preserved through the pipeline without affecting rule descriptions or Ninja progress output. |
✅ | |
| #551 | Implement a netsuke help targets subcommand (and associated help-topic handling) that loads, expands, renders, and validates the selected manifest without running Ninja, then emits a deterministic catalogue of actions and targets with descriptions, supporting text, accessible, localized, and JSON modes and honouring manifest-selection and output preferences. |
✅ | |
| #551 | Update documentation and CLI help to describe the new description field for targets/actions and the netsuke help targets subcommand, including localized help text and related surfaces such as shell completions/man pages/PowerShell help. |
✅ |
Possibly linked issues
- Add target descriptions and netsuke help targets #551: The PR fully implements optional target/action descriptions plus the
netsuke help targetssubcommand, including rendering, JSON output, tests, and docs as specified in the issue.
Tips and commands
Interacting with Sourcery
- Trigger a new review: Comment
@sourcery-ai reviewon 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 issueto create an issue from it. - Generate a pull request title: Write
@sourcery-aianywhere in the pull
request title to generate a title at any time. You can also comment
@sourcery-ai titleon the pull request to (re-)generate the title at any time. - Generate a pull request summary: Write
@sourcery-ai summaryanywhere in
the pull request body to generate a PR summary at any time exactly where you
want it. You can also comment@sourcery-ai summaryon the pull request to
(re-)generate the summary at any time. - Generate reviewer's guide: Comment
@sourcery-ai guideon the pull
request to (re-)generate the reviewer's guide at any time. - Resolve all Sourcery comments: Comment
@sourcery-ai resolveon 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 dismisson 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 reviewto 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
- Contact our support team for questions or feedback.
- Visit our documentation for detailed guides and information.
- Keep in touch with the Sourcery team by following us on X/Twitter, LinkedIn or GitHub.
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. Comment on lines +105 to +114 fn json_catalogue_snapshot() -> Result<()> {
let _lock = localizer_lock();
let _guard = en_localizer();
let entries = fixture_entries()?;
let rendered = render_json(&entries)?;
snapshot_settings("help_targets").bind(|| {
assert_snapshot!("json_catalogue", rendered);
});
Ok(())
}❌ New issue: Code Duplication |
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Ensure that this is validated against the current version of the codegraph. If further refinement to address this finding would be deleterious, please supply a clear explanatory one to two paragraph markdown message I can paste into the CodeScene web ui's diagnostic suppression function so this diagnostic can be silenced. Comment on lines +55 to +66 pub(super) fn verify_help_topic(world: &TestWorld, expected: &HelpTopic) -> Result<()> {
let command = get_command(world)?;
let Commands::Help(args) = &command else {
bail!("expected help command, got {command:?}");
};
ensure!(
args.topic.as_ref() == Some(expected),
"expected help topic {expected:?}, got {:?}",
args.topic
);
Ok(())
}❌ New issue: Code Duplication |
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
|
@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response. Overall Code Complexitysrc/manifest/render.rs: What lead to degradation?This module has a mean cyclomatic complexity of 4.14 across 7 functions. The mean complexity threshold is 4 Why does this problem occur?Overall Code Complexity is measured by the mean cyclomatic complexity across all functions in the file. The lower the number, the better. How to fix it?You address the overall cyclomatic complexity by a) modularizing the code, and b) abstract away the complexity. Let's look at some examples: |
This comment was marked as resolved.
This comment was marked as resolved.
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Tip For best results, initiate chat on the files or code changes.
✏️ Learnings added
🧠 Learnings usedYou are interacting with an AI system. |
Use the Polish imperative form and Portuguese post-Acordo Ortográfico spellings in the localized `help` command descriptions and heading.
Represent subcommand help topics through `Subcommand` so their names and localized about keys have one shared mapping. Cover supported and rejected help-topic names without changing the command surface.
Render help catalogues through a restricted manifest-query path so discovery cannot fetch, execute commands, or write caches. Escape terminal control characters at text output while retaining raw JSON values. Add end-to-end, IR, and property coverage for foreach descriptions, rule progress isolation, catalogue invariants, and the restricted template surface.
Clarify that target and action descriptions remain discovery metadata and never replace rule descriptions in Ninja progress. Add the localized `cli.help.targets_about` synopsis to every shipped locale.
Use a dedicated localized synopsis for the nested `targets` help topic rather than reusing the catalogue section heading. Keep localized help assertions aligned with the translated output.
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/v0-1-0-migration-guide.md`:
- Line 26: Update the table caption near the manifest discovery row to describe
all documented v0.1.0 additions, including the `netsuke help targets` change,
rather than limiting the scope to child-environment API additions.
In `@locales/zh-Hant/messages.ftl`:
- Around line 35-41: Update the help catalogue strings cli.help.actions_heading
and cli.help.targets_about to use 動作 instead of 操作, matching the established
manifest action terminology used by ir.action_serialisation while leaving the
rest of the translation unchanged.
In `@src/runner/help.rs`:
- Around line 219-234: Update terminal_safe to detect Unicode Bidi_Control
ranges in addition to char::is_control(), escape matching characters with
escape_unicode(), and retain the existing named escapes for newline, carriage
return, and tab. Add a regression test covering U+202E to verify it is not
emitted unchanged.
In `@src/stdlib/register.rs`:
- Around line 106-112: Update the documentation for register_read_only_helpers
to remove the claim that manifest queries must not perform I/O. State instead
that query mode prevents side effects such as network access, cache writes, and
command execution, while acknowledging retained filesystem-capable helpers
including file tests, path helpers, and which.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: ab29b06d-d462-4bba-8d02-0a18b34aee86
⛔ Files ignored due to path filters (5)
Cargo.lockis excluded by!**/*.locksrc/snapshots/cli/netsuke__cli__parser__tests__help_es_es.snapis excluded by!**/*.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__accessible_catalogue.snapis excluded by!**/*.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__localized_catalogue_es_es.snapis excluded by!**/*.snapsrc/snapshots/help_targets/netsuke__runner__help__tests__text_catalogue.snapis excluded by!**/*.snap
📒 Files selected for processing (64)
.gitignoreCargo.tomldocs/developers-guide.mddocs/execplans/fef13161.mddocs/netsuke-cli-design-document.mddocs/netsuke-design.mddocs/roadmap.mddocs/users-guide.mddocs/v0-1-0-migration-guide.mdlocales/ar/messages.ftllocales/cs/messages.ftllocales/cy/messages.ftllocales/da/messages.ftllocales/de/messages.ftllocales/el/messages.ftllocales/en-GB/messages.ftllocales/en-US/messages.ftllocales/es-419/messages.ftllocales/es-ES/messages.ftllocales/fa/messages.ftllocales/fi/messages.ftllocales/fr/messages.ftllocales/gd/messages.ftllocales/he/messages.ftllocales/hi/messages.ftllocales/hu/messages.ftllocales/id/messages.ftllocales/it/messages.ftllocales/ja/messages.ftllocales/ko/messages.ftllocales/nb/messages.ftllocales/nl/messages.ftllocales/pl/messages.ftllocales/pt-BR/messages.ftllocales/pt-PT/messages.ftllocales/ro/messages.ftllocales/ru/messages.ftllocales/sv/messages.ftllocales/th/messages.ftllocales/tr/messages.ftllocales/uk/messages.ftllocales/vi/messages.ftllocales/zh-Hans/messages.ftllocales/zh-Hant/messages.ftlsrc/cli/parser_tests.rssrc/cli_l10n.rssrc/ir/from_manifest.rssrc/localization/keys.rssrc/main.rssrc/manifest/expand_test_cases/property_cases.rssrc/manifest/expand_tests.rssrc/manifest/mod.rssrc/manifest/query.rssrc/manifest/render.rssrc/manifest/tests/workspace.rssrc/runner/dispatch.rssrc/runner/help.rssrc/runner/help_tests.rssrc/stdlib/mod.rssrc/stdlib/register.rstests/ast_tests/descriptions.rstests/ir_from_manifest_tests.rstests/novice_flow_smoke_tests.rstests/runner_help_targets_tests.rs
🔗 Linked repositories identified
CodeRabbit considers these linked repositories for cross-repo context during reviews:
leynos/rstest-bdd(auto-detected)leynos/ortho-config(auto-detected)leynos/whitaker(auto-detected)leynos/shared-actions(auto-detected)
| fn terminal_safe(input: &str) -> Cow<'_, str> { | ||
| if !input.chars().any(char::is_control) { | ||
| return Cow::Borrowed(input); | ||
| } | ||
|
|
||
| let mut escaped = String::with_capacity(input.len()); | ||
| for character in input.chars() { | ||
| match character { | ||
| '\n' => escaped.push_str("\\n"), | ||
| '\r' => escaped.push_str("\\r"), | ||
| '\t' => escaped.push_str("\\t"), | ||
| control if control.is_control() => escaped.extend(control.escape_default()), | ||
| printable => escaped.push(printable), | ||
| } | ||
| } | ||
| Cow::Owned(escaped) |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -eu
sed -n '190,255p' src/runner/help.rs
rg -n "terminal_safe|bidi|U\\+202E|202E|escape_unicode|escape_default" src tests Cargo.toml
rustc --version 2>/dev/null || trueRepository: leynos/netsuke
Length of output: 3295
🌐 Web query:
Rust standard library char::is_control char::is_bidi_control Bidirectional_Control Unicode documentation
💡 Result:
In Rust, the standard library provides the char::is_control method, but it does not include a built-in char::is_bidi_control method in the core language [1][2][3]. char::is_control The char::is_control method returns true if a character falls under the Unicode general category Cc (Control) [1][4]. These code points are described in the Unicode Standard and specified in the Unicode Character Database (UnicodeData.txt) [1][5]. The implementation in the Rust standard library matches characters in the ranges U+0000..=U+001F and U+007F..=U+009F [3]. Bidi_Control and char::is_bidi_control There is no char::is_bidi_control method in the standard library; however, functions with this name appear in third-party crates (such as unic-ucd-bidi or servo-base) [6][7][8]. The Bidi_Control property is a Unicode standard property defined in the Unicode Character Database [9][10]. Characters with this property are used by the Unicode Bidirectional Algorithm (UBA) to control the display ordering of bidirectional text [9][11]. They are categorized into three groups [9][10]: - Implicit Directional Formatting Characters: LRM, RLM, and ALM [9][10]. - Explicit Directional Embedding and Override Formatting Characters: LRE, RLE, LRO, RLO, and PDF [9][10]. - Explicit Directional Isolate Formatting Characters: LRI, RLI, FSI, and PDI [9][10]. These characters are essential for managing text directionality in environments where left-to-right and right-to-left scripts are mixed [9][12][11].
Citations:
- 1: https://doc.rust-lang.org/stable/core/primitive.char.html
- 2: https://doc.rust-lang.org/std/primitive.char.html
- 3: https://doc.rust-lang.org/nightly/src/core/char/methods.rs.html
- 4: https://doc.rust-lang.org/nightly/std/primitive.char.html
- 5: https://dev-doc.rust-lang.org/std/primitive.char.html
- 6: https://docs.rs/unic-ucd-bidi/latest/unic_ucd_bidi/bidi_control/fn.is_bidi_control.html
- 7: https://doc.servo.org/servo_base/text/fn.is_bidi_control.html
- 8: https://docs.rs/xa11y/latest/xa11y/fn.is_bidi_control.html
- 9: https://www.unicode.org/reports/tr9/
- 10: http://www.unicode.org/reports/tr9/index.html
- 11: https://www.unicode.org/reports/tr9/tr9-9.html
- 12: https://unicode.org/faq/bidi.html
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- dependencies ---'
rg -n "unicode|bidi|icu|unic|unicode-width|terminal_safe" Cargo.toml Cargo.lock src tests
printf '%s\n' '--- help imports and nearby tests ---'
sed -n '1,80p' src/runner/help.rs
rg -n -C 6 "render|help|description|catalogue|terminal" src/runner testsRepository: leynos/netsuke
Length of output: 50371
🏁 Script executed (no clone):
#!/bin/bash
set -eu
cat >/tmp/check_char.rs <<'RS'
fn main() {
for character in ['\u{001b}', '\u{007f}', '\u{009f}', '\u{202e}', '\u{202c}', '\u{2066}', '\u{2069}', '\u{200e}', '\u{200f}', '\u{061c}'] {
println!(
"U+{:04X} control={} escape_default={:?} escape_unicode={:?}",
character as u32,
character.is_control(),
character.escape_default().collect::<String>(),
character.escape_unicode().collect::<String>(),
);
}
}
RS
rustc /tmp/check_char.rs -o /tmp/check_char
/tmp/check_char
Length of output: 372
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- manifest dependencies ---'
sed -n '/^\[dependencies\]/,/^\[/p' Cargo.toml
printf '%s\n' '--- relevant source and test references ---'
rg -n -C 4 "terminal_safe|help_targets|target.*description|description.*target|U\\+202E|202E|bidi|direction" src/runner tests --glob '*.rs' --glob '*.feature' || true
printf '%s\n' '--- help test files ---'
fd -i 'help|target' tests src/runner --type fRepository: leynos/netsuke
Length of output: 33873
🏁 Script executed (no clone):
#!/bin/bash
set -eu
python3 - <<'PY'
import unicodedata
points = [0x001b, 0x007f, 0x009f, 0x061c, 0x200e, 0x200f,
0x202a, 0x202b, 0x202c, 0x202d, 0x202e,
0x2066, 0x2067, 0x2068, 0x2069]
for point in points:
character = chr(point)
print(
f"U+{point:04X} category={unicodedata.category(character)} "
f"bidi={unicodedata.bidirectional(character)!r} "
f"name={unicodedata.name(character, '<unnamed>')}"
)
PY
Length of output: 939
Escape Unicode bidirectional-control characters.
char::is_control() excludes Bidi_Control characters such as U+202E, so terminal_safe currently emits them unchanged. Use a local predicate for the Bidi_Control ranges and escape matching characters with escape_unicode(). Add a regression test for U+202E.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/runner/help.rs` around lines 219 - 234, Update terminal_safe to detect
Unicode Bidi_Control ranges in addition to char::is_control(), escape matching
characters with escape_unicode(), and retain the existing named escapes for
newline, carriage return, and tab. Add a regression test covering U+202E to
verify it is not emitted unchanged.
|
@coderabbitai Have the following now been resolved? src/cli_l10n.rs (1)
🤖 Detailed instructionsVerify each finding against current code. Fix only still-valid issues, skip the In |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Localization module outline =='
ast-grep outline src/cli_l10n.rs --items all --view expanded
printf '%s\n' '== Nested help localization flow =='
rg -n -A35 -B12 \
'fn (localize_subcommands|localize_help_topics)|enum (Subcommand|HelpTopicName)|fn (subcommand_about_key|help_topic_about_key)|HelpTopicName::from_name|Subcommand::from_name' \
src/cli_l10n.rs
printf '%s\n' '== CLI help type declarations =='
ast-grep outline src/cli/help.rs src/cli/parser.rs --items all --view expanded
rg -n -A25 -B8 'enum HelpTopic|struct HelpArgs|Commands::Help|Help\(' src/cli/help.rs src/cli/parser.rs
printf '%s\n' '== Localization keys and en-US messages =='
rg -n -A3 -B3 \
'CLI_(SUBCOMMAND_HELP|HELP_(TARGETS|ACTIONS|DEFAULT))|cli\.(subcommand\.help|help\.)' \
src/localization/keys.rs locales/en-US/messages.ftl
printf '%s\n' '== Focused tests for nested help localisation =='
rg -n -A30 -B10 \
'localized_help_topics_include_localized_descriptions|help --help|HelpTopicName|localize_help_topics' \
src/cli/parser_tests.rs src/cli_l10n.rs testsLength of output: 32114
|
Broaden the migration table caption, record the post-314f12b query and help follow-up in the living exec plan, and rename the targets help synopsis key across all shipped locales. Update Traditional Chinese wording to use 動作.
Keep the post-change record aligned with the renamed cli.help.targets.about key.
Keep query rendering deterministic, escape bidi controls, and retain capability-scoped UTF-8 fixture paths. Propagate render test failures and prove that help rejects IR-invalid manifests.
Align the completed ExecPlan filename with the issue branch so its purpose is discoverable without relying on an opaque identifier.
There was a problem hiding this comment.
Gates Failed
Enforce advisory code health rules
(1 file with Code Duplication)
Our agent can fix these. Install it.
Gates Passed
5 Quality Gates Passed
Reason for failure
| Enforce advisory code health rules | Violations | Code Health Impact | |
|---|---|---|---|
| runner_help_targets_tests.rs | 1 advisory rule | 9.39 | Suppress |
Quality Gate Profile: Pay Down Tech Debt
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.
Closes #551
Summary
Add an optional
descriptionfield to manifest targets (and, by inheritance,actions) and expose the rendered target and action catalogue through a new
netsuke help targetssubcommand.descriptionrendered through thenormal Jinja pipeline, including
foreachexpansions. A target descriptionis discovery metadata; it never replaces a referenced rule description in
Ninja progress output.
netsuke help targetsloads, expands, renders, and validates the selectedmanifest without invoking Ninja. It lists actions and targets with their
descriptions, defaults, and the established colour, accessibility, locale,
and JSON-output conventions.
documentation coverage support the new surface across all locales.
References