@maoleijin/dsh-mattpocock-skills 0.1.0

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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/cordis.patch.yml +12 -0
  4. package/docs/installation.md +51 -0
  5. package/overlay/patches.json +462 -0
  6. package/overlay/skills/dsh-workflow/dsh-workflow/DSH-MAPPING.md +40 -0
  7. package/overlay/skills/dsh-workflow/dsh-workflow/SKILL.md +47 -0
  8. package/overlay/skills/dsh-workflow/dsh-workflow/SKILLS.md +50 -0
  9. package/overlay/skills/dsh-workflow/dsh-workflow/agents/openai.yaml +3 -0
  10. package/package.json +78 -0
  11. package/scripts/install-web.bat +32 -0
  12. package/skills/engineering/ask-matt/PHASE-BOUNDARIES.md +55 -0
  13. package/skills/engineering/ask-matt/SKILL.md +90 -0
  14. package/skills/engineering/ask-matt/agents/openai.yaml +5 -0
  15. package/skills/engineering/code-review/SKILL.md +87 -0
  16. package/skills/engineering/code-review/agents/openai.yaml +3 -0
  17. package/skills/engineering/codebase-design/DEEPENING.md +37 -0
  18. package/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
  19. package/skills/engineering/codebase-design/SKILL.md +114 -0
  20. package/skills/engineering/codebase-design/agents/openai.yaml +3 -0
  21. package/skills/engineering/diagnosing-bugs/SKILL.md +138 -0
  22. package/skills/engineering/diagnosing-bugs/agents/openai.yaml +3 -0
  23. package/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  24. package/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
  25. package/skills/engineering/domain-modeling/CONTEXT-FORMAT.md +60 -0
  26. package/skills/engineering/domain-modeling/SKILL.md +74 -0
  27. package/skills/engineering/domain-modeling/agents/openai.yaml +3 -0
  28. package/skills/engineering/grill-with-docs/SKILL.md +7 -0
  29. package/skills/engineering/grill-with-docs/agents/openai.yaml +5 -0
  30. package/skills/engineering/implement/SKILL.md +15 -0
  31. package/skills/engineering/implement/agents/openai.yaml +5 -0
  32. package/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
  33. package/skills/engineering/improve-codebase-architecture/SKILL.md +71 -0
  34. package/skills/engineering/improve-codebase-architecture/agents/openai.yaml +5 -0
  35. package/skills/engineering/prototype/LOGIC.md +67 -0
  36. package/skills/engineering/prototype/SKILL.md +26 -0
  37. package/skills/engineering/prototype/UI.md +112 -0
  38. package/skills/engineering/prototype/agents/openai.yaml +3 -0
  39. package/skills/engineering/research/SKILL.md +12 -0
  40. package/skills/engineering/research/agents/openai.yaml +3 -0
  41. package/skills/engineering/resolving-merge-conflicts/SKILL.md +14 -0
  42. package/skills/engineering/resolving-merge-conflicts/agents/openai.yaml +3 -0
  43. package/skills/engineering/setup-matt-pocock-skills/SKILL.md +116 -0
  44. package/skills/engineering/setup-matt-pocock-skills/agents/openai.yaml +5 -0
  45. package/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
  46. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +45 -0
  47. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
  48. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
  49. package/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
  50. package/skills/engineering/tdd/SKILL.md +38 -0
  51. package/skills/engineering/tdd/agents/openai.yaml +3 -0
  52. package/skills/engineering/tdd/mocking.md +59 -0
  53. package/skills/engineering/tdd/tests.md +77 -0
  54. package/skills/engineering/to-spec/SKILL.md +75 -0
  55. package/skills/engineering/to-spec/agents/openai.yaml +5 -0
  56. package/skills/engineering/to-tickets/SKILL.md +105 -0
  57. package/skills/engineering/to-tickets/agents/openai.yaml +5 -0
  58. package/skills/engineering/triage/AGENT-BRIEF.md +207 -0
  59. package/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
  60. package/skills/engineering/triage/SKILL.md +112 -0
  61. package/skills/engineering/triage/agents/openai.yaml +5 -0
  62. package/skills/engineering/wayfinder/SKILL.md +128 -0
  63. package/skills/engineering/wayfinder/agents/openai.yaml +5 -0
  64. package/skills/engineering/wizard/SKILL.md +44 -0
  65. package/skills/engineering/wizard/agents/openai.yaml +3 -0
  66. package/skills/engineering/wizard/template.sh +204 -0
  67. package/skills/in-progress/claude-handoff/SKILL.md +18 -0
  68. package/skills/in-progress/claude-handoff/agents/openai.yaml +5 -0
  69. package/skills/in-progress/implement-spec/SKILL.md +35 -0
  70. package/skills/in-progress/implement-spec/agents/openai.yaml +5 -0
  71. package/skills/in-progress/loop-me/SKILL.md +32 -0
  72. package/skills/in-progress/loop-me/agents/openai.yaml +5 -0
  73. package/skills/in-progress/retro/SKILL.md +44 -0
  74. package/skills/in-progress/retro/agents/openai.yaml +5 -0
  75. package/skills/in-progress/setup-ts-deep-modules/SKILL.md +102 -0
  76. package/skills/in-progress/setup-ts-deep-modules/agents/openai.yaml +5 -0
  77. package/skills/in-progress/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
  78. package/skills/in-progress/writing-beats/SKILL.md +67 -0
  79. package/skills/in-progress/writing-beats/agents/openai.yaml +5 -0
  80. package/skills/in-progress/writing-fragments/SKILL.md +79 -0
  81. package/skills/in-progress/writing-fragments/agents/openai.yaml +5 -0
  82. package/skills/in-progress/writing-shape/SKILL.md +79 -0
  83. package/skills/in-progress/writing-shape/agents/openai.yaml +5 -0
  84. package/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
  85. package/skills/misc/git-guardrails-claude-code/agents/openai.yaml +3 -0
  86. package/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
  87. package/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
  88. package/skills/misc/migrate-to-shoehorn/agents/openai.yaml +3 -0
  89. package/skills/misc/scaffold-exercises/SKILL.md +106 -0
  90. package/skills/misc/scaffold-exercises/agents/openai.yaml +3 -0
  91. package/skills/misc/setup-pre-commit/SKILL.md +91 -0
  92. package/skills/misc/setup-pre-commit/agents/openai.yaml +3 -0
  93. package/skills/productivity/grill-me/SKILL.md +7 -0
  94. package/skills/productivity/grill-me/agents/openai.yaml +5 -0
  95. package/skills/productivity/grilling/SKILL.md +28 -0
  96. package/skills/productivity/grilling/agents/openai.yaml +3 -0
  97. package/skills/productivity/handoff/SKILL.md +16 -0
  98. package/skills/productivity/handoff/agents/openai.yaml +5 -0
  99. package/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
  100. package/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
  101. package/skills/productivity/teach/MISSION-FORMAT.md +31 -0
  102. package/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
  103. package/skills/productivity/teach/SKILL.md +140 -0
  104. package/skills/productivity/teach/agents/openai.yaml +5 -0
  105. package/skills/productivity/to-questionnaire/SKILL.md +54 -0
  106. package/skills/productivity/to-questionnaire/agents/openai.yaml +5 -0
  107. package/skills/productivity/wait-what/SKILL.md +7 -0
  108. package/skills/productivity/wait-what/agents/openai.yaml +5 -0
  109. package/skills/productivity/writing-for-agents/SKILL-MECHANICS.md +22 -0
  110. package/skills/productivity/writing-for-agents/SKILL.md +81 -0
  111. package/skills/productivity/writing-for-agents/agents/openai.yaml +3 -0
  112. package/src/frontmatter.js +153 -0
  113. package/src/index.js +99 -0
  114. package/src/overlay.js +322 -0
  115. package/src/paths.js +21 -0
  116. package/src/provider.js +294 -0
  117. package/src/skills.js +325 -0
  118. package/src/yaml.js +57 -0
  119. package/test/bundle.test.js +317 -0
  120. package/test/verify-profile.cjs +48 -0
  121. package/tools/archive-duplicates.mjs +139 -0
  122. package/vendor/VENDOR.md +67 -0
  123. package/vendor/gen-slash-rules.mjs +119 -0
  124. package/vendor/overlay-report.mjs +107 -0
  125. package/vendor/skills.manifest.json +493 -0
  126. package/vendor/sync-upstream.mjs +33 -0
  127. package/vendor/vendor-skills.mjs +419 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matt Pocock
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # dsh-mattpocock-skills
2
+
3
+ [Matt Pocock's engineering skills](https://github.com/mattpocock/skills), packaged for DeepSeek Harness with a verified DSH adaptation overlay and automated upstream synchronization.
4
+
5
+ ## What this package provides
6
+
7
+ - All 37 skills currently present upstream, plus the `dsh-workflow` guide.
8
+ - A read-only `ctx.skills` provider with lazy loading and invocation-policy preservation.
9
+ - DSH adaptations applied in memory while vendored upstream files remain byte-identical.
10
+ - Exact-match validation: changed upstream wording fails instead of silently producing a partial adaptation.
11
+ - Cross-platform synchronization, generated manifests, tests, and scheduled update pull requests.
12
+
13
+ This project combines work from [NmouZh/dsh-mattpocock-skills](https://github.com/NmouZh/dsh-mattpocock-skills) and [auggie246/dsh-mattpocock-skills](https://github.com/auggie246/dsh-mattpocock-skills). The original skills are MIT licensed and authored by Matt Pocock. See [LICENSE](LICENSE) and [vendor/VENDOR.md](vendor/VENDOR.md).
14
+
15
+ ## Install
16
+
17
+ ### DSH Web
18
+
19
+ ```powershell
20
+ npx --yes @deepseek-ai/dsh plugin --profile web add @maoleijin/dsh-mattpocock-skills
21
+ ```
22
+
23
+ Restart `dsh web`, refresh the page, and open a new session. Verify with:
24
+
25
+ ```powershell
26
+ npx --yes @deepseek-ai/dsh --profile web --dump-config | Select-String "mattpocock"
27
+ ```
28
+
29
+ ### DSH Desktop
30
+
31
+ DSH Desktop exclusively manages its profile. Open its plugin-management window, enter the npm package name below, inspect the preview, and confirm installation:
32
+
33
+ ```text
34
+ @maoleijin/dsh-mattpocock-skills
35
+ ```
36
+
37
+ Completely quit and reopen DSH Desktop, then start a new session. Desktop does not accept filesystem paths or GitHub URLs in the package field.
38
+
39
+ See [docs/installation.md](docs/installation.md) or run [scripts/install-web.bat](scripts/install-web.bat) on Windows.
40
+
41
+ ## Use
42
+
43
+ Start with:
44
+
45
+ ```text
46
+ /dsh-workflow
47
+ /setup-matt-pocock-skills
48
+ ```
49
+
50
+ Common user-started flows include `/ask-matt`, `/grill-with-docs`, `/to-spec`, `/to-tickets`, `/implement`, and `/wayfinder`. Model-invocable disciplines include `tdd`, `code-review`, `diagnosing-bugs`, `domain-modeling`, `codebase-design`, and `research`.
51
+
52
+ ## Synchronize upstream
53
+
54
+ With an upstream checkout next to this repository:
55
+
56
+ ```powershell
57
+ npm ci
58
+ npm run sync:local
59
+ npm test
60
+ ```
61
+
62
+ Or let the synchronizer clone the configured upstream into a temporary directory:
63
+
64
+ ```powershell
65
+ npm run sync
66
+ npm test
67
+ ```
68
+
69
+ Set `MATTPOCOCK_SKILLS_REPOSITORY` to use another Git remote. Scheduled synchronization opens a pull request only after overlay and provider validation succeeds.
70
+
71
+ ## Validate
72
+
73
+ ```powershell
74
+ npm ci
75
+ npm run check
76
+ npm test
77
+ ```
78
+
79
+ If upstream rewrites text targeted by the DSH overlay, validation reports the exact stale rule. Update `overlay/patches.json`, regenerate the mechanical rules, and rerun the suite.
@@ -0,0 +1,12 @@
1
+ # dsh-mattpocock-skills bundle patch: inserts the bundled skill provider row
2
+ # into the web profile roster. Applied as a profile bundle layer (the
3
+ # `dsh.bundle.patch` manifest field) over dsh-base; activate with
4
+ # `dsh plugin --profile web add @maoleijin/dsh-mattpocock-skills`.
5
+ #
6
+ # The row is a bare plugin by package name: the host half registers a
7
+ # read-only `ctx.skills` provider that serves the vendored mattpocock skill
8
+ # tree from this package, so no skill file needs to be copied into a user root.
9
+ # Optional config keys: enabled, rank, skillRoot, promote.
10
+ - insert:
11
+ - id: mattpocock-skills
12
+ name: '@maoleijin/dsh-mattpocock-skills'
@@ -0,0 +1,51 @@
1
+ # Installation
2
+
3
+ The published package name is:
4
+
5
+ ```text
6
+ @maoleijin/dsh-mattpocock-skills
7
+ ```
8
+
9
+ No machine-specific filesystem path is required.
10
+
11
+ ## Web profile
12
+
13
+ ```powershell
14
+ npx --yes @deepseek-ai/dsh plugin --profile web add @maoleijin/dsh-mattpocock-skills
15
+ ```
16
+
17
+ Verify the provider:
18
+
19
+ ```powershell
20
+ npx --yes @deepseek-ai/dsh --profile web --dump-config | Select-String "mattpocock"
21
+ ```
22
+
23
+ Restart `dsh web`, refresh the client, and create a new session.
24
+
25
+ ## Desktop profile
26
+
27
+ The CLI cannot modify the Desktop-managed profile. In DSH Desktop:
28
+
29
+ 1. Open the plugin-management window.
30
+ 2. Choose the action for installing a package.
31
+ 3. Enter `@maoleijin/dsh-mattpocock-skills`.
32
+ 4. Wait for the registry preview and verify the exact package name and version.
33
+ 5. Confirm installation.
34
+ 6. Completely quit and reopen DSH Desktop.
35
+ 7. Create a new session and invoke `/dsh-workflow`.
36
+
37
+ The Desktop package field accepts npm registry package names, not local paths or GitHub URLs.
38
+
39
+ ## Windows helper
40
+
41
+ Run `scripts\install-web.bat`. It checks Node.js and pnpm, installs the published package into the Web profile, and verifies registration. Desktop installation remains an explicit UI operation because Electron exclusively owns that profile.
42
+
43
+ ## Updating
44
+
45
+ Web profile:
46
+
47
+ ```powershell
48
+ npx --yes @deepseek-ai/dsh plugin --profile web update @maoleijin/dsh-mattpocock-skills
49
+ ```
50
+
51
+ For Desktop, use the update action in its plugin-management window. Restart and create a new session after upgrading.
@@ -0,0 +1,462 @@
1
+ {
2
+ "schema": "dsh-mattpocock-skills/overlay@1",
3
+ "upstream": {
4
+ "repository": "https://github.com/mattpocock/skills",
5
+ "version": "1.2.3"
6
+ },
7
+ "$comment": [
8
+ "DSH adaptation layer. The vendored tree under skills/ stays a byte-for-byte copy of upstream;",
9
+ "everything in this file is applied in memory by the skill provider, so `vendor-skills.mjs --check`",
10
+ "can still prove the baseline is pristine. Each rule is an exact literal find/replace plus the",
11
+ "number of occurrences the rule expects: a count mismatch fails the drift check instead of",
12
+ "silently half-applying after an upstream reword.",
13
+ "Why these edits exist: upstream is written for Claude Code, where `/name` is a command the model",
14
+ "can run. In DSH `/name` is a user-facing slash command, and a skill marked",
15
+ "`disable-model-invocation: true` cannot be loaded by the model at all, so the routing prose has to",
16
+ "name skills instead of issuing commands. See skills/dsh-workflow/ for the model-facing contract."
17
+ ],
18
+ "rules": [
19
+ {
20
+ "file": "engineering/ask-matt/SKILL.md",
21
+ "note": "the router is the entry point: teach it DSH's two invocation surfaces before it lists flows",
22
+ "find": "You don't remember every skill, so ask.",
23
+ "replace": [
24
+ "You don't remember every skill, so ask.",
25
+ "",
26
+ "**In DSH** this router names skills instead of running them. Load a name below with the `skill` tool whenever that skill is model-invocable; when a name is marked **user-only** in [`dsh-workflow`](../dsh-workflow/SKILL.md), the model cannot load it — say so and let the user invoke it from their own session, so it starts in a fresh context window the way the flow expects."
27
+ ],
28
+ "expect": 1
29
+ },
30
+ {
31
+ "file": "engineering/ask-matt/SKILL.md",
32
+ "note": "context hygiene: /clear and /compact are the harness's controls, not skills",
33
+ "find": "kick off **`/implement`** per ticket, **`/clear`ing context between each one**.",
34
+ "replace": "kick off **`implement`** per ticket, **starting a fresh session between each one** (the user starts it; a new session is what keeps each ticket's context disposable).",
35
+ "expect": 1
36
+ },
37
+ {
38
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
39
+ "note": "the move table's first row pair",
40
+ "find": "| **`/clear`** | Empty the context window and start from nothing. |",
41
+ "replace": "| **Fresh session** | Empty the context window and start from nothing. Only the user can start one; ask for it. |",
42
+ "expect": 1
43
+ },
44
+ {
45
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
46
+ "note": "step 5 hands the model a slash command with an instruction argument",
47
+ "find": "Pass it an instruction (`/compact we're going to QA this area`) so the summary keeps what the next phase needs.",
48
+ "replace": "Pass it an instruction (`/compact we're going to QA this area`) so the summary keeps what the next phase needs — the user runs the command, so ask for it in those words.",
49
+ "expect": 1
50
+ },
51
+ {
52
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
53
+ "note": "harness-swap example names two CLIs; DSH is a third",
54
+ "find": "- swapping to a **new harness** (Claude → Codex),",
55
+ "replace": "- swapping to a **new harness** (Claude Code → Codex → DSH),",
56
+ "expect": 1
57
+ },
58
+ {
59
+ "file": "engineering/triage/SKILL.md",
60
+ "note": "the maintainer's entry point, described from inside the skill",
61
+ "find": "The maintainer invokes `/triage` and describes what they want in natural language.",
62
+ "replace": "The maintainer invokes the `triage` skill (in DSH: a user-only slash command) and describes what they want in natural language.",
63
+ "expect": 1
64
+ },
65
+ {
66
+ "file": "engineering/setup-matt-pocock-skills/domain.md",
67
+ "note": "domain-doc consumer rules: this file is read as a reference, so it must not send the model to a user-only skill",
68
+ "find": "The `/domain-modeling` skill (reached via `/grill-with-docs` and `/improve-codebase-architecture`) creates them lazily",
69
+ "replace": "The `domain-modeling` skill (reached from the **user-only** `grill-with-docs` and `improve-codebase-architecture` skills) creates them lazily",
70
+ "expect": 1
71
+ },
72
+ {
73
+ "file": "engineering/setup-matt-pocock-skills/domain.md",
74
+ "note": "same file, the gap signal",
75
+ "find": "or there's a real gap (note it for `/domain-modeling`).",
76
+ "replace": "or there's a real gap (note it for a `domain-modeling` pass).",
77
+ "expect": 1
78
+ },
79
+ {
80
+ "file": "engineering/setup-matt-pocock-skills/issue-tracker-github.md",
81
+ "note": "tracker doc read by other skills",
82
+ "find": "Used by `/wayfinder`.",
83
+ "replace": "Used by the **user-only** `wayfinder` skill.",
84
+ "expect": 1
85
+ },
86
+ {
87
+ "file": "engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md",
88
+ "note": "same line in the GitLab template",
89
+ "find": "Used by `/wayfinder`.",
90
+ "replace": "Used by the **user-only** `wayfinder` skill.",
91
+ "expect": 1
92
+ },
93
+ {
94
+ "file": "engineering/setup-matt-pocock-skills/issue-tracker-local.md",
95
+ "note": "same line in the local-markdown template",
96
+ "find": "Used by `/wayfinder`.",
97
+ "replace": "Used by the **user-only** `wayfinder` skill.",
98
+ "expect": 1
99
+ },
100
+ {
101
+ "file": "engineering/improve-codebase-architecture/HTML-REPORT.md",
102
+ "note": "report template references the glossary skill three times",
103
+ "find": "(from the `/codebase-design` skill)",
104
+ "replace": "(from the `codebase-design` skill)",
105
+ "expect": 1
106
+ },
107
+ {
108
+ "file": "engineering/improve-codebase-architecture/HTML-REPORT.md",
109
+ "note": "second reference",
110
+ "find": "come straight from the `/codebase-design` skill.",
111
+ "replace": "come straight from the `codebase-design` skill.",
112
+ "expect": 1
113
+ },
114
+ {
115
+ "file": "engineering/improve-codebase-architecture/HTML-REPORT.md",
116
+ "note": "third reference",
117
+ "find": "If a term isn't in the `/codebase-design` glossary",
118
+ "replace": "If a term isn't in the `codebase-design` glossary",
119
+ "expect": 1
120
+ },
121
+ {
122
+ "file": "engineering/to-tickets/SKILL.md",
123
+ "note": "here the setup skill is named as configuration a human ran, so it only needs to stop reading as a command",
124
+ "find": "**How** depends on the tracker `/setup-matt-pocock-skills` configured",
125
+ "replace": "**How** depends on the tracker the `setup-matt-pocock-skills` setup chose",
126
+ "expect": 1
127
+ },
128
+ {
129
+ "file": "engineering/setup-matt-pocock-skills/SKILL.md",
130
+ "note": "the plugin ships every skill in one tree, so a folder probe is always true; the real signal is whether the session catalog carries triage",
131
+ "find": "- Is the `triage` skill installed? (a `triage` skill folder alongside this one, or `triage` in your available skills.) This decides whether Section B runs at all.",
132
+ "replace": "- Is the `triage` skill available? In DSH the whole mattpocock set ships in one bundle, so a `triage` folder always sits alongside this one — the folder proves nothing. Use your own available-skills catalog instead, and answer **yes** when it lists `triage`. This decides whether Section B runs at all.",
133
+ "expect": 1
134
+ },
135
+ {
136
+ "file": "in-progress/setup-ts-deep-modules/SKILL.md",
137
+ "note": "the done-when line repeats the file choice",
138
+ "find": "the repo's `CLAUDE.md`/`AGENTS.md` links to it.",
139
+ "replace": "the repo's instruction file (`AGENTS.md`, else `CLAUDE.md`) links to it.",
140
+ "expect": 1
141
+ },
142
+ {
143
+ "file": "productivity/handoff/SKILL.md",
144
+ "note": "the receiving session is a new DSH session, which cannot rely on the OS temp dir surviving or being found",
145
+ "find": "Save to the temporary directory of the user's OS - not the current workspace.",
146
+ "replace": "Save it inside the workspace, not the OS temp directory: the receiving agent is a fresh DSH session whose cwd is the workspace, so `handoff/<YYYY-MM-DD>-<slug>.md` is where it will actually look. Keep `/tmp` out of it — a temp path is neither discoverable from the repo nor guaranteed to survive a reboot.",
147
+ "expect": 1
148
+ },
149
+ {
150
+ "file": "in-progress/claude-handoff/SKILL.md",
151
+ "note": "blocker: the whole point of this skill is Claude Code's background CLI; DSH delegates in-process",
152
+ "find": "Write a handoff summary of the current conversation so a fresh agent can continue the work. Instead of saving it, launch a background agent seeded with the summary as its prompt: `claude --bg --name \"<descriptive name>\" \"<handoff summary>\"`. It starts in the current working directory and returns immediately; the user manages it with `claude agents`.",
153
+ "replace": "Write a handoff summary of the current conversation so a fresh agent can continue the work. In DSH you do not shell out to another CLI for this: delegate with the `subagent` tool, passing the summary as the prompt (it runs in this workspace and returns its own report), or `subagent_fork` when the child should inherit this conversation instead of just the summary. Both return a durable agent id immediately, so keep working and pick the result up later with `job_output`/`list_agents` and `send_message`.",
154
+ "expect": 1
155
+ },
156
+ {
157
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
158
+ "note": "move table: the two non-skill moves lose their command spelling",
159
+ "find": "| **`/handoff`** | Write a portable markdown file and seed a session anywhere with it. |",
160
+ "replace": "| **Handoff** | Write a portable markdown file and seed a session anywhere with it. |",
161
+ "expect": 1
162
+ },
163
+ {
164
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
165
+ "note": "same table, the compaction row",
166
+ "find": "| **`/compact`** | Compress this context and seed a fresh session with the summary. |",
167
+ "replace": "| **Compact** | Compress this context and seed a fresh session with the summary (the DSH `/compact` command, run by the user). |",
168
+ "expect": 1
169
+ },
170
+ {
171
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
172
+ "note": "step 3 opens on handoff as a command",
173
+ "find": "**3. Do you need to hand off?** `/handoff` is narrow.",
174
+ "replace": "**3. Do you need to hand off?** The user-only `handoff` skill is narrow.",
175
+ "expect": 1
176
+ },
177
+ {
178
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
179
+ "note": "step 3's closing line",
180
+ "find": "That list is the whole clause. What `/handoff` buys is **portability**",
181
+ "replace": "That list is the whole clause. What `handoff` buys is **portability**",
182
+ "expect": 1
183
+ },
184
+ {
185
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
186
+ "note": "step 5 is the compaction branch, and the command is the user's to run",
187
+ "find": "**5. Otherwise, `/compact`.**",
188
+ "replace": "**5. Otherwise, ask for `/compact`.**",
189
+ "expect": 1
190
+ },
191
+ {
192
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
193
+ "note": "the default-not-first-reach paragraph opens on the command",
194
+ "find": "`/compact` is the **default, not the first reach**.",
195
+ "replace": "Compaction is the **default, not the first reach**.",
196
+ "expect": 1
197
+ },
198
+ {
199
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
200
+ "note": "source table names both moves",
201
+ "find": "| Secondary (`/compact`, `/handoff`) |",
202
+ "replace": "| Secondary (Compaction, Handoff) |",
203
+ "expect": 1
204
+ },
205
+ {
206
+ "file": "engineering/ask-matt/PHASE-BOUNDARIES.md",
207
+ "note": "DSH has no /clear command; the user starts a fresh session instead",
208
+ "find": "If so, **`/clear`**. It is the cheapest move on the board: it takes no time and hands back the whole window. `/clear` also isn't terminal: the old session stays resumable.",
209
+ "replace": "If so, ask the user to start a **fresh session**. It is the cheapest move on the board: it takes no time and hands back the whole window. The old session stays resumable.",
210
+ "expect": 1
211
+ }
212
+ ],
213
+ "slashInvocations": {
214
+ "$comment": [
215
+ "Mechanical normalisation for files the hand-written rules above already touch: the remaining",
216
+ "`/name` references are commands upstream, but in DSH a skill is loaded by name and a session",
217
+ "command is run by the user. Applied after the hand-written rules, with the same exact-count",
218
+ "contract; `overlay-report.mjs` lists every one of them with its observed count.",
219
+ "ask-matt/PHASE-BOUNDARIES.md is excluded: its prose was rewritten by hand instead."
220
+ ],
221
+ "files": {
222
+ "engineering/ask-matt/SKILL.md": [
223
+ {
224
+ "find": "**`/clear`**",
225
+ "replace": "**Clear**",
226
+ "expect": 1,
227
+ "note": "clear is a session-level move the user asks for, so it is named in prose"
228
+ },
229
+ {
230
+ "find": "`/code-review`",
231
+ "replace": "`code-review`",
232
+ "expect": 2,
233
+ "note": "code-review is a skill, not a command: name it instead of running it"
234
+ },
235
+ {
236
+ "find": "`/codebase-design`",
237
+ "replace": "`codebase-design`",
238
+ "expect": 2,
239
+ "note": "codebase-design is a skill, not a command: name it instead of running it"
240
+ },
241
+ {
242
+ "find": "**`/compact`**",
243
+ "replace": "**Compact**",
244
+ "expect": 1,
245
+ "note": "compact is a session-level move the user asks for, so it is named in prose"
246
+ },
247
+ {
248
+ "find": "`/diagnosing-bugs`",
249
+ "replace": "`diagnosing-bugs`",
250
+ "expect": 1,
251
+ "note": "diagnosing-bugs is a skill, not a command: name it instead of running it"
252
+ },
253
+ {
254
+ "find": "`/domain-modeling`",
255
+ "replace": "`domain-modeling`",
256
+ "expect": 1,
257
+ "note": "domain-modeling is a skill, not a command: name it instead of running it"
258
+ },
259
+ {
260
+ "find": "`/grill-me`",
261
+ "replace": "`grill-me`",
262
+ "expect": 4,
263
+ "note": "grill-me is a skill, not a command: name it instead of running it"
264
+ },
265
+ {
266
+ "find": "`/grill-with-docs`",
267
+ "replace": "`grill-with-docs`",
268
+ "expect": 10,
269
+ "note": "grill-with-docs is a skill, not a command: name it instead of running it"
270
+ },
271
+ {
272
+ "find": "`/grilling`",
273
+ "replace": "`grilling`",
274
+ "expect": 2,
275
+ "note": "grilling is a skill, not a command: name it instead of running it"
276
+ },
277
+ {
278
+ "find": "`/handoff`",
279
+ "replace": "`handoff`",
280
+ "expect": 5,
281
+ "note": "handoff is a skill, not a command: name it instead of running it"
282
+ },
283
+ {
284
+ "find": "`/implement`",
285
+ "replace": "`implement`",
286
+ "expect": 7,
287
+ "note": "implement is a skill, not a command: name it instead of running it"
288
+ },
289
+ {
290
+ "find": "`/improve-codebase-architecture`",
291
+ "replace": "`improve-codebase-architecture`",
292
+ "expect": 4,
293
+ "note": "improve-codebase-architecture is a skill, not a command: name it instead of running it"
294
+ },
295
+ {
296
+ "find": "`/prototype`",
297
+ "replace": "`prototype`",
298
+ "expect": 2,
299
+ "note": "prototype is a skill, not a command: name it instead of running it"
300
+ },
301
+ {
302
+ "find": "`/research`",
303
+ "replace": "`research`",
304
+ "expect": 1,
305
+ "note": "research is a skill, not a command: name it instead of running it"
306
+ },
307
+ {
308
+ "find": "`/resolving-merge-conflicts`",
309
+ "replace": "`resolving-merge-conflicts`",
310
+ "expect": 1,
311
+ "note": "resolving-merge-conflicts is a skill, not a command: name it instead of running it"
312
+ },
313
+ {
314
+ "find": "`/setup-matt-pocock-skills`",
315
+ "replace": "`setup-matt-pocock-skills`",
316
+ "expect": 1,
317
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
318
+ },
319
+ {
320
+ "find": "`/tdd`",
321
+ "replace": "`tdd`",
322
+ "expect": 3,
323
+ "note": "tdd is a skill, not a command: name it instead of running it"
324
+ },
325
+ {
326
+ "find": "`/teach`",
327
+ "replace": "`teach`",
328
+ "expect": 1,
329
+ "note": "teach is a skill, not a command: name it instead of running it"
330
+ },
331
+ {
332
+ "find": "`/to-questionnaire`",
333
+ "replace": "`to-questionnaire`",
334
+ "expect": 1,
335
+ "note": "to-questionnaire is a skill, not a command: name it instead of running it"
336
+ },
337
+ {
338
+ "find": "`/to-spec`",
339
+ "replace": "`to-spec`",
340
+ "expect": 3,
341
+ "note": "to-spec is a skill, not a command: name it instead of running it"
342
+ },
343
+ {
344
+ "find": "`/to-tickets`",
345
+ "replace": "`to-tickets`",
346
+ "expect": 5,
347
+ "note": "to-tickets is a skill, not a command: name it instead of running it"
348
+ },
349
+ {
350
+ "find": "`/triage`",
351
+ "replace": "`triage`",
352
+ "expect": 2,
353
+ "note": "triage is a skill, not a command: name it instead of running it"
354
+ },
355
+ {
356
+ "find": "`/wait-what`",
357
+ "replace": "`wait-what`",
358
+ "expect": 1,
359
+ "note": "wait-what is a skill, not a command: name it instead of running it"
360
+ },
361
+ {
362
+ "find": "`/wayfinder`",
363
+ "replace": "`wayfinder`",
364
+ "expect": 2,
365
+ "note": "wayfinder is a skill, not a command: name it instead of running it"
366
+ },
367
+ {
368
+ "find": "`/wizard`",
369
+ "replace": "`wizard`",
370
+ "expect": 1,
371
+ "note": "wizard is a skill, not a command: name it instead of running it"
372
+ },
373
+ {
374
+ "find": "`/writing-for-agents`",
375
+ "replace": "`writing-for-agents`",
376
+ "expect": 1,
377
+ "note": "writing-for-agents is a skill, not a command: name it instead of running it"
378
+ }
379
+ ],
380
+ "engineering/code-review/SKILL.md": [
381
+ {
382
+ "find": "`/setup-matt-pocock-skills`",
383
+ "replace": "`setup-matt-pocock-skills`",
384
+ "expect": 1,
385
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
386
+ }
387
+ ],
388
+ "engineering/improve-codebase-architecture/SKILL.md": [
389
+ {
390
+ "find": "`/codebase-design`",
391
+ "replace": "`codebase-design`",
392
+ "expect": 1,
393
+ "note": "codebase-design is a skill, not a command: name it instead of running it"
394
+ }
395
+ ],
396
+ "engineering/setup-matt-pocock-skills/issue-tracker-github.md": [
397
+ {
398
+ "find": "`/triage`",
399
+ "replace": "`triage`",
400
+ "expect": 1,
401
+ "note": "triage is a skill, not a command: name it instead of running it"
402
+ }
403
+ ],
404
+ "engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md": [
405
+ {
406
+ "find": "`/triage`",
407
+ "replace": "`triage`",
408
+ "expect": 1,
409
+ "note": "triage is a skill, not a command: name it instead of running it"
410
+ }
411
+ ],
412
+ "engineering/to-spec/SKILL.md": [
413
+ {
414
+ "find": "`/setup-matt-pocock-skills`",
415
+ "replace": "`setup-matt-pocock-skills`",
416
+ "expect": 1,
417
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
418
+ }
419
+ ],
420
+ "engineering/to-tickets/SKILL.md": [
421
+ {
422
+ "find": "`/setup-matt-pocock-skills`",
423
+ "replace": "`setup-matt-pocock-skills`",
424
+ "expect": 1,
425
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
426
+ }
427
+ ],
428
+ "engineering/triage/AGENT-BRIEF.md": [
429
+ {
430
+ "find": "`/triage`",
431
+ "replace": "`triage`",
432
+ "expect": 1,
433
+ "note": "triage is a skill, not a command: name it instead of running it"
434
+ }
435
+ ],
436
+ "engineering/triage/SKILL.md": [
437
+ {
438
+ "find": "`/setup-matt-pocock-skills`",
439
+ "replace": "`setup-matt-pocock-skills`",
440
+ "expect": 1,
441
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
442
+ }
443
+ ],
444
+ "engineering/wayfinder/SKILL.md": [
445
+ {
446
+ "find": "`/setup-matt-pocock-skills`",
447
+ "replace": "`setup-matt-pocock-skills`",
448
+ "expect": 1,
449
+ "note": "setup-matt-pocock-skills is a skill, not a command: name it instead of running it"
450
+ }
451
+ ],
452
+ "in-progress/loop-me/SKILL.md": [
453
+ {
454
+ "find": "`/grilling`",
455
+ "replace": "`grilling`",
456
+ "expect": 1,
457
+ "note": "grilling is a skill, not a command: name it instead of running it"
458
+ }
459
+ ]
460
+ }
461
+ }
462
+ }
@@ -0,0 +1,40 @@
1
+ # Upstream → DSH
2
+
3
+ The vocabulary translation the skills assume, and the DSH features worth reaching for in each flow.
4
+ Upstream is written for a harness whose conventions differ; the overlay rewrites the places where that
5
+ would have changed behaviour, and this file is the short version of the same map.
6
+
7
+ ## Translation table
8
+
9
+ | Upstream says | In DSH |
10
+ | --- | --- |
11
+ | `` `/grilling` `` (a command you run) | the skill named `grilling` — load it with the `skill` tool |
12
+ | "run `/setup-matt-pocock-skills`" | that skill is **user-only**: ask the user to start it; you cannot load it |
13
+ | `/clear` | a fresh session — only the user starts one (`/clear` does not exist in DSH) |
14
+ | `/compact [instruction]` | the `/compact` command, run by the user; ask for it in those words |
15
+ | "a sub-agent" / "a background agent" | the `subagent` tool (background, durable id, report back) or `subagent_fork` to inherit this conversation |
16
+ | "spawn 3+ sub-agents in parallel" | several `subagent` calls in one message, or the `workflow` tool for a real fan-out with phases and structured results |
17
+ | "the receiving session opens a file" | a fresh DSH session whose cwd is the workspace — so handoff files belong in the repo, not `/tmp` |
18
+ | `CLAUDE.md` (first choice) | `AGENTS.md` is read first; `CLAUDE.md` is the fallback, and both still work |
19
+ | `.claude/settings.json` hooks | **not read by DSH.** Use repo git hooks (`setup-pre-commit`) or DSH's permission settings |
20
+ | "ask the user" | the `ask_user_question` tool when you want a structured choice; plain prose otherwise |
21
+ | TodoWrite-style checklists | the `todo_write` tool |
22
+ | "the issue tracker" | unchanged: `docs/agents/issue-tracker.md` in the repo, GitHub/GitLab via `gh`/`glab`, or local markdown under `.scratch/` |
23
+ | `CONTEXT.md`, `docs/adr/`, `.out-of-scope/`, `docs/agents/` | unchanged — these are repo conventions, not harness features |
24
+
25
+ ## DSH features that fit these flows
26
+
27
+ - **`subagent`** — the workhorse. Runs in its own context window in this workspace and returns a report, which is exactly what `code-review` (two axes), `codebase-design`'s design-it-twice (three or more alternatives) and `research` (fan-out per ticket) ask for. Start them in one message so they run concurrently; each returns a durable id you can follow up with.
28
+ - **`workflow`** — when the fan-out is large or multi-stage (a research ticket per branch, a sweep over many files), it coordinates many subagents with phases instead of you hand-managing them.
29
+ - **`subagent_fork`** — inherits this conversation. Use it when the child must know what was already decided, which the flows otherwise pay for with a handoff document.
30
+ - **Plan mode** — `to-spec` and `wayfinder` produce a plan before anything is built; plan mode is how that conversation stays a proposal until the user approves it.
31
+ - **Goals** — a multi-session build from `to-tickets` is the shape a long-running goal is for: one objective, continued across turns, with progress that survives session boundaries.
32
+ - **Todo list** — `implement` walks tickets and red-green slices; `todo_write` is how that progress is visible instead of implied.
33
+ - **`ask_user_question`** — `grilling`, `triage`, `setup-matt-pocock-skills` and `to-questionnaire` are interview-shaped. A structured question with options beats a paragraph when the answer is a choice; keep prose for open questions.
34
+
35
+ ## What deliberately does *not* change
36
+
37
+ - The skills' substance: what a good test is, the triage roles, the deepening vocabulary, the review axes.
38
+ - Repo conventions: `CONTEXT.md`, `CONTEXT-MAP.md`, `docs/adr/`, `docs/agents/`, `.scratch/`, `.out-of-scope/`.
39
+ - The flow order and the phase-boundary tree, including which moves are cheap and which are lossy.
40
+ - Upstream's choice to keep 20 skills user-started. DSH makes that a hard gate rather than a convention, which is why the rewrite list exists at all.