Best for
- Use when deploying patterns via FUSE, working with Activity Logs, Annotations, or coordinating agent workflows that read/write pieces through the filesystem.
commontoolsinc/labs/skills/fuse-agent/SKILL.md
Agent-specific interaction patterns for working with FUSE-mounted spaces. Use when deploying patterns via FUSE, working with Activity Logs, Annotations, or coordinating agent workflows that read/write pieces through the filesystem. Triggers include "deploy a pattern", "log an event", "create annotation", "agent workflow", or managing piece lifecycle via FUSE.
Decision brief
Patterns for agents that interact with FUSE-mounted Common Fabric spaces. For FUSE mounting, filesystem layout, and low-level read/write mechanics, see the fuse-workflow skill.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/commontoolsinc/labs --skill "skills/fuse-agent"Inspect the Agent Skill "fuse-agent" from https://github.com/commontoolsinc/labs/blob/b0ff67d2dde1812680849aa2373df1f49b6faa2f/skills/fuse-agent/SKILL.md at commit b0ff67d2dde1812680849aa2373df1f49b6faa2f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
cf piece step --piece $ID --space SPACE
When in doubt after a FUSE handler call: run cf piece step --piece $ID --space SPACE, then re-read pieces.json.
bash cd /code/labs export CFIDENTITY=./shared.key CFAPIURL=http://localhost:8000
ID=$(cf piece new packages/patterns/.tsx \ --space SPACE --root packages/patterns 2/dev/null | head -1)
cf piece call --quiet --piece $ID --space SPACE setTitle -- --value "My Title"
Permission review
The documentation includes network, browsing, or remote request actions.
export CF_IDENTITY=./shared.key CF_API_URL=http://localhost:8000The documentation includes network, browsing, or remote request actions.
"repository": "https://github.com/commontoolsinc/labs",Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 90/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 37 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Patterns for agents that interact with FUSE-mounted Common Fabric spaces. For
FUSE mounting, filesystem layout, and low-level read/write mechanics, see the
fuse-workflow skill.
cd ~/code/labs
export CF_IDENTITY=./shared.key CF_API_URL=http://localhost:8000
# 1. Deploy and capture piece ID
ID=$(cf piece new packages/patterns/<path>.tsx \
--space SPACE --root packages/patterns 2>/dev/null | head -1)
# 2. Set title
cf piece call --quiet --piece $ID --space SPACE setTitle -- --value "My Title"
# 3. Step to materialise
cf piece step --piece $ID --space SPACE
# 4. Re-read pieces.json immediately — stale after deploy
cat "MOUNT/SPACE/pieces/pieces.json"
Pattern index: cat ~/code/labs/packages/patterns/index.md
After deploying a structural piece:
pieces.json — get the current name with count suffix.handlers — discover available operations, never assume schemaresult/summarypieces/pieces.json and each piece's meta.json expose patternRef:
{
"identity": "<content-hash>",
"symbol": "default",
"source": {
"ref": "cf:pattern:<content-hash>",
"repository": "https://github.com/commontoolsinc/labs",
"entry": "/packages/patterns/annotation.tsx"
}
}
The prefix-free identity + symbol are the authoritative reference to the
running artifact (cf:module/<identity>#<symbol> in display form). source.ref
addresses the immutable source closure; source.repository is an optional,
explicitly supplied repository locator; source.entry is its optional authored
entry path; and source.origin is optional update provenance. For pattern-kind
discovery, match the entry filename and fall back to the origin path when the
entry is absent; do not infer it from the piece's mutable display name.
Every handler call that changes piece state updates the count suffix in the
name: Reading List (0) -> Reading List (1) -> Reading List (2)
All previously constructed FUSE paths are immediately invalid. Before every handler call:
# Find current name dynamically:
cat "MOUNT/SPACE/pieces/pieces.json" | python3 -c \
"import json,sys; p=json.load(sys.stdin); print(next(x['name'] for x in p if 'Reading' in x['name']))"
cf piece step| Operation | Step needed? |
|---|---|
cf piece call (CLI) | Always |
cf piece set (CLI) | Always |
| FUSE handler invocation | Sometimes — if count suffix doesn't update |
Read/Write/Edit on index.md | Never |
When in doubt after a FUSE handler call: run
cf piece step --piece $ID --space SPACE, then re-read pieces.json.
macOS logs nfs server fuse-t: not responding / is alive again under agent
load. Reads stall during the window.
# Detect: mount is stale if this hangs or returns empty
ls /tmp/cf-mount/
# Remount:
cf fuse mount /tmp/cf-mount --background
--background waits until the daemon reports it has mounted, so no delay is
needed after it. It exits non-zero if the child dies during startup, or if the
child does not report readiness within about 20 seconds.
If reads still stall, read the mount status rather than waiting:
cat /tmp/cf-mount/.status
connection.disconnected — the transport is dead. Remount; waiting does not
recover it.rebuilds.pending — a subtree is still rebuilding. Those reads settle on
their own.--attrcache-timeout 0 or --noattrcache; remount with the
default of 1. Neither option applies on Linux or macFUSE.Long-running FUSE mounts (24h+) can lose their backend transport. Symptom: all writes appear to succeed (no error), but values don't persist — cells stay empty or revert. The FUSE process is still running but useless.
Diagnose:
tail -20 /tmp/ct-fuse-<mount-name>.log
# Look for: "ConnectionError: memory/v2 transport closed"
Fix: Kill and remount. Remount before each experiment run to be safe.
Agent handlers (markIdle.handler, appendLearned.handler, etc.) will also
fail silently with a dead transport — the handler appears to execute but no
state changes. If agents report "learned" entries that don't show up in
input/learned, check the transport first.
The pattern sandbox gates the ambient intrinsics Date.now(), no-argument
new Date(), and Math.random(). They are allowed inside a handler (the
clock coarsened to one-second resolution; entropy passes through) and throw a
TimeCapabilityError in a lift/computed or at pattern-body level. Call the
built-ins directly — they are not importable helpers.
// Inside a handler.
const now = Date.now();
const iso = new Date(now).toISOString();
const id = `${now.toString(36)}-${Math.random().toString(36).slice(2, 11)}`;
This specifically matters for:
activity-log.tsx event creation / timestampsagent.tsx lifecycle handlers (markIdle, markError)For event IDs in authored patterns, Math.random() is fine inside a handler:
// Inside a handler.
const now = Date.now();
const id = `${now.toString(36)}-${Math.random().toString(36).slice(2, 11)}`;
const timestamp = new Date(now).toISOString();
For reactive time in a computed, read the live clock with the interval #now/N
wish rather than calling Date.now() (bare #now is a frozen first-load
capture, not a clock).
If a handler fails with messages like:
secure mode Calling new %SharedDate%() with no arguments throwssecure mode %SharedMath%.random() throwsTimeCapabilityErrorcheck the pattern source — the clock/entropy call may be running in a lift/computed or at pattern-body level rather than inside a handler.
The Activity Log (packages/patterns/activity-log/activity-log.tsx) is a
structured event stream for recording agent actions. Log events incrementally as
you work — not in one batch at the end.
Calling logEvent.handler:
# Get current name first — count suffix changes with every event
LOG_NAME=$(cat "MOUNT/SPACE/pieces/pieces.json" | python3 -c \
"import json,sys; p=json.load(sys.stdin); \
print(next(x['name'] for x in p if 'Activity Log' in x['name']))")
"MOUNT/SPACE/pieces/$LOG_NAME/result/logEvent.handler" \
--agent "deployer" \
--action "deployed" \
--piece-name "Contact Book" \
--note "Contacts mentioned in standup notes with no structured tracking"
# Note: handler CLIs expose object fields as kebab-case flags (`piece-name`),
# not camelCase (`pieceName`). `--help` on the handler shows the exact flags.
# When in doubt, prefer `--json` / `--json-file` to avoid flag-name mismatches.
# Re-read pieces.json after — name changes on every event
Input fields (all string, all optional except agent and action):
| Field | Type | Example |
|---|---|---|
agent | string | "deployer" |
action | string | "deployed", "populated", "linked" |
pieceName | string? | "Contact Book" |
note | string? | one-line detail |
Read log state (after any agent has run):
cat "MOUNT/SPACE/pieces/Activity Log (N)/result/summary"
# -> last 20 events as plain text, newest at bottom
Annotations (annotation.tsx) are pieces that record observations, flags, and
wishes. Use them to leave notes about things noticed without necessarily acting.
Deploy and configure via CF CLI:
ID=$(cf piece new packages/patterns/annotation.tsx \
--space SPACE --root packages/patterns 2>/dev/null | head -1)
echo '"Standup notes mention 5 people with no structured contact list"' \
| cf piece set --piece $ID content --space SPACE
echo '"wish"' | cf piece set --piece $ID kind --space SPACE
cf piece step --piece $ID --space SPACE
# Re-read pieces.json — name now reflects content: "Standup notes mention..."
Kind values: "note" | "todo" | "wish"
Status values: "open" | "in-progress" | "resolved" | "dismissed"
When to use each kind:
"note" — record an observation without acting: "3 standup entries reference
a project that has no piece""wish" — request for another agent or a future pass: "Deploy a Calendar
pattern — there are 4 dated events in the Work Journal""todo" — flag incomplete work: "Contact Book has 3 entries with no email
address"Mark a wish resolved (when fulfilling another agent's annotation):
echo '"resolved"' | cf piece set --piece $WISH_ID status --space SPACE
cf piece step --piece $WISH_ID --space SPACE
Discover open annotations — deploy annotation-manager.tsx for an
aggregated view, or query pieces.json directly:
cat "MOUNT/SPACE/pieces/pieces.json" | python3 -c "
import json, sys
p = json.load(sys.stdin)
for x in p:
ref = x.get('patternRef', {})
source = ref.get('source', {}) if isinstance(ref, dict) else {}
locator = (source.get('entry') or source.get('origin', '')) if isinstance(source, dict) else ''
if locator.rsplit('/', 1)[-1] == 'annotation.tsx':
print(x['name'], '—', x.get('summary','')[:60])
"
packages/patterns/agent/agent.tsx)Each agent is a piece in the space with its own cells for directive, learned state, and lifecycle. Deploy one per agent in the space.
MOUNT/SPACE/pieces/🤖 Deployer/
result/
summary ← "Deployer: last run summary" or "Deployer (no runs yet)"
markRunning.handler ← call at start of run (auto-logs to Activity Log)
markIdle.handler ← call when done: --summary "what you did"
markError.handler ← call on failure: --summary "what went wrong"
appendLearned.handler ← append a learning: --entry "today I learned X"
setDirective.handler ← update directive: --value "new directive text"
setLearned.handler ← replace all learned: --value "full learned text"
input/
agentName ← raw text: "Deployer"
directive ← raw text: the agent's full directive/instructions
enabled ← raw text: "true" or "false"
learned ← raw text: accumulated learnings
status ← raw text: "idle" | "running" | "error"
lastRun ← raw text: ISO timestamp of last run
lastRunSummary ← raw text: summary from last markIdle/markError
.handlers
meta.json
Important: Always re-resolve the piece name before each handler call. Piece
name suffixes can change after handler invocations (e.g. Counter-1 becomes
Counter-2), so a stale $AGENT_NAME will target a non-existent path.
# Helper function: resolve current piece name (call before each handler use)
resolve_agent() {
cat "MOUNT/SPACE/pieces/pieces.json" | python3 -c \
"import json,sys; p=json.load(sys.stdin); \
print(next(x['name'] for x in p if 'Deployer' in x['name']))"
}
# 1. Read your directive
AGENT_NAME=$(resolve_agent)
cat "MOUNT/SPACE/pieces/$AGENT_NAME/input/directive"
# 2. Mark running (auto-logs "started" to Activity Log)
AGENT_NAME=$(resolve_agent)
"MOUNT/SPACE/pieces/$AGENT_NAME/result/markRunning.handler"
# 3. Do your work...
# Log individual actions to Activity Log as you go (see Activity Log section)
# 4. Record learnings
AGENT_NAME=$(resolve_agent)
"MOUNT/SPACE/pieces/$AGENT_NAME/result/appendLearned.handler" \
--entry "2026-04-07: Calendar addEvent throws pattern-load-error but succeeds"
# 5. Mark idle when done (auto-logs "completed" to Activity Log)
AGENT_NAME=$(resolve_agent)
"MOUNT/SPACE/pieces/$AGENT_NAME/result/markIdle.handler" \
--summary "Deployed Contact Book and Calendar, left 2 wishes for Populator"
# Or on error:
AGENT_NAME=$(resolve_agent)
"MOUNT/SPACE/pieces/$AGENT_NAME/result/markError.handler" \
--summary "FUSE mount unresponsive: .status reports transport disconnected"
markRunning, markIdle, and markError automatically log to the Activity Log
via wish("#activity-log"). You still log individual actions (deploys,
populates, links) manually — the lifecycle handlers just record start/stop.
cat "MOUNT/SPACE/pieces/pieces.json" | python3 -c "
import json, sys
p = json.load(sys.stdin)
for x in p:
ref = x.get('patternRef', {})
source = ref.get('source', {}) if isinstance(ref, dict) else {}
locator = (source.get('entry') or source.get('origin', '')) if isinstance(source, dict) else ''
if locator.rsplit('/', 1)[-1] == 'agent.tsx':
print(x['name'], '—', x.get('summary','')[:60])
"
cf piece rm --piece $ID --space SPACE
Use this to clean up duplicate pieces deployed by accident (no --confirm
needed). Check pieces.json for orphaned pieces with -2 or -3 suffixes.
Alternatives
JasonColapietro/suede-creator-skills
Suede-owned Instagram growth operating system for account-specific audits, Reels, carousels, Stories, conversion mapping, calendars, and daily candidate-production loops. Use when the user names Instagram, IG, Reels, Stories, asks to analyze recent posts, grow a handle, run a daily workflow, create or repurpose Instagram content, or distinguish views from follows, leads, and sales. NOT FOR: multi-platform organic strategy (use suede-social), full video rendering or editing (use suede-video), pai
mission69b/t2000
Publishing, upgrading, and deploying Sui Move packages. Use this skill when the user needs to publish a package, upgrade a published package, deploy to multiple networks, serialize transactions for multisig signing, run a local Sui network (localnet), prepare for Mainnet launch, monitor production deployments, or debug dry run failures. Also use when the user asks about sui client publish, sui client upgrade, UpgradeCap, upgrade policies, Published.toml, --serialize-output, localnet, mainnet lau
eugenelim/agent-ready-repo
Use to drive the deployed end-to-end validation outer loop — deploy the integrated whole to an ephemeral environment, run e2e, observe telemetry, feed deployed findings back to work-loop's inner loop, redeploy, and iterate until the deployed whole converges, then stop at the human consent gate for the prod ship. Run by the release-lead agent (a peer of work-loop's supervisor, not a work-loop mode). Triggers on "run the release loop", "deploy the integrated whole and iterate", "ship it to an ephe
prisma/prisma
Review what Prisma Next migrations will run on merge or deploy, render the migration graph, resolve concurrent / diamond-convergence conflicts, and configure environment refs for CI. Use for "what migrations are going to run", "what runs on deploy", merge conflict, diamond convergence, concurrent migrations, migration status, ref management, staging, production, MIGRATION.DIVERGED, MIGRATION.NO_MARKER, MIGRATION.MARKER_NOT_IN_HISTORY, prisma migrate status, prisma migrate diff, prisma migrate re