@lifeaitools/rdc-skills 0.24.42 → 0.25.1

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 (202) hide show
  1. package/.claude/settings.json +15 -15
  2. package/.claude-plugin/marketplace.json +21 -21
  3. package/.claude-plugin/plugin.json +1560 -1371
  4. package/.github/workflows/publish.yml +34 -34
  5. package/.github/workflows/self-test.yml +58 -58
  6. package/CHANGELOG.md +322 -310
  7. package/LICENSE +21 -21
  8. package/MANIFEST.md +224 -221
  9. package/README.md +377 -376
  10. package/README.sandbox.md +3 -3
  11. package/assets/watcher/viewer.html +164 -164
  12. package/bin/rdc-skills-mcp.mjs +316 -316
  13. package/commands/build.md +183 -183
  14. package/commands/collab.md +180 -180
  15. package/commands/deploy.md +152 -152
  16. package/commands/design.md +31 -31
  17. package/commands/edit.md +28 -28
  18. package/commands/fixit.md +150 -124
  19. package/commands/handoff.md +173 -173
  20. package/commands/help.md +95 -95
  21. package/commands/overnight.md +220 -220
  22. package/commands/plan.md +158 -158
  23. package/commands/preplan.md +131 -131
  24. package/commands/prototype.md +145 -145
  25. package/commands/release.md +49 -49
  26. package/commands/report.md +99 -99
  27. package/commands/review.md +120 -120
  28. package/commands/self-test.md +113 -113
  29. package/commands/status.md +86 -86
  30. package/commands/watch.md +98 -98
  31. package/commands/workitems.md +137 -137
  32. package/git-sha.json +1 -1
  33. package/guides/agent-bootstrap.md +295 -295
  34. package/guides/agents/backend.md +104 -104
  35. package/guides/agents/content.md +94 -94
  36. package/guides/agents/cs2.md +56 -56
  37. package/guides/agents/data.md +87 -87
  38. package/guides/agents/design.md +77 -77
  39. package/guides/agents/frontend.md +92 -92
  40. package/guides/agents/infrastructure.md +81 -81
  41. package/guides/agents/setup.md +281 -281
  42. package/guides/agents/verify.md +151 -151
  43. package/guides/agents/viz.md +106 -106
  44. package/guides/backend.md +146 -146
  45. package/guides/content.md +147 -147
  46. package/guides/cs2.md +190 -190
  47. package/guides/data.md +123 -123
  48. package/guides/design.md +116 -116
  49. package/guides/engineering-behavior.md +43 -43
  50. package/guides/escalation-protocol.md +125 -125
  51. package/guides/frontend.md +151 -151
  52. package/guides/history-md-spec.md +297 -297
  53. package/guides/infrastructure.md +179 -179
  54. package/guides/lessons-learned-spec.md +145 -151
  55. package/guides/output-contract.md +108 -108
  56. package/guides/publish-md-spec.md +289 -289
  57. package/guides/rdc-skills-startup.md +30 -30
  58. package/guides/verify.md +11 -11
  59. package/hooks/check-cwd.js +31 -31
  60. package/hooks/check-rdc-environment.js +164 -164
  61. package/hooks/check-services.js +6 -6
  62. package/hooks/check-stale-work-items.js +19 -19
  63. package/hooks/foreground-process-gate.js +128 -128
  64. package/hooks/gate-watchdog-selfcheck.js +257 -257
  65. package/hooks/hook-logger.js +25 -25
  66. package/hooks/lib/run-evidence-gate.mjs +241 -241
  67. package/hooks/no-stop-open-epics.js +127 -127
  68. package/hooks/post-tool-batch-gate.js +203 -203
  69. package/hooks/post-work-check.js +21 -21
  70. package/hooks/postcompact-log.js +13 -13
  71. package/hooks/precompact-log.js +13 -13
  72. package/hooks/rate-limit-retry.js +46 -46
  73. package/hooks/rdc-invocation-marker.js +157 -157
  74. package/hooks/rdc-output-contract-gate.js +94 -94
  75. package/hooks/require-work-item-on-commit.js +294 -294
  76. package/hooks/restart-brief.js +19 -19
  77. package/hooks/run-hidden-hook.ps1 +47 -47
  78. package/hooks/task-completed-gate.js +274 -274
  79. package/hooks/work-item-exit-gate.js +944 -944
  80. package/lib/catalog.mjs +236 -236
  81. package/lib/cloud-rewrite.mjs +155 -155
  82. package/package.json +57 -57
  83. package/rules/work-items-rpc.md +520 -520
  84. package/scaffold/templates/HISTORY.md.template +39 -39
  85. package/scaffold/templates/PUBLISH.md.template +21 -21
  86. package/scaffold/templates/brochure-studio-default.html +70 -70
  87. package/scripts/acceptance.mjs +502 -502
  88. package/scripts/fixtures/guides/bad-guide.md +15 -15
  89. package/scripts/fixtures/guides-clean/good-guide.md +16 -16
  90. package/scripts/install-rdc-skills.js +1401 -1289
  91. package/scripts/install.ps1 +202 -202
  92. package/scripts/install.sh +132 -132
  93. package/scripts/lib/assertions.mjs +287 -287
  94. package/scripts/lib/manifest-schema.mjs +754 -754
  95. package/scripts/lib/runner.mjs +465 -465
  96. package/scripts/lib/sandbox.mjs +435 -435
  97. package/scripts/prepack.mjs +32 -32
  98. package/scripts/rdc-brochure.mjs +482 -482
  99. package/scripts/rdc-design-cli.mjs +134 -134
  100. package/scripts/rebuild-mcp.mjs +107 -107
  101. package/scripts/self-test.mjs +1460 -1460
  102. package/scripts/stamp-git-sha.mjs +29 -29
  103. package/scripts/test-guide-validator.mjs +196 -196
  104. package/scripts/test-rdc-hooks.mjs +145 -145
  105. package/scripts/uninstall.ps1 +77 -77
  106. package/scripts/uninstall.sh +69 -69
  107. package/scripts/update.ps1 +43 -43
  108. package/scripts/update.sh +43 -43
  109. package/scripts/validate-place-histories.js +461 -461
  110. package/scripts/validate-publish-manifests.js +502 -424
  111. package/scripts/watch-init.mjs +100 -100
  112. package/skills/brochure/SKILL.md +107 -107
  113. package/skills/build/SKILL.md +578 -563
  114. package/skills/channel-formatter/SKILL.md +538 -533
  115. package/skills/co-develop/SKILL.md +196 -196
  116. package/skills/collab/SKILL.md +239 -239
  117. package/skills/convert/SKILL.md +167 -140
  118. package/skills/deploy/SKILL.md +541 -541
  119. package/skills/design/SKILL.md +211 -211
  120. package/skills/design/reference/ownership.md +16 -16
  121. package/skills/design/reference/rampa.md +92 -92
  122. package/skills/design/reference/studio-model.md +153 -153
  123. package/skills/edit/SKILL.md +98 -98
  124. package/skills/env/SKILL.md +141 -0
  125. package/skills/fixit/SKILL.md +203 -165
  126. package/skills/fs-mcp/SKILL.md +183 -148
  127. package/skills/handoff/SKILL.md +236 -236
  128. package/skills/help/SKILL.md +143 -143
  129. package/skills/housekeeping/SKILL.md +160 -219
  130. package/skills/lifeai-brochure-author/SKILL.md +340 -340
  131. package/skills/new-model/SKILL.md +49 -0
  132. package/skills/onramp/SKILL.md +1459 -0
  133. package/skills/overnight/SKILL.md +251 -251
  134. package/skills/plan/SKILL.md +345 -345
  135. package/skills/preplan/SKILL.md +90 -90
  136. package/skills/prototype/SKILL.md +150 -150
  137. package/skills/rdc-brochurify/SKILL.md +245 -245
  138. package/skills/rdc-extract-verifier-rules/SKILL.md +191 -191
  139. package/skills/regen-media/SKILL.md +94 -0
  140. package/skills/release/SKILL.md +140 -140
  141. package/skills/report/SKILL.md +100 -100
  142. package/skills/review/SKILL.md +160 -152
  143. package/skills/rpms-filemap/SKILL.cloud.md +111 -111
  144. package/skills/rpms-filemap/SKILL.md +111 -111
  145. package/skills/self-test/SKILL.md +132 -132
  146. package/skills/status/SKILL.md +99 -99
  147. package/skills/terminal-config/SKILL.md +62 -62
  148. package/skills/tests/MATRIX.md +55 -54
  149. package/skills/tests/README.md +47 -47
  150. package/skills/tests/onramp.test.json +87 -0
  151. package/skills/tests/rdc-brochure.test.json +34 -34
  152. package/skills/tests/rdc-build.test.json +36 -36
  153. package/skills/tests/rdc-channel-formatter.test.json +45 -45
  154. package/skills/tests/rdc-co-develop.test.json +29 -29
  155. package/skills/tests/rdc-collab.test.json +29 -29
  156. package/skills/tests/rdc-convert.test.json +35 -35
  157. package/skills/tests/rdc-deploy.test.json +30 -30
  158. package/skills/tests/rdc-design.test.json +27 -27
  159. package/skills/tests/rdc-edit.test.json +29 -29
  160. package/skills/tests/rdc-fixit.test.json +36 -36
  161. package/skills/tests/rdc-fs-mcp.test.json +36 -36
  162. package/skills/tests/rdc-handoff.test.json +28 -28
  163. package/skills/tests/rdc-help.test.json +29 -29
  164. package/skills/tests/rdc-housekeeping.test.json +28 -32
  165. package/skills/tests/rdc-lifeai-brochure-author.test.json +35 -35
  166. package/skills/tests/rdc-overnight.test.json +37 -37
  167. package/skills/tests/rdc-plan.test.json +27 -27
  168. package/skills/tests/rdc-preplan.test.json +31 -31
  169. package/skills/tests/rdc-prototype.test.json +28 -28
  170. package/skills/tests/rdc-rdc-brochurify.test.json +23 -23
  171. package/skills/tests/rdc-rdc-extract-verifier-rules.test.json +34 -34
  172. package/skills/tests/rdc-regen-media.test.json +29 -0
  173. package/skills/tests/rdc-release.test.json +29 -29
  174. package/skills/tests/rdc-report.test.json +28 -28
  175. package/skills/tests/rdc-review.test.json +29 -29
  176. package/skills/tests/rdc-rpms-filemap.test.json +28 -28
  177. package/skills/tests/rdc-self-test.test.json +24 -24
  178. package/skills/tests/rdc-status.test.json +29 -29
  179. package/skills/tests/rdc-terminal-config.test.json +29 -29
  180. package/skills/tests/rdc-watch.test.json +24 -24
  181. package/skills/tests/rdc-workitems.test.json +27 -27
  182. package/skills/watch/SKILL.md +97 -97
  183. package/skills/workitems/SKILL.md +151 -151
  184. package/tests/acceptance.test.mjs +59 -59
  185. package/tests/channel-formatter.contract.test.mjs +251 -251
  186. package/tests/curl-surface.test.mjs +289 -289
  187. package/tests/harness-gates.test.mjs +325 -325
  188. package/tests/help-surface.test.mjs +61 -61
  189. package/tests/install-rdc-skills.test.mjs +49 -49
  190. package/tests/manifest-contract-fields.test.mjs +78 -78
  191. package/tests/mcp.test.mjs +271 -271
  192. package/tests/rdc-brochure.test.mjs +125 -125
  193. package/tests/require-work-item-on-commit.test.mjs +162 -162
  194. package/tests/run-evidence-gate.test.mjs +82 -82
  195. package/tests/skill-test-matrix.test.mjs +66 -66
  196. package/tests/validate-skills.js +27 -27
  197. package/tests/work-item-exit-gate-l2.test.mjs +368 -368
  198. package/tests/work-item-exit-gate-l3.test.mjs +197 -197
  199. package/RELEASE.md +0 -42
  200. package/tests/housekeeping-lessons-triage.test.mjs +0 -49
  201. package/tests/lessons-pipeline-contract.test.mjs +0 -27
  202. package/tests/release-contract.test.mjs +0 -16
@@ -1,148 +1,183 @@
1
- ---
2
- name: rdc:fs-mcp
3
- description: "Usage `rdc:fs-mcp <task>` — Use the File System MCP bridge for live repo reads, safe writes, cloud-to-local ingest, and GitHub-branch imports into a dirty local monorepo. Use when Claude.ai, Cowork, or CLI agents need fs_read/fs_write/fs_import_git_files guidance."
4
- ---
5
-
6
- > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
- > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
- > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
-
10
-
11
- # rdc:fs-mcp — File System MCP Bridge
12
-
13
- ## When to Use
14
- - Claude.ai, Cowork, or another remote surface needs live access to `{PROJECT_ROOT}` through the File System MCP.
15
- - You need to read, search, or list current local repo files without relying on GitHub freshness.
16
- - You need to write a small/scratch file through FS MCP.
17
- - You need to move a larger cloud file into the local repo.
18
- - Claude.ai created a durable new docs/corpus file on a GitHub branch and local dev needs to import it into a dirty monorepo.
19
-
20
- ## Arguments
21
- - `rdc:fs-mcp read` — choose the right read/search/list tool.
22
- - `rdc:fs-mcp write` — choose direct write, chunked write, append, or URL ingest.
23
- - `rdc:fs-mcp import-git` — import named files from a GitHub branch/commit into local dev.
24
- - `rdc:fs-mcp status` — inspect mounts and repo state before deciding.
25
-
26
- ## Procedure
27
-
28
- ### 1. Identify the file intent
29
-
30
- Classify the file before writing:
31
-
32
- | Intent | Default path | Default action |
33
- |---|---|---|
34
- | Live repo read | Existing repo path | `fs_read`, `fs_grep`, `fs_glob`, `fs_list` |
35
- | Small scratch or relay file | `.rdc/relay/`, `.codex/tmp/`, agreed temp path | `fs_write` |
36
- | Large text file from the current chat | Target path | `fs_write_chunk` |
37
- | Cloud-hosted file | Target path | `fs_ingest_url` |
38
- | Durable new docs/corpus file from Claude.ai | Actual target path in `docs/**`, `.rdc/plans/**`, `.claude/context/**` | GitHub branch commit, then `fs_import_git_files` |
39
- | Existing file update | Existing repo path | Prefer patch/review workflow; do not overwrite unless explicitly requested |
40
-
41
- ### 2. Read/search from live local FS
42
-
43
- Use FS MCP first for local state:
44
-
45
- ```text
46
- fs_read CLAUDE.md
47
- fs_glob docs/**/*.md
48
- fs_grep "bridge mode" docs/
49
- fs_list .rdc/relay/from-claude-code/
50
- ```
51
-
52
- Use GitHub for remote branch/file history, PRs, and durable publication. Use FS for the current local worktree.
53
-
54
- ### 3. Choose the safest write surface
55
-
56
- Use direct FS writes only when the payload is small and the destination is clear:
57
-
58
- ```text
59
- fs_write path=".rdc/relay/from-claude-ai/<timestamp>-topic.md"
60
- ```
61
-
62
- Use chunked writes for larger text:
63
-
64
- ```text
65
- fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=0 total_chunks=3 content="..."
66
- fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=1 total_chunks=3 content="..."
67
- fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=2 total_chunks=3 content="..."
68
- ```
69
-
70
- Use URL ingest when the file already exists in cloud storage:
71
-
72
- ```text
73
- fs_ingest_url url="https://..." path="docs/source/file.md" expected_sha256="<optional>"
74
- ```
75
-
76
- ### ⛔ Ingest discipline (lesson 2026-06-16-collab-claudeai-fs-ingest-race-and-preview-pollution)
77
-
78
- - **Prefer synchronous `fs_write` over `fs_ingest_url` for commit-bound bytes.**
79
- `fs_ingest_url` can return before the bytes have landed on disk; a `git add`
80
- immediately after races the download and silently stages nothing. If you MUST
81
- use `fs_ingest_url` for content you will commit, `fs_stat`-poll the target path
82
- until size/hash is stable BEFORE staging or committing.
83
- - **A silent `git add` skip is NOT gitignore.** If `git add <path>` adds nothing
84
- and the file is not obviously ignored, do not assume `.gitignore` — confirm with
85
- `git check-ignore -v <path>`. No output means it is NOT ignored, so the real
86
- cause is a missing/empty/racing file, not an ignore rule.
87
- - **Never ingest claude.ai preview / Artifacts URLs.** URLs like
88
- `*.claude.ai/.../preview` or Artifact render endpoints serve a wrapped,
89
- data-omelette-injected document (host chrome, sanitizer rewrites, injected
90
- markers) — not the clean source bytes. Ingesting them pollutes the repo. Get
91
- the durable source via the GitHub-branch import path (§4) instead.
92
-
93
- Use guarded append when appending to a known file:
94
-
95
- ```text
96
- fs_stat path="docs/plans/foo.md"
97
- fs_append path="docs/plans/foo.md" content="\n..." expected_sha256="<hash from fs_stat>"
98
- ```
99
-
100
- ### 4. Import durable new files from GitHub instead of large FS writes
101
-
102
- When Claude.ai creates a durable new docs/corpus file, publish it to a GitHub branch first, then ask FS MCP to import the exact file path.
103
-
104
- Required Claude.ai handoff shape:
105
-
106
- ```json
107
- {
108
- "repo": "<owner>/<repo>",
109
- "remote": "origin",
110
- "ref": "claude-ai/docs-upload-123",
111
- "paths": ["docs/plans/foo.md"],
112
- "mode": "new_only",
113
- "commit": true,
114
- "message": "docs(plans): add foo"
115
- }
116
- ```
117
-
118
- Then call:
119
-
120
- ```text
121
- fs_import_git_files remote="origin" ref="claude-ai/docs-upload-123" paths=["docs/plans/foo.md"] mode="new_only" commit=true message="docs(plans): add foo"
122
- ```
123
-
124
- This tool must fetch only, restore only named paths, optionally commit only those paths, and never push.
125
-
126
- ### 5. Safety rules
127
-
128
- - Never run or request `git pull` for the dirty monorepo.
129
- - Never checkout a whole branch into the local worktree.
130
- - For durable docs/corpus, save to the actual target path, not an upload folder, when the target is known.
131
- - Use upload/incoming folders only when the final destination is unknown.
132
- - Default to `new_only` for Git imports.
133
- - Refuse overwrites unless the user explicitly asks for overwrite/update behavior.
134
- - Stage only imported paths when committing.
135
- - Never push from FS import unless the user explicitly asks for a push-capable workflow.
136
-
137
- ### 6. Completion report
138
-
139
- Report:
140
-
141
- ```text
142
- FS MCP: <read/write/import> complete
143
- Paths: <paths>
144
- Source ref/commit: <if Git import>
145
- Local commit: <if committed>
146
- Verification: <fs_stat/hash or import result>
147
- Blocked/conflicts: <none or list>
148
- ```
1
+ ---
2
+ name: rdc:fs-mcp
3
+ description: "Usage `rdc:fs-mcp <task>` — Use the File System MCP bridge for live repo reads, safe writes, cloud-to-local ingest, and GitHub-branch imports into a dirty local monorepo. Use when Claude.ai, Cowork, or CLI agents need fs_read/fs_write/fs_import_git_files guidance."
4
+ ---
5
+
6
+ > **⚠️ OUTPUT CONTRACT (READ FIRST):** `guides/output-contract.md`
7
+ > Checklist-only output. No tool-call narration. No raw MCP/JSON/log dumps.
8
+ > One checklist upfront, updated in place, shown again at end with a 1-line verdict.
9
+
10
+
11
+ # rdc:fs-mcp — File System MCP Bridge
12
+
13
+ ## When to Use
14
+ - Claude.ai, Cowork, or another remote surface needs live access to `{PROJECT_ROOT}` through the File System MCP.
15
+ - You need to read, search, or list current local repo files without relying on GitHub freshness.
16
+ - You need to write a small/scratch file through FS MCP.
17
+ - You need to move a larger cloud file into the local repo.
18
+ - Claude.ai created a durable new docs/corpus file on a GitHub branch and local dev needs to import it into a dirty monorepo.
19
+
20
+ ## Arguments
21
+ - `rdc:fs-mcp read` — choose the right read/search/list tool.
22
+ - `rdc:fs-mcp write` — choose direct write, chunked write, append, or URL ingest.
23
+ - `rdc:fs-mcp import-git` — import named files from a GitHub branch/commit into local dev.
24
+ - `rdc:fs-mcp status` — inspect mounts and repo state before deciding.
25
+
26
+ ## Procedure
27
+
28
+ ### 1. Identify the file intent
29
+
30
+ Classify the file before writing:
31
+
32
+ | Intent | Default path | Default action |
33
+ |---|---|---|
34
+ | Live repo read | Existing repo path | `fs_read`, `fs_grep`, `fs_glob`, `fs_list` |
35
+ | Small scratch or relay file | `.rdc/relay/`, `.codex/tmp/`, agreed temp path | `fs_write` |
36
+ | Large text file from the current chat | Target path | `fs_write_chunk` |
37
+ | Cloud-hosted file | Target path | `fs_ingest_url` |
38
+ | Durable new docs/corpus file from Claude.ai | Actual target path in `docs/**`, `.rdc/plans/**`, `.claude/context/**` | GitHub branch commit, then `fs_import_git_files` |
39
+ | Existing file update | Existing repo path | Prefer patch/review workflow; do not overwrite unless explicitly requested |
40
+
41
+ ### 2. Read/search from live local FS
42
+
43
+ Use FS MCP first for local state:
44
+
45
+ ```text
46
+ fs_read CLAUDE.md
47
+ fs_glob docs/**/*.md
48
+ fs_grep "bridge mode" docs/
49
+ fs_list .rdc/relay/from-claude-code/
50
+ ```
51
+
52
+ Use GitHub for remote branch/file history, PRs, and durable publication. Use FS for the current local worktree.
53
+
54
+ ### 3. Choose the safest write surface
55
+
56
+ Use direct FS writes only when the payload is small and the destination is clear:
57
+
58
+ ```text
59
+ fs_write path=".rdc/relay/from-claude-ai/<timestamp>-topic.md"
60
+ ```
61
+
62
+ Use chunked writes for larger text:
63
+
64
+ ```text
65
+ fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=0 total_chunks=3 content="..."
66
+ fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=1 total_chunks=3 content="..."
67
+ fs_write_chunk upload_id="<stable-id>" path="docs/plans/foo.md" chunk_index=2 total_chunks=3 content="..."
68
+ ```
69
+
70
+ Use URL ingest when the file already exists in cloud storage:
71
+
72
+ ```text
73
+ fs_ingest_url url="https://..." path="docs/source/file.md" expected_sha256="<optional>"
74
+ ```
75
+
76
+ ### ⛔ Ingest discipline (lesson 2026-06-16-collab-claudeai-fs-ingest-race-and-preview-pollution)
77
+
78
+ - **Prefer synchronous `fs_write` over `fs_ingest_url` for commit-bound bytes.**
79
+ `fs_ingest_url` can return before the bytes have landed on disk; a `git add`
80
+ immediately after races the download and silently stages nothing. If you MUST
81
+ use `fs_ingest_url` for content you will commit, `fs_stat`-poll the target path
82
+ until size/hash is stable BEFORE staging or committing.
83
+ - **A silent `git add` skip is NOT gitignore.** If `git add <path>` adds nothing
84
+ and the file is not obviously ignored, do not assume `.gitignore` — confirm with
85
+ `git check-ignore -v <path>`. No output means it is NOT ignored, so the real
86
+ cause is a missing/empty/racing file, not an ignore rule.
87
+ - **Never ingest claude.ai preview / Artifacts URLs.** URLs like
88
+ `*.claude.ai/.../preview` or Artifact render endpoints serve a wrapped,
89
+ data-omelette-injected document (host chrome, sanitizer rewrites, injected
90
+ markers) — not the clean source bytes. Ingesting them pollutes the repo. Get
91
+ the durable source via the GitHub-branch import path (§4) instead.
92
+
93
+ Use guarded append when appending to a known file:
94
+
95
+ ```text
96
+ fs_stat path="docs/plans/foo.md"
97
+ fs_append path="docs/plans/foo.md" content="\n..." expected_sha256="<hash from fs_stat>"
98
+ ```
99
+
100
+ ### 4. Import durable new files from GitHub instead of large FS writes
101
+
102
+ When Claude.ai creates a durable new docs/corpus file, publish it to a GitHub branch first, then ask FS MCP to import the exact file path.
103
+
104
+ Required Claude.ai handoff shape:
105
+
106
+ ```json
107
+ {
108
+ "repo": "<owner>/<repo>",
109
+ "remote": "origin",
110
+ "ref": "claude-ai/docs-upload-123",
111
+ "paths": ["docs/plans/foo.md"],
112
+ "mode": "new_only",
113
+ "commit": true,
114
+ "message": "docs(plans): add foo"
115
+ }
116
+ ```
117
+
118
+ Then call:
119
+
120
+ ```text
121
+ fs_import_git_files remote="origin" ref="claude-ai/docs-upload-123" paths=["docs/plans/foo.md"] mode="new_only" commit=true message="docs(plans): add foo"
122
+ ```
123
+
124
+ This tool must fetch only, restore only named paths, optionally commit only those paths, and never push.
125
+
126
+ ### 5. `fs_exec` — always use `shell: false` (the default)
127
+
128
+ `fs_exec` supports an allowlisted set of commands: `git`, `pnpm`, `npx`,
129
+ `node`, `python3`, `rclone`, `bash`, `cat`, `grep`, `find`, `wc`,
130
+ `sha256sum`, `tsc`, `eslint`.
131
+
132
+ **Always use `shell: false`** (the default). Pass commands as arrays:
133
+
134
+ ```text
135
+ fs_exec command=["git", "add", ".rdc/plans/my-file.md"]
136
+ fs_exec command=["git", "status", "--porcelain"]
137
+ fs_exec command=["git", "diff", "--cached", "--name-only"]
138
+ fs_exec command=["git", "commit", "-m", "docs(plans): add my-file"]
139
+ ```
140
+
141
+ **Never set `shell: true`** unless you specifically need pipes/redirects.
142
+ `shell: true` spawns the host shell (`pwsh.exe` on Windows), which may not
143
+ be resolvable in the FS MCP server's process context (Store-installed
144
+ PowerShell uses a `WindowsApps` shim path that breaks across process
145
+ contexts). `shell: false` spawns the command directly — `git`, `node`, etc.
146
+ are on stable PATH locations and resolve reliably.
147
+
148
+ **On `fs_exec` failure with `spawn pwsh.exe ENOENT`:** this means the host
149
+ lacks a stable PowerShell 7 install. Fix: install PowerShell 7 via MSI
150
+ (`winget install --id Microsoft.PowerShell --scope machine --force`). But
151
+ the immediate workaround is always `shell: false` — the allowlisted commands
152
+ don't need a shell to execute.
153
+
154
+ **Before writing governed files** (`.rdc/plans/`, `.claude/rules/`, any path
155
+ with MDK validation hooks): read an existing exemplar in the same directory
156
+ via `fs_read` to learn the required frontmatter schema. Write complete,
157
+ correct content on the FIRST `fs_write`. A two-stage write creates a stale
158
+ index blob; use `fs_exec command=["git", "add", "<path>"]` to re-stage if
159
+ needed.
160
+
161
+ ### 6. Safety rules
162
+
163
+ - Never run or request `git pull` for the dirty monorepo.
164
+ - Never checkout a whole branch into the local worktree.
165
+ - For durable docs/corpus, save to the actual target path, not an upload folder, when the target is known.
166
+ - Use upload/incoming folders only when the final destination is unknown.
167
+ - Default to `new_only` for Git imports.
168
+ - Refuse overwrites unless the user explicitly asks for overwrite/update behavior.
169
+ - Stage only imported paths when committing.
170
+ - Never push from FS import unless the user explicitly asks for a push-capable workflow.
171
+
172
+ ### 7. Completion report
173
+
174
+ Report:
175
+
176
+ ```text
177
+ FS MCP: <read/write/import> complete
178
+ Paths: <paths>
179
+ Source ref/commit: <if Git import>
180
+ Local commit: <if committed>
181
+ Verification: <fs_stat/hash or import result>
182
+ Blocked/conflicts: <none or list>
183
+ ```