@bradygaster/squad-cli 0.9.1 → 0.9.2-insider.5

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 (276) hide show
  1. package/README.md +329 -329
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +10 -10
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/config.d.ts +12 -0
  6. package/dist/cli/commands/config.d.ts.map +1 -0
  7. package/dist/cli/commands/config.js +157 -0
  8. package/dist/cli/commands/config.js.map +1 -0
  9. package/dist/cli/commands/consult.d.ts.map +1 -1
  10. package/dist/cli/commands/consult.js +9 -4
  11. package/dist/cli/commands/consult.js.map +1 -1
  12. package/dist/cli/commands/copilot.d.ts.map +1 -1
  13. package/dist/cli/commands/copilot.js +8 -7
  14. package/dist/cli/commands/copilot.js.map +1 -1
  15. package/dist/cli/commands/doctor.d.ts.map +1 -1
  16. package/dist/cli/commands/doctor.js +50 -17
  17. package/dist/cli/commands/doctor.js.map +1 -1
  18. package/dist/cli/commands/economy.d.ts.map +1 -1
  19. package/dist/cli/commands/economy.js +3 -2
  20. package/dist/cli/commands/economy.js.map +1 -1
  21. package/dist/cli/commands/export.d.ts.map +1 -1
  22. package/dist/cli/commands/export.js +22 -16
  23. package/dist/cli/commands/export.js.map +1 -1
  24. package/dist/cli/commands/extract.d.ts.map +1 -1
  25. package/dist/cli/commands/extract.js +14 -10
  26. package/dist/cli/commands/extract.js.map +1 -1
  27. package/dist/cli/commands/import.d.ts.map +1 -1
  28. package/dist/cli/commands/import.js +21 -18
  29. package/dist/cli/commands/import.js.map +1 -1
  30. package/dist/cli/commands/init-remote.d.ts.map +1 -1
  31. package/dist/cli/commands/init-remote.js +7 -6
  32. package/dist/cli/commands/init-remote.js.map +1 -1
  33. package/dist/cli/commands/link.d.ts.map +1 -1
  34. package/dist/cli/commands/link.js +11 -10
  35. package/dist/cli/commands/link.js.map +1 -1
  36. package/dist/cli/commands/migrate.d.ts.map +1 -1
  37. package/dist/cli/commands/migrate.js +19 -18
  38. package/dist/cli/commands/migrate.js.map +1 -1
  39. package/dist/cli/commands/personal.d.ts.map +1 -1
  40. package/dist/cli/commands/personal.js +57 -65
  41. package/dist/cli/commands/personal.js.map +1 -1
  42. package/dist/cli/commands/plugin.d.ts.map +1 -1
  43. package/dist/cli/commands/plugin.js +8 -7
  44. package/dist/cli/commands/plugin.js.map +1 -1
  45. package/dist/cli/commands/rc.d.ts.map +1 -1
  46. package/dist/cli/commands/rc.js +19 -12
  47. package/dist/cli/commands/rc.js.map +1 -1
  48. package/dist/cli/commands/schedule.d.ts.map +1 -1
  49. package/dist/cli/commands/schedule.js +6 -5
  50. package/dist/cli/commands/schedule.js.map +1 -1
  51. package/dist/cli/commands/start.d.ts.map +1 -1
  52. package/dist/cli/commands/start.js +18 -11
  53. package/dist/cli/commands/start.js.map +1 -1
  54. package/dist/cli/commands/streams.d.ts.map +1 -1
  55. package/dist/cli/commands/streams.js +3 -2
  56. package/dist/cli/commands/streams.js.map +1 -1
  57. package/dist/cli/commands/upstream.d.ts.map +1 -1
  58. package/dist/cli/commands/upstream.js +23 -19
  59. package/dist/cli/commands/upstream.js.map +1 -1
  60. package/dist/cli/commands/watch/capabilities/board.d.ts +22 -0
  61. package/dist/cli/commands/watch/capabilities/board.d.ts.map +1 -0
  62. package/dist/cli/commands/watch/capabilities/board.js +121 -0
  63. package/dist/cli/commands/watch/capabilities/board.js.map +1 -0
  64. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts +14 -0
  65. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -0
  66. package/dist/cli/commands/watch/capabilities/decision-hygiene.js +72 -0
  67. package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -0
  68. package/dist/cli/commands/watch/capabilities/execute.d.ts +33 -0
  69. package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -0
  70. package/dist/cli/commands/watch/capabilities/execute.js +119 -0
  71. package/dist/cli/commands/watch/capabilities/execute.js.map +1 -0
  72. package/dist/cli/commands/watch/capabilities/index.d.ts +7 -0
  73. package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -0
  74. package/dist/cli/commands/watch/capabilities/index.js +28 -0
  75. package/dist/cli/commands/watch/capabilities/index.js.map +1 -0
  76. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts +14 -0
  77. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -0
  78. package/dist/cli/commands/watch/capabilities/monitor-email.js +54 -0
  79. package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -0
  80. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts +14 -0
  81. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -0
  82. package/dist/cli/commands/watch/capabilities/monitor-teams.js +55 -0
  83. package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -0
  84. package/dist/cli/commands/watch/capabilities/retro.d.ts +14 -0
  85. package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -0
  86. package/dist/cli/commands/watch/capabilities/retro.js +81 -0
  87. package/dist/cli/commands/watch/capabilities/retro.js.map +1 -0
  88. package/dist/cli/commands/watch/capabilities/self-pull.d.ts +14 -0
  89. package/dist/cli/commands/watch/capabilities/self-pull.d.ts.map +1 -0
  90. package/dist/cli/commands/watch/capabilities/self-pull.js +33 -0
  91. package/dist/cli/commands/watch/capabilities/self-pull.js.map +1 -0
  92. package/dist/cli/commands/watch/capabilities/two-pass.d.ts +14 -0
  93. package/dist/cli/commands/watch/capabilities/two-pass.d.ts.map +1 -0
  94. package/dist/cli/commands/watch/capabilities/two-pass.js +66 -0
  95. package/dist/cli/commands/watch/capabilities/two-pass.js.map +1 -0
  96. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts +14 -0
  97. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -0
  98. package/dist/cli/commands/watch/capabilities/wave-dispatch.js +117 -0
  99. package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -0
  100. package/dist/cli/commands/watch/config.d.ts +25 -0
  101. package/dist/cli/commands/watch/config.d.ts.map +1 -0
  102. package/dist/cli/commands/watch/config.js +82 -0
  103. package/dist/cli/commands/watch/config.js.map +1 -0
  104. package/dist/cli/commands/watch/index.d.ts +95 -0
  105. package/dist/cli/commands/watch/index.d.ts.map +1 -0
  106. package/dist/cli/commands/watch/index.js +704 -0
  107. package/dist/cli/commands/watch/index.js.map +1 -0
  108. package/dist/cli/commands/watch/registry.d.ts +19 -0
  109. package/dist/cli/commands/watch/registry.d.ts.map +1 -0
  110. package/dist/cli/commands/watch/registry.js +28 -0
  111. package/dist/cli/commands/watch/registry.js.map +1 -0
  112. package/dist/cli/commands/watch/types.d.ts +57 -0
  113. package/dist/cli/commands/watch/types.d.ts.map +1 -0
  114. package/dist/cli/commands/watch/types.js +8 -0
  115. package/dist/cli/commands/watch/types.js.map +1 -0
  116. package/dist/cli/core/cast.d.ts.map +1 -1
  117. package/dist/cli/core/cast.js +15 -19
  118. package/dist/cli/core/cast.js.map +1 -1
  119. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -1
  120. package/dist/cli/core/detect-squad-dir.js +12 -10
  121. package/dist/cli/core/detect-squad-dir.js.map +1 -1
  122. package/dist/cli/core/email-scrub.d.ts.map +1 -1
  123. package/dist/cli/core/email-scrub.js +12 -11
  124. package/dist/cli/core/email-scrub.js.map +1 -1
  125. package/dist/cli/core/gh-cli.d.ts +13 -0
  126. package/dist/cli/core/gh-cli.d.ts.map +1 -1
  127. package/dist/cli/core/gh-cli.js +24 -0
  128. package/dist/cli/core/gh-cli.js.map +1 -1
  129. package/dist/cli/core/init.d.ts +2 -0
  130. package/dist/cli/core/init.d.ts.map +1 -1
  131. package/dist/cli/core/init.js +22 -5
  132. package/dist/cli/core/init.js.map +1 -1
  133. package/dist/cli/core/migrate-directory.d.ts.map +1 -1
  134. package/dist/cli/core/migrate-directory.js +14 -13
  135. package/dist/cli/core/migrate-directory.js.map +1 -1
  136. package/dist/cli/core/migrations.d.ts.map +1 -1
  137. package/dist/cli/core/migrations.js +22 -8
  138. package/dist/cli/core/migrations.js.map +1 -1
  139. package/dist/cli/core/nap.d.ts.map +1 -1
  140. package/dist/cli/core/nap.js +111 -49
  141. package/dist/cli/core/nap.js.map +1 -1
  142. package/dist/cli/core/project-type.d.ts.map +1 -1
  143. package/dist/cli/core/project-type.js +11 -10
  144. package/dist/cli/core/project-type.js.map +1 -1
  145. package/dist/cli/core/team-md.d.ts.map +1 -1
  146. package/dist/cli/core/team-md.js +43 -38
  147. package/dist/cli/core/team-md.js.map +1 -1
  148. package/dist/cli/core/templates.d.ts.map +1 -1
  149. package/dist/cli/core/templates.js +4 -3
  150. package/dist/cli/core/templates.js.map +1 -1
  151. package/dist/cli/core/upgrade.d.ts.map +1 -1
  152. package/dist/cli/core/upgrade.js +68 -55
  153. package/dist/cli/core/upgrade.js.map +1 -1
  154. package/dist/cli/core/version.d.ts.map +1 -1
  155. package/dist/cli/core/version.js +8 -7
  156. package/dist/cli/core/version.js.map +1 -1
  157. package/dist/cli/index.d.ts +1 -1
  158. package/dist/cli/index.d.ts.map +1 -1
  159. package/dist/cli/index.js +1 -1
  160. package/dist/cli/index.js.map +1 -1
  161. package/dist/cli/self-update.d.ts.map +1 -1
  162. package/dist/cli/self-update.js +7 -4
  163. package/dist/cli/self-update.js.map +1 -1
  164. package/dist/cli/shell/agent-name-parser.d.ts +16 -0
  165. package/dist/cli/shell/agent-name-parser.d.ts.map +1 -0
  166. package/dist/cli/shell/agent-name-parser.js +54 -0
  167. package/dist/cli/shell/agent-name-parser.js.map +1 -0
  168. package/dist/cli/shell/commands.d.ts.map +1 -1
  169. package/dist/cli/shell/commands.js +4 -3
  170. package/dist/cli/shell/commands.js.map +1 -1
  171. package/dist/cli/shell/coordinator.d.ts +4 -1
  172. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  173. package/dist/cli/shell/coordinator.js +29 -26
  174. package/dist/cli/shell/coordinator.js.map +1 -1
  175. package/dist/cli/shell/index.d.ts.map +1 -1
  176. package/dist/cli/shell/index.js +33 -35
  177. package/dist/cli/shell/index.js.map +1 -1
  178. package/dist/cli/shell/lifecycle.d.ts +13 -2
  179. package/dist/cli/shell/lifecycle.d.ts.map +1 -1
  180. package/dist/cli/shell/lifecycle.js +26 -13
  181. package/dist/cli/shell/lifecycle.js.map +1 -1
  182. package/dist/cli/shell/session-store.d.ts.map +1 -1
  183. package/dist/cli/shell/session-store.js +16 -12
  184. package/dist/cli/shell/session-store.js.map +1 -1
  185. package/dist/cli/shell/spawn.d.ts +4 -1
  186. package/dist/cli/shell/spawn.d.ts.map +1 -1
  187. package/dist/cli/shell/spawn.js +28 -10
  188. package/dist/cli/shell/spawn.js.map +1 -1
  189. package/dist/cli-entry.js +83 -12
  190. package/dist/cli-entry.js.map +1 -1
  191. package/package.json +8 -4
  192. package/scripts/patch-esm-imports.mjs +105 -105
  193. package/scripts/patch-ink-rendering.mjs +115 -115
  194. package/templates/casting/Futurama.json +9 -9
  195. package/templates/casting-history.json +4 -4
  196. package/templates/casting-policy.json +37 -37
  197. package/templates/casting-reference.md +104 -104
  198. package/templates/casting-registry.json +3 -3
  199. package/templates/ceremonies.md +41 -41
  200. package/templates/charter.md +53 -53
  201. package/templates/constraint-tracking.md +38 -38
  202. package/templates/cooperative-rate-limiting.md +229 -229
  203. package/templates/copilot-instructions.md +46 -46
  204. package/templates/history.md +10 -10
  205. package/templates/identity/now.md +9 -9
  206. package/templates/identity/wisdom.md +15 -15
  207. package/templates/issue-lifecycle.md +412 -412
  208. package/templates/keda-scaler.md +164 -164
  209. package/templates/machine-capabilities.md +74 -74
  210. package/templates/mcp-config.md +90 -90
  211. package/templates/multi-agent-format.md +28 -28
  212. package/templates/orchestration-log.md +27 -27
  213. package/templates/plugin-marketplace.md +49 -49
  214. package/templates/ralph-circuit-breaker.md +313 -313
  215. package/templates/raw-agent-output.md +37 -37
  216. package/templates/roster.md +60 -60
  217. package/templates/routing.md +39 -39
  218. package/templates/run-output.md +50 -50
  219. package/templates/scribe-charter.md +123 -119
  220. package/templates/skill.md +24 -24
  221. package/templates/skills/agent-collaboration/SKILL.md +42 -42
  222. package/templates/skills/agent-conduct/SKILL.md +24 -24
  223. package/templates/skills/architectural-proposals/SKILL.md +151 -151
  224. package/templates/skills/ci-validation-gates/SKILL.md +84 -84
  225. package/templates/skills/cli-wiring/SKILL.md +47 -47
  226. package/templates/skills/client-compatibility/SKILL.md +89 -89
  227. package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
  228. package/templates/skills/cross-squad/SKILL.md +114 -114
  229. package/templates/skills/distributed-mesh/SKILL.md +287 -287
  230. package/templates/skills/distributed-mesh/mesh.json.example +30 -30
  231. package/templates/skills/distributed-mesh/sync-mesh.ps1 +111 -111
  232. package/templates/skills/distributed-mesh/sync-mesh.sh +104 -104
  233. package/templates/skills/docs-standards/SKILL.md +71 -71
  234. package/templates/skills/economy-mode/SKILL.md +114 -114
  235. package/templates/skills/error-recovery/SKILL.md +99 -0
  236. package/templates/skills/external-comms/SKILL.md +329 -329
  237. package/templates/skills/gh-auth-isolation/SKILL.md +183 -183
  238. package/templates/skills/git-workflow/SKILL.md +204 -204
  239. package/templates/skills/github-multi-account/SKILL.md +95 -95
  240. package/templates/skills/history-hygiene/SKILL.md +36 -36
  241. package/templates/skills/humanizer/SKILL.md +105 -105
  242. package/templates/skills/init-mode/SKILL.md +102 -102
  243. package/templates/skills/iterative-retrieval/SKILL.md +165 -0
  244. package/templates/skills/model-selection/SKILL.md +117 -117
  245. package/templates/skills/nap/SKILL.md +24 -24
  246. package/templates/skills/notification-routing/SKILL.md +105 -0
  247. package/templates/skills/personal-squad/SKILL.md +57 -57
  248. package/templates/skills/pr-screenshots/SKILL.md +149 -0
  249. package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
  250. package/templates/skills/reflect/SKILL.md +229 -0
  251. package/templates/skills/release-process/SKILL.md +131 -423
  252. package/templates/skills/reskill/SKILL.md +92 -92
  253. package/templates/skills/retro-enforcement/SKILL.md +148 -0
  254. package/templates/skills/reviewer-protocol/SKILL.md +79 -79
  255. package/templates/skills/secret-handling/SKILL.md +200 -200
  256. package/templates/skills/session-recovery/SKILL.md +155 -155
  257. package/templates/skills/squad-conventions/SKILL.md +69 -69
  258. package/templates/skills/test-discipline/SKILL.md +37 -37
  259. package/templates/skills/tiered-memory/SKILL.md +234 -0
  260. package/templates/skills/windows-compatibility/SKILL.md +98 -74
  261. package/templates/{squad.agent.md → squad.agent.md.template} +1316 -1287
  262. package/templates/workflows/squad-ci.yml +24 -24
  263. package/templates/workflows/squad-docs.yml +54 -54
  264. package/templates/workflows/squad-heartbeat.yml +0 -4
  265. package/templates/workflows/squad-insider-release.yml +61 -61
  266. package/templates/workflows/squad-issue-assign.yml +161 -161
  267. package/templates/workflows/squad-label-enforce.yml +181 -181
  268. package/templates/workflows/squad-preview.yml +55 -55
  269. package/templates/workflows/squad-promote.yml +120 -120
  270. package/templates/workflows/squad-release.yml +77 -77
  271. package/templates/workflows/squad-triage.yml +260 -260
  272. package/templates/workflows/sync-squad-labels.yml +169 -169
  273. package/dist/cli/commands/watch.d.ts +0 -18
  274. package/dist/cli/commands/watch.d.ts.map +0 -1
  275. package/dist/cli/commands/watch.js +0 -306
  276. package/dist/cli/commands/watch.js.map +0 -1
@@ -1,200 +1,200 @@
1
- ---
2
- name: secret-handling
3
- description: Never read .env files or write secrets to .squad/ committed files
4
- domain: security, file-operations, team-collaboration
5
- confidence: high
6
- source: earned (issue #267 — credential leak incident)
7
- ---
8
-
9
- ## Context
10
-
11
- Spawned agents have read access to the entire repository, including `.env` files containing live credentials. If an agent reads secrets and writes them to `.squad/` files (decisions, logs, history), Scribe auto-commits them to git, exposing them in remote history. This skill codifies absolute prohibitions and safe alternatives.
12
-
13
- ## Patterns
14
-
15
- ### Prohibited File Reads
16
-
17
- **NEVER read these files:**
18
- - `.env` (production secrets)
19
- - `.env.local` (local dev secrets)
20
- - `.env.production` (production environment)
21
- - `.env.development` (development environment)
22
- - `.env.staging` (staging environment)
23
- - `.env.test` (test environment with real credentials)
24
- - Any file matching `.env.*` UNLESS explicitly allowed (see below)
25
-
26
- **Allowed alternatives:**
27
- - `.env.example` (safe — contains placeholder values, no real secrets)
28
- - `.env.sample` (safe — documentation template)
29
- - `.env.template` (safe — schema/structure reference)
30
-
31
- **If you need config info:**
32
- 1. **Ask the user directly** — "What's the database connection string?"
33
- 2. **Read `.env.example`** — shows structure without exposing secrets
34
- 3. **Read documentation** — check `README.md`, `docs/`, config guides
35
-
36
- **NEVER assume you can "just peek at .env to understand the schema."** Use `.env.example` or ask.
37
-
38
- ### Prohibited Output Patterns
39
-
40
- **NEVER write these to `.squad/` files:**
41
-
42
- | Pattern Type | Examples | Regex Pattern (for scanning) |
43
- |--------------|----------|-------------------------------|
44
- | API Keys | `OPENAI_API_KEY=sk-proj-...`, `GITHUB_TOKEN=ghp_...` | `[A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+` |
45
- | Passwords | `DB_PASSWORD=super_secret_123`, `password: "..."` | `(?:PASSWORD|PASS|PWD)[:=]\s*["']?[^\s"']+` |
46
- | Connection Strings | `postgres://user:pass@host:5432/db`, `Server=...;Password=...` | `(?:postgres|mysql|mongodb)://[^@]+@|(?:Server|Host)=.*(?:Password|Pwd)=` |
47
- | JWT Tokens | `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...` | `eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+` |
48
- | Private Keys | `-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----` | `-----BEGIN [A-Z ]+PRIVATE KEY-----` |
49
- | AWS Credentials | `AKIA...`, `aws_secret_access_key=...` | `AKIA[0-9A-Z]{16}|aws_secret_access_key=[^\s]+` |
50
- | Email Addresses | `user@example.com` (PII violation per team decision) | `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}` |
51
-
52
- **What to write instead:**
53
- - Placeholder values: `DATABASE_URL=<set in .env>`
54
- - Redacted references: `API key configured (see .env.example)`
55
- - Architecture notes: "App uses JWT auth — token stored in session"
56
- - Schema documentation: "Requires OPENAI_API_KEY, GITHUB_TOKEN (see .env.example for format)"
57
-
58
- ### Scribe Pre-Commit Validation
59
-
60
- **Before committing `.squad/` changes, Scribe MUST:**
61
-
62
- 1. **Scan all staged files** for secret patterns (use regex table above)
63
- 2. **Check for prohibited file names** (don't commit `.env` even if manually staged)
64
- 3. **If secrets detected:**
65
- - STOP the commit (do NOT proceed)
66
- - Remove the file from staging: `git reset HEAD <file>`
67
- - Report to user:
68
- ```
69
- 🚨 SECRET DETECTED — commit blocked
70
-
71
- File: .squad/decisions/inbox/river-db-config.md
72
- Pattern: DATABASE_URL=postgres://user:password@localhost:5432/prod
73
-
74
- This file contains credentials and MUST NOT be committed.
75
- Please remove the secret, replace with placeholder, and try again.
76
- ```
77
- - Exit with error (never silently skip)
78
-
79
- 4. **If no secrets detected:**
80
- - Proceed with commit as normal
81
-
82
- **Implementation note for Scribe:**
83
- - Run validation AFTER staging files, BEFORE calling `git commit`
84
- - Use PowerShell `Select-String` or `git diff --cached` to scan staged content
85
- - Fail loud — secret leaks are unacceptable, blocking the commit is correct behavior
86
-
87
- ### Remediation — If a Secret Was Already Committed
88
-
89
- **If you discover a secret in git history:**
90
-
91
- 1. **STOP immediately** — do not make more commits
92
- 2. **Alert the user:**
93
- ```
94
- 🚨 CREDENTIAL LEAK DETECTED
95
-
96
- A secret was found in git history:
97
- Commit: abc1234
98
- File: .squad/decisions/inbox/agent-config.md
99
- Pattern: API_KEY=sk-proj-...
100
-
101
- This requires immediate remediation:
102
- 1. Revoke the exposed credential (regenerate API key, rotate password)
103
- 2. Remove from git history (git filter-repo or BFG)
104
- 3. Force-push the cleaned history
105
-
106
- Do NOT proceed with new work until this is resolved.
107
- ```
108
- 3. **Do NOT attempt to fix it yourself** — secret removal requires specialized tools
109
- 4. **Wait for user confirmation** before resuming work
110
-
111
- ## Examples
112
-
113
- ### ✓ Correct: Reading Config Schema
114
-
115
- **Agent needs to know what environment variables are required:**
116
-
117
- ```
118
- Agent: "What environment variables does this app need?"
119
- → Reads `.env.example`:
120
- OPENAI_API_KEY=sk-...
121
- DATABASE_URL=postgres://user:pass@localhost:5432/db
122
- REDIS_URL=redis://localhost:6379
123
-
124
- → Writes to .squad/decisions/inbox/river-env-setup.md:
125
- "App requires three environment variables:
126
- - OPENAI_API_KEY (OpenAI API key, format: sk-...)
127
- - DATABASE_URL (Postgres connection string)
128
- - REDIS_URL (Redis connection string)
129
- See .env.example for full schema."
130
- ```
131
-
132
- ### ✗ Incorrect: Reading Live Credentials
133
-
134
- **Agent needs to know database schema:**
135
-
136
- ```
137
- Agent: (reads .env)
138
- DATABASE_URL=postgres://admin:super_secret_pw@prod.example.com:5432/appdb
139
-
140
- → Writes to .squad/decisions/inbox/river-db-schema.md:
141
- "Database connection: postgres://admin:super_secret_pw@prod.example.com:5432/appdb"
142
-
143
- 🚨 VIOLATION: Live credential written to committed file
144
- ```
145
-
146
- **Correct approach:**
147
- ```
148
- Agent: (reads .env.example OR asks user)
149
- User: "It's a Postgres database, schema is in migrations/"
150
-
151
- → Writes to .squad/decisions/inbox/river-db-schema.md:
152
- "Database: Postgres (connection configured in .env). Schema defined in db/migrations/."
153
- ```
154
-
155
- ### ✓ Correct: Scribe Pre-Commit Validation
156
-
157
- **Scribe is about to commit:**
158
-
159
- ```powershell
160
- # Stage files
161
- git add .squad/
162
-
163
- # Scan staged content for secrets
164
- $stagedContent = git diff --cached
165
- $secretPatterns = @(
166
- '[A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+',
167
- '(?:PASSWORD|PASS|PWD)[:=]\s*["'']?[^\s"'']+',
168
- 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+'
169
- )
170
-
171
- $detected = $false
172
- foreach ($pattern in $secretPatterns) {
173
- if ($stagedContent -match $pattern) {
174
- $detected = $true
175
- Write-Host "🚨 SECRET DETECTED: $($matches[0])"
176
- break
177
- }
178
- }
179
-
180
- if ($detected) {
181
- # Remove from staging, report, exit
182
- git reset HEAD .squad/
183
- Write-Error "Commit blocked — secret detected in staged files"
184
- exit 1
185
- }
186
-
187
- # Safe to commit
188
- git commit -F $msgFile
189
- ```
190
-
191
- ## Anti-Patterns
192
-
193
- - ❌ Reading `.env` "just to check the schema" — use `.env.example` instead
194
- - ❌ Writing "sanitized" connection strings that still contain credentials
195
- - ❌ Assuming "it's just a dev environment" makes secrets safe to commit
196
- - ❌ Committing first, scanning later — validation MUST happen before commit
197
- - ❌ Silently skipping secret detection — fail loud, never silent
198
- - ❌ Trusting agents to "know better" — enforce at multiple layers (prompt, hook, architecture)
199
- - ❌ Writing secrets to "temporary" files in `.squad/` — Scribe commits ALL `.squad/` changes
200
- - ❌ Extracting "just the host" from a connection string — still leaks infrastructure topology
1
+ ---
2
+ name: secret-handling
3
+ description: Never read .env files or write secrets to .squad/ committed files
4
+ domain: security, file-operations, team-collaboration
5
+ confidence: high
6
+ source: earned (issue #267 — credential leak incident)
7
+ ---
8
+
9
+ ## Context
10
+
11
+ Spawned agents have read access to the entire repository, including `.env` files containing live credentials. If an agent reads secrets and writes them to `.squad/` files (decisions, logs, history), Scribe auto-commits them to git, exposing them in remote history. This skill codifies absolute prohibitions and safe alternatives.
12
+
13
+ ## Patterns
14
+
15
+ ### Prohibited File Reads
16
+
17
+ **NEVER read these files:**
18
+ - `.env` (production secrets)
19
+ - `.env.local` (local dev secrets)
20
+ - `.env.production` (production environment)
21
+ - `.env.development` (development environment)
22
+ - `.env.staging` (staging environment)
23
+ - `.env.test` (test environment with real credentials)
24
+ - Any file matching `.env.*` UNLESS explicitly allowed (see below)
25
+
26
+ **Allowed alternatives:**
27
+ - `.env.example` (safe — contains placeholder values, no real secrets)
28
+ - `.env.sample` (safe — documentation template)
29
+ - `.env.template` (safe — schema/structure reference)
30
+
31
+ **If you need config info:**
32
+ 1. **Ask the user directly** — "What's the database connection string?"
33
+ 2. **Read `.env.example`** — shows structure without exposing secrets
34
+ 3. **Read documentation** — check `README.md`, `docs/`, config guides
35
+
36
+ **NEVER assume you can "just peek at .env to understand the schema."** Use `.env.example` or ask.
37
+
38
+ ### Prohibited Output Patterns
39
+
40
+ **NEVER write these to `.squad/` files:**
41
+
42
+ | Pattern Type | Examples | Regex Pattern (for scanning) |
43
+ |--------------|----------|-------------------------------|
44
+ | API Keys | `OPENAI_API_KEY=sk-proj-...`, `GITHUB_TOKEN=ghp_...` | `[A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+` |
45
+ | Passwords | `DB_PASSWORD=super_secret_123`, `password: "..."` | `(?:PASSWORD|PASS|PWD)[:=]\s*["']?[^\s"']+` |
46
+ | Connection Strings | `postgres://user:pass@host:5432/db`, `Server=...;Password=...` | `(?:postgres|mysql|mongodb)://[^@]+@|(?:Server|Host)=.*(?:Password|Pwd)=` |
47
+ | JWT Tokens | `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...` | `eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+` |
48
+ | Private Keys | `-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----` | `-----BEGIN [A-Z ]+PRIVATE KEY-----` |
49
+ | AWS Credentials | `AKIA...`, `aws_secret_access_key=...` | `AKIA[0-9A-Z]{16}|aws_secret_access_key=[^\s]+` |
50
+ | Email Addresses | `user@example.com` (PII violation per team decision) | `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}` |
51
+
52
+ **What to write instead:**
53
+ - Placeholder values: `DATABASE_URL=<set in .env>`
54
+ - Redacted references: `API key configured (see .env.example)`
55
+ - Architecture notes: "App uses JWT auth — token stored in session"
56
+ - Schema documentation: "Requires OPENAI_API_KEY, GITHUB_TOKEN (see .env.example for format)"
57
+
58
+ ### Scribe Pre-Commit Validation
59
+
60
+ **Before committing `.squad/` changes, Scribe MUST:**
61
+
62
+ 1. **Scan all staged files** for secret patterns (use regex table above)
63
+ 2. **Check for prohibited file names** (don't commit `.env` even if manually staged)
64
+ 3. **If secrets detected:**
65
+ - STOP the commit (do NOT proceed)
66
+ - Remove the file from staging: `git reset HEAD <file>`
67
+ - Report to user:
68
+ ```
69
+ 🚨 SECRET DETECTED — commit blocked
70
+
71
+ File: .squad/decisions/inbox/river-db-config.md
72
+ Pattern: DATABASE_URL=postgres://user:password@localhost:5432/prod
73
+
74
+ This file contains credentials and MUST NOT be committed.
75
+ Please remove the secret, replace with placeholder, and try again.
76
+ ```
77
+ - Exit with error (never silently skip)
78
+
79
+ 4. **If no secrets detected:**
80
+ - Proceed with commit as normal
81
+
82
+ **Implementation note for Scribe:**
83
+ - Run validation AFTER staging files, BEFORE calling `git commit`
84
+ - Use PowerShell `Select-String` or `git diff --cached` to scan staged content
85
+ - Fail loud — secret leaks are unacceptable, blocking the commit is correct behavior
86
+
87
+ ### Remediation — If a Secret Was Already Committed
88
+
89
+ **If you discover a secret in git history:**
90
+
91
+ 1. **STOP immediately** — do not make more commits
92
+ 2. **Alert the user:**
93
+ ```
94
+ 🚨 CREDENTIAL LEAK DETECTED
95
+
96
+ A secret was found in git history:
97
+ Commit: abc1234
98
+ File: .squad/decisions/inbox/agent-config.md
99
+ Pattern: API_KEY=sk-proj-...
100
+
101
+ This requires immediate remediation:
102
+ 1. Revoke the exposed credential (regenerate API key, rotate password)
103
+ 2. Remove from git history (git filter-repo or BFG)
104
+ 3. Force-push the cleaned history
105
+
106
+ Do NOT proceed with new work until this is resolved.
107
+ ```
108
+ 3. **Do NOT attempt to fix it yourself** — secret removal requires specialized tools
109
+ 4. **Wait for user confirmation** before resuming work
110
+
111
+ ## Examples
112
+
113
+ ### ✓ Correct: Reading Config Schema
114
+
115
+ **Agent needs to know what environment variables are required:**
116
+
117
+ ```
118
+ Agent: "What environment variables does this app need?"
119
+ → Reads `.env.example`:
120
+ OPENAI_API_KEY=sk-...
121
+ DATABASE_URL=postgres://user:pass@localhost:5432/db
122
+ REDIS_URL=redis://localhost:6379
123
+
124
+ → Writes to .squad/decisions/inbox/river-env-setup.md:
125
+ "App requires three environment variables:
126
+ - OPENAI_API_KEY (OpenAI API key, format: sk-...)
127
+ - DATABASE_URL (Postgres connection string)
128
+ - REDIS_URL (Redis connection string)
129
+ See .env.example for full schema."
130
+ ```
131
+
132
+ ### ✗ Incorrect: Reading Live Credentials
133
+
134
+ **Agent needs to know database schema:**
135
+
136
+ ```
137
+ Agent: (reads .env)
138
+ DATABASE_URL=postgres://admin:super_secret_pw@prod.example.com:5432/appdb
139
+
140
+ → Writes to .squad/decisions/inbox/river-db-schema.md:
141
+ "Database connection: postgres://admin:super_secret_pw@prod.example.com:5432/appdb"
142
+
143
+ 🚨 VIOLATION: Live credential written to committed file
144
+ ```
145
+
146
+ **Correct approach:**
147
+ ```
148
+ Agent: (reads .env.example OR asks user)
149
+ User: "It's a Postgres database, schema is in migrations/"
150
+
151
+ → Writes to .squad/decisions/inbox/river-db-schema.md:
152
+ "Database: Postgres (connection configured in .env). Schema defined in db/migrations/."
153
+ ```
154
+
155
+ ### ✓ Correct: Scribe Pre-Commit Validation
156
+
157
+ **Scribe is about to commit:**
158
+
159
+ ```powershell
160
+ # Stage files
161
+ git add .squad/
162
+
163
+ # Scan staged content for secrets
164
+ $stagedContent = git diff --cached
165
+ $secretPatterns = @(
166
+ '[A-Z_]+(?:KEY|TOKEN|SECRET)=[^\s]+',
167
+ '(?:PASSWORD|PASS|PWD)[:=]\s*["'']?[^\s"'']+',
168
+ 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+'
169
+ )
170
+
171
+ $detected = $false
172
+ foreach ($pattern in $secretPatterns) {
173
+ if ($stagedContent -match $pattern) {
174
+ $detected = $true
175
+ Write-Host "🚨 SECRET DETECTED: $($matches[0])"
176
+ break
177
+ }
178
+ }
179
+
180
+ if ($detected) {
181
+ # Remove from staging, report, exit
182
+ git reset HEAD .squad/
183
+ Write-Error "Commit blocked — secret detected in staged files"
184
+ exit 1
185
+ }
186
+
187
+ # Safe to commit
188
+ git commit -F $msgFile
189
+ ```
190
+
191
+ ## Anti-Patterns
192
+
193
+ - ❌ Reading `.env` "just to check the schema" — use `.env.example` instead
194
+ - ❌ Writing "sanitized" connection strings that still contain credentials
195
+ - ❌ Assuming "it's just a dev environment" makes secrets safe to commit
196
+ - ❌ Committing first, scanning later — validation MUST happen before commit
197
+ - ❌ Silently skipping secret detection — fail loud, never silent
198
+ - ❌ Trusting agents to "know better" — enforce at multiple layers (prompt, hook, architecture)
199
+ - ❌ Writing secrets to "temporary" files in `.squad/` — Scribe commits ALL `.squad/` changes
200
+ - ❌ Extracting "just the host" from a connection string — still leaks infrastructure topology