Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/onboarding_issue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ body:
- Installation (Homebrew / cargo / binary download)
- First run (`nono run` returned an error immediately)
- Writing or loading a profile (JSON)
- Using a built-in profile (e.g. `--profile always-further/claude`)
- Using a built-in profile (e.g. `--profile nolabs-ai/claude`)
- nono ran but didn't seem to enforce anything
- Something else (describe below)
validations:
Expand All @@ -29,7 +29,7 @@ body:
attributes:
label: What happened?
description: What did you try, and what went wrong?
placeholder: "I followed the quickstart and ran `nono run --profile always-further/claude -- claude` but got..."
placeholder: "I followed the quickstart and ran `nono run --profile nolabs-ai/claude -- claude` but got..."
validations:
required: true

Expand Down
19 changes: 16 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ Search for an agent in the registry, then run it:

```bash
$ nono search opencode
always-further/opencode - Official Opencode Plugin
nolabs-ai/opencode - Official Opencode Plugin

$ nono run --profile always-further/opencode -- opencode
$ nono run --profile nolabs-ai/opencode -- opencode
```

That's it. `opencode` now runs with read/write access to the current directory and **nothing else** — your SSH keys, your cloud credentials, the rest of your disk are invisible to it.
Expand All @@ -77,7 +77,7 @@ Profiles for all the popular agents live at [registry.nono.sh](https://registry.
Outgrow the defaults? Scaffold a profile and tweak it — same command you already know:

```bash
nono profile init opencode --extends always-further/opencode
nono profile init opencode --extends nolabs-ai/opencode
nono run --profile opencode -- opencode
```

Expand Down Expand Up @@ -148,6 +148,19 @@ The policy lives in the profile, not in the prompt. The agent can ask for a tool

Read more in [Sandboxed Tool Execution](https://nono.sh/docs/cli/features/tool-sandbox).

## Migrating from `always-further/` packs

All official packs have moved from the `always-further` namespace to `nolabs-ai`. To migrate
cleanly, remove the old pack first so its wiring is torn down, then pull the new one:

```bash
nono remove always-further/<pack>
nono pull nolabs-ai/<pack>
```

Pulling the new pack without removing the old one can leave stale wiring from the previous
namespace in place (symlinks, plugin registrations, etc.).

## Ready to go deep?

Head over to the [docs](https://nono.sh/docs) and discover nono's rich composable policy system, credentials injection, L7 filtering, supply chain security, rollback, multiplexing, audit and more.
Expand Down
24 changes: 17 additions & 7 deletions crates/nono-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ nono run --allow ./project-a --allow ./project-b -- command
# Block network access
nono run --allow-cwd --block-net -- command

# Use a pack profile (requires: nono pull always-further/claude)
nono run --profile always-further/claude -- claude
# Use a pack profile (requires: nono pull nolabs-ai/claude)
nono run --profile nolabs-ai/claude -- claude

# Use a built-in profile
nono run --profile always-further/opencode -- opencode
nono run --profile nolabs-ai/opencode -- opencode

# Keep a profile but temporarily allow unrestricted network
nono run --profile always-further/claude --allow-net -- claude
nono run --profile nolabs-ai/claude --allow-net -- claude

# Start an interactive shell inside the sandbox
nono shell --allow .
Expand Down Expand Up @@ -85,14 +85,24 @@ Precedence is: CLI flag, then `NONO_THEME`, then config file, then the default `

| Profile | Install | Command |
|---------|---------|---------|
| Claude Code | `nono pull always-further/claude` | `nono run --profile always-further/claude -- claude` |
| Codex | `nono pull always-further/codex` | `nono run --profile always-further/codex -- codex` |
| Claude Code | `nono pull nolabs-ai/claude` | `nono run --profile nolabs-ai/claude -- claude` |
| Codex | `nono pull nolabs-ai/codex` | `nono run --profile nolabs-ai/codex -- codex` |

> **Migrating from `always-further/` packs?**
> Packs were moved from the `always-further` namespace to `nolabs-ai`. To cleanly migrate,
> remove the old pack first so its wiring is torn down, then pull the new one:
> ```bash
> nono remove always-further/<pack>
> nono pull nolabs-ai/<pack>
> ```
> Just pulling the new pack without removing the old one can leave stale wiring from the
> previous namespace in place.

### Built-in profiles

| Profile | Command |
|---------|---------|
| OpenCode | `nono run --profile always-further/opencode -- opencode` |
| OpenCode | `nono run --profile nolabs-ai/opencode -- opencode` |
| OpenClaw | `nono run --profile openclaw -- openclaw gateway` |
| Swival | `nono run --profile swival -- swival` |

Expand Down
20 changes: 10 additions & 10 deletions crates/nono-cli/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ pub enum Commands {
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono run --allow . claude # Read/write current dir, run claude
nono run --profile always-further/claude claude # Use a profile
nono run --profile always-further/claude --allow-domain api.openai.com claude
nono run --profile nolabs-ai/claude claude # Use a profile
nono run --profile nolabs-ai/claude --allow-domain api.openai.com claude
# Restrict outbound access to listed domains
nono run --read ./src --write ./output cargo build
# Separate read/write permissions
Expand All @@ -156,7 +156,7 @@ pub enum Commands {
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono shell --allow . # Shell with read/write to current dir
nono shell --profile always-further/claude # Use a named profile
nono shell --profile nolabs-ai/claude # Use a named profile
nono shell --allow . --shell /bin/zsh # Override shell binary
")]
Shell(Box<ShellArgs>),
Expand Down Expand Up @@ -558,9 +558,9 @@ IN-BAND DETACH:
{all-args}
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono pull always-further/claude
nono pull always-further/claude@1.2.0 --registry http://localhost:3000
nono pull always-further/claude --init
nono pull nolabs-ai/claude
nono pull nolabs-ai/claude@1.2.0 --registry http://localhost:3000
nono pull nolabs-ai/claude --init
")]
Pull(PullArgs),

Expand All @@ -574,7 +574,7 @@ IN-BAND DETACH:
{all-args}
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono remove always-further/claude
nono remove nolabs-ai/claude
")]
Remove(RemoveArgs),

Expand All @@ -589,7 +589,7 @@ IN-BAND DETACH:
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono update
nono update always-further/claude
nono update nolabs-ai/claude
nono update --dry-run
nono update --force # also update pinned packs
")]
Expand Down Expand Up @@ -635,7 +635,7 @@ IN-BAND DETACH:
{all-args}
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono pin always-further/claude
nono pin nolabs-ai/claude
")]
Pin(PinArgs),

Expand All @@ -649,7 +649,7 @@ IN-BAND DETACH:
{all-args}
{after-help}")]
#[command(after_help = "\x1b[1mEXAMPLES\x1b[0m
nono unpin always-further/claude
nono unpin nolabs-ai/claude
")]
Unpin(UnpinArgs),

Expand Down
2 changes: 1 addition & 1 deletion crates/nono-cli/src/legacy_cleanup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//! Pre-0.43 installs wrote `~/.claude/hooks/nono-hook.sh` and patched
//! `~/.claude/settings.json::hooks` with one matching command entry.
//! Post-0.43 the integration ships as a registry pack
//! (`always-further/claude`) with its own marketplace-based plugin
//! (`nolabs-ai/claude`) with its own marketplace-based plugin
//! install. If the legacy state isn't removed, Claude Code runs both —
//! duplicate hook execution at best, broken behaviour if the legacy
//! `nono-hook.sh` references binaries the current nono no longer ships.
Expand Down
2 changes: 1 addition & 1 deletion crates/nono-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ mod tests {
let helper = Cli::parse_from([
"nono",
"pack-update-hint-helper",
"always-further/claude",
"nolabs-ai/claude",
"1.0.0",
]);
assert!(!allows_pre_exec_update_check(&helper.command));
Expand Down
16 changes: 8 additions & 8 deletions crates/nono-cli/src/migration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ const LEARN_MORE_URL: &str = "https://github.com/nolabs-ai/nono/discussions/780"
const OFFICIAL_PACKS: &[OfficialPack] = &[
OfficialPack {
profile_name: "claude",
namespace: "always-further",
namespace: "nolabs-ai",
pack_name: "claude",
description: Some("Anthropic Claude Code sandbox profile + plugin"),
installs_summary: Some("sandbox profile + Claude Code plugin (hooks, skill)"),
Expand All @@ -52,24 +52,24 @@ const OFFICIAL_PACKS: &[OfficialPack] = &[
// renamed to `claude` so it matches the pack name. Once the pack
// is installed, the resolver also accepts `claude-code` via the
// artifact's `aliases` field. This entry only matters for users
// who type `--profile always-further/claude` *before* the pack is installed.
// who type `--profile nolabs-ai/claude` *before* the pack is installed.
OfficialPack {
profile_name: "claude-code",
namespace: "always-further",
namespace: "nolabs-ai",
pack_name: "claude",
description: Some("Anthropic Claude Code (legacy profile name; canonical is `claude`)"),
installs_summary: Some("sandbox profile + Claude Code plugin (hooks, skill)"),
},
OfficialPack {
profile_name: "codex",
namespace: "always-further",
namespace: "nolabs-ai",
pack_name: "codex",
description: Some("OpenAI Codex CLI sandbox profile + plugin"),
installs_summary: Some("sandbox profile + Codex plugin (hooks, skill)"),
},
OfficialPack {
profile_name: "opencode",
namespace: "always-further",
namespace: "nolabs-ai",
pack_name: "opencode",
description: Some("OpenCode AI coding assistant sandbox profile + plugin"),
installs_summary: Some("sandbox profile + OpenCode plugin (hooks, skill)"),
Expand Down Expand Up @@ -166,7 +166,7 @@ pub fn check_and_run(profile_name: &str) -> Result<MigrationOutcome> {
}

fn is_claude_pack(provider: &ProfileProvider) -> bool {
provider.namespace == "always-further" && provider.name == "claude"
provider.namespace == "nolabs-ai" && provider.name == "claude"
}

fn official_pack_for(profile_name: &str) -> Option<&'static OfficialPack> {
Expand Down Expand Up @@ -312,7 +312,7 @@ mod tests {

#[test]
fn registry_ref_skips_migration() {
assert!(is_path_or_registry_ref("always-further/claude"));
assert!(is_path_or_registry_ref("nolabs-ai/claude"));
assert!(is_path_or_registry_ref("./local.json"));
assert!(is_path_or_registry_ref("path/to/profile.json"));
assert!(!is_path_or_registry_ref("claude-code"));
Expand Down Expand Up @@ -345,7 +345,7 @@ mod tests {
.expect("claude-code")
.as_provider();
assert_eq!(canonical.pack_ref(), legacy.pack_ref());
assert_eq!(canonical.pack_ref(), "always-further/claude");
assert_eq!(canonical.pack_ref(), "nolabs-ai/claude");
}

#[test]
Expand Down
6 changes: 3 additions & 3 deletions crates/nono-cli/src/pack_update_hint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -331,8 +331,8 @@ mod tests {
#[test]
fn refresh_helper_args_round_trip() {
let stale = vec![
("always-further/claude".to_string(), "1.0.0".to_string()),
("always-further/codex".to_string(), "2.3.4".to_string()),
("nolabs-ai/claude".to_string(), "1.0.0".to_string()),
("nolabs-ai/codex".to_string(), "2.3.4".to_string()),
];

let args = refresh_helper_args(&stale);
Expand All @@ -342,7 +342,7 @@ mod tests {

#[test]
fn refresh_helper_args_reject_odd_values() {
assert!(parse_refresh_helper_args(vec!["always-further/claude".to_string()]).is_none());
assert!(parse_refresh_helper_args(vec!["nolabs-ai/claude".to_string()]).is_none());
}

#[test]
Expand Down
4 changes: 2 additions & 2 deletions crates/nono-cli/src/package_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ pub fn run_pull(args: PullArgs) -> Result<()> {
// pack (here, not via `migration::check_and_run`), also offer to
// strip pre-0.43 inbuilt-hook leftovers. Idempotent — silent no-op
// on a clean install. Mirrors the cleanup hook in `check_and_run`
// so power users who skip `--profile always-further/claude` don't end up with
// so power users who skip `--profile nolabs-ai/claude` don't end up with
// both legacy and pack hooks firing.
if package_ref.namespace == "always-further" && package_ref.name == "claude" {
if package_ref.namespace == "nolabs-ai" && package_ref.name == "claude" {
crate::legacy_cleanup::check_and_offer_cleanup()?;
}

Expand Down
Loading
Loading