diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-26 07:36:51 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-26 07:36:51 -0500 |
| commit | b255a74441c936f8e27859d57402a15170dcd73a (patch) | |
| tree | 7f84e6b5c324dae2a943eee21320be41a31e9d8e | |
| parent | 4fac2a09e5bd395f4058f2e2f5a3e1dab662af87 (diff) | |
| download | rulesets-b255a74441c936f8e27859d57402a15170dcd73a.tar.gz rulesets-b255a74441c936f8e27859d57402a15170dcd73a.zip | |
docs(protocols): document .ai/project-scripts/ for project-owned scripts
A project script dropped into .ai/scripts/ gets wiped on the next startup, because that dir syncs from the template with rsync --delete. There was no documented home for a project's own scripts, the script-side counterpart to .ai/project-workflows/.
I added .ai/project-scripts/ to the Directory Architecture table and noted in startup.org that it sits outside the synced set, like project-workflows/. A script a workflow imports lives there. Naming: a Python module imported via sys.path needs an importable name (underscores), while a CLI-invoked script can stay kebab-case like the template tooling.
No mechanism change. Startup Phase A only rsyncs protocols.org, workflows/, and scripts/, so project-scripts/ is already sync-safe. This just documents it.
| -rw-r--r-- | .ai/protocols.org | 3 | ||||
| -rw-r--r-- | .ai/workflows/startup.org | 1 | ||||
| -rw-r--r-- | claude-templates/.ai/protocols.org | 3 | ||||
| -rw-r--r-- | claude-templates/.ai/workflows/startup.org | 1 |
4 files changed, 6 insertions, 2 deletions
diff --git a/.ai/protocols.org b/.ai/protocols.org index e4e1310..c709010 100644 --- a/.ai/protocols.org +++ b/.ai/protocols.org @@ -42,7 +42,8 @@ Every file and directory has a defined purpose: | =sessions/= | Archived session files (one per session) — =YYYY-MM-DD-HH-MM-description.org= | | =workflows/= | Template workflows (synced from claude-templates, never edit in project) | | =project-workflows/= | Project-specific workflows (never touched by sync) | -| =scripts/= | Template scripts | +| =scripts/= | Template scripts (synced from claude-templates, never edit in project) | +| =project-scripts/= | Project-specific scripts (never touched by sync; mirrors =project-workflows/=) | | =someday-maybe.org= | Project ideas backlog | ** =docs/= (visible, real project documentation) diff --git a/.ai/workflows/startup.org b/.ai/workflows/startup.org index 2371d11..64eb172 100644 --- a/.ai/workflows/startup.org +++ b/.ai/workflows/startup.org @@ -110,6 +110,7 @@ Notes on the rsync commands: - Trailing slashes on both source and destination matter — they tell rsync to sync /contents/ rather than nest a directory inside. - =--delete= on the directory syncs lets retired template files actually disappear from each project on next startup. - protocols.org is a single file, no =--delete= needed. +- The sync touches only =protocols.org=, =workflows/=, and =scripts/=. The project-owned dirs =project-workflows/= and =project-scripts/= are deliberately *outside* the synced set, so a project's own workflows and scripts survive startup. This is why a project script that a workflow imports must live in =.ai/project-scripts/=, never =.ai/scripts/= — the latter is wiped to match the template by =--delete= on every startup. Naming: a script imported as a Python module needs an importable name (underscores, e.g. =zlibrary_api.py=); a CLI-invoked script can stay kebab-case like the template tooling (=cmail-action.py=). Rationale: Every call in Phase A is read-only or writes to a distinct path. Running them sequentially wastes round-trips; running them in parallel gives Claude the complete starting picture in one round-trip. diff --git a/claude-templates/.ai/protocols.org b/claude-templates/.ai/protocols.org index e4e1310..c709010 100644 --- a/claude-templates/.ai/protocols.org +++ b/claude-templates/.ai/protocols.org @@ -42,7 +42,8 @@ Every file and directory has a defined purpose: | =sessions/= | Archived session files (one per session) — =YYYY-MM-DD-HH-MM-description.org= | | =workflows/= | Template workflows (synced from claude-templates, never edit in project) | | =project-workflows/= | Project-specific workflows (never touched by sync) | -| =scripts/= | Template scripts | +| =scripts/= | Template scripts (synced from claude-templates, never edit in project) | +| =project-scripts/= | Project-specific scripts (never touched by sync; mirrors =project-workflows/=) | | =someday-maybe.org= | Project ideas backlog | ** =docs/= (visible, real project documentation) diff --git a/claude-templates/.ai/workflows/startup.org b/claude-templates/.ai/workflows/startup.org index 2371d11..64eb172 100644 --- a/claude-templates/.ai/workflows/startup.org +++ b/claude-templates/.ai/workflows/startup.org @@ -110,6 +110,7 @@ Notes on the rsync commands: - Trailing slashes on both source and destination matter — they tell rsync to sync /contents/ rather than nest a directory inside. - =--delete= on the directory syncs lets retired template files actually disappear from each project on next startup. - protocols.org is a single file, no =--delete= needed. +- The sync touches only =protocols.org=, =workflows/=, and =scripts/=. The project-owned dirs =project-workflows/= and =project-scripts/= are deliberately *outside* the synced set, so a project's own workflows and scripts survive startup. This is why a project script that a workflow imports must live in =.ai/project-scripts/=, never =.ai/scripts/= — the latter is wiped to match the template by =--delete= on every startup. Naming: a script imported as a Python module needs an importable name (underscores, e.g. =zlibrary_api.py=); a CLI-invoked script can stay kebab-case like the template tooling (=cmail-action.py=). Rationale: Every call in Phase A is read-only or writes to a distinct path. Running them sequentially wastes round-trips; running them in parallel gives Claude the complete starting picture in one round-trip. |
