@meowshed/meow-flow

Runs the method's six steps from research to review, each refused by a native program until its input is approved, routes each request before work starts, drives the steps to the next approval gate with /meow-flow:run, and checks the record they write whe

Packages

Package details

extensionskill

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

$ pi install npm:@meowshed/meow-flow
Package
@meowshed/meow-flow
Version
0.54.1
Published
Oct 31, 2026
Downloads
1,105/mo · 250/wk
Author
retran
License
Apache-2.0
Types
extension, skill
Size
116.4 KB
Dependencies
0 dependencies · 5 peers
Pi manifest JSON
{
  "skills": [
    "skills"
  ],
  "extensions": [
    "extensions/flow.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-flow on Pi answers: what meow-flow provides, what it adds to a session and how to install it kind: reference describes: [@meowshed/meow-flow@0.54.1]

@meowshed/meow-flow

Runs the method's six steps from research to review, each refused by a native program until its input is approved, routes each request before work starts, drives the steps to the next approval gate with /meow-flow:run, and checks the record they write where .meowpaw/profile.toml declares it. Distributed as a Pi package.

Install it

pi install npm:@meowshed/meow-flow

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.

Upgrade a record from epics and tasks

Where your record holds epics/ or tasks/, every paw command but upgrade stops with one finding naming the upgrade, because a second working form would never retire. Type /meow-flow:upgrade, which runs the two commands below and stops between them for you to read what each will do.

paw upgrade                # previews each move and writes nothing
paw upgrade --write        # makes the moves

The upgrade moves epics/ and tasks/ to archive/epics/ and archive/tasks/, each file otherwise unchanged, and paw goes on reading them, so a citation still resolves. It stores done on each decision and defect whose tasks finished, because nothing can compute that once the marks are archived. It adds each open task as a step of the ## Plan of the live decision or defect that authorises it, and writes folded-into: on the task. It archives an open task with no live authority and reports it as needing a decision. It removes epic from [unattended] gates. It leaves a template you override under .meowpaw/templates/ for a retired kind alone and reports it. Run it again on a finished record and it says there is nothing to upgrade.

Review the result as one pull request with paw count before and after in its body. Once it merges, run meow-github upgrade to retire the archived tasks' issues, as meow-github's page says.

Declare where the record lives

Put it under [record] in .meowpaw/profile.toml at the repository's root:

[record]
root = "project"

root is relative to the repository's root, and it may lead outside it, to a folder or to another repository's checkout. Where you declare none, the record is at project/.

Each paw command that reads the record, except the session-start paw status --waiting, prints the profile's state on standard error, profile: absent, profile: unparseable or profile: parsed, and then unknown key: <path> for each key no unit reads. It goes to standard error because standard output is what a step reads, such as a template or an identifier. An unparseable profile stops the command with the parser's message, and an unknown key changes no exit status.

Declare your own kinds

Declare a kind of artifact the harness doesn't ship under [record.kinds.<name>] in the same profile, and paw check holds its files to the same rules as the built-in kinds:

[record.kinds.narrative]
prefix = "NAR"
lifetime = "record"
template = ".meowpaw/templates/narrative.md"
outranks = ["research"]

prefix, lifetime and template are required. lifetime is record, which freezes a file on approval, or living, which you rewrite freely. template is a path under .meowpaw/templates/ to a file that exists. Files of the kind sit in a directory named for the kind under the record's root, as project/narrative/NAR-0001-<slug>.md, with the front matter every artifact carries: id, artifact (the kind's name), status and revised. paw check reports a declaration that lacks one of the three, a template that doesn't exist and a prefix another kind uses. A key that would turn an obligation off, such as frozen = false, is an unknown key, because a declared kind is never exempt from the method. paw index writes no index for a declared kind.

outranks is optional. Where two artifacts of kinds in that order cite each other and state different values for a field of their own, paw check reports the pair in relations, naming both files and the order. It doesn't choose between them, and the fields every artifact carries and the relations are left out of the comparison, because they describe the artifact and not what it claims.

Have a change reviewed

The review step reads the record's pull request. Where the session wrote the change, it sends the difference to an agent with read-only tools and fixes what the agent finds in that pull request. It reports each test that would still pass against a wrong implementation. Where the agent reports BLOCKED, because a tool it needed was denied, the step reports the review as not run, and doesn't resume the agent, send another under the same permissions or review the change itself. No agent reviews a record: you read it when you approve its pull request.

The implement step hands work to another agent only to keep its own context clean or to run independent tracks at once, never because the work is large. It gives that agent the output of paw brief <record>, and declares isolation: worktree where agents implement in parallel. A fresh agent, never a fork of the session that did the work, reviews delegated work, and a third fresh agent settles a disagreement between the two, given both positions and the brief. The pull request names the record and paw brief <record>, and names no agent, model or vendor.

Write a status change in one command

A status change that touches several files is one command, so none of the files is left out:

paw approve <id>...                      # draft to approved, where `paw check` reports nothing about it
paw done <record> --pr <number>          # done and `pr:` on a decision or defect, in the pull request that completes it
paw withdraw <requirement> --by <decision> --replaced-by <id>...

approve writes nothing and exits 1 where the check has a finding about a record you named. done refuses a record that isn't approved, a decision that addresses work with no plan, and a defect whose Closed by names no check. withdraw writes the tombstone, the status and today's date. Each command changes only the lines it owns and regenerates the index of each kind it touched, and a result passes paw check without the command, so you can still edit a record in your editor.

Postpone requirements

A decision can postpone requirements you choose not to realise now. Give it postpones: [REQ-...] beside or in place of addresses:, and say under What would reverse it when they should be taken up. The requirements then read as postponed in show and status, and stop reading as postponed once a later decision closes them. A decision that only postpones needs no plan. paw status lists every postponement under Postponed with its condition, the first entry under the decision's What would reverse it, so you see them on each run.

Tools

The researcher agent holds four tools, each for one step of its procedure:

  • Read: step 1 reads the primary sources the brief names.
  • Grep: step 1 finds where a source lives where the brief names no path.
  • Glob: step 1 lists the paths that match a name the brief gives.
  • WebFetch: step 1 reads a source the brief names by its address.

Hooks

status --waiting stops nothing: at the start of a session it reports what waits at a gate, so the model sees a pending approval before it replies.

Where it reads the record

The layout it reads each kind by is packages/meow-flow/lib/layout.toml.

Commands

Each command sends its skill's instructions into the session, so the step runs: the six step commands load the method skill, /meow-flow:run the driver skill, and /meow-flow:init, /meow-flow:onboard and /meow-flow:upgrade their own. Type the command and its arguments, and the model carries out what the skill says.

The researcher's nested call picks the model the MEOW_NESTED_MODEL environment variable names before any other, so you choose what the draft costs: it runs on glm 5.3 flash where the variable names nothing.