Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
custom: ["https://alivecomputer.com"]
custom: ["https://walnut.world"]
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Community Discussion
url: https://github.com/alivecomputer/alive-claude/discussions
url: https://github.com/stackwalnuts/walnut/discussions
about: Questions, ideas, and show & tell
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ assignees: ''
---

**Component:** <!-- skill | rule | hook | template | runtime | other -->
**Affects:** <!-- e.g. alive:save, session lifecycle, capsule routing -->
**Affects:** <!-- e.g. walnut:save, session lifecycle, capsule routing -->

## Problem

Expand Down
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

## Session context

<!-- Optional: paste your squirrel YAML entry if this was built inside an ALIVE session. -->
<!-- Optional: paste your squirrel YAML entry if this was built inside a walnut session. -->

```yaml
```
6 changes: 3 additions & 3 deletions .github/workflows/validate-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ jobs:

- name: Validate plugin structure
run: |
PLUGIN_DIR="plugins/alive"
PLUGIN_DIR="plugins/walnut"
ERRORS=0

echo "=== Validating ALIVE plugin structure ==="
echo "=== Validating Walnut plugin structure ==="

# Check required top-level files
for file in CLAUDE.md; do
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:
# Check templates exist
echo ""
echo "=== Templates ==="
for template_dir in alive walnut capsule squirrel; do
for template_dir in world walnut capsule squirrel; do
if [ ! -d "$PLUGIN_DIR/templates/$template_dir" ]; then
echo "⚠️ Template directory '$template_dir' not found (optional)"
else
Expand Down
49 changes: 33 additions & 16 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -1,37 +1,54 @@
#!/bin/bash
# Deploy alive plugin from local clone to cache
# Deploy walnut plugin from local clone to cache + marketplace
# Usage: ./deploy.sh [--dry-run]

set -euo pipefail

SOURCE="$(cd "$(dirname "$0")/plugins/alive" && pwd)"
CACHE="$HOME/.claude/plugins/cache/alivecomputer/alive/1.0.1-beta"
SOURCE="$(cd "$(dirname "$0")/plugins/walnut" && pwd)"
CACHE="$HOME/.claude/plugins/cache/stackwalnuts/walnut/1.0.0"
MARKETPLACE="$HOME/.claude/plugins/marketplaces/stackwalnuts/plugins/walnut"

if [ ! -d "$SOURCE" ]; then
echo "ERROR: Source not found at $SOURCE"
exit 1
fi

if [ ! -d "$CACHE" ]; then
echo "ERROR: Cache not found at $CACHE"
exit 1
fi

DRY_RUN=""
if [ "${1:-}" = "--dry-run" ]; then
DRY_RUN="--dry-run"
echo "=== DRY RUN ==="
fi

echo "Source: $SOURCE"
echo "Cache: $CACHE"
echo "Source: $SOURCE"
echo "Cache: $CACHE"
echo "Marketplace: $MARKETPLACE"
echo ""

rsync -av --delete \
--exclude='.git' \
--exclude='.DS_Store' \
$DRY_RUN \
"$SOURCE/" "$CACHE/"
# Deploy to cache (if it exists)
if [ -d "$CACHE" ]; then
rsync -av --delete \
--exclude='.git' \
--exclude='.DS_Store' \
$DRY_RUN \
"$SOURCE/" "$CACHE/"
echo ""
echo "Cache deployed."
else
echo "Cache dir not found at $CACHE — skipping."
fi

# Deploy to marketplace (if it exists)
if [ -d "$MARKETPLACE" ]; then
rsync -av --delete \
--exclude='.git' \
--exclude='.DS_Store' \
$DRY_RUN \
"$SOURCE/" "$MARKETPLACE/"
echo ""
echo "Marketplace deployed."
else
echo "Marketplace dir not found at $MARKETPLACE — skipping."
fi

echo ""
echo "Deployed $(date '+%Y-%m-%d %H:%M:%S')"
echo "Done $(date '+%Y-%m-%d %H:%M:%S')"
2 changes: 1 addition & 1 deletion plugins/walnut/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ version: 1.0.1-beta
runtime: squirrel.core@1.0
---

# ALIVE
# Walnut

**Personal Private Context Infrastructure**

Expand Down
2 changes: 1 addition & 1 deletion plugins/walnut/hooks/scripts/walnut-log-guardian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fi
# For Edit: check if the old_string contains a signed entry
OLD_STRING=$(echo "$HOOK_INPUT" | jq -r '.tool_input.old_string // empty')

if echo "$OLD_STRING" | grep -q 'signed: squirrel:'; then
if echo "$OLD_STRING" | grep -qE 'signed: (squirrel:|walnut-mcp:)'; then
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"log.md is immutable. That entry is signed — add a correction entry instead."}}'
exit 0
fi
Expand Down
2 changes: 1 addition & 1 deletion plugins/walnut/hooks/scripts/walnut-rules-guardian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ esac

# Block: anything in the Walnut plugin cache
case "$FILE_PATH" in
*/.claude/plugins/cache/alivecomputer/walnut/*)
*/.claude/plugins/cache/stackwalnuts/walnut/*)
echo "$DENY_MSG"
exit 0
;;
Expand Down
4 changes: 2 additions & 2 deletions plugins/walnut/hooks/scripts/walnut-session-new.sh
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ if [ -f "$WORLD_KEY_FILE" ]; then
WORLD_KEY_CONTENT=$(cat "$WORLD_KEY_FILE")
fi

# Read world index (.alive/_index.yaml) for injection — walnut registry
# Read world index (.walnut/_index.yaml) for injection — walnut registry
WORLD_INDEX_CONTENT=""
WORLD_INDEX_FILE="$WORLD_ROOT/.alive/_index.yaml"
WORLD_INDEX_FILE="$WORLD_ROOT/.walnut/_index.yaml"
if [ -f "$WORLD_INDEX_FILE" ]; then
WORLD_INDEX_CONTENT="<WORLD_INDEX>
$(cat "$WORLD_INDEX_FILE")
Expand Down
2 changes: 1 addition & 1 deletion plugins/walnut/rules/squirrels.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ One clear explanation. Then move on. Don't over-explain. Don't patronise. Don't

Never create or overwrite a system file without reading its template first.

Before writing to `.walnut/` → read the corresponding template from the plugin at `templates/alive/`.
Before writing to `.walnut/` → read the corresponding template from the plugin at `templates/world/`.
Before writing to any walnut system file (_core/key.md, _core/now.md, _core/log.md, _core/insights.md, _core/tasks.md) → read the corresponding template from `templates/walnut/`.
Before creating a capsule companion → read `templates/capsule/companion.md`.

Expand Down
6 changes: 3 additions & 3 deletions plugins/walnut/skills/extend/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Not about adjusting preferences or voice (that's `walnut:tune`). Extend is about
| **Skill** | Repeatable workflow with instructions | `.walnut/skills/{skill-name}/SKILL.md` |
| **Rule** | Behavioral constraint or guide | `.walnut/rules/{rule-name}.md` |
| **Hook** | Automated trigger on system events | `.walnut/hooks/` (scripts + hooks.json) |
| **Plugin** | Distributable package of skills + rules + hooks | Hands off to `contributor@alivecomputer` |
| **Plugin** | Distributable package of skills + rules + hooks | Hands off to `contributor@stackwalnuts` |

---

Expand Down Expand Up @@ -178,13 +178,13 @@ When a custom skill is polished and battle-tested:
╰─
```

**Contributor plugin handoff:** For marketplace packaging, PII stripping, testing, and publishing -> suggest installing `contributor@alivecomputer`. This is a SEPARATE plugin, not part of walnut core. The extend skill's job ends at building working custom capabilities. The contributor plugin handles everything from packaging to publishing.
**Contributor plugin handoff:** For marketplace packaging, PII stripping, testing, and publishing -> suggest installing `contributor@stackwalnuts`. This is a SEPARATE plugin, not part of walnut core. The extend skill's job ends at building working custom capabilities. The contributor plugin handles everything from packaging to publishing.

```
╭─ 🐿️ to publish this skill:
│ 1. Install the contributor plugin:
│ claude plugin install contributor@alivecomputer
│ claude plugin install contributor@stackwalnuts
│ 2. Run: walnut:contribute {skill-name}
│ It handles: PII check, packaging, testing, submission
Expand Down
2 changes: 1 addition & 1 deletion plugins/walnut/skills/history/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Show recent sessions across all walnuts.
│ System architecture, blueprint, 8 skills built, shipped v0.1-beta
│ 2. a44d04aa orbit-lab yesterday opus-4-6
alivecomputer.com rebuilt, whitepaper v0.3, brand locked
walnut.world rebuilt, whitepaper v0.3, brand locked
│ 3. 5551126e orbit-lab Feb 22 opus-4-6
│ Companion app, web installer, plugin v0.1-beta released
Expand Down
8 changes: 4 additions & 4 deletions plugins/walnut/skills/world/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ internal: true

# Setup — Three Paths to a World

First time. No ALIVE folders exist. You just installed alive. Make it feel like something just came alive.
First time. No ALIVE folders exist. You just installed Walnut. Make it feel like something just came alive.

All three paths produce the same result: a fully scaffolded ALIVE world with domain folders, `.walnut/` config, and at least one walnut. The only difference is how we collect the information.

Expand Down Expand Up @@ -400,7 +400,7 @@ Show:

#### Step 2: World identity — .walnut/key.md

Read the template from the plugin: `templates/alive/key.md`
Read the template from the plugin: `templates/world/key.md`

Replace template variables:
- `{{name}}` → world name
Expand Down Expand Up @@ -434,7 +434,7 @@ Show:

#### Step 3: Preferences — .walnut/preferences.yaml

Read the template from the plugin: `templates/alive/preferences.yaml`
Read the template from the plugin: `templates/world/preferences.yaml`

If preferences were provided (Path A only), uncomment the relevant lines and set values.

Expand All @@ -460,7 +460,7 @@ Show:

#### Step 4: Overrides — .walnut/overrides.md

Read the template from the plugin: `templates/alive/overrides.md`
Read the template from the plugin: `templates/world/overrides.md`

Write as-is. No variable replacement needed.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ links: []
- **Slack** — via MCP server. Posts to channels, reads history.
- **Notion** — via MCP server. Task management, knowledge base.
- **Otter** — transcript sync script at ~/scripts/otter-sync.sh
- **GitHub** — via gh CLI. Repos: alivecomputer/walnut
- **GitHub** — via gh CLI. Repos: stackwalnuts/walnut
-->

## Key People
Expand Down
4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ server.tool(
content: [
{
type: "text" as const,
text: `Captured to ${walnut}/_capsules/${capsule}/raw/${filename}`,
text: `Captured to ${walnut}/_core/_capsules/${capsule}/raw/${filename}`,
},
],
};
Expand Down Expand Up @@ -340,7 +340,7 @@ server.tool(

// Create directory structure
const coreDir = join(walnutDir, "_core");
const capsulesDir = join(walnutDir, "_capsules");
const capsulesDir = join(coreDir, "_capsules");
mkdirSync(coreDir, { recursive: true });
mkdirSync(capsulesDir, { recursive: true });

Expand Down
2 changes: 1 addition & 1 deletion src/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ export async function runSetup() {
for (const d of domains) {
mkdirSync(join(worldPath, d), { recursive: true });
}
mkdirSync(join(worldPath, ".alive"), { recursive: true });
mkdirSync(join(worldPath, ".walnut"), { recursive: true });
mkdirSync(join(worldPath, "02_Life", "people"), { recursive: true });
configured.push("World scaffolded at ~/world/");
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/world/scanner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ function walkForWalnuts(dir: string, results: FoundKeyMd[]): void {
});
}

// Recurse into subdirectories, but skip _core/, _capsules/, _squirrels/, .alive/
// Recurse into subdirectories, but skip _core/, _capsules/, _squirrels/, .walnut/
for (const entry of entries) {
if (entry.startsWith(".") || entry === "_core" || entry === "_capsules" || entry === "_squirrels") {
continue;
Expand Down
Loading