@wipcomputer/wip-ai-devops-toolbox 1.9.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.license-guard.json +7 -0
  2. package/.publish-skill.json +4 -0
  3. package/CHANGELOG.md +1120 -0
  4. package/CLA.md +19 -0
  5. package/DEV-GUIDE-GENERAL-PUBLIC.md +882 -0
  6. package/LICENSE +52 -0
  7. package/README.md +238 -0
  8. package/SKILL.md +728 -0
  9. package/TECHNICAL.md +282 -0
  10. package/UNIVERSAL-INTERFACE.md +180 -0
  11. package/_trash/RELEASE-NOTES-v1-8-0.md +29 -0
  12. package/_trash/RELEASE-NOTES-v1-8-1.md +7 -0
  13. package/_trash/RELEASE-NOTES-v1-8-2.md +7 -0
  14. package/_trash/RELEASE-NOTES-v1-9-0.md +37 -0
  15. package/_trash/RELEASE-NOTES-v1-9-1.md +38 -0
  16. package/_trash/RELEASE-NOTES-v1-9-10.md +40 -0
  17. package/_trash/RELEASE-NOTES-v1-9-2.md +40 -0
  18. package/_trash/RELEASE-NOTES-v1-9-6.md +72 -0
  19. package/_trash/RELEASE-NOTES-v1-9-7.md +23 -0
  20. package/_trash/RELEASE-NOTES-v1-9-9.md +75 -0
  21. package/_trash/guide 2/DEV-GUIDE.md +487 -0
  22. package/_trash/guide 2/scripts/deploy-public.sh +152 -0
  23. package/package.json +27 -0
  24. package/scripts/SKILL-deploy-public.md +61 -0
  25. package/scripts/SKILL-post-merge-rename.md +47 -0
  26. package/scripts/deploy-public.sh +264 -0
  27. package/scripts/post-merge-rename.sh +205 -0
  28. package/scripts/publish-skill.sh +134 -0
  29. package/tools/deploy-public/LICENSE +52 -0
  30. package/tools/deploy-public/README.md +31 -0
  31. package/tools/deploy-public/SKILL.md +71 -0
  32. package/tools/deploy-public/deploy-public.sh +264 -0
  33. package/tools/deploy-public/package.json +9 -0
  34. package/tools/ldm-jobs/LICENSE +52 -0
  35. package/tools/ldm-jobs/README.md +46 -0
  36. package/tools/ldm-jobs/backup.sh +16 -0
  37. package/tools/ldm-jobs/branch-protect.sh +39 -0
  38. package/tools/ldm-jobs/crystal-capture.sh +19 -0
  39. package/tools/ldm-jobs/setup-shell.sh +27 -0
  40. package/tools/ldm-jobs/visibility-audit.sh +27 -0
  41. package/tools/post-merge-rename/LICENSE +52 -0
  42. package/tools/post-merge-rename/README.md +29 -0
  43. package/tools/post-merge-rename/SKILL.md +57 -0
  44. package/tools/post-merge-rename/package.json +9 -0
  45. package/tools/post-merge-rename/post-merge-rename.sh +122 -0
  46. package/tools/wip-branch-guard/INSTALL.md +41 -0
  47. package/tools/wip-branch-guard/guard.mjs +259 -0
  48. package/tools/wip-branch-guard/package.json +11 -0
  49. package/tools/wip-file-guard/CHANGELOG.md +6 -0
  50. package/tools/wip-file-guard/LICENSE +52 -0
  51. package/tools/wip-file-guard/README.md +113 -0
  52. package/tools/wip-file-guard/REFERENCE.md +86 -0
  53. package/tools/wip-file-guard/SKILL.md +105 -0
  54. package/tools/wip-file-guard/guard.mjs +128 -0
  55. package/tools/wip-file-guard/openclaw.plugin.json +8 -0
  56. package/tools/wip-file-guard/package.json +27 -0
  57. package/tools/wip-file-guard/test.sh +119 -0
  58. package/tools/wip-license-guard/LICENSE +52 -0
  59. package/tools/wip-license-guard/README.md +32 -0
  60. package/tools/wip-license-guard/SKILL.md +65 -0
  61. package/tools/wip-license-guard/cli.mjs +464 -0
  62. package/tools/wip-license-guard/core.mjs +310 -0
  63. package/tools/wip-license-guard/hook.mjs +146 -0
  64. package/tools/wip-license-guard/package.json +15 -0
  65. package/tools/wip-license-hook/CHANGELOG.md +17 -0
  66. package/tools/wip-license-hook/LICENSE +52 -0
  67. package/tools/wip-license-hook/README.md +200 -0
  68. package/tools/wip-license-hook/SKILL.md +111 -0
  69. package/tools/wip-license-hook/dist/cli/index.d.ts +15 -0
  70. package/tools/wip-license-hook/dist/cli/index.js +170 -0
  71. package/tools/wip-license-hook/dist/cli/index.js.map +1 -0
  72. package/tools/wip-license-hook/dist/core/detector.d.ts +12 -0
  73. package/tools/wip-license-hook/dist/core/detector.js +104 -0
  74. package/tools/wip-license-hook/dist/core/detector.js.map +1 -0
  75. package/tools/wip-license-hook/dist/core/index.d.ts +4 -0
  76. package/tools/wip-license-hook/dist/core/index.js +5 -0
  77. package/tools/wip-license-hook/dist/core/index.js.map +1 -0
  78. package/tools/wip-license-hook/dist/core/ledger.d.ts +49 -0
  79. package/tools/wip-license-hook/dist/core/ledger.js +72 -0
  80. package/tools/wip-license-hook/dist/core/ledger.js.map +1 -0
  81. package/tools/wip-license-hook/dist/core/reporter.d.ts +14 -0
  82. package/tools/wip-license-hook/dist/core/reporter.js +227 -0
  83. package/tools/wip-license-hook/dist/core/reporter.js.map +1 -0
  84. package/tools/wip-license-hook/dist/core/scanner.d.ts +39 -0
  85. package/tools/wip-license-hook/dist/core/scanner.js +325 -0
  86. package/tools/wip-license-hook/dist/core/scanner.js.map +1 -0
  87. package/tools/wip-license-hook/hooks/pre-pull.sh +55 -0
  88. package/tools/wip-license-hook/hooks/pre-push.sh +51 -0
  89. package/tools/wip-license-hook/mcp-server.mjs +119 -0
  90. package/tools/wip-license-hook/package-lock.json +54 -0
  91. package/tools/wip-license-hook/package.json +43 -0
  92. package/tools/wip-license-hook/src/cli/index.ts +189 -0
  93. package/tools/wip-license-hook/src/core/detector.ts +130 -0
  94. package/tools/wip-license-hook/src/core/index.ts +4 -0
  95. package/tools/wip-license-hook/src/core/ledger.ts +116 -0
  96. package/tools/wip-license-hook/src/core/reporter.ts +255 -0
  97. package/tools/wip-license-hook/src/core/scanner.ts +367 -0
  98. package/tools/wip-license-hook/tsconfig.json +16 -0
  99. package/tools/wip-readme-format/README.md +49 -0
  100. package/tools/wip-readme-format/SKILL.md +84 -0
  101. package/tools/wip-readme-format/format.mjs +570 -0
  102. package/tools/wip-readme-format/package.json +15 -0
  103. package/tools/wip-release/CHANGELOG.md +42 -0
  104. package/tools/wip-release/LICENSE +52 -0
  105. package/tools/wip-release/README.md +45 -0
  106. package/tools/wip-release/REFERENCE.md +100 -0
  107. package/tools/wip-release/SKILL.md +139 -0
  108. package/tools/wip-release/cli.js +161 -0
  109. package/tools/wip-release/core.mjs +1174 -0
  110. package/tools/wip-release/mcp-server.mjs +109 -0
  111. package/tools/wip-release/package.json +36 -0
  112. package/tools/wip-repo-init/README.md +38 -0
  113. package/tools/wip-repo-init/SKILL.md +77 -0
  114. package/tools/wip-repo-init/init.mjs +142 -0
  115. package/tools/wip-repo-init/package.json +11 -0
  116. package/tools/wip-repo-permissions-hook/LICENSE +52 -0
  117. package/tools/wip-repo-permissions-hook/README.md +86 -0
  118. package/tools/wip-repo-permissions-hook/SKILL.md +73 -0
  119. package/tools/wip-repo-permissions-hook/cli.js +83 -0
  120. package/tools/wip-repo-permissions-hook/core.mjs +122 -0
  121. package/tools/wip-repo-permissions-hook/guard.mjs +64 -0
  122. package/tools/wip-repo-permissions-hook/mcp-server.mjs +92 -0
  123. package/tools/wip-repo-permissions-hook/openclaw.plugin.json +8 -0
  124. package/tools/wip-repo-permissions-hook/package.json +31 -0
  125. package/tools/wip-repos/LICENSE +52 -0
  126. package/tools/wip-repos/README.md +77 -0
  127. package/tools/wip-repos/SKILL.md +80 -0
  128. package/tools/wip-repos/cli.mjs +176 -0
  129. package/tools/wip-repos/core.mjs +290 -0
  130. package/tools/wip-repos/mcp-server.mjs +157 -0
  131. package/tools/wip-repos/package.json +34 -0
  132. package/tools/wip-universal-installer/CHANGELOG.md +57 -0
  133. package/tools/wip-universal-installer/LICENSE +52 -0
  134. package/tools/wip-universal-installer/README.md +81 -0
  135. package/tools/wip-universal-installer/REFERENCE.md +122 -0
  136. package/tools/wip-universal-installer/SKILL.md +87 -0
  137. package/tools/wip-universal-installer/SPEC.md +180 -0
  138. package/tools/wip-universal-installer/detect.mjs +130 -0
  139. package/tools/wip-universal-installer/examples/minimal/README.md +20 -0
  140. package/tools/wip-universal-installer/examples/minimal/SKILL.md +28 -0
  141. package/tools/wip-universal-installer/examples/minimal/cli.mjs +4 -0
  142. package/tools/wip-universal-installer/examples/minimal/core.mjs +8 -0
  143. package/tools/wip-universal-installer/examples/minimal/mcp-server.mjs +27 -0
  144. package/tools/wip-universal-installer/examples/minimal/package.json +12 -0
  145. package/tools/wip-universal-installer/install.js +930 -0
  146. package/tools/wip-universal-installer/package.json +36 -0
@@ -0,0 +1,72 @@
1
+ # v1.9.6 ... Enforcement Gates
2
+
3
+ Three fixes that move the release pipeline from "suggestions agents forget" to "gates that block."
4
+
5
+ ---
6
+
7
+ ## syncSkillVersion corrupted quoted versions (#71)
8
+
9
+ Every release was appending the old version instead of replacing it. SKILL.md went from `"1.9.5"` to `"1.9.5".9.4".9.3".9.2".9.1"` over five releases.
10
+
11
+ Root cause: the regex `"?\S+?"?` used non-greedy matching. For quoted values, it consumed only part of the string, leaving the rest as trailing garbage.
12
+
13
+ Fix: replaced with `(?:"[^\n]*|\S+)`. Quoted values now match through end of line. Unquoted values use greedy `\S+`. Also fixed the staleness-check regex to extract clean semver from corrupted strings.
14
+
15
+ **Files changed:**
16
+ - `tools/wip-release/core.mjs` ... `syncSkillVersion()` regex fix
17
+ - `SKILL.md` ... repaired corrupted version back to `"1.9.5"`
18
+
19
+ ---
20
+
21
+ ## gh pr merge now always deletes branch (#74)
22
+
23
+ Every `gh pr merge` call in the codebase now includes `--delete-branch`. Previously, deploy-public.sh had a manual 3-line `gh api -X DELETE` cleanup block. That's gone. The flag handles it.
24
+
25
+ Also verified every merge uses `--merge` (never squash). Dev Guide updated with the new convention.
26
+
27
+ **Files changed:**
28
+ - `scripts/deploy-public.sh` ... added `--delete-branch`, removed manual cleanup
29
+ - `tools/deploy-public/deploy-public.sh` ... same
30
+ - `DEV-GUIDE-GENERAL-PUBLIC.md` ... updated merge examples
31
+ - `ai/DEV-GUIDE-FOR-WIP-ONLY-PRIVATE.md` ... updated merge rules
32
+ - `ai/_trash/DEV-GUIDE-private.md` ... updated
33
+ - `ai/_sort/_trash/ai_old/_trash/DEV-GUIDE-private.md` ... updated
34
+
35
+ ---
36
+
37
+ ## wip-release blocks on stale remote branches (#75)
38
+
39
+ New gate in the release pipeline. Before releasing, wip-release checks for remote branches that are fully merged into main but haven't been cleaned up.
40
+
41
+ - **Patch:** warns with the list of stale branches (non-blocking)
42
+ - **Minor/major:** blocks the release. Clean up first.
43
+ - **`--skip-stale-check`:** override flag for emergencies
44
+
45
+ Follows the existing gate pattern: fetches with `--prune`, filters out `origin/main`, `origin/HEAD`, and `--merged-` branches. Fails gracefully if git commands error.
46
+
47
+ **Files changed:**
48
+ - `tools/wip-release/core.mjs` ... `checkStaleBranches()` function, integrated as gate 0.8
49
+ - `tools/wip-release/cli.js` ... `--skip-stale-check` flag, help text
50
+
51
+ ---
52
+
53
+ ## Diffstat
54
+
55
+ ```
56
+ 10 files changed, 102 insertions(+), 21 deletions(-)
57
+ ```
58
+
59
+ ## Install
60
+
61
+ ```bash
62
+ npm install -g @wipcomputer/wip-ai-devops-toolbox
63
+ ```
64
+
65
+ Or update an existing install:
66
+ ```bash
67
+ wip-install wipcomputer/wip-ai-devops-toolbox
68
+ ```
69
+
70
+ ---
71
+
72
+ Built by Parker Todd Brooks, Lēsa (OpenClaw, Claude Opus 4.6), Claude Code (Claude Opus 4.6).
@@ -0,0 +1,23 @@
1
+ # Release Notes: AI DevOps Toolbox v1.9.7
2
+
3
+ ## LDM OS Integration
4
+
5
+ AI DevOps Toolbox now works with LDM OS when it's available.
6
+
7
+ ### wip-install delegates to ldm install
8
+
9
+ When the `ldm` CLI exists on PATH, `wip-install` delegates to `ldm install`. LDM OS handles the scaffold, interface detection, and extension deployment. The Toolbox's standalone behavior is preserved as a fallback when `ldm` isn't available.
10
+
11
+ Supports `--dry-run` and `--json` passthrough to `ldm install`.
12
+
13
+ ### LDM OS tip
14
+
15
+ After standalone installs, the Toolbox prints a tip: "Run `ldm install` to see more skills you can add."
16
+
17
+ ### Universal Installer link
18
+
19
+ The "Read more about Universal Installer" link now points to the LDM OS docs page. The Universal Installer engine moved to LDM OS. The Toolbox keeps `wip-install` as an entry point that delegates.
20
+
21
+ ### Part of LDM OS
22
+
23
+ README includes a "Part of LDM OS" section linking back to the LDM OS repo.
@@ -0,0 +1,75 @@
1
+ # Release Notes: AI DevOps Toolbox v1.9.9
2
+
3
+ **Enforce git worktrees as default workflow (#86)**
4
+
5
+ Agents forget rules. Code doesn't. Three incidents in 48 hours (mixed commits from parallel subagents, wrong-branch writes, directory collisions) all caused by agents sharing a working tree. This release makes the safe behavior structural.
6
+
7
+ ## What changed
8
+
9
+ ### wip-release: Worktree guard (Phase 5)
10
+
11
+ `wip-release` now blocks if you're running from inside a git worktree. Releases must happen from the main working tree, on `main`, after PRs are merged. Running from a worktree would create a tag on the wrong branch.
12
+
13
+ ```
14
+ ✗ wip-release must run from the main working tree, not a worktree.
15
+ Current: /path/to/repo/.claude/worktrees/fix-search/
16
+ Main working tree: /path/to/repo/
17
+ Switch to the main working tree and run again.
18
+ ```
19
+
20
+ Detection: `git rev-parse --git-dir` returns a path containing `/worktrees/` for linked worktrees. Override with `--skip-worktree-check`.
21
+
22
+ ### wip-install: Auto-gitignore (Phase 3)
23
+
24
+ `wip-install` now adds `.claude/worktrees/` to every repo's `.gitignore` during installation. Worktrees are local and ephemeral. They should never be committed.
25
+
26
+ - Skips `/tmp/` clones (URL installs)
27
+ - Skips non-git directories
28
+ - Respects `--dry-run`
29
+ - Idempotent (won't duplicate if already present)
30
+
31
+ ### Dev Guide: Worktree Workflow section (Phase 2)
32
+
33
+ New section in the Dev Guide covering the full worktree workflow:
34
+
35
+ - Every session starts in a worktree
36
+ - Branch naming follows harness prefix convention (`cc-mini/`, `lesa-mini/`)
37
+ - Subagents use `isolation: "worktree"` for parallel work
38
+ - Commit and push before session ends (worktree cleanup deletes uncommitted work)
39
+ - `wip-release` must run from the main working tree
40
+
41
+ ### .gitignore
42
+
43
+ Added `.claude/worktrees/` to this repo's `.gitignore`.
44
+
45
+ ## What's next
46
+
47
+ - **Phase 4:** Boot hook warning when session is in main working tree (separate PR on wip-ldm-os-private)
48
+ - **Phase 6:** Lesa integration (worktrees for spawned parallel work within her agent)
49
+
50
+ ## Fixes
51
+
52
+ - Closes #86 (phases 2, 3, 5)
53
+
54
+ ## Files changed
55
+
56
+ ```
57
+ .gitignore | 1 +
58
+ DEV-GUIDE-GENERAL-PUBLIC.md | 66 +++
59
+ ai/DEV-GUIDE-FOR-WIP-ONLY-PRIVATE.md | 12 +
60
+ tools/wip-release/cli.js | 3 +
61
+ tools/wip-release/core.mjs | 32 ++
62
+ tools/wip-universal-installer/install.js | 32 ++
63
+ RELEASE-NOTES-v1-9-9.md | (this file)
64
+ ```
65
+
66
+ ## Install
67
+
68
+ ```bash
69
+ git pull origin main
70
+ ```
71
+
72
+ ## Attribution
73
+
74
+ Built by Parker Todd Brooks, Lesa, and Claude Opus 4.6 at WIP.computer.
75
+ Three parallel agents, each in its own worktree. Phase 1 of the plan, proving itself.
@@ -0,0 +1,487 @@
1
+ # Dev Guide ... Best Practices for AI-Assisted Development
2
+
3
+ ## Repo Structure Convention
4
+
5
+ Every project follows this split:
6
+
7
+ ### Public Repo
8
+ Clean. Code only.
9
+ - `README.md` ... what it is, how to use it
10
+ - `LICENSE` ... MIT (verified, always)
11
+ - `SKILL.md` ... agent skill definition (if applicable)
12
+ - `src/` or `core/` ... source code
13
+ - `cli/` ... CLI wrapper
14
+ - `package.json` / `pyproject.toml` ... package config
15
+ - `CHANGELOG.md` ... release notes
16
+
17
+ **No dev noise.** No todos, no conversations, no internal notes.
18
+
19
+ ### Plans and Dev Notes (per-repo `ai/` folder)
20
+
21
+ Plans, todos, dev updates, and conversations live in the repo's own `ai/` folder. See the `ai/` folder section under Git Conventions for the full structure.
22
+
23
+ ### Architecture (4-piece pattern)
24
+
25
+ Every tool follows the dual-interface architecture:
26
+ 1. **core.ts** ... pure logic, zero framework deps
27
+ 2. **cli.ts** ... thin wrapper (argv -> core -> stdout)
28
+ 3. **mcp-server.ts** ... MCP wrapper for agents
29
+ 4. *(optional)* **plugin wrapper** ... platform-specific integration
30
+
31
+ CLI is the universal fallback. MCP and plugin wrappers are optimizations.
32
+
33
+ ## Release Process
34
+
35
+ ### Branch, PR, Merge, Publish
36
+
37
+ ```
38
+ 1. Create feature branch: git checkout -b <prefix>/<feature>
39
+ 2. Make changes, commit
40
+ 3. Push branch: git push -u origin <prefix>/<feature>
41
+ 4. Create PR: gh pr create --title "..." --body "..."
42
+ 5. Merge PR: gh pr merge <number> --merge --delete-branch
43
+ 6. Pull merged main: git checkout main && git pull origin main
44
+ 7. Release: wip-release patch --notes="description"
45
+ # or: wip-release minor / wip-release major
46
+ # flags: --dry-run (preview), --no-publish (bump + tag only)
47
+ ```
48
+
49
+ **Important:**
50
+ - **Every change goes through a PR.** No direct pushes to main. Not even "just a README fix." Branch, PR, merge. Every time.
51
+ - **Never squash merge.** Every commit has co-authors and tells the story of how something was built. Squashing destroys attribution and history. Always use `--merge --delete-branch` or fast-forward. This applies to `gh pr merge`, manual merges, deploy-public.sh, and any other merge path. No exceptions.
52
+ - After merging, switch back to your dev branch. Don't sit on main.
53
+ - Use scoped npm tokens for publishing, not personal credentials.
54
+
55
+ ### Release Quality Standards
56
+
57
+ **Every release must have exhaustive, categorized notes.** People use our software. Sloppy notes are embarrassing. Look at [OpenClaw releases](https://github.com/openclaw/openclaw/releases) as the benchmark.
58
+
59
+ `wip-release` generates structured notes automatically:
60
+
61
+ 1. **Changes** ... new features, refactors, additions. One bullet per commit with hash.
62
+ 2. **Fixes** ... bug fixes, hotfixes. One bullet per commit with hash.
63
+ 3. **Docs** ... README, TECHNICAL, RELAY, any documentation changes.
64
+ 4. **Files changed** ... diffstat (excludes `ai/` folder).
65
+ 5. **Install** ... npm install command + git pull.
66
+ 6. **Attribution** ... Built-by line.
67
+ 7. **Full changelog** ... GitHub compare URL.
68
+
69
+ The `--notes` flag provides the summary paragraph at the top. The tool builds everything else from git history.
70
+
71
+ **For major releases (minor/major bumps):** the auto-generated notes are a starting point. Always review and expand them. Add context, describe architectural changes, explain why things changed. A commit subject like "Add cc-poller.ts" should become a paragraph explaining what the poller does, why it replaces the old hook, and what problem it solves.
72
+
73
+ **For patch releases:** auto-generated notes are usually sufficient. Review before publishing.
74
+
75
+ **Never publish a release with just a one-liner.** If two days of work went into it, the release notes should reflect that.
76
+
77
+ #### Release Checklist
78
+
79
+ Every release must also have:
80
+
81
+ 1. **All three contributors.** Parker, Lesa, and Claude Code must all have authored at least one commit in the repo. GitHub tracks contributors by commit author, not co-author trailers. If a contributor is missing, make a real commit with `--author`.
82
+ 2. **Release on both repos.** The private repo gets the release from wip-release. The public repo gets a matching release from deploy-public.sh. Both must show the release in their GitHub Releases tab.
83
+ 3. **npm package published.** Available via `npm install <package-name>@<version>`. Verify after publishing.
84
+ 4. **CHANGELOG.md updated.** wip-release handles this, but verify it's accurate and complete.
85
+
86
+ **After every release, verify all of these.** Check the public repo's GitHub page. Does it show the release? Does it show all three contributors? Are the release notes complete? Is the npm package available? If any of these are missing, fix it before moving on.
87
+
88
+ ### Pre-Publish Checklist
89
+
90
+ Before any repo goes public:
91
+
92
+ 1. [ ] Code complete (all punchlist items done)
93
+ 2. [ ] Code review (architecture, edge cases, quality)
94
+ 3. [ ] Human review (spec, UX, direction)
95
+ 4. [ ] LICENSE file present (MIT, verified)
96
+ 5. [ ] README covers usage, installation, examples
97
+ 6. [ ] CHANGELOG started
98
+ 7. [ ] npm package published (scoped)
99
+ 8. [ ] GitHub release created with tag
100
+ 9. [ ] License compliance ledger initialized for all dependencies
101
+
102
+ ## Cloudflare Workers Deploy
103
+
104
+ Some repos deploy to Cloudflare Workers via `wrangler deploy`. Same rules as git: **never deploy uncommitted code.**
105
+
106
+ ### The Rule
107
+
108
+ **Commit first. Deploy second. Always.** The source that produced the deployed worker must exist in git before it goes to Cloudflare. If something breaks, we need to know exactly what's running.
109
+
110
+ ### Repos That Deploy to Cloudflare
111
+
112
+ | Repo | Worker | Config |
113
+ |------|--------|--------|
114
+ | memory-crystal-private | memory-crystal-demo | wrangler-demo.toml |
115
+ | memory-crystal-private | memory-crystal-cloud | wrangler-mcp.toml |
116
+ | wip-agent-pay | wip-agent-pay | worker/wrangler.toml |
117
+
118
+ ### Deploy Workflow
119
+
120
+ ```
121
+ 1. Write code on feature branch
122
+ 2. Build: npm run build:demo (or whatever the build script is)
123
+ 3. Test locally: npm run dev:demo (wrangler dev)
124
+ 4. Commit source: git add src/worker-*.ts wrangler-*.toml && git commit
125
+ 5. Push + PR + merge: normal PR flow
126
+ 6. Deploy: npm run deploy:demo (wrangler deploy)
127
+ ```
128
+
129
+ **Steps 4-5 happen BEFORE step 6.** Not after. Not "I'll commit later." The deploy command should never run on uncommitted code.
130
+
131
+ ### Deploy Guard
132
+
133
+ Every repo with a `wrangler*.toml` should use guarded deploy scripts in package.json:
134
+
135
+ ```json
136
+ "deploy:demo": "bash -c 'git diff --quiet HEAD -- src/ wrangler-demo.toml || (echo \"ERROR: uncommitted changes. commit before deploying.\" && exit 1)' && wrangler deploy --config wrangler-demo.toml"
137
+ ```
138
+
139
+ This checks that all source files are committed before `wrangler deploy` runs. If anything is dirty, it refuses.
140
+
141
+ ### What Gets Tracked
142
+
143
+ The deployed worker is the compiled output of committed source. The chain is:
144
+
145
+ ```
146
+ source (git) -> build (tsup) -> dist/*.js -> wrangler deploy -> Cloudflare edge
147
+ ```
148
+
149
+ We track the source. The build is reproducible from source. The deploy is reproducible from the build. If we have the git commit, we can reconstruct exactly what's running.
150
+
151
+ ## License Compliance
152
+
153
+ Use `wip-license-hook` for license rug-pull detection:
154
+ - Pre-pull hook: blocks upstream merges if license changed
155
+ - Pre-push hook: alerts if upstream has drifted
156
+ - LICENSE snapshots archived at adoption
157
+ - Daily cron scan of all dependencies
158
+ - Dashboard published for public verification
159
+
160
+ **Rule: never merge upstream if license changed. Hard stop.**
161
+
162
+ ## Git Conventions
163
+
164
+ ### Never Work on Main
165
+
166
+ **Main is for merged, released code only.** Never make changes directly on main. Every repo should have a dev branch checked out as the working branch at all times.
167
+
168
+ When you clone a repo or finish a PR, immediately create or switch to a dev branch:
169
+
170
+ ```bash
171
+ git checkout -b <prefix>/dev # new repo, first time
172
+ git checkout <prefix>/<feature> # existing feature work
173
+ ```
174
+
175
+ If you find yourself on main with uncommitted changes, stash, branch, and apply:
176
+
177
+ ```bash
178
+ git stash
179
+ git checkout -b <prefix>/fix-name
180
+ git stash pop
181
+ ```
182
+
183
+ ### Branch Prefixes
184
+
185
+ Branch names use the **harness name** (agent + machine) as the prefix. Every harness is a distinct entity. Claude Code on the Mini is not the same as Claude Code on the Air.
186
+
187
+ ```
188
+ <harness>/<feature>
189
+ ```
190
+
191
+ Examples: `cc-mini/fix-search`, `cc-air/add-relay`, `lesa-mini/weekly-tuning`
192
+
193
+ ### Multi-Agent Clone Workflow
194
+
195
+ **Every harness gets their own clone of every repo.** This prevents checkout collisions when multiple agents work on the same repo at the same time.
196
+
197
+ ```
198
+ staff/
199
+ Parker/
200
+ Claude Code - Mini/repos/
201
+ memory-crystal-private/ <- cc-mini works here, cc-mini/ branches
202
+ Claude Code - MBA/repos/
203
+ memory-crystal-private/ <- cc-air works here, cc-air/ branches
204
+ Lēsa/
205
+ repos/
206
+ memory-crystal-private/ <- lesa-mini works here, lesa-mini/ branches
207
+ ```
208
+
209
+ **Rules:**
210
+ - Never work in another agent's folder. If Lesa originated a repo, CC still clones it to their own folder.
211
+ - Each harness uses their own branch prefix (`cc-mini/`, `cc-air/`, `lesa-mini/`).
212
+ - PRs merge to `main` on GitHub. That's the shared integration point.
213
+ - If something needs to change in another agent's working tree, open a PR or ask them.
214
+
215
+ **When a new repo is created:**
216
+ 1. Whoever creates it pushes to GitHub (wipcomputer org)
217
+ 2. Every other agent clones it to their own repos folder
218
+ 3. Each agent creates their dev branch with their prefix
219
+
220
+ This is how we avoid the "two agents have different branches checked out in the same folder" problem. It doesn't work. Separate folders, separate clones, shared remote.
221
+
222
+ ### Commit Messages
223
+
224
+ - Imperative mood, concise (`add: license scanner`, `fix: offline detection`)
225
+ - Co-author trailers for all contributors on every commit
226
+ - PRs for cross-agent edits: don't edit another agent's working tree directly
227
+ - Never push directly to main. Always branch, PR, merge. No exceptions.
228
+
229
+ ### File Naming Convention
230
+
231
+ All files authored by an agent use this format:
232
+
233
+ ```
234
+ YYYY-MM-DD--HH-MM-SS--{agent}--{description}.md
235
+ ```
236
+
237
+ Single dashes within date and time. Double dashes between segments. 24-hour clock.
238
+
239
+ This applies to dev updates, plans, todos, notes, session exports, daily logs ... everything with an author and a timestamp.
240
+
241
+ ### Daily Logs
242
+
243
+ Each entry is its own file, not appended to a shared file.
244
+
245
+ ```
246
+ agents/{agent-id}/memory/daily/
247
+ 2026-02-27--17-45-30--agent-a--feature-deploy.md
248
+ 2026-02-27--19-12-00--agent-a--config-migration.md
249
+ ```
250
+
251
+ One file per entry. Full timestamp. Agent ID in the name. Nothing gets overwritten or collided.
252
+
253
+ ### The `ai/` Folder (per-repo standard)
254
+
255
+ Every repo gets an `ai/` folder. It holds all the thinking between humans and agents ... plans, dev updates, todos, conversations, notes. Scoped to the repo it belongs to.
256
+
257
+ ```
258
+ ai/
259
+ plan/ ... architecture plans, roadmaps, convention notes
260
+ dev-updates/ ... what was built, session logs
261
+ todos/
262
+ Parker-todo.md ... Parker's action items
263
+ CC-Mini-todo.md ... CC-Mini's action items
264
+ OC-Lesa-Mini-todo.md ... OC-Lesa-Mini's action items
265
+ notes/ ... research, raw conversation logs, references
266
+ ```
267
+
268
+ ### Todo Files
269
+
270
+ One file per person/agent. Named `{Name}-todo.md`. Lives in `ai/todos/`.
271
+
272
+ **Three sections, always in this order:**
273
+
274
+ ```markdown
275
+ # {Name} ... {Project} To-Do
276
+
277
+ **Updated:** YYYY-MM-DD
278
+
279
+ ---
280
+
281
+ ## To Do
282
+ - [ ] Thing that needs doing
283
+ - [ ] Another thing
284
+
285
+ ---
286
+
287
+ ## Done
288
+ - [x] Thing that was completed ... YYYY-MM-DD
289
+
290
+ ---
291
+
292
+ ## Deprecated
293
+ - ~~Thing that's no longer needed~~ ... reason. (YYYY-MM-DD)
294
+ ```
295
+
296
+ **Rules:**
297
+ - **Never delete anything.** Items move between sections, never off the page.
298
+ - **To Do** ... work that needs to happen.
299
+ - **Done** ... work that was completed. Check the box, add the date.
300
+ - **Deprecated** ... work that was planned but is no longer needed (code changed, approach changed, requirement dropped). Strikethrough the text, add the reason and date. This is NOT the same as Done. Deprecated means "we decided not to do this."
301
+ - **Update the date** at the top of the file every time you edit it.
302
+ - Each person/agent has exactly one file. Don't create per-date or per-feature todo files.
303
+
304
+ **Our todo files:**
305
+
306
+ | File | Who |
307
+ |------|-----|
308
+ | `Parker-todo.md` | Parker (human tasks, setup, deploy, review) |
309
+ | `CC-Mini-todo.md` | Claude Code on Mac Mini (code, docs, builds) |
310
+ | `OC-Lesa-Mini-todo.md` | OpenClaw Lesa on Mac Mini (agent tasks, testing) |
311
+
312
+ Add more as harnesses are added (e.g., `CC-Air-todo.md` for the MacBook Air).
313
+
314
+ ## Branch Protection
315
+
316
+ All repos should have branch protection on `main` with `enforce_admins=true`. This means:
317
+ - No direct pushes to main (even for admins)
318
+ - All changes go through PRs
319
+
320
+ **To add protection:**
321
+ ```bash
322
+ gh api "repos/<org>/<repo>/branches/main/protection" -X PUT \
323
+ -F "required_pull_request_reviews[required_approving_review_count]=0" \
324
+ -F "enforce_admins=true" \
325
+ -F "restrictions=null" \
326
+ -F "required_status_checks=null"
327
+ ```
328
+
329
+ ## Review Flow
330
+
331
+ ```
332
+ Agent builds -> pushes to dev branch
333
+ -> Code review (another agent or human)
334
+ -> Human reviews (direction, spec)
335
+ -> merge to main
336
+ -> publish (npm, GitHub, skill registry)
337
+ ```
338
+
339
+ ## Public/Private Repo Pattern
340
+
341
+ ### The Rule
342
+
343
+ **Never make a repo public unless it has a `-private` counterpart with all `ai/` content separated out.** If a repo doesn't have a `-private` counterpart yet, it stays private until one is created. No exceptions. Violating this exposes internal plans, todos, and development context.
344
+
345
+ **The private repo is the working repo. The public repo is everything except `ai/`.**
346
+
347
+ **You only need the private repo locally.** Clone `<name>-private`, work in it, release from it, deploy to public from it. Never clone the public repo for development. The public repo is a deployment target, not a working tree. The deploy script handles syncing.
348
+
349
+ Every repo has an `ai/` folder where agents and humans collaborate ... plans, todos, dev updates, notes, conversations. This is the development process. It doesn't ship publicly.
350
+
351
+ The private repo tracks everything, including `ai/`. The public repo is the same codebase without `ai/`. Two repos, same code, clean boundary.
352
+
353
+ ```
354
+ <name>-private/ <- working repo (clone this one, work here)
355
+ src/, README.md, LICENSE, package.json, SKILL.md ...
356
+ ai/ <- plans, todos, notes, dev updates
357
+ plan/
358
+ todos/
359
+ dev-updates/
360
+ notes/
361
+
362
+ <name>/ <- public repo (deploy target only, never clone for dev)
363
+ src/, README.md, LICENSE, package.json, SKILL.md ...
364
+ (no ai/ folder)
365
+ ```
366
+
367
+ ### Why
368
+
369
+ The `ai/` folder contains personal notes, half-formed ideas, internal debates, agent inboxes. Useful for the team. Irrelevant to users. Can be taken out of context. Should not be public.
370
+
371
+ The public repo has everything an LLM or human needs to understand and use the project: README, code, docs, SKILL.md, LICENSE. The `ai/` folder is operational context, not conceptual context.
372
+
373
+ ### Workflow
374
+
375
+ 1. All work happens in the private repo
376
+ 2. Merge PR to main on the private repo
377
+ 3. Run `wip-release` on the private repo (version bump, changelog, npm publish, GitHub release)
378
+ 4. Deploy to public repo (everything except `ai/`)
379
+
380
+ **The order matters.** Release first, then deploy. The public repo should always reflect a released version with correct version numbers, changelog, and SKILL.md.
381
+
382
+ ```bash
383
+ # Step 1-2: normal PR flow on private repo
384
+ cd /path/to/private-repo
385
+ git checkout main && git pull origin main
386
+
387
+ # Step 3: release
388
+ wip-release patch --notes="description of changes"
389
+
390
+ # Step 4: deploy to public (code sync + release)
391
+ bash deploy-public.sh /path/to/private-repo <org>/<public-repo>
392
+ ```
393
+
394
+ The deploy script:
395
+ 1. Clones the public repo
396
+ 2. Rsyncs everything except `ai/` and `.git/`
397
+ 3. Creates a branch, commits, opens a PR, merges it
398
+ 4. Creates a matching GitHub release on the public repo (pulls notes from the private repo's release)
399
+
400
+ **After deploy, the public repo should show:**
401
+ - Updated code (matching private minus `ai/`)
402
+ - A GitHub release with the version tag and release notes
403
+ - npm package available via `npm install <package-name>`
404
+
405
+ **What goes where:**
406
+
407
+ | Artifact | Where it lives |
408
+ |----------|---------------|
409
+ | npm package | Public npm registry (anyone can install) |
410
+ | GitHub release (private) | `<name>-private` repo (internal reference) |
411
+ | GitHub release (public) | `<name>` repo (what users see) |
412
+ | GitHub Packages | Not used (npm registry is the source of truth) |
413
+
414
+ ### Config-specific splits
415
+
416
+ Some repos also have deployment config that shouldn't be public (real paths, contacts, secrets references). Same pattern applies ... the private repo has `config.json`, the public repo has `config.example.json`.
417
+
418
+ **Key rule:** never put real paths, contacts, personal notes, or deployment values in the public repo.
419
+
420
+ ## Scheduled Automation (.app Pattern)
421
+
422
+ macOS restricts cron and shell scripts from accessing protected files (Full Disk Access). The workaround: wrap automation in a native `.app` bundle and grant FDA to the app.
423
+
424
+ ### How it works
425
+
426
+ `LDMDevTools.app` is a minimal macOS application that:
427
+ 1. Contains a compiled Mach-O binary (so macOS recognizes it as a real app)
428
+ 2. The binary calls a shell script that dispatches to individual job scripts
429
+ 3. Jobs live in `LDMDevTools.app/Contents/Resources/jobs/*.sh`
430
+ 4. Adding a new job = dropping a new `.sh` file in that folder
431
+
432
+ ### Structure
433
+
434
+ ```
435
+ ~/Applications/LDMDevTools.app/
436
+ Contents/
437
+ Info.plist ... app metadata (bundle ID, version)
438
+ MacOS/
439
+ ldm-dev-tools ... compiled binary (Mach-O, calls ldm-dev-tools-run)
440
+ ldm-dev-tools-run ... shell dispatcher (routes to jobs)
441
+ Resources/
442
+ jobs/
443
+ backup.sh ... daily backup of databases + state
444
+ branch-protect.sh ... audit + enforce branch protection across org
445
+ visibility-audit.sh ... audit public repos for missing -private counterparts
446
+ ```
447
+
448
+ ### Setup
449
+
450
+ 1. Build the app (or copy from dev-tools repo)
451
+ 2. Drag `LDMDevTools.app` into **System Settings > Privacy & Security > Full Disk Access**
452
+ 3. Schedule via cron:
453
+
454
+ ```bash
455
+ 0 0 * * * open -W ~/Applications/LDMDevTools.app --args backup >> /tmp/ldm-dev-tools/cron.log 2>&1
456
+ 0 1 * * * open -W ~/Applications/LDMDevTools.app --args branch-protect >> /tmp/ldm-dev-tools/cron.log 2>&1
457
+ ```
458
+
459
+ ### Why not LaunchAgents?
460
+
461
+ LaunchAgents have been unreliable across macOS updates. FDA grants to `/bin/bash` and `cron` don't persist. The `.app` bundle is the one thing macOS consistently respects for FDA permissions.
462
+
463
+ ### Adding a new job
464
+
465
+ Create a file in `Contents/Resources/jobs/`:
466
+
467
+ ```bash
468
+ # ~/Applications/LDMDevTools.app/Contents/Resources/jobs/my-job.sh
469
+ #!/bin/bash
470
+ echo "=== My job: $(date) ==="
471
+ # ... your automation here
472
+ echo "=== Done ==="
473
+ ```
474
+
475
+ Then: `open -W ~/Applications/LDMDevTools.app --args my-job`
476
+
477
+ ### Logs
478
+
479
+ All job output goes to `/tmp/ldm-dev-tools/`:
480
+ - `ldm-dev-tools.log` ... dispatcher log (which jobs ran, exit codes)
481
+ - `<job-name>.log` ... individual job output
482
+ - `<job-name>-last-exit` ... last exit code (for monitoring)
483
+ - `<job-name>-last-run` ... last run timestamp
484
+
485
+ ## The _trash Convention
486
+
487
+ **Never rm or delete files.** Always move to a `_trash/` folder. Applies everywhere: repos, agent data, extension installs. Makes recovery trivial without git archaeology.