Release v0.3.0#45
Conversation
…nd enhanced release conditions - Modified CI workflow to trigger on pushes to 'dev' and all branches using wildcard. - Enhanced release workflow to include checks for PR merges and tag pushes, ensuring proper release conditions. - Added new jobs for release checks and CI validation before building and releasing artifacts. - Updated dependencies and installation steps for improved compatibility.
* docs: add wildcard allow command design spec Design for issue #18 — wildcard allow patterns and Ctrl+U interactive "always allow" shortcut for session-scoped tool approval. * docs: fix spec review issues — correct data flow, JSON-aware extraction Addresses reviewer feedback: - Fix suggest_allow_pattern to handle JSON tool input - Correct TUI approval data flow: app.rs → repl.rs → runner.rs - Add missing files: ipc_pending.rs, runner.rs, repl.rs * docs: add wildcard allow implementation plan 6-task plan covering wildcard matching, session allow list, ApprovalVerdict enum, and Ctrl+U TUI shortcut. * feat: add wildcard_matches function for permission patterns * feat: add extract_meaningful_text and suggest_allow_pattern * feat: add session_allow list and human-readable key matching in check() - Add `session_allow: Vec<String>` field (pub) to ApprovalPolicy - Add `add_session_allow()` method with deduplication - Update `check()` to build both json_key and readable_key (via extract_meaningful_text) - Replace key.contains() with wildcard_matches() for deny and allow checks - Chain session_allow with config.allow in explicitly_allowed check * feat: replace bool approval with ApprovalVerdict enum across all handlers * feat: add Ctrl+U always-allow shortcut with session-scoped wildcard pattern * style: apply cargo fmt across workspace * chore: add cargo-husky pre-commit hooks (fmt, clippy, test) * fix: handle single-word commands in suggest_allow_pattern Pattern for single-token inputs like `ls` now generates `execute_bash:ls*` instead of `execute_bash:ls *` which failed to match because the space was mandatory. Also removes docs/superpowers plan and spec files. * feat: add advanced animated busy indicator (#19) Replace the plain busy/idle text in the status bar with a color-coded animated indicator that reflects real-time agent state: - Green idle, brown thinking, orange streaming, cyan tool, amber approval, red error Derive BusyState from existing events in apply_event and emit BusyStateChanged from the agent core at key transition points.
…) (#27) * docs: add wildcard allow command design spec Design for issue #18 — wildcard allow patterns and Ctrl+U interactive "always allow" shortcut for session-scoped tool approval. * docs: fix spec review issues — correct data flow, JSON-aware extraction Addresses reviewer feedback: - Fix suggest_allow_pattern to handle JSON tool input - Correct TUI approval data flow: app.rs → repl.rs → runner.rs - Add missing files: ipc_pending.rs, runner.rs, repl.rs * docs: add wildcard allow implementation plan 6-task plan covering wildcard matching, session allow list, ApprovalVerdict enum, and Ctrl+U TUI shortcut. * feat: add wildcard_matches function for permission patterns * feat: add extract_meaningful_text and suggest_allow_pattern * feat: add session_allow list and human-readable key matching in check() - Add `session_allow: Vec<String>` field (pub) to ApprovalPolicy - Add `add_session_allow()` method with deduplication - Update `check()` to build both json_key and readable_key (via extract_meaningful_text) - Replace key.contains() with wildcard_matches() for deny and allow checks - Chain session_allow with config.allow in explicitly_allowed check * feat: replace bool approval with ApprovalVerdict enum across all handlers * feat: add Ctrl+U always-allow shortcut with session-scoped wildcard pattern * style: apply cargo fmt across workspace * chore: add cargo-husky pre-commit hooks (fmt, clippy, test) * fix: handle single-word commands in suggest_allow_pattern Pattern for single-token inputs like `ls` now generates `execute_bash:ls*` instead of `execute_bash:ls *` which failed to match because the space was mandatory. Also removes docs/superpowers plan and spec files. * fix: prevent tool_use/tool_result desync during context truncation (#24) Context compaction (sliding window and apply_summary) could split tool_use/tool_result message groups, leaving orphaned tool_result messages without their matching assistant tool_use. This caused the API error: "unexpected tool_use_id found in tool_result blocks". Add adjust_cutoff_for_tool_groups() to walk the cutoff backwards past any Role::Tool messages so the preceding assistant message with tool_calls is always included.
- Added functionality to compact expanded file blocks in user event previews, replacing them with a simplified format (e.g., `@path`). - Introduced new methods for handling at-mentions, including selection, deletion, and cursor styling in the TUI. - Updated the composer line rendering to visually distinguish at-mentions with a specific background color. - Improved whitespace handling in message content to ensure clean formatting.
* feat(tui): add question modal state fields, helpers, and event hooks (#32) * fix(tui): close question modal in clear_replayed_interaction_state (#32) Prevents stale modal-open state when resuming a session that was interrupted mid-question. * feat(tui): add question modal key event handling (#32) * feat(tui): render question modal popup and suppress composer hint (#32) * test(tui): add question modal state tests (#32) * feat(tui): hide inline question options when modal is open (#32) Keep the question header and prompt visible in the transcript but skip the numbered options, tips, and click targets while the modal popup is handling selection.
* feat(tui): add question modal state fields, helpers, and event hooks (#32) * fix(tui): close question modal in clear_replayed_interaction_state (#32) Prevents stale modal-open state when resuming a session that was interrupted mid-question. * feat(tui): add question modal key event handling (#32) * feat(tui): render question modal popup and suppress composer hint (#32) * test(tui): add question modal state tests (#32) * feat(tui): hide inline question options when modal is open (#32) Keep the question header and prompt visible in the transcript but skip the numbered options, tips, and click targets while the modal popup is handling selection. * chore: add regex dependency to nca-core (#34) * feat: add skill supporting file inlining (#34) * feat: add invoke_skill tool for dynamic skill loading (#34) * feat: add subagent skill indicator in sidebar and transcript (#34) * fix: security and stability fixes for skill invocation (#34) - Remove stale session_id from InvokeSkillTool (was not updated on session reset, causing events tagged to wrong session) - Block path traversal (../) in skill file reference resolution - Prevent AGENTS.md skills from leaking parent directory files via Level-2 fallback (only filesystem skills use catalog root fallback) - Detect invoke_skill phase in subagent activity for sidebar indicator - Add path traversal rejection test * fix: stop infinite tool retry loops after 3 consecutive failures (#34) When the same tool fails 3 times in a row (e.g., ask_question called with malformed inputs by a weaker model), the agent loop now stops and surfaces an error instead of retrying indefinitely.
) * feat(tui): add question modal state fields, helpers, and event hooks (#32) * fix(tui): close question modal in clear_replayed_interaction_state (#32) Prevents stale modal-open state when resuming a session that was interrupted mid-question. * feat(tui): add question modal key event handling (#32) * feat(tui): render question modal popup and suppress composer hint (#32) * test(tui): add question modal state tests (#32) * feat(tui): hide inline question options when modal is open (#32) Keep the question header and prompt visible in the transcript but skip the numbered options, tips, and click targets while the modal popup is handling selection. * chore: add regex dependency to nca-core (#34) * feat: add skill supporting file inlining (#34) * feat: add invoke_skill tool for dynamic skill loading (#34) * feat: add subagent skill indicator in sidebar and transcript (#34) * fix: security and stability fixes for skill invocation (#34) - Remove stale session_id from InvokeSkillTool (was not updated on session reset, causing events tagged to wrong session) - Block path traversal (../) in skill file reference resolution - Prevent AGENTS.md skills from leaking parent directory files via Level-2 fallback (only filesystem skills use catalog root fallback) - Detect invoke_skill phase in subagent activity for sidebar indicator - Add path traversal rejection test * fix: stop infinite tool retry loops after 3 consecutive failures (#34) When the same tool fails 3 times in a row (e.g., ask_question called with malformed inputs by a weaker model), the agent loop now stops and surfaces an error instead of retrying indefinitely. * feat: add skill_installer module with source parsing, lock file, install/remove (#36) * feat: expand nca skills to add/remove/update subcommands (#36) --------- Co-authored-by: Aris Setiawan <arissetia.m@gmail.com>
#41) * feat: enhance search and edit tools with structured results and precise editing - Updated `search_code` to return structured JSON match objects, improving search reliability and usability. - Introduced `replace_match` tool for precise edits based on search results, ensuring safer editing workflows. - Enhanced `edit_file` and `apply_patch` tools to reject ambiguous single-match edits, requiring explicit user intent for replacements. - Updated documentation to reflect new features and improved tool descriptions. * chore: update CI and release workflows to install additional system dependencies - Changed the step name from "Install OpenSSL" to "Install system dependencies" for clarity. - Added `ripgrep` to the list of installed packages in both CI and release workflows to enhance search capabilities.
* fix(tui): remove Esc key exit functionality and update input hints - Removed the Esc key functionality that allowed users to exit the application. - Updated the input hints to streamline user instructions by removing the Esc exit option. * fix(tui): update input hints and add Ctrl+Q exit functionality - Revised input hints to include the new Ctrl+Q exit command for improved user guidance. - Implemented Ctrl+Q key binding to allow users to exit the application, enhancing usability. * feat(tui): implement cancel functionality with Esc key and update busy state handling - Added cancel functionality to allow users to cancel ongoing operations using the Esc key when in specific busy states (Thinking, Streaming, ToolRunning). - Updated the TuiSessionState to handle the transition to Idle state when a run is cancelled. - Enhanced the run_blocking function to display a cancel hint in the UI, improving user experience during long-running tasks.
* feat(tui): enhance cancel functionality and update input hints - Improved cancel functionality to allow users to cancel ongoing operations using the Esc key in specific busy states (Thinking, Streaming, ToolRunning). - Updated TuiSessionState to transition to Idle state upon cancellation. - Enhanced run_blocking function to display a cancel hint in the UI for better user experience during long-running tasks. - Revised input hints to reflect the new cancel functionality and streamline user instructions. * docs: update README with comprehensive user documentation links - Expanded the documentation section in the README to include a detailed table of contents for user-facing documentation. - Added links to various guides covering installation, commands, configuration, providers, tools, sessions, permissions, skills, and advanced topics.
Bump workspace version from 0.2.0 to 0.3.0 across all crates and the install script. Remove Linux musl and ARM64 targets from the README that are not built by the release workflow. Made-with: Cursor
There was a problem hiding this comment.
16 issues found across 56 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="docs/plans/file-mention-preview-compaction.md">
<violation number="1" location="docs/plans/file-mention-preview-compaction.md:9">
P3: Malformed backtick formatting makes the fence example render incorrectly and unclear. Use a valid inline code span for the fence example.</violation>
</file>
<file name="crates/core/src/skills.rs">
<violation number="1" location="crates/core/src/skills.rs:475">
P1: The new AGENTS.md-skip heuristic in `resolve_skill_reference` is incorrect, so Level 2/3 fallback can resolve files outside the workspace root.</violation>
</file>
<file name="crates/core/src/tools/replace_match.rs">
<violation number="1" location="crates/core/src/tools/replace_match.rs:170">
P2: Reject columns that point past the end of the line body. With the current `>` check, `column == body.len() + 1` is accepted and can replace across the newline, which violates the "column starts within the line" contract.</violation>
</file>
<file name="crates/core/src/skill_installer.rs">
<violation number="1" location="crates/core/src/skill_installer.rs:52">
P2: Valid GitHub shorthand repos with `.` in the repo name are incorrectly rejected.</violation>
<violation number="2" location="crates/core/src/skill_installer.rs:234">
P1: Recursive copy follows directory symlinks without validation, which can traverse outside the source tree or recurse through cycles.</violation>
</file>
<file name="crates/common/src/message.rs">
<violation number="1" location="crates/common/src/message.rs:203">
P2: File-block compaction can stop at an internal code fence, so previews are malformed for files that contain ``` inside their contents.</violation>
</file>
<file name="crates/core/src/agent.rs">
<violation number="1" location="crates/core/src/agent.rs:137">
P2: Busy state can remain non-idle on error/cancel paths because Idle is only emitted on the success return path.</violation>
</file>
<file name="docs/documentation/sessions.md">
<violation number="1" location="docs/documentation/sessions.md:22">
P2: Session status value is documented as `failed`, but persisted JSON uses `error`. This can break automation that relies on the documented status string.</violation>
<violation number="2" location="docs/documentation/sessions.md:200">
P2: `auto_compact_on_finish` is documented under `[session]`, but runtime compaction behavior is keyed off `[memory].auto_compact_on_finish`. Users may configure the documented key and get no compaction.</violation>
</file>
<file name="docs/documentation/providers.md">
<violation number="1" location="docs/documentation/providers.md:9">
P2: The MiniMax default model/alias entries document `MiniMax-M2.7`, but the code defaults and built-in aliases are `MiniMax-M2.5`. Update the provider docs to match the actual defaults so users don’t configure the wrong model.</violation>
</file>
<file name="docs/superpowers/plans/2026-03-24-skill-supporting-files.md">
<violation number="1" location="docs/superpowers/plans/2026-03-24-skill-supporting-files.md:506">
P3: The expected test count is incorrect here; this task defines 5 `expanded_body` tests, not 4.</violation>
<violation number="2" location="docs/superpowers/plans/2026-03-24-skill-supporting-files.md:585">
P2: Use portable paths in verification commands; hardcoded absolute local paths make the plan fail for other developers.</violation>
</file>
<file name=".github/workflows/release.yml">
<violation number="1" location=".github/workflows/release.yml:7">
P1: The PR trigger is missing `types: [closed]`, so merged PRs won’t reliably satisfy the `pull_request.merged` gate and release jobs can be skipped.</violation>
</file>
<file name="crates/cli/src/main.rs">
<violation number="1" location="crates/cli/src/main.rs:1418">
P2: `skills update` will skip skills whose original directory name needed sanitization because the update path matches raw repo names against sanitized lock keys. Match against sanitized names to ensure updates work for those skills.</violation>
</file>
<file name="crates/core/src/tools/search.rs">
<violation number="1" location="crates/core/src/tools/search.rs:202">
P1: Missing `--` separator before positional arguments. If `pattern` starts with `-`, ripgrep will interpret it as a flag, causing incorrect behavior or errors. Move all option flags before the positional arguments and insert `--` to terminate flag parsing.</violation>
</file>
<file name="docs/documentation/skills.md">
<violation number="1" location="docs/documentation/skills.md:11">
P3: This line is incomplete: skill discovery also includes AGENTS.md and home-level skill directories. Update the wording so users don't miss those sources.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| .file_name() | ||
| .and_then(|n| n.to_str()) | ||
| .unwrap_or(""); | ||
| let is_likely_skill_subdir = |
There was a problem hiding this comment.
P1: The new AGENTS.md-skip heuristic in resolve_skill_reference is incorrect, so Level 2/3 fallback can resolve files outside the workspace root.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/core/src/skills.rs, line 475:
<comment>The new AGENTS.md-skip heuristic in `resolve_skill_reference` is incorrect, so Level 2/3 fallback can resolve files outside the workspace root.</comment>
<file context>
@@ -394,6 +438,139 @@ fn parse_permission_mode_str(raw: &str) -> Option<PermissionMode> {
+ .file_name()
+ .and_then(|n| n.to_str())
+ .unwrap_or("");
+ let is_likely_skill_subdir =
+ !skill_dir_name.is_empty() && skill_dir_name != "." && skill_directory != catalog_root;
+
</file context>
| if src_path.is_dir() { | ||
| copy_dir_recursive(&src_path, &dst_path)?; | ||
| } else { | ||
| std::fs::copy(&src_path, &dst_path) | ||
| .map_err(|e| format!("copy {}: {e}", src_path.display()))?; | ||
| } |
There was a problem hiding this comment.
P1: Recursive copy follows directory symlinks without validation, which can traverse outside the source tree or recurse through cycles.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/core/src/skill_installer.rs, line 234:
<comment>Recursive copy follows directory symlinks without validation, which can traverse outside the source tree or recurse through cycles.</comment>
<file context>
@@ -0,0 +1,588 @@
+ let entry = entry.map_err(|e| e.to_string())?;
+ let src_path = entry.path();
+ let dst_path = dst.join(entry.file_name());
+ if src_path.is_dir() {
+ copy_dir_recursive(&src_path, &dst_path)?;
+ } else {
</file context>
| if src_path.is_dir() { | |
| copy_dir_recursive(&src_path, &dst_path)?; | |
| } else { | |
| std::fs::copy(&src_path, &dst_path) | |
| .map_err(|e| format!("copy {}: {e}", src_path.display()))?; | |
| } | |
| let file_type = std::fs::symlink_metadata(&src_path) | |
| .map_err(|e| format!("metadata {}: {e}", src_path.display()))? | |
| .file_type(); | |
| if file_type.is_symlink() { | |
| continue; | |
| } else if file_type.is_dir() { | |
| copy_dir_recursive(&src_path, &dst_path)?; | |
| } else { | |
| std::fs::copy(&src_path, &dst_path) | |
| .map_err(|e| format!("copy {}: {e}", src_path.display()))?; | |
| } |
| pull_request: | ||
| branches: [main] |
There was a problem hiding this comment.
P1: The PR trigger is missing types: [closed], so merged PRs won’t reliably satisfy the pull_request.merged gate and release jobs can be skipped.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/release.yml, line 7:
<comment>The PR trigger is missing `types: [closed]`, so merged PRs won’t reliably satisfy the `pull_request.merged` gate and release jobs can be skipped.</comment>
<file context>
@@ -4,17 +4,74 @@ on:
push:
branches: [main]
tags: ["v*"]
+ pull_request:
+ branches: [main]
</file context>
| pull_request: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| types: [closed] |
| let mut cmd = tokio::process::Command::new("rg"); | ||
| cmd.arg("--no-heading") | ||
| .arg("--line-number") | ||
| cmd.arg("--json") |
There was a problem hiding this comment.
P1: Missing -- separator before positional arguments. If pattern starts with -, ripgrep will interpret it as a flag, causing incorrect behavior or errors. Move all option flags before the positional arguments and insert -- to terminate flag parsing.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/core/src/tools/search.rs, line 202:
<comment>Missing `--` separator before positional arguments. If `pattern` starts with `-`, ripgrep will interpret it as a flag, causing incorrect behavior or errors. Move all option flags before the positional arguments and insert `--` to terminate flag parsing.</comment>
<file context>
@@ -37,36 +163,299 @@ impl ToolExecutor for SearchCodeTool {
let mut cmd = tokio::process::Command::new("rg");
- cmd.arg("--no-heading")
- .arg("--line-number")
+ cmd.arg("--json")
.arg("--color=never")
- .arg(pattern)
</file context>
|
|
||
| let body = line_body(segment); | ||
| let byte_column = column - 1; | ||
| if byte_column > body.len() { |
There was a problem hiding this comment.
P2: Reject columns that point past the end of the line body. With the current > check, column == body.len() + 1 is accepted and can replace across the newline, which violates the "column starts within the line" contract.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/core/src/tools/replace_match.rs, line 170:
<comment>Reject columns that point past the end of the line body. With the current `>` check, `column == body.len() + 1` is accepted and can replace across the newline, which violates the "column starts within the line" contract.</comment>
<file context>
@@ -0,0 +1,296 @@
+
+ let body = line_body(segment);
+ let byte_column = column - 1;
+ if byte_column > body.len() {
+ return ToolResult {
+ call_id: call.id.clone(),
</file context>
| if byte_column > body.len() { | |
| if byte_column >= body.len() { |
|
|
||
| ```bash | ||
| mkdir -p .nca/skills/test-skill | ||
| cp /home/nst/Documents/superpower/skills/subagent-driven-development/SKILL.md .nca/skills/test-skill/ |
There was a problem hiding this comment.
P2: Use portable paths in verification commands; hardcoded absolute local paths make the plan fail for other developers.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/superpowers/plans/2026-03-24-skill-supporting-files.md, line 585:
<comment>Use portable paths in verification commands; hardcoded absolute local paths make the plan fail for other developers.</comment>
<file context>
@@ -0,0 +1,603 @@
+
+```bash
+mkdir -p .nca/skills/test-skill
+cp /home/nst/Documents/superpower/skills/subagent-driven-development/SKILL.md .nca/skills/test-skill/
+cp /home/nst/Documents/superpower/skills/subagent-driven-development/implementer-prompt.md .nca/skills/test-skill/
+cp /home/nst/Documents/superpower/skills/subagent-driven-development/spec-reviewer-prompt.md .nca/skills/test-skill/
</file context>
|
|
||
| let discovered = discover_skills_in_dir(&skills_path).map_err(anyhow::Error::msg)?; | ||
|
|
||
| if let Some((_, src_dir)) = discovered.iter().find(|(n, _)| n == &skill_name) { |
There was a problem hiding this comment.
P2: skills update will skip skills whose original directory name needed sanitization because the update path matches raw repo names against sanitized lock keys. Match against sanitized names to ensure updates work for those skills.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/cli/src/main.rs, line 1418:
<comment>`skills update` will skip skills whose original directory name needed sanitization because the update path matches raw repo names against sanitized lock keys. Match against sanitized names to ensure updates work for those skills.</comment>
<file context>
@@ -1274,6 +1329,120 @@ fn list_skills(config: &NcaConfig, workspace_root: &Path, json: bool) -> anyhow:
+
+ let discovered = discover_skills_in_dir(&skills_path).map_err(anyhow::Error::msg)?;
+
+ if let Some((_, src_dir)) = discovered.iter().find(|(n, _)| n == &skill_name) {
+ let dest = target.join(&skill_name);
+ copy_skill_dir(src_dir, &dest).map_err(anyhow::Error::msg)?;
</file context>
| if let Some((_, src_dir)) = discovered.iter().find(|(n, _)| n == &skill_name) { | |
| if let Some((_, src_dir)) = discovered.iter().find(|(n, _)| { | |
| n == &skill_name | |
| || nca_core::skill_installer::sanitize_skill_name(n) | |
| .ok() | |
| .as_deref() | |
| == Some(skill_name.as_str()) | |
| }) { |
|
|
||
| ## Implementation | ||
|
|
||
| - Add a shared preview compactor that rewrites expanded ````file:path` fences back to `@path`. |
There was a problem hiding this comment.
P3: Malformed backtick formatting makes the fence example render incorrectly and unclear. Use a valid inline code span for the fence example.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/plans/file-mention-preview-compaction.md, line 9:
<comment>Malformed backtick formatting makes the fence example render incorrectly and unclear. Use a valid inline code span for the fence example.</comment>
<file context>
@@ -0,0 +1,17 @@
+
+## Implementation
+
+- Add a shared preview compactor that rewrites expanded ````file:path` fences back to `@path`.
+- Use that compacted preview for user `MessageReceived` events.
+- Keep assistant/tool previews unchanged.
</file context>
|
|
||
| - [ ] **Step 4: Run tests to verify they pass** | ||
|
|
||
| Run: `cargo test -p nca-core expanded_body 2>&1 | tail -20` |
There was a problem hiding this comment.
P3: The expected test count is incorrect here; this task defines 5 expanded_body tests, not 4.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/superpowers/plans/2026-03-24-skill-supporting-files.md, line 506:
<comment>The expected test count is incorrect here; this task defines 5 `expanded_body` tests, not 4.</comment>
<file context>
@@ -0,0 +1,603 @@
+
+- [ ] **Step 4: Run tests to verify they pass**
+
+Run: `cargo test -p nca-core expanded_body 2>&1 | tail -20`
+Expected: all 4 tests pass
+
</file context>
|
|
||
| ## Skill Discovery | ||
|
|
||
| nca looks for skills in configured directories: |
There was a problem hiding this comment.
P3: This line is incomplete: skill discovery also includes AGENTS.md and home-level skill directories. Update the wording so users don't miss those sources.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/documentation/skills.md, line 11:
<comment>This line is incomplete: skill discovery also includes AGENTS.md and home-level skill directories. Update the wording so users don't miss those sources.</comment>
<file context>
@@ -0,0 +1,177 @@
+
+## Skill Discovery
+
+nca looks for skills in configured directories:
+
+```toml
</file context>
| nca looks for skills in configured directories: | |
| nca discovers skills from `AGENTS.md` and from the configured directories (resolved relative to the workspace and combined with `~/.nca/skills` and `~/.claude/skills` when HOME is set): |
Summary
Release v0.3.0 from
devtomain, covering all work since v0.2.0.New features
nca skillsCLI for discovering, installing, and managing skills;invoke_skilltool for agent-side skill invocationsearch_codereturns structured JSON results;replace_matchfor coordinate-targeted edits;edit_file/apply_patchfail loudly on ambiguous matches/stopcancels the current running turn mid-streamFixes
tokio::select!Chores
Pre-merge checks
cargo build --release— compiles cleanlycargo clippy --all-targets— zero warningscargo test— all 184 tests passcargo fmt --check— clean0.3.0in workspaceCargo.toml,Cargo.lock, andinstall.shMade with Cursor
Summary by cubic
Release v0.3.0 with a new skills system, safer search/edit tooling, and major TUI improvements. This release also adds cancel-in-progress, improves reliability, and ships comprehensive docs.
New Features
nca skillsCLI (list/add/remove/update) andinvoke_skilltool; inlines referenced files and loads from.nca/skillsand.claude/skills./stop).search_codereturns structured JSON matches;replace_matchenables precise edits;edit_file/apply_patchreject ambiguous replacements;query_symbolsuses literal symbol search.ripgrep.Bug Fixes
tokio::select!polling.Written for commit 0a23e33. Summary will update on new commits.