claude-task-worker 0.47.0 → 0.49.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.
- package/README.md +9 -6
- package/dist/index.js +26 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -74,7 +74,8 @@ UI実装Issueについて、実装の前に Pencil(`.pen`)でデザインを
|
|
|
74
74
|
{
|
|
75
75
|
"uiDesign": {
|
|
76
76
|
"enabled": true,
|
|
77
|
-
"designDir": "designs"
|
|
77
|
+
"designDir": "designs",
|
|
78
|
+
"yolo": false
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
```
|
|
@@ -83,6 +84,7 @@ UI実装Issueについて、実装の前に Pencil(`.pen`)でデザインを
|
|
|
83
84
|
|---|---|---|
|
|
84
85
|
| `uiDesign.enabled` | `false` | 本ワークフローの有効化。`false` の間は `triage-created-issue` がUI判定を行わず、2つのワーカーも起動しない |
|
|
85
86
|
| `uiDesign.designDir` | `"designs"` | `.pen` とスナップショットの配置先(リポジトリルートからの相対パス) |
|
|
87
|
+
| `uiDesign.yolo` | `false` | デザインPRを自動レビュー・自動マージへ流すか。`true` のときだけデザインPRに `cc-triage-scope` を付与する。`false`(既定)ではデザインPRは `cc-ui-design` のみが付いた状態で止まり、人がレビュー・マージするまで `apply-ui-design` は先へ進まない |
|
|
86
88
|
|
|
87
89
|
フローは以下のとおり。
|
|
88
90
|
|
|
@@ -93,8 +95,9 @@ cc-issue-created + triage-created-issue(ルーティング)
|
|
|
93
95
|
→ create-ui-design ワーカー
|
|
94
96
|
・.pen を作成/更新 + snapshots/ に PNG 出力
|
|
95
97
|
・ブランチ cc-ui-design-<N> を push しデザインPRを作成(Refs #N。closing keyword は使わない)
|
|
96
|
-
・PR に cc-
|
|
97
|
-
→ triage-pr / fix-review-point / resolve-conflict(既存フローでレビュー・マージ)
|
|
98
|
+
・PR に cc-ui-design(uiDesign.yolo が true なら cc-triage-scope も)、Issue に cc-ui-design-pr-created を付与
|
|
99
|
+
→ uiDesign.yolo: true → triage-pr / fix-review-point / resolve-conflict(既存フローでレビュー・マージ)
|
|
100
|
+
uiDesign.yolo: false → 人がデザインPRをレビュー・マージ
|
|
98
101
|
→ apply-ui-design ワーカー
|
|
99
102
|
・デザインPRが MERGED になるまで skip
|
|
100
103
|
・Issue description に「## UIデザイン」セクションを追記
|
|
@@ -102,7 +105,7 @@ cc-issue-created + triage-created-issue(ルーティング)
|
|
|
102
105
|
→ exec-issue(デザインを参照元として実装)
|
|
103
106
|
```
|
|
104
107
|
|
|
105
|
-
デザインPR
|
|
108
|
+
デザインPRのレビュー・マージ経路は `uiDesign.yolo` で切り替わる。`true` のときはデザインPRに `cc-triage-scope` が付き、Epic PR ではないため `cc-release-ready` によるマージ保留の対象外で、`triage-pr` が通常どおりレビュー・マージする。`false`(既定)では `cc-triage-scope` を付けないためどのワーカーもデザインPRを拾わず、人がレビューしてマージするまで待つ(`apply-ui-design` はデザインPRが `MERGED` になるまでスキップし続ける)。デザインに人が介在したい場合は既定のままにする。`triage-pr` は `cc-ui-design` ラベル付きPRに対してコードレビューではなくデザイン向けの観点(差分が `.pen` とPNGに限定されているか、スナップショットとデザイン意図が読み取れるか、Issue要件を満たしているか)で評価する。
|
|
106
109
|
|
|
107
110
|
デザインが不要と判明した場合は `create-ui-design` が理由をコメントして `cc-ui-design-ready` + `cc-exec-issue` を付与し、人手を介さず実装へ復帰する。Pencil が使えない環境やデザインPRが却下された場合は `cc-need-human-check` に落ちて停止する(共通除外ラベルのため無限リトライしない)。
|
|
108
111
|
|
|
@@ -506,7 +509,7 @@ advisor は main モデル以上の能力を持つモデルである必要があ
|
|
|
506
509
|
- `claude-task-worker.json` の `uiDesign.enabled` が `true` の場合のみ起動する(`false` なら1行ログを出して即終了)
|
|
507
510
|
- `cc-ui-design-pr-created` / `cc-ui-design-ready` が付いているIssueは除外
|
|
508
511
|
- デザインPRは `cc-ui-design-<Issue番号>` の固定名ブランチを head とする(後段の `apply-ui-design` が一意に特定するため)
|
|
509
|
-
- 完了後、デザインPRの実在を確認できた場合のみ、PRに `cc-ui-design`
|
|
512
|
+
- 完了後、デザインPRの実在を確認できた場合のみ、PRに `cc-ui-design`(`uiDesign.yolo` が `true` の場合は `cc-triage-scope` も)、Issueに `cc-ui-design-pr-created` を付与する
|
|
510
513
|
- スキルが「デザイン不要」と判定した場合(`cc-ui-design-ready` 付与済み)は完了扱いとし、そのまま実装フェーズへ流す
|
|
511
514
|
- PRの実在を確認できない場合は `cc-need-human-check` を付与してIssueにコメントを残す
|
|
512
515
|
|
|
@@ -581,7 +584,7 @@ claude-task-worker -v
|
|
|
581
584
|
| キー | 型 | デフォルト | 説明 |
|
|
582
585
|
|---|---|---|---|
|
|
583
586
|
| `fixReviewPointCallbackCommentMessage` | string | - | fix-review-point 完了時にPRへ投稿するコメント(未設定の場合は投稿しない) |
|
|
584
|
-
| `uiDesign` | object | `{ "enabled": false, "designDir": "designs" }` | UIデザイン先行ワークフローの設定(詳細は「[UIデザイン先行ワークフロー](#uiデザイン先行ワークフロー)」) |
|
|
587
|
+
| `uiDesign` | object | `{ "enabled": false, "designDir": "designs", "yolo": false }` | UIデザイン先行ワークフローの設定(詳細は「[UIデザイン先行ワークフロー](#uiデザイン先行ワークフロー)」) |
|
|
585
588
|
| `workers` | object | `{}` | ワーカーごとに Claude CLI に渡すスキル、`--model` / `--advisor` / `--effort`、ポーリング間隔、クールダウン時間、最大同時実行数を上書きする設定(詳細は下記) |
|
|
586
589
|
|
|
587
590
|
### ワーカーごとの設定
|
package/dist/index.js
CHANGED
|
@@ -1597,7 +1597,8 @@ import { readFileSync } from "node:fs";
|
|
|
1597
1597
|
import { isAbsolute, join, normalize, sep as SEP } from "node:path";
|
|
1598
1598
|
var DEFAULT_UI_DESIGN_CONFIG = {
|
|
1599
1599
|
enabled: false,
|
|
1600
|
-
designDir: "designs"
|
|
1600
|
+
designDir: "designs",
|
|
1601
|
+
yolo: false
|
|
1601
1602
|
};
|
|
1602
1603
|
var DEFAULT_WORKER_CONFIG = {
|
|
1603
1604
|
skill: "",
|
|
@@ -1813,6 +1814,15 @@ function parseUiDesignEntry(val) {
|
|
|
1813
1814
|
);
|
|
1814
1815
|
}
|
|
1815
1816
|
}
|
|
1817
|
+
if ("yolo" in entry) {
|
|
1818
|
+
if (typeof entry.yolo === "boolean") {
|
|
1819
|
+
result.yolo = entry.yolo;
|
|
1820
|
+
} else {
|
|
1821
|
+
console.warn(
|
|
1822
|
+
`[config] invalid uiDesign.yolo: ${String(entry.yolo)}, using default ${DEFAULT_UI_DESIGN_CONFIG.yolo}`
|
|
1823
|
+
);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1816
1826
|
if ("designDir" in entry) {
|
|
1817
1827
|
const normalized = typeof entry.designDir === "string" && entry.designDir.length > 0 ? normalize(entry.designDir) : null;
|
|
1818
1828
|
const isContained = normalized !== null && !isAbsolute(normalized) && normalized !== ".." && !normalized.startsWith(`..${SEP}`);
|
|
@@ -3533,11 +3543,12 @@ function designReferenceMissingComment(issueNumber) {
|
|
|
3533
3543
|
}
|
|
3534
3544
|
|
|
3535
3545
|
// src/workers/create-ui-design.ts
|
|
3536
|
-
function designPrLabelingFailedComment(issueNumber, prNumber, error) {
|
|
3546
|
+
function designPrLabelingFailedComment(issueNumber, prNumber, error, yolo = false) {
|
|
3537
3547
|
const message = error instanceof Error ? error.message : String(error);
|
|
3548
|
+
const prLabels = yolo ? "`cc-ui-design` / `cc-triage-scope`" : "`cc-ui-design`";
|
|
3538
3549
|
return [
|
|
3539
3550
|
"## \u30C7\u30B6\u30A4\u30F3PR\u3078\u306E\u30E9\u30D9\u30EB\u4ED8\u4E0E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u8981\u4EBA\u624B\u78BA\u8A8D\uFF09",
|
|
3540
|
-
`\u30C7\u30B6\u30A4\u30F3PR #${prNumber}\uFF08\u30D6\u30E9\u30F3\u30C1 \`${designBranchName(issueNumber)}\`\uFF09\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u5F8C\u7D9A\u30E9\u30D9\u30EB\uFF08
|
|
3551
|
+
`\u30C7\u30B6\u30A4\u30F3PR #${prNumber}\uFF08\u30D6\u30E9\u30F3\u30C1 \`${designBranchName(issueNumber)}\`\uFF09\u306F\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u5F8C\u7D9A\u30E9\u30D9\u30EB\uFF08${prLabels} / \`cc-ui-design-pr-created\`\uFF09\u306E\u4ED8\u4E0E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002`,
|
|
3541
3552
|
"",
|
|
3542
3553
|
"## \u8D77\u3053\u308A\u3046\u308B\u539F\u56E0",
|
|
3543
3554
|
"- \u672C\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u8FFD\u52A0\u6642\u306E\u30E9\u30D9\u30EB\u304C\u672A\u4F5C\u6210\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`claude-task-worker init` \u3092\u518D\u5B9F\u884C\u3057\u3066\u30E9\u30D9\u30EB\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
@@ -3548,14 +3559,16 @@ function designPrLabelingFailedComment(issueNumber, prNumber, error) {
|
|
|
3548
3559
|
"```",
|
|
3549
3560
|
"",
|
|
3550
3561
|
"## \u5BFE\u5FDC\u5F8C\u306E\u9032\u3081\u65B9",
|
|
3551
|
-
|
|
3562
|
+
`- \u30E9\u30D9\u30EB\u4F5C\u6210\u5F8C\u306B\u3084\u308A\u76F4\u3059\u5834\u5408: \`cc-need-human-check\` \u30E9\u30D9\u30EB\u3092\u5916\u3057\u3001${yolo ? "`cc-ui-design`\u30FB`cc-triage-scope`" : "`cc-ui-design`"}\uFF08PR\u5074\uFF09\u3068 \`cc-ui-design-pr-created\`\uFF08Issue\u5074\uFF09\u3092\u624B\u52D5\u3067\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044`
|
|
3552
3563
|
].join("\n");
|
|
3553
3564
|
}
|
|
3554
3565
|
var createUiDesignWorker = async (opts = {}) => {
|
|
3555
|
-
|
|
3566
|
+
const uiDesignConfig = getUiDesignConfig();
|
|
3567
|
+
if (!uiDesignConfig.enabled) {
|
|
3556
3568
|
console.log("[create-ui-design] uiDesign.enabled is false, skipping");
|
|
3557
3569
|
return;
|
|
3558
3570
|
}
|
|
3571
|
+
const yolo = uiDesignConfig.yolo;
|
|
3559
3572
|
await createIssuePollingWorker({
|
|
3560
3573
|
name: "create-ui-design",
|
|
3561
3574
|
command: "/claude-task-worker:create-ui-design",
|
|
@@ -3586,12 +3599,18 @@ var createUiDesignWorker = async (opts = {}) => {
|
|
|
3586
3599
|
}
|
|
3587
3600
|
try {
|
|
3588
3601
|
await addLabel("pr", prNumber, "cc-ui-design");
|
|
3589
|
-
|
|
3602
|
+
if (yolo) {
|
|
3603
|
+
await addLabel("pr", prNumber, "cc-triage-scope");
|
|
3604
|
+
} else {
|
|
3605
|
+
console.log(
|
|
3606
|
+
`[create-ui-design] #${issueNumber}: uiDesign.yolo is false, leaving design PR #${prNumber} for human review (no cc-triage-scope)`
|
|
3607
|
+
);
|
|
3608
|
+
}
|
|
3590
3609
|
await addLabel("issue", issueNumber, "cc-ui-design-pr-created");
|
|
3591
3610
|
} catch (err) {
|
|
3592
3611
|
console.error(`[create-ui-design] #${issueNumber}: labeling design PR #${prNumber} failed: ${err}`);
|
|
3593
3612
|
await addLabel("issue", issueNumber, "cc-need-human-check");
|
|
3594
|
-
await commentOnIssue(issueNumber, designPrLabelingFailedComment(issueNumber, prNumber, err)).catch(
|
|
3613
|
+
await commentOnIssue(issueNumber, designPrLabelingFailedComment(issueNumber, prNumber, err, yolo)).catch(
|
|
3595
3614
|
(commentErr) => console.error(`[create-ui-design] commentOnIssue failed for #${issueNumber}: ${commentErr}`)
|
|
3596
3615
|
);
|
|
3597
3616
|
return false;
|