@mmerterden/multi-agent-pipeline 16.18.0 → 16.19.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 (200) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +5 -5
  3. package/README.tr.md +2 -2
  4. package/docs/FIGMA_PIPELINE.md +1 -1
  5. package/docs/adr/0001-three-model-triage.md +4 -2
  6. package/docs/architecture.md +2 -2
  7. package/docs/ecosystem.md +13 -11
  8. package/docs/features.md +2 -2
  9. package/index.js +1 -1
  10. package/install/_common.mjs +25 -1
  11. package/install/_dev-only-files.mjs +2 -2
  12. package/install/_mcp-register.mjs +4 -3
  13. package/install/_plugin-skills.mjs +1 -3
  14. package/install/copilot.mjs +18 -9
  15. package/install/index.mjs +2 -4
  16. package/install/templates/copilot-instructions.md +7 -7
  17. package/package.json +1 -1
  18. package/pipeline/claude-md-template.md +2 -2
  19. package/pipeline/commands/multi-agent/SKILL.md +5 -5
  20. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +1 -1
  21. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  22. package/pipeline/commands/multi-agent/help/SKILL.md +2 -2
  23. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  24. package/pipeline/commands/multi-agent/review/SKILL.md +27 -14
  25. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
  26. package/pipeline/commands/multi-agent/store-ready/SKILL.md +2 -2
  27. package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
  28. package/pipeline/commands/sim-test.md +54 -15
  29. package/pipeline/lib/credential-inventory.sh +15 -2
  30. package/pipeline/lib/credential-store-resolver.sh +14 -4
  31. package/pipeline/lib/credential-store.sh +8 -2
  32. package/pipeline/lib/extract-conventions.sh +1 -14
  33. package/pipeline/lib/fetch-confluence.sh +12 -4
  34. package/pipeline/lib/fetch-crashlytics.sh +11 -8
  35. package/pipeline/lib/fetch-document.sh +1 -1
  36. package/pipeline/lib/fetch-figma-annotations.sh +7 -5
  37. package/pipeline/lib/fetch-fortify.sh +5 -3
  38. package/pipeline/lib/fetch-graylog.sh +5 -3
  39. package/pipeline/lib/figma-mcp-refresh.sh +1 -1
  40. package/pipeline/lib/figma-screenshot.sh +27 -24
  41. package/pipeline/lib/figma-token.sh +8 -4
  42. package/pipeline/lib/issue-fetcher.sh +0 -1
  43. package/pipeline/lib/jira-publish.sh +7 -5
  44. package/pipeline/lib/md2confluence-v3.py +13 -7
  45. package/pipeline/lib/multi-repo-pipeline.sh +18 -8
  46. package/pipeline/lib/plan-todos.sh +11 -0
  47. package/pipeline/lib/post-pr-review.sh +9 -2
  48. package/pipeline/lib/repo-cache.sh +18 -10
  49. package/pipeline/lib/review-watch.sh +60 -14
  50. package/pipeline/lib/shadow-git.sh +8 -4
  51. package/pipeline/lib/vercel-deploy.sh +2 -2
  52. package/pipeline/multi-agent-refs/_dev-context.md +5 -2
  53. package/pipeline/multi-agent-refs/analysis/locked.md +4 -4
  54. package/pipeline/multi-agent-refs/analysis/render.md +1 -1
  55. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  56. package/pipeline/multi-agent-refs/outside-the-pipeline.md +6 -6
  57. package/pipeline/multi-agent-refs/phases/log-format.md +1 -1
  58. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  59. package/pipeline/multi-agent-refs/phases/phase-0-init.md +4 -2
  60. package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +3 -3
  61. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +5 -5
  62. package/pipeline/multi-agent-refs/phases/phase-4-review.md +21 -16
  63. package/pipeline/multi-agent-refs/tracker-contract.md +1 -1
  64. package/pipeline/rules/figma-pipeline.md +18 -72
  65. package/pipeline/rules/outside-the-pipeline.md +4 -3
  66. package/pipeline/schemas/agent-state.schema.json +1 -1
  67. package/pipeline/schemas/token-budget.json +1 -1
  68. package/pipeline/scripts/_stack-routing.mjs +1 -1
  69. package/pipeline/scripts/agent-guard.py +102 -21
  70. package/pipeline/scripts/anonymize-findings.mjs +7 -6
  71. package/pipeline/scripts/build-skills-index.mjs +14 -3
  72. package/pipeline/scripts/cost-budget-check.mjs +5 -3
  73. package/pipeline/scripts/cost-lib.sh +0 -15
  74. package/pipeline/scripts/diff-explain.mjs +22 -12
  75. package/pipeline/scripts/gc-refs.sh +6 -2
  76. package/pipeline/scripts/gc-tmp.sh +1 -1
  77. package/pipeline/scripts/gc-worktrees.sh +1 -1
  78. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  79. package/pipeline/scripts/github-ssh-setup.sh +7 -2
  80. package/pipeline/scripts/graph-build.mjs +2 -2
  81. package/pipeline/scripts/jira-wiki-escape.mjs +2 -1
  82. package/pipeline/scripts/keychain.py +12 -11
  83. package/pipeline/scripts/learning-curve.mjs +1 -1
  84. package/pipeline/scripts/migrate-prefs.mjs +1 -1
  85. package/pipeline/scripts/output-quality-check.sh +3 -1
  86. package/pipeline/scripts/phase-tracker.sh +1 -1
  87. package/pipeline/scripts/phase0-exit-gate.mjs +2 -1
  88. package/pipeline/scripts/plan-coverage-gate.mjs +2 -1
  89. package/pipeline/scripts/pre-commit-check.sh +23 -13
  90. package/pipeline/scripts/prune-logs.sh +1 -1
  91. package/pipeline/scripts/render-agent-log-cost.sh +3 -1
  92. package/pipeline/scripts/render-cost-summary.sh +4 -2
  93. package/pipeline/scripts/render-work-summary.sh +5 -3
  94. package/pipeline/scripts/repo-map.mjs +3 -2
  95. package/pipeline/scripts/scan-skills.sh +6 -2
  96. package/pipeline/scripts/search-logs.sh +8 -6
  97. package/pipeline/scripts/sign-skills.sh +3 -1
  98. package/pipeline/scripts/smoke-cross-cli-behavior.sh +1 -1
  99. package/pipeline/scripts/triage-memory.mjs +25 -4
  100. package/pipeline/scripts/uninstall.mjs +20 -12
  101. package/pipeline/scripts/update-check.sh +2 -2
  102. package/pipeline/scripts/update-issue-progress.sh +6 -5
  103. package/pipeline/scripts/validate-analysis-doc.mjs +6 -6
  104. package/pipeline/scripts/verify-skills.sh +3 -1
  105. package/pipeline/scripts/worktree-finalize.sh +22 -10
  106. package/pipeline/skills/.skill-manifest.json +81 -57
  107. package/pipeline/skills/.skills-index.json +19 -19
  108. package/pipeline/skills/shared/README.md +8 -8
  109. package/pipeline/skills/shared/core/multi-agent/SKILL.md +7 -7
  110. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  111. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
  112. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  113. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +2 -2
  114. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +23 -14
  115. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +2 -2
  116. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +56 -0
  117. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +0 -4
  118. package/pipeline/skills/shared/external/api-patterns/SKILL.md +12 -24
  119. package/pipeline/skills/shared/external/app-store-changelog/references/release-notes-guidelines.md +34 -0
  120. package/pipeline/skills/shared/external/app-store-changelog/scripts/collect_release_changes.sh +33 -0
  121. package/pipeline/skills/shared/external/architecture/SKILL.md +7 -9
  122. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +0 -4
  123. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +0 -1
  124. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +0 -14
  125. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +13 -13
  126. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +16 -16
  127. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +6 -6
  128. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +13 -13
  129. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +23 -23
  130. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +18 -18
  131. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +30 -30
  132. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +11 -11
  133. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +33 -33
  134. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +52 -52
  135. package/pipeline/skills/shared/external/ios-coding-standard/references/lint-local.sh +1 -1
  136. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +11 -11
  137. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -1
  138. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +7 -3
  139. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -15
  140. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +0 -5
  141. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Package.swift +17 -0
  142. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/Resources/.keep +0 -0
  143. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/Sources/MyApp/main.swift +11 -0
  144. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/bootstrap/version.env +2 -0
  145. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/build_icon.sh +49 -0
  146. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/compile_and_run.sh +63 -0
  147. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/launch.sh +28 -0
  148. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/make_appcast.sh +82 -0
  149. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/package_app.sh +206 -0
  150. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/setup_dev_signing.sh +52 -0
  151. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/sign-and-notarize.sh +52 -0
  152. package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/version.env +2 -0
  153. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/packaging.md +17 -0
  154. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/release.md +32 -0
  155. package/pipeline/skills/shared/external/macos-spm-app-packaging/references/scaffold.md +79 -0
  156. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +0 -1
  157. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +0 -4
  158. package/pipeline/skills/shared/external/swift-concurrency-expert/references/approachable-concurrency.md +63 -0
  159. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swift-6-2-concurrency.md +272 -0
  160. package/pipeline/skills/shared/external/swift-concurrency-expert/references/swiftui-concurrency-tour-wwdc.md +33 -0
  161. package/pipeline/skills/shared/external/swiftui-performance-audit/references/code-smells.md +150 -0
  162. package/pipeline/skills/shared/external/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
  163. package/pipeline/skills/shared/external/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
  164. package/pipeline/skills/shared/external/swiftui-performance-audit/references/profiling-intake.md +44 -0
  165. package/pipeline/skills/shared/external/swiftui-performance-audit/references/report-template.md +47 -0
  166. package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
  167. package/pipeline/skills/shared/external/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
  168. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/app-wiring.md +201 -0
  169. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/async-state.md +96 -0
  170. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/components-index.md +46 -0
  171. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/controls.md +57 -0
  172. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/deeplinks.md +66 -0
  173. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/focus.md +90 -0
  174. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/form.md +97 -0
  175. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/grids.md +71 -0
  176. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/haptics.md +71 -0
  177. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/input-toolbar.md +51 -0
  178. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
  179. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/list.md +86 -0
  180. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
  181. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/macos-settings.md +71 -0
  182. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/matched-transitions.md +59 -0
  183. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/media.md +73 -0
  184. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/menu-bar.md +101 -0
  185. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/navigationstack.md +159 -0
  186. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/overlay.md +45 -0
  187. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/performance.md +62 -0
  188. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/previews.md +48 -0
  189. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
  190. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/scrollview.md +87 -0
  191. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/searchable.md +71 -0
  192. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/sheets.md +155 -0
  193. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/split-views.md +72 -0
  194. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/tabview.md +114 -0
  195. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/theming.md +71 -0
  196. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/title-menus.md +93 -0
  197. package/pipeline/skills/shared/external/swiftui-ui-patterns/references/top-bar.md +49 -0
  198. package/pipeline/skills/shared/external/swiftui-view-refactor/references/mv-patterns.md +161 -0
  199. package/pipeline/skills/skills-index.md +8 -8
  200. package/pipeline/skills/shared/external/help-skills/SKILL.md +0 -166
@@ -21,6 +21,7 @@
21
21
  * Subcommands:
22
22
  * ingest --triage <path> --task-id <id> [--task-title "..."] [--stack ios]
23
23
  * [--repo-slug <slug>] [--state <agent-state.json>]
24
+ * (--state fills task-id / task-title / stack when the flag is absent)
24
25
  * query --issue "<text>" [--file-glob "Auth*"] [--top N]
25
26
  * [--repo-slug <slug>] [--json]
26
27
  * show --id <id> [--repo-slug <slug>]
@@ -214,14 +215,34 @@ function writeRow(slug, row) {
214
215
  appendFileSync(p, JSON.stringify(row) + "\n", "utf8");
215
216
  }
216
217
 
218
+ // --state <agent-state.json> supplies the ingest defaults an explicit flag does
219
+ // not: task id, title and stack, read from the run's own state.
220
+ function stateDefaults() {
221
+ const p = flags.state;
222
+ if (!p || p === true) return {};
223
+ if (!existsSync(p)) die(`state file not found: ${p}`, 1);
224
+ let state;
225
+ try {
226
+ state = JSON.parse(readFileSync(p, "utf8"));
227
+ } catch (e) {
228
+ die(`cannot parse state JSON: ${e.message}`, 1);
229
+ }
230
+ return {
231
+ taskId: state.taskId || null,
232
+ taskTitle: state.taskTitle || state.task?.title || null,
233
+ stack: state.stack?.primary || state.repos?.[0]?.stack || null,
234
+ };
235
+ }
236
+
217
237
  function ingest() {
218
238
  const triagePath = flags.triage;
219
239
  if (!triagePath) die("ingest needs --triage <path>", 1);
220
240
  if (!existsSync(triagePath)) die(`triage file not found: ${triagePath}`, 1);
221
- const taskId = flags["task-id"];
222
- if (!taskId) die("ingest needs --task-id <id>", 1);
223
- const taskTitle = flags["task-title"] || null;
224
- const stack = flags.stack || null;
241
+ const fromState = stateDefaults();
242
+ const taskId = flags["task-id"] || fromState.taskId;
243
+ if (!taskId) die("ingest needs --task-id <id> (or --state with a taskId)", 1);
244
+ const taskTitle = flags["task-title"] || fromState.taskTitle || null;
245
+ const stack = flags.stack || fromState.stack || null;
225
246
  const slug = repoSlug();
226
247
 
227
248
  let triage;
@@ -95,11 +95,12 @@ const explicitlyTargeted = flags.some((f) => TOOL_FLAGS.includes(f)) || flags.in
95
95
 
96
96
  const forClaude = flags.includes("--claude") || flags.includes("--all") || !explicitlyTargeted;
97
97
  const forCopilot = flags.includes("--copilot") || flags.includes("--all") || !explicitlyTargeted;
98
- const forCursor = flags.includes("--cursor") || flags.includes("--all") || !explicitlyTargeted;
99
- const forCopilotChat =
100
- flags.includes("--copilot-chat") || flags.includes("--all") || !explicitlyTargeted;
101
- const forAntigravity =
102
- flags.includes("--antigravity") || flags.includes("--all") || !explicitlyTargeted;
98
+ // The legacy adapters wrote into the PROJECT directory (cwd or --target), not
99
+ // into $HOME, so their cleanup is opt-in: a bare `uninstall` must not walk the
100
+ // current directory's AGENTS.md / .cursorrules / .github on the user's behalf.
101
+ const forCursor = flags.includes("--cursor");
102
+ const forCopilotChat = flags.includes("--copilot-chat");
103
+ const forAntigravity = flags.includes("--antigravity");
103
104
  const forCodex = flags.includes("--codex") || flags.includes("--all") || !explicitlyTargeted;
104
105
 
105
106
  const dryRun = flags.includes("--dry-run");
@@ -566,9 +567,16 @@ function legacyTrailingContent(section) {
566
567
  * Strip a marker-wrapped `<!-- multi-agent-pipeline:begin/end -->` block from
567
568
  * a user-owned file. Preserves everything outside the markers. Deletes the
568
569
  * file entirely if it becomes empty.
570
+ *
571
+ * `hostFile` marks the instruction files the installers themselves write
572
+ * (~/.copilot/copilot-instructions.md, ~/.codex/AGENTS.md). Only there is a
573
+ * `# Multi-Agent Development Pipeline` heading provably ours, so only there
574
+ * does the heading-bounded legacy path apply. A project file with that heading
575
+ * and no marker is user prose and is left alone.
569
576
  * @param {string} filePath
577
+ * @param {{hostFile?: boolean}} [opts]
570
578
  */
571
- function stripManagedBlock(filePath) {
579
+ function stripManagedBlock(filePath, { hostFile = false } = {}) {
572
580
  if (!existsSync(filePath)) return false;
573
581
  const content = readFileSync(filePath, "utf-8");
574
582
  const re = /\s*<!-- multi-agent-pipeline:begin -->[\s\S]*?<!-- multi-agent-pipeline:end -->\s*/m;
@@ -578,7 +586,7 @@ function stripManagedBlock(filePath) {
578
586
  // pipeline section; strip only the start..end span so user content BELOW
579
587
  // the section survives. Legacy files without the end marker are bounded
580
588
  // at the next top-level heading outside code fences, else EOF.
581
- if (content.includes("# Multi-Agent Development Pipeline")) {
589
+ if (hostFile && content.includes("# Multi-Agent Development Pipeline")) {
582
590
  const marker = "# Multi-Agent Development Pipeline";
583
591
  const idx = content.indexOf(marker);
584
592
  if (idx >= 0) {
@@ -823,7 +831,7 @@ export async function main() {
823
831
  // Agent definitions are FILES; remove only the pipeline-shipped names so
824
832
  // user-authored agents survive.
825
833
  rmMatchingFiles(join(COP, "agents"), (name) => PIPELINE_AGENT_FILES.includes(name));
826
- stripManagedBlock(join(COP, "copilot-instructions.md"));
834
+ stripManagedBlock(join(COP, "copilot-instructions.md"), { hostFile: true });
827
835
  }
828
836
 
829
837
  // Full cleanup: pipeline settings, the log root, and the per-repo memory
@@ -851,9 +859,9 @@ export async function main() {
851
859
  rmIfExists(join(HOME, ".claude", "knowledge"));
852
860
  }
853
861
 
854
- // Legacy adapter-file cleanup (adapters removed in v10.7.0). These blocks
855
- // delete files a pre-v10.7.0 install generated; they never touch user files
856
- // outside the multi-agent-* namespace / managed markers.
862
+ // Legacy adapter-file cleanup (adapters removed in v10.7.0), opt-in per flag.
863
+ // These blocks delete files a pre-v10.7.0 install generated; they never touch
864
+ // user files outside the multi-agent-* namespace / begin-end markers.
857
865
  if (forCursor) {
858
866
  console.log("");
859
867
  console.log(` [Cursor - legacy cleanup] Removing from ${adapterTarget}...`);
@@ -913,7 +921,7 @@ export async function main() {
913
921
  rmIfExists(join(CODEX, "prompts", "multi-agent.md"));
914
922
  removeGeneratedCodexAgents(join(CODEX, "agents"));
915
923
 
916
- stripManagedBlock(join(CODEX, "AGENTS.md"));
924
+ stripManagedBlock(join(CODEX, "AGENTS.md"), { hostFile: true });
917
925
 
918
926
  // The MCP entry was written by `codex mcp add`, so hand it back the same
919
927
  // way rather than editing config.toml - Codex also stores marketplace and
@@ -48,8 +48,8 @@ PRINT_REQUIRED=0
48
48
 
49
49
  while [ $# -gt 0 ]; do
50
50
  case "$1" in
51
- --local) LOCAL_VERSION="${2:-}"; shift 2 ;;
52
- --ttl-hours) TTL_HOURS="${2:-24}"; shift 2 ;;
51
+ --local) LOCAL_VERSION="${2:-}"; shift; [ $# -gt 0 ] && shift ;;
52
+ --ttl-hours) TTL_HOURS="${2:-24}"; shift; [ $# -gt 0 ] && shift ;;
53
53
  --force) FORCE=1; shift ;;
54
54
  --print-required) PRINT_REQUIRED=1; shift ;;
55
55
  *) shift ;;
@@ -134,8 +134,9 @@ G_CC=$(glyph_for "$F_CC")
134
134
  G_WIKI=$(glyph_for "$F_WIKI")
135
135
 
136
136
  # Fetch current body, replace the Progress table, write back.
137
- TMP_BODY=$(mktemp /tmp/issue-progress-"${TASK_ID}"-XXXXXX.md)
138
- trap 'rm -f "$TMP_BODY"' EXIT
137
+ TMP_BODY=$(mktemp "/tmp/issue-progress-${TASK_ID}.XXXXXX")
138
+ TMP_NEW=$(mktemp "/tmp/issue-progress-${TASK_ID}.new.XXXXXX")
139
+ trap 'rm -f "$TMP_BODY" "$TMP_NEW"' EXIT
139
140
 
140
141
  gh issue view "$ISSUE_NUM" --repo "$ORG_REPO" --json body --jq .body > "$TMP_BODY"
141
142
 
@@ -144,16 +145,16 @@ NEW_BLOCK=$(build_progress_block "$G_IMPL" "$G_TEST" "$G_CC" "$G_WIKI")
144
145
 
145
146
  # Replace the table between `### Progress` and the first terminator (legend
146
147
  # comment, next heading, or EOF) - see rewrite_progress_body above.
147
- rewrite_progress_body "$NEW_BLOCK" "$TMP_BODY" > "${TMP_BODY}.new"
148
+ rewrite_progress_body "$NEW_BLOCK" "$TMP_BODY" > "$TMP_NEW"
148
149
 
149
150
  # Check if body actually changed (idempotent no-op).
150
- if cmp -s "$TMP_BODY" "${TMP_BODY}.new"; then
151
+ if cmp -s "$TMP_BODY" "$TMP_NEW"; then
151
152
  echo "update-issue-progress: no change for #$ISSUE_NUM (idempotent no-op)" >&2
152
153
  exit 0
153
154
  fi
154
155
 
155
156
  # Apply.
156
- if ! gh issue edit "$ISSUE_NUM" --repo "$ORG_REPO" --body-file "${TMP_BODY}.new" >/dev/null; then
157
+ if ! gh issue edit "$ISSUE_NUM" --repo "$ORG_REPO" --body-file "$TMP_NEW" >/dev/null; then
157
158
  echo "update-issue-progress: gh issue edit failed for #$ISSUE_NUM" >&2
158
159
  exit 4
159
160
  fi
@@ -271,7 +271,7 @@ function main() {
271
271
  }
272
272
  }
273
273
 
274
- // 2b. JSON does not fit in a table cell (Locked 37).
274
+ // 2b. JSON does not fit in a table cell (analysis-template.md Section 9.2 / 9.3).
275
275
  //
276
276
  // One document rendered `Request` as inline JSON with a field note glued to
277
277
  // the end, and `Response` as a proper fenced block below the table: two
@@ -284,7 +284,7 @@ function main() {
284
284
  if (/[{}]/.test(cell)) {
285
285
  errors.push(
286
286
  `line ${i + 1}: ${/Request/.test(line) ? "Request" : "Response"} cell holds JSON; ` +
287
- "put the payload in a fenced block under the table (Locked 37)",
287
+ "put the payload in a fenced block under the table (analysis-template.md Section 9.2 / 9.3)",
288
288
  );
289
289
  }
290
290
  }
@@ -335,7 +335,7 @@ function main() {
335
335
  // place a Turkish document can quietly go ASCII: one run shipped `Hayir` and
336
336
  // `Basarili` in its flow chart while every other line was correct. A warning,
337
337
  // not an error - node ids are legitimately ASCII, only labels are checked.
338
- if (parsed.fm.language === "tr") {
338
+ if (parsed?.fm?.language === "tr") {
339
339
  const mmLines = text.split("\n");
340
340
  let inMermaid = false;
341
341
  for (let i = 0; i < mmLines.length; i++) {
@@ -353,12 +353,12 @@ function main() {
353
353
  for (const lbl of labels) {
354
354
  if (
355
355
  /^[\x20-\x7E]+$/.test(lbl) &&
356
- /\b(Hayir|Basarili|Basarisiz|Odeme|Iptal|Gecerli|Gecersiz|Secim|Dogrulama|Uyari|Baslangic|Bitis|Onay|Aciklama)\b/.test(
356
+ /\b(Hayir|Basarili|Basarisiz|Odeme|Iptal|Gecerli|Gecersiz|Secim|Dogrulama|Uyari|Baslangic|Bitis|Aciklama)\b/.test(
357
357
  lbl,
358
358
  )
359
359
  ) {
360
- errors.push(
361
- `WARN line ${i + 1}: diagram label "${lbl}" looks like Turkish flattened to ASCII (Locked 7)`,
360
+ warns.push(
361
+ `line ${i + 1}: diagram label "${lbl}" looks like Turkish flattened to ASCII (Locked 7)`,
362
362
  );
363
363
  }
364
364
  }
@@ -31,7 +31,9 @@ ROOT_OVERRIDE=""
31
31
  QUIET=0
32
32
  while [ $# -gt 0 ]; do
33
33
  case "$1" in
34
- --root) ROOT_OVERRIDE="$2"; shift 2 ;;
34
+ --root)
35
+ [ $# -ge 2 ] || { echo "verify-skills: --root needs a value" >&2; exit 1; }
36
+ ROOT_OVERRIDE="$2"; shift 2 ;;
35
37
  --quiet) QUIET=1; shift ;;
36
38
  *) shift ;;
37
39
  esac
@@ -34,14 +34,16 @@ WORKTREE=""; PROJECT_ROOT=""; TASK_ID=""; PROJECT=""; BRANCH=""
34
34
  LOGS_ROOT="${HOME}/.claude/logs/multi-agent"
35
35
  DRY=0; JSON=0
36
36
 
37
+ need_value() { [ $# -ge 2 ] || { echo "ERR: $1 needs a value" >&2; exit 1; }; }
38
+
37
39
  while [ $# -gt 0 ]; do
38
40
  case "$1" in
39
- --worktree) WORKTREE="${2:-}"; shift 2 ;;
40
- --project-root) PROJECT_ROOT="${2:-}"; shift 2 ;;
41
- --task-id) TASK_ID="${2:-}"; shift 2 ;;
42
- --project) PROJECT="${2:-}"; shift 2 ;;
43
- --branch) BRANCH="${2:-}"; shift 2 ;;
44
- --logs-root) LOGS_ROOT="${2:-}"; shift 2 ;;
41
+ --worktree) need_value "$@"; WORKTREE="$2"; shift 2 ;;
42
+ --project-root) need_value "$@"; PROJECT_ROOT="$2"; shift 2 ;;
43
+ --task-id) need_value "$@"; TASK_ID="$2"; shift 2 ;;
44
+ --project) need_value "$@"; PROJECT="$2"; shift 2 ;;
45
+ --branch) need_value "$@"; BRANCH="$2"; shift 2 ;;
46
+ --logs-root) need_value "$@"; LOGS_ROOT="$2"; shift 2 ;;
45
47
  --dry-run) DRY=1; shift ;;
46
48
  --json) JSON=1; shift ;;
47
49
  *) echo "usage: worktree-finalize.sh --worktree <p> --project-root <p> --task-id <id> [--project <s>] [--branch <b>] [--logs-root <d>] [--dry-run] [--json]" >&2; exit 1 ;;
@@ -129,10 +131,16 @@ esac
129
131
 
130
132
  # Must be a worktree git actually knows about, so a mistyped path cannot delete an
131
133
  # unrelated directory.
132
- if ! git -C "$rp_pr" worktree list --porcelain 2>/dev/null \
133
- | awk '/^worktree /{print substr($0,10)}' \
134
- | while IFS= read -r w; do (cd "$w" 2>/dev/null && pwd -P); done \
135
- | grep -qxF "$rp_wt"; then
134
+ registered=""
135
+ while IFS= read -r w; do
136
+ [ -n "$w" ] || continue
137
+ w_rp="$(cd "$w" 2>/dev/null && pwd -P)" || continue
138
+ registered="$registered$w_rp
139
+ "
140
+ done <<EOF_WT
141
+ $(git -C "$rp_pr" worktree list --porcelain 2>/dev/null | awk '/^worktree /{print substr($0,10)}')
142
+ EOF_WT
143
+ if ! printf '%s' "$registered" | grep -qxF "$rp_wt"; then
136
144
  skip "not a registered worktree of $rp_pr"
137
145
  fi
138
146
 
@@ -212,6 +220,7 @@ copy_one() {
212
220
  return 0
213
221
  fi
214
222
  mkdir -p "$DEST/$(dirname "$1")" 2>/dev/null
223
+ [ -d "$DEST/$1" ] && rm -rf "${DEST:?}/$1"
215
224
  cp -R "$src" "$DEST/$1" 2>/dev/null && SALVAGED="${SALVAGED:+$SALVAGED,}\"$1\""
216
225
  }
217
226
 
@@ -223,6 +232,9 @@ copy_one() {
223
232
  # actually fired for either file.
224
233
  copy_from_logs() {
225
234
  src="$LOGS_TASK_DIR/$1"
235
+ # phase-tracker.sh writes tracker-state.json to <logs-root>/<task-id>/ with
236
+ # no project segment; the project-scoped dir is agent-state.json's home.
237
+ [ -e "$src" ] || src="$LOGS_ROOT/$TASK_ID/$1"
226
238
  [ -e "$src" ] || return 0
227
239
  if [ "$DRY" = "1" ]; then
228
240
  SALVAGED="${SALVAGED:+$SALVAGED,}\"$1\""