devrites 5.6.0 → 5.7.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 (48) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/install.sh +107 -41
  4. package/pack/.claude/skills/rite-define/SKILL.md +1 -1
  5. package/pack/.claude/skills/rite-handoff/SKILL.md +1 -1
  6. package/pack/.claude/skills/rite-plan/SKILL.md +1 -1
  7. package/pack/.claude/skills/rite-pressure-test/SKILL.md +1 -1
  8. package/pack/.claude/skills/rite-quick/SKILL.md +1 -1
  9. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  10. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  11. package/pack/generated/claude/skills/rite-define/SKILL.md +1 -1
  12. package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -1
  13. package/pack/generated/claude/skills/rite-plan/SKILL.md +1 -1
  14. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +1 -1
  15. package/pack/generated/claude/skills/rite-quick/SKILL.md +1 -1
  16. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  17. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  18. package/pack/generated/codex/skills/rite-define/SKILL.md +1 -1
  19. package/pack/generated/codex/skills/rite-handoff/SKILL.md +1 -1
  20. package/pack/generated/codex/skills/rite-plan/SKILL.md +1 -1
  21. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +1 -1
  22. package/pack/generated/codex/skills/rite-quick/SKILL.md +1 -1
  23. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  24. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  25. package/pack/generated/omp/skills/rite-define/SKILL.md +1 -1
  26. package/pack/generated/omp/skills/rite-handoff/SKILL.md +1 -1
  27. package/pack/generated/omp/skills/rite-plan/SKILL.md +1 -1
  28. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +1 -1
  29. package/pack/generated/omp/skills/rite-quick/SKILL.md +1 -1
  30. package/pack/generated/omp/skills/rite-status/SKILL.md +1 -1
  31. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  32. package/pack/generated/pi/prompts/rite-define.md +1 -1
  33. package/pack/generated/pi/prompts/rite-handoff.md +1 -1
  34. package/pack/generated/pi/prompts/rite-plan.md +1 -1
  35. package/pack/generated/pi/prompts/rite-pressure-test.md +1 -1
  36. package/pack/generated/pi/prompts/rite-quick.md +1 -1
  37. package/pack/generated/pi/prompts/rite-status.md +1 -1
  38. package/pack/generated/pi/prompts/rite-zoom-out.md +1 -1
  39. package/pack/generated/pi/skills/rite-define/SKILL.md +1 -1
  40. package/pack/generated/pi/skills/rite-handoff/SKILL.md +1 -1
  41. package/pack/generated/pi/skills/rite-plan/SKILL.md +1 -1
  42. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +1 -1
  43. package/pack/generated/pi/skills/rite-quick/SKILL.md +1 -1
  44. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  45. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  46. package/package.json +1 -1
  47. package/scripts/build-host-artifacts.sh +59 -46
  48. package/scripts/pi-generate.sh +15 -15
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [5.7.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.6.0...v5.7.0) (2026-09-13)
6
+
7
+ ### Added
8
+
9
+ * **installer:** pi as fourth host target + skill frontmatter YAML fix ([#70](https://github.com/ViktorsBaikers/DevRites/issues/70)) ([9275755](https://github.com/ViktorsBaikers/DevRites/commit/92757555f4c6cf74f8cdec5f8e8688ec28360508))
10
+
5
11
  ## [5.6.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.5.0...v5.6.0) (2026-09-13)
6
12
 
7
13
  ### Added
package/README.md CHANGED
@@ -33,7 +33,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
33
33
  Unattended runs may create local WIP checkpoint commits along the way, but they
34
34
  remain local unless Ship's disclosed plan includes an approved remote action.
35
35
 
36
- **Status:** [`v5.6.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.6.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
36
+ **Status:** [`v5.7.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.7.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
37
37
 
38
38
  This is the latest published release; `main` may contain unreleased work.
39
39
 
package/install.sh CHANGED
@@ -28,8 +28,8 @@ normalize_release_tag() {
28
28
  printf '%s\n' "$version" | LC_ALL=C grep -Eq '^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$' || return 1
29
29
  prerelease="${version%%+*}"
30
30
  case "$prerelease" in
31
- *-*) prerelease="${prerelease#*-}" ;;
32
- *) prerelease="" ;;
31
+ *-*) prerelease="${prerelease#*-}" ;;
32
+ *) prerelease="" ;;
33
33
  esac
34
34
  if [ -n "$prerelease" ]; then
35
35
  printf '%s\n' "$prerelease" | awk -F. '{ for (i = 1; i <= NF; i++) if ($i ~ /^[0-9]+$/ && length($i) > 1 && substr($i, 1, 1) == "0") exit 1 }' || return 1
@@ -45,11 +45,11 @@ bounded_curl() {
45
45
  DOWNLOAD_FAILURE=""
46
46
  rm -f "$out" "$out.part"
47
47
  curl -fL --proto '=https' --proto-redir '=https' --tlsv1.2 --connect-timeout 10 --max-time "$seconds" \
48
- "$url" 2>/dev/null | head -c "$((limit + 1))" > "$out.part"
48
+ "$url" 2>/dev/null | head -c "$((limit + 1))" >"$out.part"
49
49
  pipeline_status=("${PIPESTATUS[@]}")
50
50
  curl_status="${pipeline_status[0]}"
51
51
  head_status="${pipeline_status[1]}"
52
- bytes="$(wc -c < "$out.part" 2>/dev/null)" || {
52
+ bytes="$(wc -c <"$out.part" 2>/dev/null)" || {
53
53
  DOWNLOAD_FAILURE="local write"
54
54
  rm -f "$out.part"
55
55
  return 1
@@ -66,15 +66,19 @@ bounded_curl() {
66
66
  fi
67
67
  if [ "$curl_status" -ne 0 ]; then
68
68
  case "$curl_status" in
69
- 22) DOWNLOAD_FAILURE="HTTP status" ;;
70
- 28) DOWNLOAD_FAILURE="timeout" ;;
71
- 47) DOWNLOAD_FAILURE="redirect" ;;
72
- *) DOWNLOAD_FAILURE="download" ;;
69
+ 22) DOWNLOAD_FAILURE="HTTP status" ;;
70
+ 28) DOWNLOAD_FAILURE="timeout" ;;
71
+ 47) DOWNLOAD_FAILURE="redirect" ;;
72
+ *) DOWNLOAD_FAILURE="download" ;;
73
73
  esac
74
74
  rm -f "$out.part"
75
75
  return 1
76
76
  fi
77
- mv "$out.part" "$out" || { DOWNLOAD_FAILURE="local write"; rm -f "$out.part"; return 1; }
77
+ mv "$out.part" "$out" || {
78
+ DOWNLOAD_FAILURE="local write"
79
+ rm -f "$out.part"
80
+ return 1
81
+ }
78
82
  }
79
83
 
80
84
  bounded_decompress() {
@@ -83,11 +87,11 @@ bounded_decompress() {
83
87
  limit="$3"
84
88
  DECOMPRESS_FAILURE=""
85
89
  rm -f "$out" "$out.part"
86
- gzip -dc "$archive" 2>/dev/null | head -c "$((limit + 1))" > "$out.part"
90
+ gzip -dc "$archive" 2>/dev/null | head -c "$((limit + 1))" >"$out.part"
87
91
  pipeline_status=("${PIPESTATUS[@]}")
88
92
  gzip_status="${pipeline_status[0]}"
89
93
  head_status="${pipeline_status[1]}"
90
- bytes="$(wc -c < "$out.part" 2>/dev/null)" || {
94
+ bytes="$(wc -c <"$out.part" 2>/dev/null)" || {
91
95
  DECOMPRESS_FAILURE="could not write bounded archive"
92
96
  rm -f "$out.part"
93
97
  return 1
@@ -107,7 +111,11 @@ bounded_decompress() {
107
111
  rm -f "$out.part"
108
112
  return 1
109
113
  fi
110
- mv "$out.part" "$out" || { DECOMPRESS_FAILURE="could not write bounded archive"; rm -f "$out.part"; return 1; }
114
+ mv "$out.part" "$out" || {
115
+ DECOMPRESS_FAILURE="could not write bounded archive"
116
+ rm -f "$out.part"
117
+ return 1
118
+ }
111
119
  }
112
120
 
113
121
  verify_sha256() {
@@ -173,19 +181,31 @@ preflight_archive() {
173
181
  bootstrap_bundle() {
174
182
  script="install"
175
183
  case "${1:-}" in
176
- install|update|uninstall)
177
- script="$1"
178
- shift
179
- ;;
184
+ install | update | uninstall)
185
+ script="$1"
186
+ shift
187
+ ;;
180
188
  esac
181
189
  if [ "${DEVRITES_BOOTSTRAPPED:-0}" = "1" ]; then
182
190
  echo "error: bootstrap re-exec did not find pack/ - aborting to avoid a loop." >&2
183
191
  exit 1
184
192
  fi
185
- command -v curl >/dev/null 2>&1 || { echo "error: curl is required for the network installer." >&2; exit 1; }
186
- command -v gzip >/dev/null 2>&1 || { echo "error: gzip is required for the network installer." >&2; exit 1; }
187
- command -v tar >/dev/null 2>&1 || { echo "error: tar is required for the network installer." >&2; exit 1; }
188
- valid_repo "$DEVRITES_REPO" || { echo "error: DEVRITES_REPO must be an owner/repository name." >&2; exit 1; }
193
+ command -v curl >/dev/null 2>&1 || {
194
+ echo "error: curl is required for the network installer." >&2
195
+ exit 1
196
+ }
197
+ command -v gzip >/dev/null 2>&1 || {
198
+ echo "error: gzip is required for the network installer." >&2
199
+ exit 1
200
+ }
201
+ command -v tar >/dev/null 2>&1 || {
202
+ echo "error: tar is required for the network installer." >&2
203
+ exit 1
204
+ }
205
+ valid_repo "$DEVRITES_REPO" || {
206
+ echo "error: DEVRITES_REPO must be an owner/repository name." >&2
207
+ exit 1
208
+ }
189
209
  old_umask="$(umask)"
190
210
  umask 077
191
211
  BOOTSTRAP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/devrites-bootstrap.XXXXXX" 2>/dev/null)" || {
@@ -197,7 +217,10 @@ bootstrap_bundle() {
197
217
  trap 'exit 1' HUP INT TERM
198
218
  trap 'rm -rf "$BOOTSTRAP_DIR"' EXIT
199
219
  if [ -n "$DEVRITES_REF" ]; then
200
- tag="$(normalize_release_tag "$DEVRITES_REF")" || { echo "error: DEVRITES_REF must be an exact semantic version." >&2; exit 1; }
220
+ tag="$(normalize_release_tag "$DEVRITES_REF")" || {
221
+ echo "error: DEVRITES_REF must be an exact semantic version." >&2
222
+ exit 1
223
+ }
201
224
  else
202
225
  metadata="$BOOTSTRAP_DIR/latest.json"
203
226
  bounded_curl "https://api.github.com/repos/$DEVRITES_REPO/releases/latest" "$metadata" "$BOOTSTRAP_MAX_METADATA" 30 || {
@@ -205,23 +228,53 @@ bootstrap_bundle() {
205
228
  exit 1
206
229
  }
207
230
  metadata_tag="$(sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$metadata" | head -n1)"
208
- tag="$(normalize_release_tag "$metadata_tag")" || { echo "error: latest release did not provide an exact semantic version." >&2; exit 1; }
231
+ tag="$(normalize_release_tag "$metadata_tag")" || {
232
+ echo "error: latest release did not provide an exact semantic version." >&2
233
+ exit 1
234
+ }
209
235
  fi
210
236
  asset="devrites-$tag.tar.gz"
211
237
  archive="$BOOTSTRAP_DIR/$asset"
212
238
  sidecar="$archive.sha256"
213
239
  url="https://github.com/$DEVRITES_REPO/releases/download/$tag/$asset"
214
- bounded_curl "$url" "$archive" "$BOOTSTRAP_MAX_ARCHIVE" 120 || { echo "error: release $tag asset $asset: ${DOWNLOAD_FAILURE:-download} failed." >&2; exit 1; }
215
- bounded_curl "$url.sha256" "$sidecar" "$BOOTSTRAP_MAX_SIDECAR" 30 || { rm -f "$archive"; echo "error: release $tag asset $asset.sha256: ${DOWNLOAD_FAILURE:-download} failed." >&2; exit 1; }
216
- verify_sha256 "$archive" "$sidecar" "$asset" || { rm -f "$archive" "$sidecar"; echo "error: release $tag asset $asset: checksum failed." >&2; exit 1; }
240
+ bounded_curl "$url" "$archive" "$BOOTSTRAP_MAX_ARCHIVE" 120 || {
241
+ echo "error: release $tag asset $asset: ${DOWNLOAD_FAILURE:-download} failed." >&2
242
+ exit 1
243
+ }
244
+ bounded_curl "$url.sha256" "$sidecar" "$BOOTSTRAP_MAX_SIDECAR" 30 || {
245
+ rm -f "$archive"
246
+ echo "error: release $tag asset $asset.sha256: ${DOWNLOAD_FAILURE:-download} failed." >&2
247
+ exit 1
248
+ }
249
+ verify_sha256 "$archive" "$sidecar" "$asset" || {
250
+ rm -f "$archive" "$sidecar"
251
+ echo "error: release $tag asset $asset: checksum failed." >&2
252
+ exit 1
253
+ }
217
254
  uncompressed="$BOOTSTRAP_DIR/devrites-$tag.tar"
218
- bounded_decompress "$archive" "$uncompressed" "$BOOTSTRAP_MAX_UNCOMPRESSED" || { rm -f "$archive" "$sidecar"; echo "error: release $tag asset $asset: ${DECOMPRESS_FAILURE:-decompression failed}." >&2; exit 1; }
219
- preflight_archive "$uncompressed" "$tag" || { rm -f "$archive" "$sidecar" "$uncompressed"; echo "error: release $tag asset $asset: archive preflight failed." >&2; exit 1; }
255
+ bounded_decompress "$archive" "$uncompressed" "$BOOTSTRAP_MAX_UNCOMPRESSED" || {
256
+ rm -f "$archive" "$sidecar"
257
+ echo "error: release $tag asset $asset: ${DECOMPRESS_FAILURE:-decompression failed}." >&2
258
+ exit 1
259
+ }
260
+ preflight_archive "$uncompressed" "$tag" || {
261
+ rm -f "$archive" "$sidecar" "$uncompressed"
262
+ echo "error: release $tag asset $asset: archive preflight failed." >&2
263
+ exit 1
264
+ }
220
265
  extract="$BOOTSTRAP_DIR/extract"
221
266
  mkdir "$extract" || exit 1
222
- tar -C "$extract" -xf "$uncompressed" || { rm -rf "$extract"; echo "error: could not extract bounded DevRites tarball" >&2; exit 1; }
267
+ tar -C "$extract" -xf "$uncompressed" || {
268
+ rm -rf "$extract"
269
+ echo "error: could not extract bounded DevRites tarball" >&2
270
+ exit 1
271
+ }
223
272
  bundle="$extract/devrites-$tag"
224
- [ -f "$bundle/$script.sh" ] || { rm -rf "$extract"; echo "error: extracted bundle is missing $script.sh" >&2; exit 1; }
273
+ [ -f "$bundle/$script.sh" ] || {
274
+ rm -rf "$extract"
275
+ echo "error: extracted bundle is missing $script.sh" >&2
276
+ exit 1
277
+ }
225
278
  chmod +x "$bundle/install.sh" "$bundle/uninstall.sh" "$bundle/update.sh" 2>/dev/null || true
226
279
  echo "DevRites: bootstrapped from $tag"
227
280
  export DEVRITES_BOOTSTRAPPED=1
@@ -235,25 +288,38 @@ if [ -z "$SELF_DIR" ] || [ ! -d "$SELF_DIR/pack" ]; then
235
288
  fi
236
289
 
237
290
  INSTALL_LIB="$SELF_DIR/scripts/install-lib.sh"
238
- [ -f "$INSTALL_LIB" ] || { echo "error: extracted bundle is missing scripts/install-lib.sh" >&2; exit 1; }
291
+ [ -f "$INSTALL_LIB" ] || {
292
+ echo "error: extracted bundle is missing scripts/install-lib.sh" >&2
293
+ exit 1
294
+ }
239
295
  . "$INSTALL_LIB"
240
296
 
241
- DR_ENGINE_PATH=""; DR_ENGINE_TMP=""
297
+ DR_ENGINE_PATH=""
298
+ DR_ENGINE_TMP=""
242
299
  trap dr_cleanup_engine EXIT
243
300
  trap 'exit 1' HUP INT TERM
244
- dr_acquire_engine "$SELF_DIR" install "$DEVRITES_REPO" || { echo "error: could not acquire devrites-engine (no usable installed binary and no matching verified release binary${DR_ACQUIRE_FAILURE:+; $DR_ACQUIRE_FAILURE})." >&2; exit 1; }
301
+ dr_acquire_engine "$SELF_DIR" install "$DEVRITES_REPO" || {
302
+ echo "error: could not acquire devrites-engine (no usable installed binary and no matching verified release binary${DR_ACQUIRE_FAILURE:+; $DR_ACQUIRE_FAILURE})." >&2
303
+ exit 1
304
+ }
245
305
  ENGINE="$DR_ENGINE_PATH"
246
306
  PAYLOAD="${DEVRITES_HOST_ARTIFACT_DIR:-$SELF_DIR/pack/generated}"
247
- if [ ! -d "$PAYLOAD/claude/skills" ] || [ ! -d "$PAYLOAD/codex/skills" ] \
248
- || [ ! -d "$PAYLOAD/pi/skills" ] || [ ! -d "$PAYLOAD/pi/agents" ] \
249
- || [ ! -d "$PAYLOAD/pi/prompts" ] \
250
- || [ ! -f "$PAYLOAD/claude/skills/devrites-lib/reference/standards/agents.md" ] \
251
- || [ ! -f "$PAYLOAD/codex/skills/devrites-lib/reference/standards/agents.md" ] \
252
- || [ ! -f "$PAYLOAD/pi/skills/devrites-lib/reference/standards/agents.md" ] \
253
- || [ ! -f "$PAYLOAD/codex/config.toml" ] || [ ! -f "$PAYLOAD/pi/AGENTS.md" ]; then
307
+ if [ ! -d "$PAYLOAD/claude/skills" ] || [ ! -d "$PAYLOAD/codex/skills" ] ||
308
+ [ ! -d "$PAYLOAD/pi/skills" ] || [ ! -d "$PAYLOAD/pi/agents" ] ||
309
+ [ ! -d "$PAYLOAD/pi/prompts" ] ||
310
+ [ ! -f "$PAYLOAD/claude/skills/devrites-lib/reference/standards/agents.md" ] ||
311
+ [ ! -f "$PAYLOAD/codex/skills/devrites-lib/reference/standards/agents.md" ] ||
312
+ [ ! -f "$PAYLOAD/pi/skills/devrites-lib/reference/standards/agents.md" ] ||
313
+ [ ! -f "$PAYLOAD/codex/config.toml" ] || [ ! -f "$PAYLOAD/pi/AGENTS.md" ]; then
254
314
  BUILDER="$SELF_DIR/scripts/build-host-artifacts.sh"
255
- [ -f "$BUILDER" ] || { echo "error: generated install payload missing at $PAYLOAD and builder missing at $BUILDER" >&2; exit 1; }
256
- DEVRITES_HOST_ARTIFACT_DIR="$PAYLOAD" bash "$BUILDER" >/dev/null || { echo "error: could not generate install payload at $PAYLOAD" >&2; exit 1; }
315
+ [ -f "$BUILDER" ] || {
316
+ echo "error: generated install payload missing at $PAYLOAD and builder missing at $BUILDER" >&2
317
+ exit 1
318
+ }
319
+ DEVRITES_HOST_ARTIFACT_DIR="$PAYLOAD" bash "$BUILDER" >/dev/null || {
320
+ echo "error: could not generate install payload at $PAYLOAD" >&2
321
+ exit 1
322
+ }
257
323
  fi
258
324
  export DEVRITES_ENGINE_CLI="$ENGINE"
259
325
  "$ENGINE" install --source-dir "$SELF_DIR" --payload-dir "$PAYLOAD" "$@"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
3
+ description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.
3
+ description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
3
+ description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
3
+ description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
3
+ description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-status
3
- description: User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.
3
+ description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-zoom-out
3
- description: User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.
3
+ description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
4
4
  argument-hint: "[symbol | file | area to map]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
3
+ description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.
3
+ description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
3
+ description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
3
+ description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
3
+ description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-status
3
- description: User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.
3
+ description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-zoom-out
3
- description: User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.
3
+ description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
4
4
  argument-hint: "[symbol | file | area to map]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
3
+ description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.
3
+ description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
3
+ description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
3
+ description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
3
+ description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-status
3
- description: User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.
3
+ description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-zoom-out
3
- description: User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.
3
+ description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
4
4
  argument-hint: "[symbol | file | area to map]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
3
+ description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.
3
+ description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
3
+ description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
3
+ description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
3
+ description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-status
3
- description: User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.
3
+ description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-zoom-out
3
- description: User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.
3
+ description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
4
4
  argument-hint: "[symbol | file | area to map]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
2
+ description: "\"Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.\""
3
3
  argument-hint: "\"[feature-slug]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-define/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
2
+ description: "\"User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.\""
3
3
  argument-hint: "\"[what the next session will focus on]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-handoff/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
2
+ description: "\"Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.\""
3
3
  argument-hint: "\"[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-plan/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
2
+ description: "\"Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.\""
3
3
  argument-hint: "\"[rough idea or plan to stress-test]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-pressure-test/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
2
+ description: "\"Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.\""
3
3
  argument-hint: "\"<what to change>\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-quick/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
2
+ description: "\"User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.\""
3
3
  argument-hint: "\"[feature-slug]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-status/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
2
+ description: "\"User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.\""
3
3
  argument-hint: "\"[symbol | file | area to map]\""
4
4
  ---
5
5
  Read and follow the DevRites skill at `.pi/skills/rite-zoom-out/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
3
+ description: "Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff.
3
+ description: "User-invoked handoff writer: sync chat-only context into `.devrites/` and write a fresh-agent handoff."
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
3
+ description: "Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition."
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
3
+ description: "Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec."
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
3
+ description: "Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix."
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-status
3
- description: User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness.
3
+ description: "User-invoked read-only active-feature report: phase, active slice, next action, evidence, open questions, drift, risks, and handoff readiness."
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-zoom-out
3
- description: User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions.
3
+ description: "User-invoked read-only structural map of unfamiliar code: modules, callers, callees, and relevant decisions."
4
4
  argument-hint: "[symbol | file | area to map]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "5.6.0",
3
+ "version": "5.7.0",
4
4
  "description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code, Codex, omp, and pi",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
@@ -10,9 +10,18 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
10
10
  PACK_SRC="$ROOT/pack/.claude"
11
11
  OUT_ROOT="${DEVRITES_HOST_ARTIFACT_DIR:-$ROOT/pack/generated}"
12
12
 
13
- [ -d "$PACK_SRC/skills" ] || { echo "build-host-artifacts: missing $PACK_SRC/skills" >&2; exit 1; }
14
- [ -d "$PACK_SRC/agents" ] || { echo "build-host-artifacts: missing $PACK_SRC/agents" >&2; exit 1; }
15
- [ -d "$PACK_SRC/workflows" ] || { echo "build-host-artifacts: missing $PACK_SRC/workflows" >&2; exit 1; }
13
+ [ -d "$PACK_SRC/skills" ] || {
14
+ echo "build-host-artifacts: missing $PACK_SRC/skills" >&2
15
+ exit 1
16
+ }
17
+ [ -d "$PACK_SRC/agents" ] || {
18
+ echo "build-host-artifacts: missing $PACK_SRC/agents" >&2
19
+ exit 1
20
+ }
21
+ [ -d "$PACK_SRC/workflows" ] || {
22
+ echo "build-host-artifacts: missing $PACK_SRC/workflows" >&2
23
+ exit 1
24
+ }
16
25
 
17
26
  TMP_GEN_DIR="$(mktemp -d)"
18
27
  cleanup() { rm -rf "$TMP_GEN_DIR"; }
@@ -26,79 +35,83 @@ trap cleanup EXIT
26
35
  . "$ROOT/scripts/pi-generate.sh"
27
36
 
28
37
  copy_tree() {
29
- _src="$1"; _dest="$2"
38
+ _src="$1"
39
+ _dest="$2"
30
40
  mkdir -p "$(dirname "$_dest")"
31
41
  rm -rf "$_dest"
32
42
  cp -R "$_src" "$_dest"
33
43
  }
34
44
 
35
45
  render_codex_skill_tree() {
36
- _sd="$1"; _dest="$2"
46
+ _sd="$1"
47
+ _dest="$2"
37
48
  mkdir -p "$_dest"
38
49
  while IFS= read -r f; do
39
50
  _r="${f#$_sd/}"
40
51
  _out="$_dest/$_r"
41
52
  mkdir -p "$(dirname "$_out")"
42
53
  case "$_r" in
43
- SKILL.md)
44
- _implicit_disabled=0
45
- if awk 'NR==1&&$0=="---"{fm=1;next} fm&&$0=="---"{exit} fm&&/^disable-model-invocation:[[:space:]]*true/{u=1} END{exit !u}' "$f"; then
46
- _implicit_disabled=1
47
- fi
48
- gen_codex_skill_file "$f" "$_out"
49
- if [ "$_implicit_disabled" -eq 1 ]; then
50
- mkdir -p "$_dest/agents"
51
- printf 'policy:\n allow_implicit_invocation: false\n' > "$_dest/agents/openai.yaml"
52
- fi
53
- ;;
54
- *.md)
55
- gen_codex_markdown_file "$f" "$_out"
56
- ;;
57
- *)
58
- cp "$f" "$_out"
59
- ;;
54
+ SKILL.md)
55
+ _implicit_disabled=0
56
+ if awk 'NR==1&&$0=="---"{fm=1;next} fm&&$0=="---"{exit} fm&&/^disable-model-invocation:[[:space:]]*true/{u=1} END{exit !u}' "$f"; then
57
+ _implicit_disabled=1
58
+ fi
59
+ gen_codex_skill_file "$f" "$_out"
60
+ if [ "$_implicit_disabled" -eq 1 ]; then
61
+ mkdir -p "$_dest/agents"
62
+ printf 'policy:\n allow_implicit_invocation: false\n' >"$_dest/agents/openai.yaml"
63
+ fi
64
+ ;;
65
+ *.md)
66
+ gen_codex_markdown_file "$f" "$_out"
67
+ ;;
68
+ *)
69
+ cp "$f" "$_out"
70
+ ;;
60
71
  esac
61
72
  done < <(find "$_sd" -type f)
62
73
  }
63
74
 
64
75
  render_omp_skill_tree() {
65
- _sd="$1"; _dest="$2"
76
+ _sd="$1"
77
+ _dest="$2"
66
78
  mkdir -p "$_dest"
67
79
  while IFS= read -r f; do
68
80
  _r="${f#$_sd/}"
69
81
  _out="$_dest/$_r"
70
82
  mkdir -p "$(dirname "$_out")"
71
83
  case "$_r" in
72
- SKILL.md)
73
- gen_omp_skill_file "$f" "$_out"
74
- ;;
75
- *.md)
76
- gen_omp_markdown_file "$f" "$_out"
77
- ;;
78
- *)
79
- cp "$f" "$_out"
80
- ;;
84
+ SKILL.md)
85
+ gen_omp_skill_file "$f" "$_out"
86
+ ;;
87
+ *.md)
88
+ gen_omp_markdown_file "$f" "$_out"
89
+ ;;
90
+ *)
91
+ cp "$f" "$_out"
92
+ ;;
81
93
  esac
82
94
  done < <(find "$_sd" -type f)
83
95
  }
84
96
 
85
97
  render_pi_skill_tree() {
86
- _sd="$1"; _dest="$2"
98
+ _sd="$1"
99
+ _dest="$2"
87
100
  mkdir -p "$_dest"
88
101
  while IFS= read -r f; do
89
102
  _r="${f#$_sd/}"
90
103
  _out="$_dest/$_r"
91
104
  mkdir -p "$(dirname "$_out")"
92
105
  case "$_r" in
93
- SKILL.md)
94
- gen_pi_skill_file "$f" "$_out"
95
- ;;
96
- *.md)
97
- gen_pi_markdown_file "$f" "$_out"
98
- ;;
99
- *)
100
- cp "$f" "$_out"
101
- ;;
106
+ SKILL.md)
107
+ gen_pi_skill_file "$f" "$_out"
108
+ ;;
109
+ *.md)
110
+ gen_pi_markdown_file "$f" "$_out"
111
+ ;;
112
+ *)
113
+ cp "$f" "$_out"
114
+ ;;
102
115
  esac
103
116
  done < <(find "$_sd" -type f)
104
117
  }
@@ -155,9 +168,9 @@ while IFS= read -r d; do
155
168
  [ "$name" = ".impeccable" ] && continue
156
169
  render_pi_skill_tree "$d" "$OUT_ROOT/pi/skills/$name"
157
170
  case "$name" in
158
- rite|rite-*)
159
- gen_pi_prompt_stub "$d/SKILL.md" "$name" "$OUT_ROOT/pi/prompts/$name.md"
160
- ;;
171
+ rite | rite-*)
172
+ gen_pi_prompt_stub "$d/SKILL.md" "$name" "$OUT_ROOT/pi/prompts/$name.md"
173
+ ;;
161
174
  esac
162
175
  done < <(find "$PACK_SRC/skills" -mindepth 1 -maxdepth 1 -type d)
163
176
 
@@ -168,7 +181,7 @@ done < <(find "$PACK_SRC/agents" -maxdepth 1 -type f -name '*.md')
168
181
 
169
182
  gen_pi_agents_bridge "$OUT_ROOT/pi/AGENTS.md"
170
183
 
171
- cat > "$OUT_ROOT/README.md" <<'EOF'
184
+ cat >"$OUT_ROOT/README.md" <<'EOF'
172
185
  # Generated DevRites Host Artifacts
173
186
 
174
187
  This directory is generated by `scripts/build-host-artifacts.sh`.
@@ -56,7 +56,7 @@ gen_pi_markdown_file() {
56
56
  -e 's#verb dispatches to the matching `rite-<verb>` skill#verb invokes the matching `rite-<verb>` skill#g' \
57
57
  -e 's#the dispatch map only#the invocation map only#g' \
58
58
  -e 's#→ dispatch per the table above#→ invoke the matching skill per the table above#g' \
59
- "$_src" > "$_out"
59
+ "$_src" >"$_out"
60
60
  }
61
61
 
62
62
  gen_pi_skill_file() {
@@ -88,15 +88,15 @@ _pi_map_tools() {
88
88
  _tok="${_tok%"${_tok##*[![:space:]]}"}"
89
89
  [ -z "$_tok" ] && continue
90
90
  case "$_tok" in
91
- Read|read) _mapped="read" ;;
92
- Edit|edit) _mapped="edit" ;;
93
- Write|write) _mapped="write" ;;
94
- Bash|bash) _mapped="bash" ;;
95
- Grep|grep) _mapped="grep" ;;
96
- Glob|glob) _mapped="find" ;;
97
- LS|ls) _mapped="ls" ;;
98
- Skill|skill) continue ;;
99
- *) continue ;;
91
+ Read | read) _mapped="read" ;;
92
+ Edit | edit) _mapped="edit" ;;
93
+ Write | write) _mapped="write" ;;
94
+ Bash | bash) _mapped="bash" ;;
95
+ Grep | grep) _mapped="grep" ;;
96
+ Glob | glob) _mapped="find" ;;
97
+ LS | ls) _mapped="ls" ;;
98
+ Skill | skill) continue ;;
99
+ *) continue ;;
100
100
  esac
101
101
  _out="${_out}${_sep}${_mapped}"
102
102
  _sep=", "
@@ -129,7 +129,7 @@ gen_pi_agent() {
129
129
  _tools="$(_pi_map_tools "$_tools_raw" "$_name")"
130
130
  _desc_tmp="$TMP_GEN_DIR/pi-agent-desc-$(basename "$_src").txt"
131
131
  _desc_pi="$TMP_GEN_DIR/pi-agent-desc-$(basename "$_src").pi.txt"
132
- printf '%s' "$_desc" > "$_desc_tmp"
132
+ printf '%s' "$_desc" >"$_desc_tmp"
133
133
  gen_pi_markdown_file "$_desc_tmp" "$_desc_pi"
134
134
  _desc="$(cat "$_desc_pi")"
135
135
  [ -n "$_desc" ] || _desc="DevRites custom agent."
@@ -144,10 +144,10 @@ gen_pi_agent() {
144
144
  printf '%s\n' "---"
145
145
  _body_tmp="$TMP_GEN_DIR/pi-agent-body-$(basename "$_src").md"
146
146
  _body_pi="$TMP_GEN_DIR/pi-agent-body-$(basename "$_src").pi.md"
147
- awk 'NR==1 && $0=="---"{fm=1; next} fm && $0=="---"{fm=0; body=1; next} body{print}' "$_src" > "$_body_tmp"
147
+ awk 'NR==1 && $0=="---"{fm=1; next} fm && $0=="---"{fm=0; body=1; next} body{print}' "$_src" >"$_body_tmp"
148
148
  gen_pi_markdown_file "$_body_tmp" "$_body_pi"
149
149
  cat "$_body_pi"
150
- } > "$_out"
150
+ } >"$_out"
151
151
  }
152
152
 
153
153
  # Write a pi prompt template that preserves the public /<name> command form.
@@ -166,12 +166,12 @@ gen_pi_prompt_stub() {
166
166
  [ -n "$_hint" ] && printf 'argument-hint: "%s"\n' "$(pi_yaml_escape "$_hint")"
167
167
  printf '%s\n' "---"
168
168
  printf 'Read and follow the DevRites skill at `.pi/skills/%s/SKILL.md`, applying it to: ${ARGUMENTS:-the current request}.\n' "$_name"
169
- } > "$_out"
169
+ } >"$_out"
170
170
  }
171
171
 
172
172
  gen_pi_agents_bridge() {
173
173
  _out="$1"
174
- cat > "$_out" <<'EOF'
174
+ cat >"$_out" <<'EOF'
175
175
  <!-- BEGIN DEVRITES PI -->
176
176
  ## DevRites For pi
177
177