@meowshed/meow-unattended

Prints the posture an unattended run is held to from the [unattended] table a repository declares: the permission mode, the gates the run may decide, its release command and whether it may amend an approved record, with each deny rule and what the rules d

Packages

Package details

extension

Install @meowshed/meow-unattended from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@meowshed/meow-unattended
Package
@meowshed/meow-unattended
Version
0.7.1
Published
Oct 31, 2026
Downloads
519/mo · 242/wk
Author
retran
License
Apache-2.0
Types
extension
Size
8.6 KB
Dependencies
0 dependencies · 5 peers
Pi manifest JSON
{
  "extensions": [
    "extensions/bin.ts"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README


reader: someone installing or running meow-unattended on Pi answers: what meow-unattended provides, what it adds to a session and how to install it kind: reference describes: [@meowshed/meow-unattended@0.7.1]

@meowshed/meow-unattended

Prints the posture an unattended run is held to from the [unattended] table a repository declares: the permission mode, the gates the run may decide, its release command and whether it may amend an approved record, with each deny rule and what the rules don't stop. It writes nothing, starts nothing and keeps nothing in context on every turn. Distributed as a Pi package.

Install it

pi install npm:@meowshed/meow-unattended

The paw executable ships with @meowshed/meow-core alone (REQ-4612): this package's launchers run their subcommands through it, so install the core package beside this one for the binary-backed checks. Without it, every check reports unrun and lets the command through.

pi install npm:@meowshed/meow-core   # carries the binary the launchers run

Installing from this repository's checkout is the development install: it loads the package in place and runs no lifecycle script.

Declare the posture

A run's authority comes from this table and never from what a session would default to:

[git]
trunk = "main"

[unattended]
permission_mode = "dontAsk"
gates = ["review", "merge"]
release = false
amend_approved = false
Key Holds Where it's absent
permission_mode The mode the session must be in: one of dontAsk, acceptEdits or auto unresolved, exit 3
gates The gates the run may decide, each a step of the chain or merge; an empty list decides none unresolved, exit 3
release The release command, run from the repository's root once after a merge, or false for none unresolved, exit 3
amend_approved Whether the run may edit an approved requirement or decision in place, which the record forbids false

The start command checks permission_mode against the mode the session is in and refuses a mismatch with both modes named, because a run can't change the session's mode and a mode it didn't declare is a posture nobody chose. bypassPermissions is refused. release = false declares that the repository has no release, and the run then releases nothing. [git] trunk has to be declared, because the push rule needs a branch to protect.

Print it

Run the launcher by its path in the installed unit, from the repository:

meow-unattended plan

It exits 0 for a resolved posture, 3 for an unresolved one and 2 for a usage error, and it reports every refusal it finds before it exits, so one run names every key a repository has to fix.

What the deny rules don't stop

A Bash deny matches the command's text, so a push hidden in a script passes it. A merge through the code host's interface needs no push, so no deny rule stops it, and the checks the run makes before a merge hold it. A new record whose front matter supersedes or withdraws an approved one retires it without editing its file, so no deny rule stops that either.

What it reports instead of a plan

Each refusal is a line starting unresolved: and the exit status is 3:

State Reported as
No profile, or no [unattended] table unresolved: no [unattended] table in .meowpaw/profile.toml
The profile isn't valid TOML unresolved: the profile doesn't parse: <reason>
A required key is missing unresolved: [unattended] <key> is not declared, once for each
permission_mode is bypassPermissions or not listed unresolved: [unattended] permission_mode <value> is refused
A gate outside the steps and merge unresolved: [unattended] gates names <value>, which is not a gate
gates isn't a list of strings unresolved: [unattended] gates <value> is not a list of strings
release is neither a string nor false unresolved: [unattended] release <value> is not a command or false
amend_approved isn't true or false unresolved: [unattended] amend_approved <value> is not true or false
The profile declares no [git] trunk unresolved: [git] trunk is not declared, so the push rule has no trunk

On a machine where the core unit's binary isn't found, the launcher reports that and names meow-core, which ships the shared binary.

What it costs you

The unit ships no skill, so it keeps nothing in context on every turn, and its budget states zero characters. It runs the shared binary that meow-core ships, and needs git on the machine.

Read a subcommand's help

meow-unattended --help lists the subcommands, and meow-unattended <subcommand> --help names what it determines, what you read to reach the same answer without the tool, and the first word of each kind of line it prints. A test holds each subcommand's output to those words.