boxglow 0.6.5 → 0.6.7

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/bin/boxglow.js CHANGED
@@ -1139,7 +1139,18 @@ var parts = {
1139
1139
  "\u30A8\u30C7\u30A3\u30BF\u3067\u958B\u304F: {path}": "Open in the editor: {path}",
1140
1140
  "\u65B0\u3057\u3044\u30BF\u30D6\u3067\u958B\u304F: {path}": "Open in a new tab: {path}",
1141
1141
  "\u30D1\u30B9\u3092\u30B3\u30D4\u30FC: {path}": "Copy the path: {path}",
1142
- "\u8A18\u9332\u3057\u305F\u3068\u304D\u306E\u7248\u3092\u30D6\u30E9\u30A6\u30B6\u3067\u898B\u308B": "See the recorded version in the browser"
1142
+ "\u8A18\u9332\u3057\u305F\u3068\u304D\u306E\u7248\u3092\u30D6\u30E9\u30A6\u30B6\u3067\u898B\u308B": "See the recorded version in the browser",
1143
+ "(\u4F5C\u6210\u4E2D)": "(work in progress)",
1144
+ "\u4F5C\u308A\u304B\u3051\u306E\u8CC7\u6599\u3068\u3057\u3066\u4ED8\u3051\u308B (\u4F7F\u3046\u5074\u306E\u7BB1\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u5B8C\u4E86\u3067\u78BA\u5B9A)": "Attach as work in progress (boxes using it keep waiting; finishing the box confirms it)",
1145
+ "\u4F5C\u6210\u4E2D": "WIP",
1146
+ "\u4F5C\u6210\u4E2D: \u4F7F\u3046\u5074\u306E\u7BB1\u306F\u3001\u305D\u306E\u5165\u529B\u3092\u300C\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF\u300D\u306B\u3057\u3066\u3044\u306A\u3051\u308C\u3070\u5F85\u3061\u307E\u3059\u3002\u7BB1\u3092\u5B8C\u4E86\u306B\u3059\u308B\u3068\u78BA\u5B9A\u306B\u306A\u308A\u307E\u3059": "Work in progress: boxes using it wait unless their input accepts work in progress. Finishing the box confirms it",
1147
+ "\u4F5C\u6210\u4E2D\u3042\u308A": "WIP available",
1148
+ "\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF": "Accept work in progress",
1149
+ "\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF: \u4F9B\u7D66\u5143\u306E\u8CC7\u6599\u304C\u4F5C\u308A\u304B\u3051\u3067\u3082\u3001\u3053\u306E\u5165\u529B\u306F\u305D\u308D\u3063\u305F\u3068\u307F\u306A\u3059": "Accept work in progress: this input counts as ready even if the source's material is still in progress",
1150
+ "\u4F9B\u7D66\u5143\u306B\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u304C\u3042\u308A\u307E\u3059\u3002\u300C\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF\u300D\u306B\u3059\u308B\u3068\u3001\u3053\u306E\u5165\u529B\u306F\u305D\u308D\u3063\u305F\u3068\u307F\u306A\u3057\u307E\u3059": 'The source has work-in-progress material. Mark "Accept work in progress" to count this input as ready',
1151
+ "\u78BA\u5B9A\u306B\u3059\u308B": "Confirm",
1152
+ "\u78BA\u5B9A\u306B\u3059\u308B (\u4F7F\u3046\u5074\u306E\u7BB1\u304C\u7740\u624B\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308B)": "Confirm (boxes using it can start)",
1153
+ "\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF\u306B\u3059\u308B": "Accept work in progress"
1143
1154
  };
1144
1155
 
1145
1156
  // src/i18n/en/canvas.ts
@@ -1200,7 +1211,9 @@ var canvas = {
1200
1211
  "\u65B9\u91DD: \u672A\u6C7A\u5B9A {n}": "Policy undecided {n}",
1201
1212
  "\u5B8C\u4E86\u3057\u305F\u5F8C\u306B\u65B9\u91DD\u304C\u6C7A\u307E\u3063\u305F\u30FB\u5909\u308F\u308A\u307E\u3057\u305F (\u78BA\u304B\u3081\u76F4\u3057\u306E\u5019\u88DC\u3002I/O \u30BF\u30D6\u306E\u65B9\u91DD\u3067\u300C\u78BA\u304B\u3081\u305F\u300D\u3092\u62BC\u3059\u3068\u6D88\u3048\u307E\u3059)": 'A policy was decided or changed after this box was done (check it again; press "Checked" under Policies on the I/O tab to clear this)',
1202
1213
  "\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057": "Policy: check again",
1203
- "\u8A08\u753B\u5168\u4F53": "Whole plan"
1214
+ "\u8A08\u753B\u5168\u4F53": "Whole plan",
1215
+ "\u4F5C\u6210\u4E2D": "WIP",
1216
+ "\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u304C\u5C4A\u3044\u3066\u3044\u307E\u3059 (\u3053\u306E\u5165\u529B\u3092\u300C\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF\u300D\u306B\u3059\u308B\u3068\u7740\u624B\u3067\u304D\u307E\u3059)": 'Work-in-progress material has arrived (mark this input "Accept work in progress" to start)'
1204
1217
  };
1205
1218
 
1206
1219
  // src/i18n/en/app.ts
@@ -1659,7 +1672,8 @@ var app = {
1659
1672
  "{file} \u306B\u4FDD\u5B58\u3057\u307E\u3059 (\u81EA\u52D5\u4FDD\u5B58\u306F\u30AA\u30D5: Save \u304B Ctrl+S \u3067\u66F8\u304D\u307E\u3059)": "Saves to {file} (auto save is off: Save or Ctrl+S writes)",
1660
1673
  "\u30D1\u30B9\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F: {path} (\u30D6\u30E9\u30A6\u30B6\u304B\u3089\u306F\u624B\u5143\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3002VS Code \u62E1\u5F35\u304B serve \u3067\u958B\u304F\u3068\u3001\u62BC\u3059\u3060\u3051\u3067\u958B\u3051\u307E\u3059)": "Copied the path: {path} (a browser cannot open files on this computer; in the VS Code extension or serve, clicking opens the file)",
1661
1674
  "\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u30D6\u30E9\u30A6\u30B6\u304B\u3089\u306F\u958B\u3051\u307E\u305B\u3093: {path}": "This file cannot be opened from the browser: {path}",
1662
- "\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F: {path}": "Could not open the file: {path}"
1675
+ "\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F: {path}": "Could not open the file: {path}",
1676
+ "\u8A08\u753B\u306E\u30D5\u30A9\u30EB\u30C0\u306E\u5916\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u958B\u3051\u307E\u305B\u3093: {path}": "Files outside the plan's folder cannot be opened: {path}"
1663
1677
  };
1664
1678
 
1665
1679
  // src/i18n/en/cli.ts
@@ -1993,7 +2007,7 @@ var cli = {
1993
2007
  "\u3042\u308A": "present",
1994
2008
  "\u306A\u3057": "absent",
1995
2009
  "\u3042\u308A (\u5370 {mark})": "present (mark {mark})",
1996
- "--in <\u540D\u524D> / --out <\u540D\u524D> / --remove <\u540D\u524D> / --policy <\u51FA\u529B\u540D> / --expect <\u51FA\u529B\u540D>=<kind>:<hint> / --self <\u51FA\u529B\u540D> / --rename <\u65E7\u540D>=<\u65B0\u540D> / --any-of <\u5165\u529B\u540D> / --all-of <\u5165\u529B\u540D> / --optional <\u5165\u529B\u540D> / --required <\u5165\u529B\u540D> / --describe <\u540D\u524D>=<\u8AAC\u660E> \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": "Specify one of --in <name> / --out <name> / --remove <name> / --policy <output> / --expect <output>=<kind>:<hint> / --self <output> / --rename <old>=<new> / --any-of <input> / --all-of <input> / --optional <input> / --required <input> / --describe <name>=<description>",
2010
+ "--in <\u540D\u524D> / --out <\u540D\u524D> / --remove <\u540D\u524D> / --policy <\u51FA\u529B\u540D> / --expect <\u51FA\u529B\u540D>=<kind>:<hint> / --self <\u51FA\u529B\u540D> / --rename <\u65E7\u540D>=<\u65B0\u540D> / --any-of <\u5165\u529B\u540D> / --all-of <\u5165\u529B\u540D> / --optional <\u5165\u529B\u540D> / --required <\u5165\u529B\u540D> / --describe <\u540D\u524D>=<\u8AAC\u660E> / --accept-draft <\u5165\u529B\u540D> \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": "Specify one of --in <name> / --out <name> / --remove <name> / --policy <output> / --expect <output>=<kind>:<hint> / --self <output> / --rename <old>=<new> / --any-of <input> / --all-of <input> / --optional <input> / --required <input> / --describe <name>=<description> / --accept-draft <input>",
1997
2011
  "\u300C{name}\u300D\u306F\u5165\u529B\u3068\u51FA\u529B\u306E\u4E21\u65B9\u306B\u3042\u308A\u307E\u3059\u3002in:{name} / out:{name} \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": '"{name}" exists as both an input and an output; use in:{name} / out:{name}',
1998
2012
  "\u524A\u9664: {name} (\u4F7F\u3046\u7BB1\u306E\u5165\u529B {count} \u4EF6\u3082)": "deleted: {name} (and {count} input(s) of the boxes that use it)",
1999
2013
  "\u524A\u9664: {name}": "deleted: {name}",
@@ -2024,7 +2038,39 @@ var cli = {
2024
2038
  "\u3053\u306E\u7BB1\u3067\u306F\u53D7\u3051\u53D6\u3089\u306A\u3044\u65B9\u91DD (<\u7BB1>.<\u51FA\u529B\u540D>)": "Policies this box does not take (<box>.<output>)",
2025
2039
  "\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {path}": "File not found: {path}",
2026
2040
  "\u8A08\u753B\u306E\u30D5\u30A9\u30EB\u30C0\u306E\u5916\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u8868\u793A\u3067\u304D\u307E\u305B\u3093: {path}": "Files outside the plan's folder cannot be shown: {path}",
2027
- "\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u3066\u8868\u793A\u3067\u304D\u307E\u305B\u3093: {path}": "The file is too large to show: {path}"
2041
+ "\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u3066\u8868\u793A\u3067\u304D\u307E\u305B\u3093: {path}": "The file is too large to show: {path}",
2042
+ " (\u4F5C\u6210\u4E2D)": " (work in progress)",
2043
+ " (\u4F5C\u6210\u4E2D\u3002\u4F7F\u3046\u5074\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u5B8C\u4E86\u304B --final \u3067\u78BA\u5B9A)": " (work in progress: boxes using it keep waiting; finishing the box or --final confirms it)",
2044
+ "\u4F5C\u6210\u4E2D\u3060\u3063\u305F\u8CC7\u6599 {count} \u4EF6\u3092\u78BA\u5B9A\u306B\u3057\u307E\u3057\u305F": "Confirmed {count} work-in-progress item(s)",
2045
+ "\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF {name}": "accepts work in progress {name}",
2046
+ "\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u300C{key}\u300D\u306F\u3042\u308A\u307E\u305B\u3093 ({list})": 'No work-in-progress item "{key}" ({list})',
2047
+ "\u53C2\u8003\u8CC7\u6599\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{title}\u300D <- {artifact}": 'Added a reference link: "{title}" <- {artifact}',
2048
+ "\u78BA\u5B9A\u306B\u3057\u307E\u3057\u305F: {list}": "Confirmed: {list}",
2049
+ "\u78BA\u5B9A\u3092\u5F85\u3064 {name}": "waits for confirmed {name}",
2050
+ "\u30E1\u30F3\u30D0\u30FC\u3092\u8DB3\u3057\u307E\u3057\u305F: {names}": "Added members: {names}",
2051
+ "\u30E1\u30F3\u30D0\u30FC\u306F\u3044\u307E\u305B\u3093\u3002\u62C5\u5F53\u306F set <block> --assignee <\u540D\u524D> \u3067\u6C7A\u3081\u307E\u3059 (\u540D\u524D\u306E\u30E1\u30F3\u30D0\u30FC\u306F\u81EA\u52D5\u3067\u8DB3\u3055\u308C\u307E\u3059)": "No members yet. Assign with set <block> --assignee <name> (a missing member is added)",
2052
+ "(\u672A\u5B8C\u4E86\u306E\u62C5\u5F53 {count} \u4EF6)": "({count} open)",
2053
+ " (\u9014\u4E2D\u306E\u7BB1\u3092\u901A\u308B {count} \u672C)": " ({count} wires through the boxes in between)",
2054
+ "--edit / --remove \u306B\u306F\u8A18\u9332\u306E id \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 (log {block} \u3067\u4E00\u89A7)": "Give the entry id to --edit / --remove (list them with log {block})",
2055
+ "--name \u306B\u306F\u8A08\u753B\u306E\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": "Give the plan's name to --name",
2056
+ "--remove \u306B\u306F\u5916\u3059\u30E1\u30F3\u30D0\u30FC\u306E\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": "Give the names of the members to remove to --remove",
2057
+ "--rename \u306B\u306F\u65B0\u3057\u3044\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044": "Give the new name to --rename",
2058
+ "\u307B\u304B\u306E\u66F8\u304D\u624B ({by}) \u306E\u8A18\u9332\u306F\u76F4\u305B\u307E\u305B\u3093\u3002\u76F4\u3059\u306E\u306F\u81EA\u5206\u306E\u8A18\u9332\u3060\u3051\u3067\u3059": "This entry was written by {by}. You can only change your own entries",
2059
+ "\u30E1\u30F3\u30D0\u30FC\u3092\u5916\u3057\u307E\u3057\u305F: {names}": "Removed members: {names}",
2060
+ "\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u66F4\u65B0: \u300C{name}\u300D": 'Updated input group: "{name}"',
2061
+ "\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u6D88\u3057\u307E\u3057\u305F: \u300C{name}\u300D (\u5165\u3063\u3066\u3044\u305F\u5165\u529B\u306F Inputs \u306B\u623B\u308A\u307E\u3057\u305F)": 'Deleted input group: "{name}" (its inputs went back to Inputs)',
2062
+ "\u5224\u65AD {id} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093": "Decision {id} not found",
2063
+ "\u540C\u3058\u7B54\u3048\u3067\u3059: {answer}": "That is already the answer: {answer}",
2064
+ '\u65B0\u3057\u3044\u672C\u6587\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: log <block> --edit <id> "<\u672C\u6587>"': 'Give the new text: log <block> --edit <id> "<text>"',
2065
+ "\u7B54\u3048\u3092\u76F4\u3057\u307E\u3057\u305F: \u300C{title}\u300D {before} -> {answer}": 'Corrected the answer: "{title}" {before} -> {answer}',
2066
+ "\u7D50\u7DDA: {route}": "Connected: {route}",
2067
+ "\u8A08\u753B\u306E\u540D\u524D: {name}": "Plan name: {name}",
2068
+ "\u8A08\u753B\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F: {name}": "Updated the plan: {name}",
2069
+ "\u8A18\u9332 {id} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 (log {block} \u3067\u4E00\u89A7)": "Entry {id} not found (list them with log {block})",
2070
+ "\u8A18\u9332\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093: {key} \u300C{title}\u300D": 'No entries yet: {key} "{title}"',
2071
+ "\u8A18\u9332\u3092\u6D88\u3057\u307E\u3057\u305F: {id}": "Deleted entry: {id}",
2072
+ "\u8A18\u9332\u3092\u76F4\u3057\u307E\u3057\u305F: {id}": "Updated entry: {id}",
2073
+ "\u8AAC\u660E: {text}": "Description: {text}"
2028
2074
  };
2029
2075
 
2030
2076
  // src/i18n/en/model.ts
@@ -2100,7 +2146,12 @@ var model = {
2100
2146
  "{title} (\u89AA\u306E\u51FA\u529B\u3078)": "{title} (into its output)",
2101
2147
  "\u300C{title}\u300D\u306F\u3053\u306E\u7BB1\u306E\u5165\u529B\u306E\u4F9B\u7D66\u5143\u3067\u306F\u3042\u308A\u307E\u305B\u3093 (\u5DEE\u3057\u623B\u305B\u308B\u306E\u306F\u3001\u5165\u529B\u3092\u4F5C\u3063\u3066\u3044\u308B\u7BB1\u3060\u3051\u3067\u3059)": `"{title}" does not feed this box's inputs (you can only send back to a box that makes one of the inputs)`,
2102
2148
  "\u5DEE\u3057\u623B\u3057: \u300C{from}\u300D\u304B\u3089\u300C{to}\u300D\u3078: {note}": 'Sent back from "{from}" to "{to}": {note}',
2103
- "\u65B9\u91DD\u300C{name}\u300D": 'policy "{name}"'
2149
+ "\u65B9\u91DD\u300C{name}\u300D": 'policy "{name}"',
2150
+ "(\u4F5C\u6210\u4E2D)": "(work in progress)",
2151
+ "(\u4F5C\u6210\u4E2D\u3042\u308A)": "(work in progress available)",
2152
+ "\u30E1\u30F3\u30D0\u30FC\u300C{name}\u300D\u304C\u3044\u307E\u305B\u3093 ({list})": 'Member "{name}" not found ({list})',
2153
+ "(\u62C5\u5F53: {names})": "(assignees: {names})",
2154
+ "\u62C5\u5F53: {names}": "Assignees: {names}"
2104
2155
  };
2105
2156
 
2106
2157
  // src/i18n/en/report.ts
@@ -2211,7 +2262,20 @@ var report = {
2211
2262
  "\u30DC\u30C3\u30AF\u30B9\u306E\u5C5E\u6027\u3092\u5909\u3048\u308B (\u984C\u540D\u30FB\u30E1\u30E2\u30FB\u30AB\u30C6\u30B4\u30EA\u30FB\u671F\u65E5\u30FB\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u8AB2\u984C URL)": "Change a box's attributes (title, note, category, due date, repository, issue URL)",
2212
2263
  "\u8A08\u753B\u3092 Markdown \u306B\u66F8\u304D\u51FA\u3059 (docs/ROADMAP.md \u306A\u3069)": "Export the plan as Markdown (e.g. docs/ROADMAP.md)",
2213
2264
  "\u8A08\u753B\u306E\u554F\u984C (\u3064\u306A\u304C\u3063\u3066\u3044\u306A\u3044\u5165\u51FA\u529B\u306A\u3069) \u3092\u691C\u67FB\u3059\u308B": "Check the plan for problems (e.g. unconnected inputs / outputs)",
2214
- '\u305D\u306E\u307B\u304B\u306E CLI \u30B3\u30DE\u30F3\u30C9\u3092\u305D\u306E\u307E\u307E\u5B9F\u884C\u3059\u308B (\u4F8B: ["log", "--n", "20"]\u3001["layout"]\u3001["help"])': 'Run any other CLI command as is (e.g. ["log", "--n", "20"], ["layout"], ["help"])'
2265
+ '\u305D\u306E\u307B\u304B\u306E CLI \u30B3\u30DE\u30F3\u30C9\u3092\u305D\u306E\u307E\u307E\u5B9F\u884C\u3059\u308B (\u4F8B: ["log", "--n", "20"]\u3001["layout"]\u3001["help"])': 'Run any other CLI command as is (e.g. ["log", "--n", "20"], ["layout"], ["help"])',
2266
+ "true \u306A\u3089 path \u306E\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u3092\u78BA\u5B9A\u306B\u3059\u308B (all \u3067\u3059\u3079\u3066)": "If true, confirm the work-in-progress item named by path (all = every one)",
2267
+ "\u4F5C\u6210\u4E2D\u3068\u3057\u3066\u4ED8\u3051\u308B (\u4F7F\u3046\u5074\u306E\u7BB1\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u4F7F\u3046\u5074\u306E\u5165\u529B\u304C acceptDraft \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002\u5B8C\u4E86\u3067\u78BA\u5B9A\u306B\u306A\u308B)": "Attach as work in progress (boxes using it keep waiting unless their input accepts drafts; finishing the box confirms it)",
2268
+ "\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u3067\u3082\u7740\u624B\u3057\u3066\u3088\u3044\u5165\u529B\u306E\u540D\u524D": "Inputs that may start with work-in-progress material",
2269
+ "\u51FA\u529B\u3067\u306F\u306A\u304F\u3001\u7BB1\u306E\u53C2\u8003\u8CC7\u6599 (Links) \u306B\u4ED8\u3051\u308B (\u4F7F\u3046\u5074\u306B\u306F\u6E21\u3089\u306A\u3044)": "Attach to the box's reference links instead of an output (not passed to other boxes)",
2270
+ "\u78BA\u5B9A\u3057\u305F\u8CC7\u6599\u3092\u5F85\u3064 (\u65E2\u5B9A) \u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D": "Inputs that wait for confirmed material again (default)",
2271
+ "\u62C5\u5F53\u3092\u7F6E\u304D\u63DB\u3048\u308B (\u30E1\u30F3\u30D0\u30FC\u306E\u540D\u524D\u3002\u7A7A\u306E\u914D\u5217\u3067\u62C5\u5F53\u306A\u3057\u3002\u3044\u306A\u3044\u540D\u524D\u306F\u30E1\u30F3\u30D0\u30FC\u306B\u8DB3\u3059)": "Replace the assignees (member names; an empty array clears them; missing members are added)",
2272
+ "\u62C5\u5F53\u306B\u8DB3\u3059\u540D\u524D": "Names to add as assignees",
2273
+ "\u62C5\u5F53\u304B\u3089\u5916\u3059\u540D\u524D": "Names to remove from the assignees",
2274
+ "(\u307B\u304B {count} \u4EF6\u3002\u5168\u90E8\u306F log {block})": "({count} more. See them all with log {block})",
2275
+ "\u3002text \u3092\u7701\u304F\u3068\u8A18\u9332\u306E\u4E00\u89A7 (id \u4ED8\u304D)\u3002edit \u3067\u66F8\u304D\u76F4\u3057\u3001remove \u3067\u6D88\u3059 (\u81EA\u5206\u306E\u8A18\u9332\u3060\u3051)": ". Without text, lists the entries (with ids). edit rewrites one, remove deletes one (your own only)",
2276
+ "\u66F8\u304D\u76F4\u3059\u8A18\u9332\u306E id": "Id of the entry to rewrite",
2277
+ "\u6D88\u3059\u8A18\u9332\u306E id": "Id of the entry to delete",
2278
+ "\u5224\u65AD\u306E id (\u7701\u304F\u3068\u6700\u65B0\u306E\u672A\u56DE\u7B54\u3002\u7B54\u3048\u6E08\u307F\u306E id \u3092\u6307\u3059\u3068\u7B54\u3048\u3092\u76F4\u3059)": "Decision id (default: the latest unanswered one. An answered id corrects the answer)"
2215
2279
  };
2216
2280
 
2217
2281
  // src/i18n/en/index.ts
@@ -2845,7 +2909,7 @@ function candidateGroups(p, blocks) {
2845
2909
  const reasons = unpreparedReasons(p, b.id);
2846
2910
  const missingInputs = waitingFor(p, b.id);
2847
2911
  const state = reasons.length ? "unprepared" : missingInputs.length ? "waiting" : "ready";
2848
- return { blockId: b.id, key: b.key, title: b.title, inFocus: inFocus(p, b.id), missingInputs, unprepared: reasons.map((r) => reasonText(p, r)), state };
2912
+ return { blockId: b.id, key: b.key, title: b.title, inFocus: inFocus(p, b.id), missingInputs: markDraftInputs(p, b.id, missingInputs), unprepared: reasons.map((r) => reasonText(p, r)), state };
2849
2913
  });
2850
2914
  const label = { ready: "\u7740\u624B\u3067\u304D\u308B", unprepared: "\u8981\u5177\u4F53\u5316", waiting: "\u5165\u529B\u5F85\u3061" };
2851
2915
  return (focused ? [true, false] : [false]).flatMap((scope2) => ["ready", "unprepared", "waiting"].map((state) => ({
@@ -2863,7 +2927,7 @@ function checkStart(p, id, actor, reason = "") {
2863
2927
  const human = isHumanActor(actor);
2864
2928
  const names = waitingFor(p, id);
2865
2929
  if (names.length && !reason.trim()) {
2866
- const warning = t("\u5FC5\u9808\u306E\u5165\u529B\u5F85\u3061: {names}", { names: names.join(", ") });
2930
+ const warning = t("\u5FC5\u9808\u306E\u5165\u529B\u5F85\u3061: {names}", { names: markDraftInputs(p, id, names).join(", ") });
2867
2931
  if (p.workflowPolicy?.startWithoutInputs === "reject" && !human) errors.push(warning + " " + t("\u958B\u59CB\u3059\u308B\u7406\u7531\u3092 --reason \u3067\u8A18\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002"));
2868
2932
  else warnings.push(warning);
2869
2933
  }
@@ -3175,6 +3239,8 @@ function createGitArtifact(title, git2) {
3175
3239
  return { id: newId(), title, url: git2.url ?? "", kind: "git", note: "", repo: git2.repo, path: git2.path, commit: git2.commit, blob: git2.blob, state: "ok", checkedAt: now() };
3176
3240
  }
3177
3241
  var index = null;
3242
+ var endpointKey = (ep) => `${ep.portId}
3243
+ ${ep.side}`;
3178
3244
  function childrenOf(p, blockId) {
3179
3245
  if (index && index.blocks === p.blocks) return (index.kidsByParent.get(blockId) ?? []).slice();
3180
3246
  return Object.values(p.blocks).filter((b) => b.parentId === blockId);
@@ -3211,9 +3277,11 @@ function portsOf(p, blockId, direction) {
3211
3277
  }
3212
3278
  var sameEndpoint = (a, b) => a.portId === b.portId && a.side === b.side;
3213
3279
  function incomingEdges(p, ep) {
3280
+ if (index && index.edges === p.edges) return (index.edgesTo.get(endpointKey(ep)) ?? []).slice();
3214
3281
  return Object.values(p.edges).filter((e) => sameEndpoint(e.to, ep));
3215
3282
  }
3216
3283
  function outgoingEdges(p, ep) {
3284
+ if (index && index.edges === p.edges) return (index.edgesFrom.get(endpointKey(ep)) ?? []).slice();
3217
3285
  return Object.values(p.edges).filter((e) => sameEndpoint(e.from, ep));
3218
3286
  }
3219
3287
  function scopeOf(p, ep) {
@@ -3304,6 +3372,17 @@ function addLogEntry(p, blockId, by, text2) {
3304
3372
  const entry = { id: newId(), at: (/* @__PURE__ */ new Date()).toISOString(), by, text: text2 };
3305
3373
  return { ...p, blocks: { ...p.blocks, [blockId]: { ...b, log: [...b.log ?? [], entry] } } };
3306
3374
  }
3375
+ function removeLogEntry(p, blockId, entryId) {
3376
+ const b = p.blocks[blockId];
3377
+ if (!b?.log) return p;
3378
+ const log = b.log.filter((e) => e.id !== entryId);
3379
+ return { ...p, blocks: { ...p.blocks, [blockId]: { ...b, ...log.length ? { log } : { log: void 0 } } } };
3380
+ }
3381
+ function updateLogEntry(p, blockId, entryId, text2) {
3382
+ const b = p.blocks[blockId];
3383
+ if (!b?.log || !text2.trim() || !b.log.some((e) => e.id === entryId)) return p;
3384
+ return { ...p, blocks: { ...p.blocks, [blockId]: { ...b, log: b.log.map((e) => e.id === entryId ? { ...e, text: text2 } : e) } } };
3385
+ }
3307
3386
  function updateBlock(p, blockId, patch) {
3308
3387
  const q = touch(p);
3309
3388
  const b = q.blocks[blockId];
@@ -3490,11 +3569,134 @@ function connect(p, from, to) {
3490
3569
  }
3491
3570
  return { project: normalizePromotions(q), edgeId: id };
3492
3571
  }
3493
- function disconnect(p, edgeId) {
3494
- if (!p.edges[edgeId]) return p;
3572
+ function wireChainOf(p, edgeId) {
3573
+ const out2 = /* @__PURE__ */ new Set([edgeId]);
3574
+ const start = p.edges[edgeId];
3575
+ if (!start) return out2;
3576
+ let cur = start;
3577
+ for (let guard = 0; guard < 64; guard++) {
3578
+ const backSide = cur.from.side === "outer" ? "inner" : "outer";
3579
+ const outs = outgoingEdges(p, cur.from);
3580
+ const ins = incomingEdges(p, { portId: cur.from.portId, side: backSide });
3581
+ if (outs.length !== 1 || ins.length !== 1 || out2.has(ins[0].id)) break;
3582
+ out2.add(ins[0].id);
3583
+ cur = ins[0];
3584
+ }
3585
+ cur = start;
3586
+ for (let guard = 0; guard < 64; guard++) {
3587
+ const nextSide = cur.to.side === "outer" ? "inner" : "outer";
3588
+ const ins = incomingEdges(p, cur.to);
3589
+ const outs = outgoingEdges(p, { portId: cur.to.portId, side: nextSide });
3590
+ if (ins.length !== 1 || outs.length !== 1 || out2.has(outs[0].id)) break;
3591
+ out2.add(outs[0].id);
3592
+ cur = outs[0];
3593
+ }
3594
+ return out2;
3595
+ }
3596
+ function disconnectWire(p, edgeId) {
3597
+ const e = p.edges[edgeId];
3598
+ if (!e) return { project: p };
3495
3599
  const q = touch(p);
3496
- delete q.edges[edgeId];
3497
- return normalizePromotions(q);
3600
+ if (e.auto) {
3601
+ const stack = [e];
3602
+ const seen = /* @__PURE__ */ new Set();
3603
+ while (stack.length > 0) {
3604
+ const cur = stack.pop();
3605
+ if (seen.has(cur.id)) continue;
3606
+ seen.add(cur.id);
3607
+ delete q.edges[cur.id];
3608
+ const target = q.ports[cur.to.portId];
3609
+ if (!target || target.direction !== "in") continue;
3610
+ if (!target.promotedFrom) {
3611
+ q.ports[target.id] = { ...target, noPromote: true };
3612
+ continue;
3613
+ }
3614
+ for (const x of Object.values(q.edges)) if (x.auto && x.from.portId === target.id && x.from.side === "inner") stack.push(x);
3615
+ }
3616
+ } else {
3617
+ const chain = wireChainOf(p, edgeId);
3618
+ for (const id of chain) if (!p.edges[id].auto) delete q.edges[id];
3619
+ for (const id of chain) {
3620
+ const to = q.ports[p.edges[id].to.portId];
3621
+ if (to && to.direction === "in" && p.edges[id].to.side === "outer" && !Object.values(q.edges).some((x) => x.to.portId === to.id && x.to.side === "outer")) q.ports[to.id] = { ...to, noPromote: true };
3622
+ }
3623
+ const tos = new Set([...chain].map((id) => p.edges[id].to.portId));
3624
+ const froms = new Set([...chain].map((id) => p.edges[id].from.portId));
3625
+ const unused = (portId) => !Object.values(q.edges).some((x) => x.from.portId === portId || x.to.portId === portId);
3626
+ for (const portId of tos) {
3627
+ if (!froms.has(portId) || !q.ports[portId]) continue;
3628
+ if (!unused(portId)) continue;
3629
+ delete q.ports[portId];
3630
+ }
3631
+ for (const portId of [...froms, ...tos]) {
3632
+ const x = q.ports[portId];
3633
+ if (!x || x.direction !== "out" || x.blockId === ROOT_ID) continue;
3634
+ if (childrenOf(q, x.blockId).length === 0 || x.artifacts.length > 0 || x.expect || x.policy) continue;
3635
+ if (unused(portId)) delete q.ports[portId];
3636
+ }
3637
+ }
3638
+ return { project: normalizePromotions(q) };
3639
+ }
3640
+ function wirePathBetween(p, fromPortIds, toPortIds) {
3641
+ const goal = new Set(toPortIds);
3642
+ const edges = Object.values(p.edges);
3643
+ const queue = fromPortIds.map((portId) => ({ portId, path: [] }));
3644
+ const seen = new Set(fromPortIds);
3645
+ while (queue.length > 0) {
3646
+ const cur = queue.shift();
3647
+ for (const e of edges) {
3648
+ if (e.from.portId !== cur.portId) continue;
3649
+ const path = [...cur.path, e.id];
3650
+ if (goal.has(e.to.portId)) return path;
3651
+ if (seen.has(e.to.portId)) continue;
3652
+ seen.add(e.to.portId);
3653
+ queue.push({ portId: e.to.portId, path });
3654
+ }
3655
+ }
3656
+ return null;
3657
+ }
3658
+ var MEMBER_COLORS = ["#0d8080", "#e8875e", "#3aa85a", "#6b7075", "#2f6fb3", "#a0522d"];
3659
+ function findMember(p, ref) {
3660
+ const key = ref.trim().toLowerCase();
3661
+ return p.members.find((m) => m.id === ref) ?? p.members.find((m) => m.name.trim().toLowerCase() === key);
3662
+ }
3663
+ function assignMembers(p, blockId, args) {
3664
+ if (!p.blocks[blockId] || blockId === ROOT_ID) return { project: p, added: [], error: t("\u30D6\u30ED\u30C3\u30AF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093") };
3665
+ let q = p;
3666
+ const added = [];
3667
+ const idOf = (name) => {
3668
+ const m = findMember(q, name);
3669
+ if (m) return m.id;
3670
+ const r = addMember(q, name.trim(), MEMBER_COLORS[q.members.length % MEMBER_COLORS.length]);
3671
+ q = r.project;
3672
+ added.push(name.trim());
3673
+ return r.memberId;
3674
+ };
3675
+ let ids = [...q.blocks[blockId].assigneeIds];
3676
+ if (args.set) ids = [...new Set(args.set.filter((n) => n.trim()).map(idOf))];
3677
+ for (const n of args.add ?? []) {
3678
+ if (!n.trim()) continue;
3679
+ const id = idOf(n);
3680
+ if (!ids.includes(id)) ids.push(id);
3681
+ }
3682
+ for (const n of args.remove ?? []) {
3683
+ const m = findMember(q, n);
3684
+ if (!m) return { project: p, added: [], error: t("\u30E1\u30F3\u30D0\u30FC\u300C{name}\u300D\u304C\u3044\u307E\u305B\u3093 ({list})", { name: n, list: q.members.map((x) => x.name).join(", ") || "-" }) };
3685
+ ids = ids.filter((id) => id !== m.id);
3686
+ }
3687
+ return { project: updateBlock(q, blockId, { assigneeIds: ids }), added };
3688
+ }
3689
+ function addMember(p, name, color) {
3690
+ const q = touch(p);
3691
+ const m = { id: newId(), name, color };
3692
+ q.members.push(m);
3693
+ return { project: q, memberId: m.id };
3694
+ }
3695
+ function removeMember(p, memberId) {
3696
+ const q = touch(p);
3697
+ q.members = q.members.filter((m) => m.id !== memberId);
3698
+ for (const b of Object.values(q.blocks)) b.assigneeIds = b.assigneeIds.filter((id) => id !== memberId);
3699
+ return q;
3498
3700
  }
3499
3701
  function normalizePromotions(p) {
3500
3702
  const q = clone(p);
@@ -3592,15 +3794,18 @@ function setProgress(p, blockId, value, actor) {
3592
3794
  appendLog(q, { actor, kind: "note", blockId, message: t("\u300C{title}\u300D\u306E\u9032\u6357 {value}", { title: b.title, value: value === null ? t("\u81EA\u52D5") : value + "%" }) });
3593
3795
  return q;
3594
3796
  }
3595
- function hasExternalInputArtifact(p, portId, seen = /* @__PURE__ */ new Set()) {
3797
+ function hasExternalInputArtifact(p, portId, seen = /* @__PURE__ */ new Set(), allowDraft = false) {
3596
3798
  if (seen.has(portId)) return false;
3597
3799
  const port2 = p.ports[portId];
3598
3800
  if (!port2 || port2.direction !== "in") return false;
3599
- if (port2.artifacts.length > 0) return true;
3801
+ if (hasArtifacts(port2, allowDraft)) return true;
3600
3802
  const next = new Set(seen).add(portId);
3601
- return outgoingEdges(p, { portId, side: "inner" }).some((e) => e.auto && hasExternalInputArtifact(p, e.to.portId, next));
3803
+ return outgoingEdges(p, { portId, side: "inner" }).some((e) => e.auto && hasExternalInputArtifact(p, e.to.portId, next, allowDraft));
3804
+ }
3805
+ function hasArtifacts(port2, allowDraft = false) {
3806
+ return port2.artifacts.some((a) => allowDraft || !a.draft);
3602
3807
  }
3603
- function isSourceReady(p, ep, seen = /* @__PURE__ */ new Set()) {
3808
+ function isSourceReady(p, ep, seen = /* @__PURE__ */ new Set(), allowDraft = false) {
3604
3809
  const key = `${ep.portId}:${ep.side}`;
3605
3810
  if (seen.has(key)) return false;
3606
3811
  const port2 = p.ports[ep.portId];
@@ -3608,17 +3813,29 @@ function isSourceReady(p, ep, seen = /* @__PURE__ */ new Set()) {
3608
3813
  const nextSeen = new Set(seen).add(key);
3609
3814
  const backSide = ep.side === "outer" ? "inner" : "outer";
3610
3815
  const upstream = incomingEdges(p, { portId: port2.id, side: backSide });
3611
- if (upstream.length > 0) return upstream.every((e) => isSourceReady(p, e.from, nextSeen));
3612
- if (port2.direction === "in") return hasExternalInputArtifact(p, port2.id);
3816
+ if (upstream.length > 0) return upstream.every((e) => isSourceReady(p, e.from, nextSeen, allowDraft));
3817
+ if (port2.direction === "in") return hasExternalInputArtifact(p, port2.id, /* @__PURE__ */ new Set(), allowDraft);
3613
3818
  const owner = p.blocks[port2.blockId];
3614
- if (port2.direction === "out" && owner?.merge) return portsOf(p, owner.id, "in").some((q) => isSourceReady(p, { portId: q.id, side: "inner" }, nextSeen));
3819
+ if (port2.direction === "out" && owner?.merge) return portsOf(p, owner.id, "in").some((q) => isSourceReady(p, { portId: q.id, side: "inner" }, nextSeen, allowDraft));
3615
3820
  if (port2.branchOption !== void 0 && owner?.branch) return chosenOption(owner) === port2.branchOption;
3616
- if (port2.artifacts.length > 0) return true;
3821
+ if (hasArtifacts(port2, allowDraft)) return true;
3617
3822
  return port2.direction === "out" && p.blocks[port2.blockId]?.status === "white";
3618
3823
  }
3619
3824
  function isInputReady(p, portId) {
3620
3825
  const port2 = p.ports[portId];
3621
- return !!port2 && port2.direction === "in" && isSourceReady(p, { portId, side: "inner" });
3826
+ return !!port2 && port2.direction === "in" && isSourceReady(p, { portId, side: "inner" }, /* @__PURE__ */ new Set(), !!port2.acceptDraft);
3827
+ }
3828
+ function markDraftInputs(p, blockId, names) {
3829
+ const ins = portsOf(p, blockId, "in");
3830
+ return names.map((n) => {
3831
+ const q = ins.find((x) => x.name === n);
3832
+ return q && hasDraftOnly(p, q.id) ? `${n} ${t("(\u4F5C\u6210\u4E2D\u3042\u308A)")}` : n;
3833
+ });
3834
+ }
3835
+ function hasDraftOnly(p, portId) {
3836
+ const port2 = p.ports[portId];
3837
+ if (!port2 || port2.direction !== "in") return false;
3838
+ return !isSourceReady(p, { portId, side: "inner" }) && isSourceReady(p, { portId, side: "inner" }, /* @__PURE__ */ new Set(), true);
3622
3839
  }
3623
3840
  function missingRequiredInputs(p, blockId) {
3624
3841
  const missing = portsOf(p, blockId, "in").filter((q) => q.required && !isInputReady(p, q.id));
@@ -3653,25 +3870,46 @@ function upstreamOf(p, blockId) {
3653
3870
  }
3654
3871
  return out2;
3655
3872
  }
3656
- function policiesFor(p, blockId) {
3873
+ function policyTableOf(p) {
3874
+ return { policies: Object.values(p.ports).filter((q) => !!q.policy && q.direction === "out"), upstream: /* @__PURE__ */ new Map() };
3875
+ }
3876
+ function policiesForIn(p, blockId, table) {
3657
3877
  const b = p.blocks[blockId];
3658
3878
  if (!b || blockId === ROOT_ID) return [];
3659
3879
  const ancestors = new Set(ancestorsOf(p, blockId).map((a) => a.id));
3660
3880
  const out2 = [];
3661
- const upstreamCache = /* @__PURE__ */ new Map();
3662
- for (const q of Object.values(p.ports)) {
3663
- if (!q.policy || q.direction !== "out") continue;
3881
+ let wired = null;
3882
+ for (const q of table.policies) {
3664
3883
  if (q.blockId === blockId || ancestors.has(q.blockId)) continue;
3665
- if (!upstreamCache.has(q.blockId)) upstreamCache.set(q.blockId, upstreamOf(p, q.blockId));
3666
- if (upstreamCache.get(q.blockId).has(blockId)) continue;
3884
+ if (!table.upstream.has(q.blockId)) table.upstream.set(q.blockId, upstreamOf(p, q.blockId));
3885
+ if (table.upstream.get(q.blockId).has(blockId)) continue;
3667
3886
  const scope2 = policyScopeOf(p, q.id);
3668
3887
  if (scope2 !== ROOT_ID && !ancestors.has(scope2)) continue;
3669
3888
  if (b.policyOptOut?.includes(q.id)) continue;
3670
- if (portsOf(p, blockId, "in").some((i) => sourceOfInput(p, i.id)?.id === q.id)) continue;
3889
+ wired ??= new Set(portsOf(p, blockId, "in").map((i) => sourceOfInput(p, i.id)?.id).filter((id) => !!id));
3890
+ if (wired.has(q.id)) continue;
3671
3891
  out2.push(q);
3672
3892
  }
3673
3893
  return out2.sort((x, y) => (p.blocks[x.blockId]?.title ?? "").localeCompare(p.blocks[y.blockId]?.title ?? "") || x.name.localeCompare(y.name));
3674
3894
  }
3895
+ var POLICY_CACHE = /* @__PURE__ */ new WeakMap();
3896
+ function policyCacheOf(p) {
3897
+ let c = POLICY_CACHE.get(p);
3898
+ if (!c) {
3899
+ c = { table: policyTableOf(p), byBlock: /* @__PURE__ */ new Map(), receivers: null };
3900
+ POLICY_CACHE.set(p, c);
3901
+ }
3902
+ return c;
3903
+ }
3904
+ function policiesFor(p, blockId) {
3905
+ const c = policyCacheOf(p);
3906
+ let hit = c.byBlock.get(blockId);
3907
+ if (!hit) {
3908
+ hit = policiesForIn(p, blockId, c.table);
3909
+ c.byBlock.set(blockId, hit);
3910
+ }
3911
+ return hit.slice();
3912
+ }
3675
3913
  function isPolicyReady(p, portId) {
3676
3914
  return isSourceReady(p, { portId, side: "outer" });
3677
3915
  }
@@ -3722,7 +3960,7 @@ function setPolicyOptOut(p, blockId, portId, skip) {
3722
3960
  return q;
3723
3961
  }
3724
3962
  function stampPolicies(q, blockId) {
3725
- const ps = policiesFor(q, blockId);
3963
+ const ps = policiesForIn(q, blockId, policyTableOf(q));
3726
3964
  if (ps.length === 0) {
3727
3965
  delete q.blocks[blockId].policyStamps;
3728
3966
  return;
@@ -3935,6 +4173,7 @@ function finishBlock(p, blockId, actor, args = {}) {
3935
4173
  if (target && args.artifacts) {
3936
4174
  for (const a of args.artifacts) q.ports[target.id].artifacts.push("id" in a && "kind" in a ? a : createArtifact(a.title, a.url ?? ""));
3937
4175
  }
4176
+ finalizeDrafts(q, blockId);
3938
4177
  q.blocks[blockId].activity = null;
3939
4178
  if (q.blocks[blockId].status !== "white") q.blocks[blockId].statusChangedAt = now();
3940
4179
  q.blocks[blockId].status = "white";
@@ -4046,6 +4285,28 @@ function answerDecision(p, blockId, decisionId, answer, by) {
4046
4285
  }
4047
4286
  return q;
4048
4287
  }
4288
+ function editDecisionAnswer(p, blockId, decisionId, answer, by) {
4289
+ const b = p.blocks[blockId];
4290
+ const d = b?.decisions.find((x) => x.id === decisionId);
4291
+ if (!b || !d || d.answer === void 0 || !answer.trim() || answer.trim() === d.answer) return p;
4292
+ const q = touch(p);
4293
+ const qd = q.blocks[blockId].decisions.find((x) => x.id === decisionId);
4294
+ delete qd.ackedAt;
4295
+ delete qd.ackedBy;
4296
+ qd.answer = answer.trim();
4297
+ qd.answeredBy = by;
4298
+ qd.answeredAt = now();
4299
+ appendLog(q, { actor: by, kind: "answered", blockId, message: t("\u300C{title}\u300D\u306E\u5224\u65AD\u306E\u7B54\u3048\u3092\u76F4\u3057\u305F: {question} \u2192 {answer}", { title: b.title, question: d.question, answer: answer.trim() }) });
4300
+ const eb = q.blocks[blockId];
4301
+ if (eb.branch?.decisionId === decisionId) {
4302
+ const next = d.options.includes(answer.trim()) ? "white" : "black";
4303
+ if (eb.status !== next && (next === "white" || eb.status === "white")) {
4304
+ eb.status = next;
4305
+ eb.statusChangedAt = now();
4306
+ }
4307
+ }
4308
+ return q;
4309
+ }
4049
4310
  function candidatesOf(d) {
4050
4311
  if (d.answer === void 0) return { rejected: [...d.options] };
4051
4312
  return { chosen: d.answer, rejected: d.options.filter((o) => o !== d.answer) };
@@ -4107,6 +4368,18 @@ function ackDecisions(p, blockId, by, decisionId) {
4107
4368
  appendLog(q, { actor: by, kind: "note", blockId, message: t("\u300C{title}\u300D\u306E\u56DE\u7B54\u3092\u78BA\u8A8D: {questions}", { title: b.title, questions: targets.map((d) => d.question).join(" / ") }) });
4108
4369
  return q;
4109
4370
  }
4371
+ function finalizeDrafts(q, blockId) {
4372
+ let n = 0;
4373
+ for (const o of portsOf(q, blockId, "out")) {
4374
+ if (!o.artifacts.some((a) => a.draft)) continue;
4375
+ n += o.artifacts.filter((a) => a.draft).length;
4376
+ q.ports[o.id] = { ...q.ports[o.id], artifacts: q.ports[o.id].artifacts.map(({ draft: _d, ...a }) => {
4377
+ void _d;
4378
+ return a;
4379
+ }) };
4380
+ }
4381
+ return n;
4382
+ }
4110
4383
  function setStatus(p, blockId, status, actor) {
4111
4384
  const b = p.blocks[blockId];
4112
4385
  if (!b || b.status === status) return p;
@@ -4114,6 +4387,7 @@ function setStatus(p, blockId, status, actor) {
4114
4387
  if (status === "white") {
4115
4388
  q.blocks[blockId].activity = null;
4116
4389
  stampPolicies(q, blockId);
4390
+ finalizeDrafts(q, blockId);
4117
4391
  }
4118
4392
  appendLog(q, { actor, kind: "status", blockId, message: t("\u300C{title}\u300D\u3092 {status} \u306B", { title: b.title, status }) });
4119
4393
  return q;
@@ -4122,7 +4396,10 @@ function summarize(p) {
4122
4396
  const blocks = Object.values(p.blocks).filter((b) => b.id !== ROOT_ID && kindOf(b) !== "project" && !isSkipped(p, b.id) && !b.merge);
4123
4397
  const working = blocks.filter((b) => b.activity?.state === "working").map((b) => ({ block: b, actor: b.activity.actor, note: b.activity.note, since: b.activity.since }));
4124
4398
  const blocked = blocks.filter((b) => b.activity?.state === "blocked" || b.activity?.state === "waiting_review").map((b) => ({ block: b, actor: b.activity.actor, note: b.activity.note }));
4125
- const leafBlack = blocks.filter((b) => b.status === "black" && !b.activity && childrenOf(p, b.id).length === 0).sort((a, b) => Number(inFocus(p, b.id)) - Number(inFocus(p, a.id)) || Number(waitingFor(p, a.id).length > 0) - Number(waitingFor(p, b.id).length > 0));
4399
+ const candidates = blocks.filter((b) => b.status === "black" && !b.activity && childrenOf(p, b.id).length === 0);
4400
+ const focused = new Map(candidates.map((b) => [b.id, inFocus(p, b.id)]));
4401
+ const waiting = new Map(candidates.map((b) => [b.id, waitingFor(p, b.id).length > 0]));
4402
+ const leafBlack = candidates.sort((a, b) => Number(focused.get(b.id)) - Number(focused.get(a.id)) || Number(waiting.get(a.id)) - Number(waiting.get(b.id)));
4126
4403
  return {
4127
4404
  total: blocks.length,
4128
4405
  white: blocks.filter((b) => b.status === "white").length,
@@ -4793,6 +5070,12 @@ function updateInputGroup(p, groupId, patch) {
4793
5070
  Object.assign(gp, patch);
4794
5071
  return q;
4795
5072
  }
5073
+ function removeInputGroup(p, groupId) {
5074
+ const q = touch(p);
5075
+ q.inputGroups = (q.inputGroups ?? []).filter((x) => x.id !== groupId);
5076
+ for (const x of Object.values(q.ports)) if (x.groupId === groupId) delete x.groupId;
5077
+ return q;
5078
+ }
4796
5079
  function setInputGroup(p, portId, groupId) {
4797
5080
  const port2 = p.ports[portId];
4798
5081
  if (!port2 || port2.blockId !== ROOT_ID || port2.direction !== "in") return p;
@@ -6029,7 +6312,7 @@ function resolveToken(server, allowEnvironmentToken = true) {
6029
6312
  import { hostname as hostname2 } from "node:os";
6030
6313
 
6031
6314
  // package.json
6032
- var version = "0.6.5";
6315
+ var version = "0.6.7";
6033
6316
 
6034
6317
  // src/model/version.ts
6035
6318
  var APP_VERSION = version;
@@ -8395,8 +8678,11 @@ function registerTools(server, run2) {
8395
8678
  return safe(run2, argv);
8396
8679
  });
8397
8680
  server.registerTool("boxglow_context", { description: t("\u30DC\u30C3\u30AF\u30B9\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8AAD\u3080: \u89AA\u3068\u5165\u529B\u5143\u306E\u5224\u65AD\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3002guard \u4ED8\u304D\u306E\u5909\u66F4\u306B\u4F7F\u3046 contextToken \u3092\u8FD4\u3059 (\u81EA\u5206\u306E\u64CD\u4F5C\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5909\u308F\u308B\u3068\u3001\u305D\u306E\u64CD\u4F5C\u306E\u51FA\u529B\u306B\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B)"), inputSchema: { block: block2, brief: z2.boolean().optional().describe(t("\u77ED\u3044\u5F62\u3067\u8AAD\u3080 (\u5BFE\u8C61\u306E\u60C5\u5831\u306F\u5168\u90E8\u3001\u89AA\u3068\u5165\u529B\u5143\u306F\u984C\u540D\u30FB\u72B6\u614B\u30FB\u6709\u52B9\u306A\u5224\u65AD\u30FB\u5BFE\u8C61\u306B\u3064\u306A\u304C\u308B\u51FA\u529B\u3060\u3051\u3002\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u540C\u3058)")) }, annotations: { readOnlyHint: true } }, async ({ block: b, brief }) => safe(run2, ["context", b, ...brief ? ["--brief"] : []]));
8398
- server.registerTool("boxglow_log", { description: t("\u4F5C\u696D\u8A18\u9332\u3092 1 \u4EF6\u8DB3\u3059 (Markdown \u53EF\u3002\u65E5\u4ED8\u3068\u66F8\u304D\u624B\u304C\u4ED8\u304F\u3002\u9032\u6357\u30FB\u6C17\u3065\u304D\u30FB\u7D4C\u7DEF\u3092\u81EA\u7531\u306B)"), inputSchema: { block: block2, text: z2.string(), contextToken: z2.string().optional() } }, async (a) => {
8399
- const argv = ["log", a.block, "--note", a.text];
8681
+ server.registerTool("boxglow_log", { description: t("\u4F5C\u696D\u8A18\u9332\u3092 1 \u4EF6\u8DB3\u3059 (Markdown \u53EF\u3002\u65E5\u4ED8\u3068\u66F8\u304D\u624B\u304C\u4ED8\u304F\u3002\u9032\u6357\u30FB\u6C17\u3065\u304D\u30FB\u7D4C\u7DEF\u3092\u81EA\u7531\u306B)") + t("\u3002text \u3092\u7701\u304F\u3068\u8A18\u9332\u306E\u4E00\u89A7 (id \u4ED8\u304D)\u3002edit \u3067\u66F8\u304D\u76F4\u3057\u3001remove \u3067\u6D88\u3059 (\u81EA\u5206\u306E\u8A18\u9332\u3060\u3051)"), inputSchema: { block: block2, text: z2.string().optional(), edit: z2.string().optional().describe(t("\u66F8\u304D\u76F4\u3059\u8A18\u9332\u306E id")), remove: z2.string().optional().describe(t("\u6D88\u3059\u8A18\u9332\u306E id")), contextToken: z2.string().optional() } }, async (a) => {
8682
+ const argv = ["log", a.block];
8683
+ opt(argv, "edit", a.edit);
8684
+ opt(argv, "remove", a.remove);
8685
+ opt(argv, "note", a.text);
8400
8686
  opt(argv, "context-token", a.contextToken);
8401
8687
  return safe(run2, argv);
8402
8688
  });
@@ -8424,7 +8710,7 @@ function registerTools(server, run2) {
8424
8710
  }, async ({ block: b, spec, contextToken }) => safe(run2, ["split", b, "--spec", JSON.stringify(spec), ...contextToken ? ["--context-token", contextToken] : []]));
8425
8711
  server.registerTool("boxglow_connect", { description: t("\u7DDA\u3092\u3064\u306A\u3050: <\u984C\u540D.\u51FA\u529B\u540D> \u304B\u3089 <\u984C\u540D> \u3078 (\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044\u3002\u51FA\u529B\u540D\u3068\u540C\u3058\u540D\u524D\u306E\u5165\u529B\u304C\u4F5C\u3089\u308C\u308B\u3002<\u984C\u540D.\u5165\u529B\u540D> \u3067\u65E2\u5B58\u306E\u5165\u529B\u3092\u6307\u5B9A\u3057\u3066\u3082\u3088\u3044\u3002\u89AA\u306E\u5165\u529B\u306F project.\u5165\u529B\u540D\u3001\u89AA\u306E\u51FA\u529B\u3078\u306F \u984C\u540D.\u51FA\u529B\u540D -> project)"), inputSchema: { from: z2.string(), to: z2.string() } }, async ({ from, to }) => safe(run2, ["connect", from, to]));
8426
8712
  server.registerTool("boxglow_disconnect", { description: t("\u7DDA\u3092\u5916\u3059"), inputSchema: { from: z2.string(), to: z2.string() } }, async ({ from, to }) => safe(run2, ["disconnect", from, to]));
8427
- server.registerTool("boxglow_port", { description: t("\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u529B / \u51FA\u529B\u3092\u8DB3\u3059\u3001\u540D\u524D\u3092\u5909\u3048\u308B\u3001\u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269 (expect) \u3068\u62C5\u5F53 (self) \u3092\u6C7A\u3081\u308B\u3002anyOf \u306E\u5165\u529B\u306F\u5408\u6D41 (\u3069\u308C\u304B 1 \u3064\u304C\u5C4A\u3051\u3070\u3088\u3044) \u306B\u3059\u308B"), inputSchema: { block: block2, in: z2.array(z2.string()).optional(), out: z2.array(z2.string()).optional(), policy: z2.array(z2.string()).optional().describe(t("\u65B9\u91DD\u3068\u3057\u3066\u914D\u308B\u51FA\u529B\u306E\u540D\u524D (\u7DDA\u3092\u5F15\u304B\u305A\u306B\u7BC4\u56F2\u306E\u7BB1\u3059\u3079\u3066\u306B\u5C4A\u304F\u3002\u6280\u8853\u9078\u5B9A\u306A\u3069\u5168\u4F53\u306B\u52B9\u304F\u6C7A\u5B9A)")), policyScope: z2.string().optional().describe(t("\u65B9\u91DD\u306E\u7BC4\u56F2: all = \u8A08\u753B\u5168\u4F53\u3001<block> = \u305D\u306E\u7BB1\u306E\u4E2D\u3001\u7701\u7565 = \u540C\u3058\u89AA\u306E\u4E2D")), advisory: z2.boolean().optional().describe(t("\u65B9\u91DD\u3092\u53C2\u8003\u306B\u3059\u308B (\u6C7A\u307E\u3063\u3066\u3044\u306A\u304F\u3066\u3082\u7740\u624B\u3092\u5F85\u305F\u305B\u306A\u3044)")), noPolicy: z2.array(z2.string()).optional().describe(t("\u65B9\u91DD\u3092\u3084\u3081\u308B\u51FA\u529B\u306E\u540D\u524D")), skipPolicy: z2.array(z2.string()).optional().describe(t("\u3053\u306E\u7BB1\u3067\u306F\u53D7\u3051\u53D6\u3089\u306A\u3044\u65B9\u91DD (<\u7BB1>.<\u51FA\u529B\u540D>)")), remove: z2.array(z2.string()).optional().describe(t("\u6D88\u3059\u30DD\u30FC\u30C8\u306E\u540D\u524D (\u5165\u529B\u3092\u6D88\u3059\u3068\u3001\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B\u3002\u540C\u540D\u304C\u4E21\u65B9\u306B\u3042\u308C\u3070 in:<\u540D\u524D> / out:<\u540D\u524D>)")), expect: z2.array(z2.string()).optional().describe(t('\u4E88\u5B9A\u6210\u679C\u7269: "<\u51FA\u529B\u540D>=<kind>:<hint>" (kind \u306F file / dir / url / doc / note / decision / result\u3001hint \u306F\u30D1\u30B9\u306E\u898B\u5F53\u3084\u984C\u540D)')), self: z2.array(z2.string()).optional().describe(t("\u5B50\u306B\u4EFB\u305B\u305A\u3001\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u306E\u540D\u524D (\u7D71\u5408\u30FB\u691C\u8A3C\u306A\u3069\u3002\u5B50\u3092\u6301\u3064\u30DC\u30C3\u30AF\u30B9\u3060\u3051)")), noSelf: z2.array(z2.string()).optional().describe(t("\u81EA\u8EAB\u304C\u4F5C\u308B\u5370\u3092\u5916\u3059\u51FA\u529B\u306E\u540D\u524D")), rename: z2.string().optional().describe(t("\u65E7=\u65B0")), anyOf: z2.array(z2.string()).optional().describe(t("\u5408\u6D41\u306B\u3059\u308B\u5165\u529B\u306E\u540D\u524D (\u5206\u304B\u308C\u305F\u9053\u304C\u307E\u3068\u307E\u308B\u3068\u3053\u308D)")), allOf: z2.array(z2.string()).optional().describe(t("\u901A\u5E38 (\u3059\u3079\u3066\u8981\u308B) \u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D")), optional: z2.array(z2.string()).optional().describe(t("\u4EFB\u610F (\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B) \u306B\u3059\u308B\u5165\u529B\u306E\u540D\u524D")), required: z2.array(z2.string()).optional().describe(t("\u5FC5\u9808\u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D")), describe: z2.array(z2.string()).optional().describe(t('\u5165\u51FA\u529B\u306E\u8AAC\u660E: "<\u540D\u524D>=<\u8AAC\u660E>" (\u540C\u540D\u304C\u4E21\u65B9\u306B\u3042\u308C\u3070 in:<\u540D\u524D> / out:<\u540D\u524D>)')) } }, async (a) => {
8713
+ server.registerTool("boxglow_port", { description: t("\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u529B / \u51FA\u529B\u3092\u8DB3\u3059\u3001\u540D\u524D\u3092\u5909\u3048\u308B\u3001\u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269 (expect) \u3068\u62C5\u5F53 (self) \u3092\u6C7A\u3081\u308B\u3002anyOf \u306E\u5165\u529B\u306F\u5408\u6D41 (\u3069\u308C\u304B 1 \u3064\u304C\u5C4A\u3051\u3070\u3088\u3044) \u306B\u3059\u308B"), inputSchema: { block: block2, in: z2.array(z2.string()).optional(), out: z2.array(z2.string()).optional(), policy: z2.array(z2.string()).optional().describe(t("\u65B9\u91DD\u3068\u3057\u3066\u914D\u308B\u51FA\u529B\u306E\u540D\u524D (\u7DDA\u3092\u5F15\u304B\u305A\u306B\u7BC4\u56F2\u306E\u7BB1\u3059\u3079\u3066\u306B\u5C4A\u304F\u3002\u6280\u8853\u9078\u5B9A\u306A\u3069\u5168\u4F53\u306B\u52B9\u304F\u6C7A\u5B9A)")), policyScope: z2.string().optional().describe(t("\u65B9\u91DD\u306E\u7BC4\u56F2: all = \u8A08\u753B\u5168\u4F53\u3001<block> = \u305D\u306E\u7BB1\u306E\u4E2D\u3001\u7701\u7565 = \u540C\u3058\u89AA\u306E\u4E2D")), advisory: z2.boolean().optional().describe(t("\u65B9\u91DD\u3092\u53C2\u8003\u306B\u3059\u308B (\u6C7A\u307E\u3063\u3066\u3044\u306A\u304F\u3066\u3082\u7740\u624B\u3092\u5F85\u305F\u305B\u306A\u3044)")), noPolicy: z2.array(z2.string()).optional().describe(t("\u65B9\u91DD\u3092\u3084\u3081\u308B\u51FA\u529B\u306E\u540D\u524D")), skipPolicy: z2.array(z2.string()).optional().describe(t("\u3053\u306E\u7BB1\u3067\u306F\u53D7\u3051\u53D6\u3089\u306A\u3044\u65B9\u91DD (<\u7BB1>.<\u51FA\u529B\u540D>)")), remove: z2.array(z2.string()).optional().describe(t("\u6D88\u3059\u30DD\u30FC\u30C8\u306E\u540D\u524D (\u5165\u529B\u3092\u6D88\u3059\u3068\u3001\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B\u3002\u540C\u540D\u304C\u4E21\u65B9\u306B\u3042\u308C\u3070 in:<\u540D\u524D> / out:<\u540D\u524D>)")), expect: z2.array(z2.string()).optional().describe(t('\u4E88\u5B9A\u6210\u679C\u7269: "<\u51FA\u529B\u540D>=<kind>:<hint>" (kind \u306F file / dir / url / doc / note / decision / result\u3001hint \u306F\u30D1\u30B9\u306E\u898B\u5F53\u3084\u984C\u540D)')), self: z2.array(z2.string()).optional().describe(t("\u5B50\u306B\u4EFB\u305B\u305A\u3001\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u306E\u540D\u524D (\u7D71\u5408\u30FB\u691C\u8A3C\u306A\u3069\u3002\u5B50\u3092\u6301\u3064\u30DC\u30C3\u30AF\u30B9\u3060\u3051)")), noSelf: z2.array(z2.string()).optional().describe(t("\u81EA\u8EAB\u304C\u4F5C\u308B\u5370\u3092\u5916\u3059\u51FA\u529B\u306E\u540D\u524D")), rename: z2.string().optional().describe(t("\u65E7=\u65B0")), anyOf: z2.array(z2.string()).optional().describe(t("\u5408\u6D41\u306B\u3059\u308B\u5165\u529B\u306E\u540D\u524D (\u5206\u304B\u308C\u305F\u9053\u304C\u307E\u3068\u307E\u308B\u3068\u3053\u308D)")), allOf: z2.array(z2.string()).optional().describe(t("\u901A\u5E38 (\u3059\u3079\u3066\u8981\u308B) \u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D")), optional: z2.array(z2.string()).optional().describe(t("\u4EFB\u610F (\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B) \u306B\u3059\u308B\u5165\u529B\u306E\u540D\u524D")), required: z2.array(z2.string()).optional().describe(t("\u5FC5\u9808\u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D")), describe: z2.array(z2.string()).optional().describe(t('\u5165\u51FA\u529B\u306E\u8AAC\u660E: "<\u540D\u524D>=<\u8AAC\u660E>" (\u540C\u540D\u304C\u4E21\u65B9\u306B\u3042\u308C\u3070 in:<\u540D\u524D> / out:<\u540D\u524D>)')), acceptDraft: z2.array(z2.string()).optional().describe(t("\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u3067\u3082\u7740\u624B\u3057\u3066\u3088\u3044\u5165\u529B\u306E\u540D\u524D")), noAcceptDraft: z2.array(z2.string()).optional().describe(t("\u78BA\u5B9A\u3057\u305F\u8CC7\u6599\u3092\u5F85\u3064 (\u65E2\u5B9A) \u306B\u623B\u3059\u5165\u529B\u306E\u540D\u524D")) } }, async (a) => {
8428
8714
  const argv = ["port", a.block];
8429
8715
  opt(argv, "in", a.in);
8430
8716
  opt(argv, "out", a.out);
@@ -8443,6 +8729,8 @@ function registerTools(server, run2) {
8443
8729
  opt(argv, "optional", a.optional);
8444
8730
  opt(argv, "required", a.required);
8445
8731
  opt(argv, "describe", a.describe);
8732
+ opt(argv, "accept-draft", a.acceptDraft);
8733
+ opt(argv, "no-accept-draft", a.noAcceptDraft);
8446
8734
  return safe(run2, argv);
8447
8735
  });
8448
8736
  server.registerTool("boxglow_branch", {
@@ -8511,8 +8799,9 @@ function registerTools(server, run2) {
8511
8799
  opt(argv, "context-token", a.contextToken);
8512
8800
  return safe(run2, argv);
8513
8801
  });
8514
- server.registerTool("boxglow_answer", { description: t("\u5224\u65AD\u306B\u7B54\u3048\u308B (\u4EBA\u304C\u30C1\u30E3\u30C3\u30C8\u3067\u7B54\u3048\u305F\u3089 by=human \u3067\u8A18\u9332)"), inputSchema: { block: block2, contextToken: z2.string().optional(), answer: z2.string(), by: z2.string().optional().describe(t("human / claude-code \u306A\u3069")) } }, async (a) => {
8802
+ server.registerTool("boxglow_answer", { description: t("\u5224\u65AD\u306B\u7B54\u3048\u308B (\u4EBA\u304C\u30C1\u30E3\u30C3\u30C8\u3067\u7B54\u3048\u305F\u3089 by=human \u3067\u8A18\u9332)"), inputSchema: { block: block2, contextToken: z2.string().optional(), answer: z2.string(), id: z2.string().optional().describe(t("\u5224\u65AD\u306E id (\u7701\u304F\u3068\u6700\u65B0\u306E\u672A\u56DE\u7B54\u3002\u7B54\u3048\u6E08\u307F\u306E id \u3092\u6307\u3059\u3068\u7B54\u3048\u3092\u76F4\u3059)")), by: z2.string().optional().describe(t("human / claude-code \u306A\u3069")) } }, async (a) => {
8515
8803
  const argv = ["answer", a.block, a.answer];
8804
+ opt(argv, "id", a.id);
8516
8805
  opt(argv, "by", a.by);
8517
8806
  opt(argv, "context-token", a.contextToken);
8518
8807
  return safe(run2, argv);
@@ -8536,11 +8825,17 @@ function registerTools(server, run2) {
8536
8825
  opt(argv, "context-token", contextToken);
8537
8826
  return safe(run2, argv);
8538
8827
  });
8539
- server.registerTool("boxglow_set", { description: t("\u30DC\u30C3\u30AF\u30B9\u306E\u5C5E\u6027\u3092\u5909\u3048\u308B (\u984C\u540D\u30FB\u30E1\u30E2\u30FB\u30AB\u30C6\u30B4\u30EA\u30FB\u671F\u65E5\u30FB\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u8AB2\u984C URL)"), inputSchema: { block: block2, contextToken: z2.string().optional(), title: z2.string().optional(), note: z2.string().optional(), category: z2.string().optional(), start: z2.string().optional().describe("YYYY-MM-DD"), due: z2.string().optional().describe("YYYY-MM-DD"), repo: z2.string().optional(), issue: z2.string().optional(), splitBy: z2.string().optional().describe(t("\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9 (\u4E00\u8A9E: \u5DE5\u7A0B / \u6210\u679C\u7269 / \u6A5F\u80FD \u306A\u3069\u3002none \u3067\u6D88\u3059)")) } }, async (a) => {
8828
+ server.registerTool("boxglow_set", { description: t("\u30DC\u30C3\u30AF\u30B9\u306E\u5C5E\u6027\u3092\u5909\u3048\u308B (\u984C\u540D\u30FB\u30E1\u30E2\u30FB\u30AB\u30C6\u30B4\u30EA\u30FB\u671F\u65E5\u30FB\u30EA\u30DD\u30B8\u30C8\u30EA\u30FB\u8AB2\u984C URL)"), inputSchema: { block: block2, contextToken: z2.string().optional(), title: z2.string().optional(), note: z2.string().optional(), category: z2.string().optional(), start: z2.string().optional().describe("YYYY-MM-DD"), due: z2.string().optional().describe("YYYY-MM-DD"), repo: z2.string().optional(), issue: z2.string().optional(), splitBy: z2.string().optional().describe(t("\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9 (\u4E00\u8A9E: \u5DE5\u7A0B / \u6210\u679C\u7269 / \u6A5F\u80FD \u306A\u3069\u3002none \u3067\u6D88\u3059)")), assignee: z2.array(z2.string()).optional().describe(t("\u62C5\u5F53\u3092\u7F6E\u304D\u63DB\u3048\u308B (\u30E1\u30F3\u30D0\u30FC\u306E\u540D\u524D\u3002\u7A7A\u306E\u914D\u5217\u3067\u62C5\u5F53\u306A\u3057\u3002\u3044\u306A\u3044\u540D\u524D\u306F\u30E1\u30F3\u30D0\u30FC\u306B\u8DB3\u3059)")), addAssignee: z2.array(z2.string()).optional().describe(t("\u62C5\u5F53\u306B\u8DB3\u3059\u540D\u524D")), removeAssignee: z2.array(z2.string()).optional().describe(t("\u62C5\u5F53\u304B\u3089\u5916\u3059\u540D\u524D")) } }, async (a) => {
8540
8829
  const argv = ["set", a.block];
8541
8830
  for (const k of ["title", "note", "category", "start", "due", "repo", "issue"]) opt(argv, k, a[k]);
8542
8831
  opt(argv, "split-by", a.splitBy);
8543
8832
  opt(argv, "context-token", a.contextToken);
8833
+ if (a.assignee) {
8834
+ if (a.assignee.length === 0) argv.push("--assignee", "none");
8835
+ else opt(argv, "assignee", a.assignee.join(","));
8836
+ }
8837
+ opt(argv, "add-assignee", a.addAssignee);
8838
+ opt(argv, "remove-assignee", a.removeAssignee);
8544
8839
  return safe(run2, argv);
8545
8840
  });
8546
8841
  server.registerTool("boxglow_export", { description: t("\u8A08\u753B\u3092 Markdown \u306B\u66F8\u304D\u51FA\u3059 (docs/ROADMAP.md \u306A\u3069)"), inputSchema: { out: z2.string().optional() } }, async ({ out: o }) => {
@@ -8564,8 +8859,10 @@ function registerTools(server, run2) {
8564
8859
  });
8565
8860
  server.registerTool("boxglow_lint", { description: t("\u8A08\u753B (\u307E\u305F\u306F\u30DC\u30C3\u30AF\u30B9\u306E\u914D\u4E0B) \u306E\u691C\u67FB: \u5FC5\u305A\u76F4\u3059 (\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6\u306E\u6B20\u843D\u3001\u89AA\u51FA\u529B\u306E\u62C5\u5F53\u306E\u672A\u5B9A\u30FB\u91CD\u8907\u3001\u6392\u4ED6\u306E\u9053\u306E\u4E21\u65B9\u3092\u5FC5\u9808) \u3068\u898B\u76F4\u3057\u5019\u88DC (\u5B50\u304C 1 \u500B\u3001\u3064\u306A\u304C\u3089\u306A\u3044\u51FA\u529B\u3001\u5F62\u3060\u3051\u306E\u8A18\u5165\u3001\u9053\u306E\u5148\u304C\u7121\u3044\u5206\u5C90\u3001\u5165\u529B 1 \u672C\u306E\u5408\u6D41\u3001\u5144\u5F1F\u306E\u540C\u3058\u4E88\u5B9A\u6210\u679C\u7269) \u3092\u5206\u3051\u3066\u8FD4\u3059"), inputSchema: { block: z2.string().optional().describe(t("\u7701\u7565\u3059\u308B\u3068\u8A08\u753B\u5168\u4F53")) }, annotations: { readOnlyHint: true } }, async ({ block: b }) => safe(run2, ["lint", ...b ? [b] : [], "--json"]));
8566
8861
  server.registerTool("boxglow_validate", { description: t("\u8A08\u753B\u306E\u554F\u984C (\u3064\u306A\u304C\u3063\u3066\u3044\u306A\u3044\u5165\u51FA\u529B\u306A\u3069) \u3092\u691C\u67FB\u3059\u308B"), inputSchema: {}, annotations: { readOnlyHint: true } }, async () => safe(run2, ["validate"]));
8567
- server.registerTool("boxglow_artifact", { description: t('\u6210\u679C\u7269\u3060\u3051\u4ED8\u3051\u308B (\u5B8C\u4E86\u306B\u306F\u3057\u306A\u3044)\u3002block \u306B "inputs" \u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B (Inputs) \u306B\u8CC7\u6599\u3092\u4ED8\u3051\u308B (input \u3067\u5165\u529B\u540D\u3092\u9078\u3076)\u3002\u5165\u529B\u306B\u8CC7\u6599\u304C\u7121\u3044\u3068\u3001\u305D\u308C\u3092\u4F7F\u3046\u7BB1\u306F\u7740\u624B\u3067\u304D\u306A\u3044'), inputSchema: { block: block2, path: z2.string().describe(t("\u30EA\u30DD\u30B8\u30C8\u30EA\u5185\u306E\u30D1\u30B9 \u307E\u305F\u306F URL")), title: z2.string().optional(), output: z2.string().optional().describe(t("\u4ED8\u3051\u308B\u51FA\u529B\u306E\u540D\u524D (\u7BB1\u306E\u3068\u304D)")), input: z2.string().optional().describe(t("\u4ED8\u3051\u308B\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306E\u540D\u524D (block \u304C inputs \u306E\u3068\u304D)")), remove: z2.boolean().optional().describe(t("true \u306A\u3089 path \u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599\u3092\u5916\u3059 (\u984C\u540D\u304B\u30D1\u30B9\u304B URL \u3067\u63A2\u3059)")), contextToken: z2.string().optional() } }, async (a) => {
8568
- const argv = a.remove ? ["artifact", a.block, "--remove", a.path] : ["artifact", a.block, a.path];
8862
+ server.registerTool("boxglow_artifact", { description: t('\u6210\u679C\u7269\u3060\u3051\u4ED8\u3051\u308B (\u5B8C\u4E86\u306B\u306F\u3057\u306A\u3044)\u3002block \u306B "inputs" \u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B (Inputs) \u306B\u8CC7\u6599\u3092\u4ED8\u3051\u308B (input \u3067\u5165\u529B\u540D\u3092\u9078\u3076)\u3002\u5165\u529B\u306B\u8CC7\u6599\u304C\u7121\u3044\u3068\u3001\u305D\u308C\u3092\u4F7F\u3046\u7BB1\u306F\u7740\u624B\u3067\u304D\u306A\u3044'), inputSchema: { block: block2, path: z2.string().describe(t("\u30EA\u30DD\u30B8\u30C8\u30EA\u5185\u306E\u30D1\u30B9 \u307E\u305F\u306F URL")), title: z2.string().optional(), output: z2.string().optional().describe(t("\u4ED8\u3051\u308B\u51FA\u529B\u306E\u540D\u524D (\u7BB1\u306E\u3068\u304D)")), input: z2.string().optional().describe(t("\u4ED8\u3051\u308B\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306E\u540D\u524D (block \u304C inputs \u306E\u3068\u304D)")), remove: z2.boolean().optional().describe(t("true \u306A\u3089 path \u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599\u3092\u5916\u3059 (\u984C\u540D\u304B\u30D1\u30B9\u304B URL \u3067\u63A2\u3059)")), draft: z2.boolean().optional().describe(t("\u4F5C\u6210\u4E2D\u3068\u3057\u3066\u4ED8\u3051\u308B (\u4F7F\u3046\u5074\u306E\u7BB1\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u4F7F\u3046\u5074\u306E\u5165\u529B\u304C acceptDraft \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002\u5B8C\u4E86\u3067\u78BA\u5B9A\u306B\u306A\u308B)")), final: z2.boolean().optional().describe(t("true \u306A\u3089 path \u306E\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u3092\u78BA\u5B9A\u306B\u3059\u308B (all \u3067\u3059\u3079\u3066)")), link: z2.boolean().optional().describe(t("\u51FA\u529B\u3067\u306F\u306A\u304F\u3001\u7BB1\u306E\u53C2\u8003\u8CC7\u6599 (Links) \u306B\u4ED8\u3051\u308B (\u4F7F\u3046\u5074\u306B\u306F\u6E21\u3089\u306A\u3044)")), contextToken: z2.string().optional() } }, async (a) => {
8863
+ const argv = a.remove ? ["artifact", a.block, "--remove", a.path] : a.final ? ["artifact", a.block, "--final", a.path] : ["artifact", a.block, a.path];
8864
+ if (a.draft) argv.push("--draft");
8865
+ if (a.link) argv.push("--link");
8569
8866
  opt(argv, "title", a.title);
8570
8867
  opt(argv, "output", a.output);
8571
8868
  opt(argv, "input", a.input);
@@ -12197,7 +12494,16 @@ function agentContext(p, blockId) {
12197
12494
  sentBack: sentBackTo(p, id).map((x) => ({ from: x.from.title, by: x.record.by, at: x.record.at, note: x.record.note })),
12198
12495
  decisions: b.decisions.map((d) => ({ id: d.id, question: d.question, context: d.context, options: d.options, answer: d.answer, history: d.history })),
12199
12496
  handoff: p.handoffs?.[id],
12200
- ports: Object.values(p.ports).filter((port2) => port2.blockId === id).sort((a, b2) => a.id.localeCompare(b2.id)).map((port2) => ({ id: port2.id, direction: port2.direction, name: port2.name, description: port2.description, required: port2.required, artifacts: port2.artifacts }))
12497
+ ports: Object.values(p.ports).filter((port2) => port2.blockId === id).sort((a, b2) => a.id.localeCompare(b2.id)).map((port2) => ({
12498
+ id: port2.id,
12499
+ direction: port2.direction,
12500
+ name: port2.name,
12501
+ description: port2.description,
12502
+ required: port2.required,
12503
+ artifacts: port2.artifacts,
12504
+ ...port2.acceptDraft ? { acceptDraft: true } : {},
12505
+ ...port2.direction === "in" && hasDraftOnly(p, port2.id) ? { draftOnly: true } : {}
12506
+ }))
12201
12507
  };
12202
12508
  }),
12203
12509
  bundledOutputs: [...bundledOutputs.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([, v]) => v),
@@ -12266,6 +12572,8 @@ function briefContext(p, blockId) {
12266
12572
  artifacts: port2.artifacts,
12267
12573
  sources,
12268
12574
  ready,
12575
+ ...hasDraftOnly(p, port2.id) ? { draftOnly: true } : {},
12576
+ ...port2.acceptDraft ? { acceptDraft: true } : {},
12269
12577
  missing: !!port2.required && !ready && !skippedPath,
12270
12578
  ...skippedPath ? { skippedPath: true } : {}
12271
12579
  };
@@ -13478,16 +13786,16 @@ import { existsSync as existsSync14, readFileSync as readFileSync14, writeFileSy
13478
13786
  import { execFileSync as execFileSync3 } from "node:child_process";
13479
13787
 
13480
13788
  // docs/AGENTS_SNIPPET.md
13481
- var AGENTS_SNIPPET_default = '# Boxglow \u3092\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u4F7F\u308F\u305B\u308B\u6307\u793A\u66F8 (AGENTS.md / CLAUDE.md \u306B\u8CBC\u308B)\n\n\u4E0B\u306E\u300C---\u300D\u306E\u9593\u3092\u305D\u306E\u307E\u307E\u30EA\u30DD\u30B8\u30C8\u30EA\u306E AGENTS.md (Codex) \u3084 CLAUDE.md (Claude Code) \u306B\u8CBC\u308B\u3002\nboxglow.json \u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u76F4\u4E0B\u306B\u7F6E\u304F (`npx boxglow init --name "<\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D>"`)\u3002\n\n---\n\n## Boxglow (\u8A08\u753B\u3068\u9032\u6357\u306E\u5171\u6709)\n\n\u3053\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u8A08\u753B\u3068\u9032\u6357\u306F `boxglow.json` \u304C\u6B63\u672C\u3002\u4EBA\u9593\u306F Boxglow \u306E\u753B\u9762\u3067\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u898B\u3066\u3044\u308B\u3002\n\u30D5\u30A1\u30A4\u30EB\u3092\u76F4\u63A5\u7DE8\u96C6\u305B\u305A\u3001\u5FC5\u305A `npx boxglow` \u30B3\u30DE\u30F3\u30C9\u3067\u66F4\u65B0\u3059\u308B\u3053\u3068 (\u7D50\u7DDA\u30EB\u30FC\u30EB\u3068\u5C65\u6B74\u304C\u4FDD\u305F\u308C\u308B)\u3002\n\n\u30D6\u30ED\u30C3\u30AF = \u300C\u5165\u529B\u304B\u3089\u51FA\u529B (\u6210\u679C\u7269) \u3092\u4F5C\u308B\u30BF\u30B9\u30AF\u300D\u3002\u51FA\u529B\u306E\u6210\u679C\u7269\u304C\u78BA\u5B9A\u3057\u305F\u3089\u5B8C\u4E86 (WhiteBox)\u3002\n\u72B6\u614B: BlackBox (\u51FA\u529B\u3060\u3051\u6C7A\u3081\u305F) \u2192 GrayBox (\u7740\u624B\u4E2D) \u2192 WhiteBox (\u5B8C\u4E86)\u3002\n\n### \u4F5C\u696D\u306E\u305F\u3073\u306B\u5B88\u308B\u3053\u3068\n\n1. **\u6700\u521D\u306B\u8AAD\u3080**: `npx boxglow resume` (\u307E\u305F\u306F `npx boxglow status --brief`) \u3067\u3001\u4F5C\u696D\u4E2D\u30FB\u5224\u65AD\u5F85\u3061\u30FBAI \u672A\u78BA\u8A8D\u306E\u56DE\u7B54\u30FB\u6B21\u306E\u5019\u88DC\u30FB\u672A\u5B8C\u4E86\u306E\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u524D\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u7D9A\u304D\u306F\u3001\u3053\u3053\u306B\u51FA\u308B\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u304B\u3089\u518D\u958B\u3059\u308B\u3002`npx boxglow show <block>` \u3067\u62C5\u5F53\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u51FA\u529B\u3092\u78BA\u8A8D\u3059\u308B\n2. **\u6E96\u5099\u3092\u78BA\u8A8D**: \u53D6\u308A\u304B\u304B\u308B\u524D\u306B `npx boxglow context <block>` \u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E `readiness` \u304C\u6E96\u5099\u306E\u72B6\u614B: `state` \u304C `ready` \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002`unprepared` (\u8981\u5177\u4F53\u5316) \u306A\u3089 `unprepared` \u306E\u7406\u7531\u3068 `next` \u306E\u6B21\u306E\u4E00\u624B\u306B\u5F93\u3063\u3066\u5148\u306B\u5177\u4F53\u5316\u3059\u308B\u3002`waiting` \u306F\u5FC5\u9808\u306E\u5165\u529B\u304B\u5206\u5C90\u306E\u7B54\u3048\u3092\u5F85\u3063\u3066\u3044\u308B\n3. **\u53D7\u3051\u6301\u3061\u3001\u5177\u4F53\u5316**: \u5177\u4F53\u5316\u3084\u5206\u89E3\u306E\u524D\u306B `npx boxglow claim <block>` \u3067\u53D7\u3051\u6301\u3061\u3060\u3051\u3092\u53D6\u308B (\u5B9F\u884C\u4E2D\u306B\u306F\u306A\u3089\u306A\u3044\u3002\u53D7\u3051\u6301\u3061\u5236\u5FA1\u304C\u7121\u52B9\u306A\u8A08\u753B\u3067\u306F\u300C\u53D6\u5F97\u4E0D\u8981\u300D\u3067\u6B63\u5E38\u7D42\u4E86\u3059\u308B)\u3002\u305D\u306E\u3046\u3048\u3067\u4E0D\u8DB3\u3092\u57CB\u3081\u308B:\n - \u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269: `npx boxglow port <block> --expect "<\u51FA\u529B\u540D>=file:src/x.ts"` (kind \u306F file / dir / url / doc / note / decision / result\u3002hint \u306F\u30D1\u30B9\u306E\u898B\u5F53\u3084\u984C\u540D\u3002\u307E\u3060\u4F5C\u3063\u3066\u3044\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u3067\u3088\u3044)\n - \u5B8C\u4E86\u6761\u4EF6: `npx boxglow scope <block> --acceptance "<\u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6>"`\u3002\u51E6\u7406\u306E\u7BC4\u56F2\u306F `--goal`\u3002\u51FA\u529B\u3092\u4F5C\u308B\u3046\u3048\u3067\u5B88\u308B\u6761\u4EF6 (\u6027\u80FD\u30FB\u54C1\u8CEA\u30FB\u30B5\u30A4\u30BA\u30FB\u5BF8\u6CD5\u30FB\u6D88\u8CBB\u96FB\u529B\u306A\u3069) \u306F `--constraints`\n - 1 \u3064\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u51FA\u529B\u3092\u4F5C\u308B\u898B\u901A\u3057\u304C\u7ACB\u305F\u306A\u3044\u306A\u3089 `npx boxglow split <block> --spec \'<JSON>\'` \u3067\u4E2D\u306B\u5C0F\u3055\u306A\u30DC\u30C3\u30AF\u30B9\u3092\u7F6E\u304F\u3002\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051 expect / acceptance \u3092\u66F8\u304D\u3001\u5148\u306E\u5B50\u306F\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u3067\u3088\u3044 (\u8981\u5177\u4F53\u5316\u3068\u3057\u3066\u6B8B\u308B)\u3002\u5165\u529B\u306F\u4E0D\u660E\u306A\u3089\u7701\u7565\u3057\u3066\u3088\u3044 (\u81EA\u52D5\u3067\u4E0A\u306E\u968E\u5C64\u306E\u5165\u529B\u306B\u306A\u308B)\n - \u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5206\u304B\u3089\u306A\u3044\u3068\u304D\u306F\u3001\u67B6\u7A7A\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304B\u305A\u300C\u5BFE\u8C61\u3092\u7279\u5B9A\u3059\u308B\u8ABF\u67FB\u300D\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u51FA\u529B `note` \u3067\u4F5C\u3063\u3066\u59CB\u3081\u308B\n4. **\u7740\u624B\u3092\u8A18\u9332**: \u6E96\u5099\u304C\u3067\u304D\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u307F\u76F4\u3057\u3066\u304B\u3089 `npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>"`\u3002\u540C\u6642\u306B\u9032\u3081\u308B\u30DC\u30C3\u30AF\u30B9\u306F 1\u301C2 \u500B\u307E\u3067\u3002\n start \u3057\u305F\u30DC\u30C3\u30AF\u30B9\u306B\u300C\u4ECA\u3053\u3053\u300D(\u672C\u5F53\u306B\u3044\u307E\u4F5C\u696D\u3057\u3066\u3044\u308B\u30DC\u30C3\u30AF\u30B9\u3002\u8907\u6570\u306E AI \u3084\u4EBA\u304C\u3044\u308C\u3070\u3001\u3044\u304F\u3064\u3067\u3082) \u304C\u4ED8\u304D\u3001\u753B\u9762\u3067\u592A\u3044\u67A0\u3068 NOW \u306E\u672D\u304C\u4ED8\u304F\u3002\u5225\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u3082\u4ED8\u3051\u308B\u3068\u304D\u306F `npx boxglow now <block>` (\u5916\u3059\u3068\u304D\u306F `--off`\u3001\u5168\u90E8\u6D88\u3059\u3068\u304D\u306F `now none`)\u3002done / leave \u3067\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5206\u304C\u5916\u308C\u308B\u3002\u4EBA\u3082\u753B\u9762\u306E\u72B6\u614B\u30BF\u30D6\u306E NOW \u3067\u4ED8\u3051\u5916\u3057\u3059\u308B\n \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u304C\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001\u51FA\u529B\u306E `contextToken` (\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3) \u3092\u4ED8\u3051\u308B:\n `npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` (\u4E0B\u306E\u300C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\u300D\u3092\u53C2\u7167)\n \u8981\u5177\u4F53\u5316\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u306E start \u306F\u65E2\u5B9A\u3067\u306F\u8B66\u544A (\u7406\u7531\u3068\u6B21\u306E\u4E00\u624B\u304C\u51FA\u308B)\u3002`policy --unprepared reject` \u306E\u8A08\u753B\u3067\u306F\u958B\u59CB\u3067\u304D\u306A\u3044 (`--reason` \u3067\u306F\u901A\u308C\u306A\u3044\u3002\u4EBA\u306E\u64CD\u4F5C\u306F\u901A\u308B)\u3002\u51FA\u529B\u3092\u5B50\u306B\u4EFB\u305B\u304D\u308A\u306E\u89AA\u3082\u5B9F\u884C\u3059\u308B\u3082\u306E\u304C\u7121\u3044\u306E\u3067\u3001\u5B50\u3092 start \u3059\u308B\n5. **\u5B8C\u4E86\u3092\u8A18\u9332**: \u51FA\u529B\u306E\u6210\u679C\u7269\u304C\u3067\u304D\u305F\u3089 `npx boxglow done <block> --artifact "<\u540D\u524D>=<\u30EA\u30DD\u30B8\u30C8\u30EA\u5185\u306E\u30D1\u30B9>" --checked "<\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>"`\u3002\u691C\u67FB\u7D50\u679C\u306F\u6C7A\u307E\u3063\u305F 3 \u3064\u3067\u6B8B\u3059: `--checked` (\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C\u3002\u4F8B: "vitest 53 \u4EF6\u6210\u529F; e2e home 34/34")\u3001`--not-checked` (\u8A66\u3057\u3066\u3044\u306A\u3044\u3053\u3068)\u3001`--limits` (\u6B8B\u308B\u5236\u9650\u30FB\u6CE8\u610F)\u3002\u30B3\u30FC\u30C9\u4EE5\u5916\u306E\u6210\u679C\u7269 (\u6587\u66F8\u306A\u3069) \u306F\u300C\u78BA\u8A8D\u3057\u305F\u3053\u3068\u300D\u3092 `--checked` \u306B\u66F8\u304F\u3002\u7BB1\u306B\u6B8B\u308A\u3001context \u3068 show \u306B\u51FA\u308B\u3002\n guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B (\u76F4\u524D\u306E\u81EA\u5206\u306E\u64CD\u4F5C\u306E\u51FA\u529B\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u3066\u3044\u308C\u3070\u3001\u305D\u308C\u3092\u4F7F\u3046)\u3002\n HEAD \u306B\u30B3\u30DF\u30C3\u30C8\u6E08\u307F\u3067\u5185\u5BB9\u304C\u4E00\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u306F\u300C\u30B3\u30DF\u30C3\u30C8 + \u30D1\u30B9 + \u4E2D\u8EAB\u306E\u30CF\u30C3\u30B7\u30E5\u300D\u3067\u8A18\u9332\u3055\u308C\u308B (\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306F\u3057\u306A\u3044)\u3002\u672A\u30B3\u30DF\u30C3\u30C8\u30FB\u672A\u8FFD\u8DE1\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u30ED\u30FC\u30AB\u30EB\u53C2\u7167\u3068\u3057\u3066\u6B8B\u308A\u3001\u30B3\u30DF\u30C3\u30C8\u3057\u305F\u5F8C\u306E `npx boxglow check` \u3067 Git \u306E\u53C2\u7167\u306B\u88DC\u5B8C\u3055\u308C\u308B\u3002\u8A18\u9332\u306E\u305F\u3081\u3060\u3051\u306B\u30B3\u30DF\u30C3\u30C8\u3057\u306A\u3044\u3002\u5168\u968E\u5C64\u304C\u5FC5\u8981\u306A\u3089 `npx boxglow status` \u3092\u8AAD\u3080\u3002PR \u3084\u5916\u90E8\u8CC7\u6599\u306F URL \u3067\u3082\u3088\u3044\u3002\n \u6210\u679C\u7269\u3060\u3051\u5148\u306B\u4ED8\u3051\u308B\u306A\u3089 `npx boxglow artifact <block> <\u30D1\u30B9>`\u3002\u9032\u6357\u306E\u9014\u4E2D\u7D4C\u904E\u306F `npx boxglow set <block> --progress 60`\n6. **\u4EBA\u9593\u306E\u5224\u65AD\u304C\u8981\u308B**: `npx boxglow ask <block> "<\u8CEA\u554F>" --options "A|B"`\u3002\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u9032\u3081\u305A\u3001\u4ED6\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u79FB\u308B\u3002\u4EBA\u306E\u56DE\u7B54\u306F `status` \u306E\u300C\u56DE\u7B54\u3042\u308A\u300D\u306B\u51FA\u308B\u3002\u8AAD\u3093\u3060\u3089 `npx boxglow ack <block>` \u3067\u5F15\u304D\u53D6\u308B (\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E `start` / `done` / `set` \u306A\u3069\u3067\u3082\u81EA\u52D5\u3067\u5F15\u304D\u53D6\u3089\u308C\u308B)\u3002\u5F15\u304D\u53D6\u308B\u307E\u3067\u4EBA\u306E\u753B\u9762\u306B\u306F\u300CAI \u672A\u78BA\u8A8D\u300D\u3068\u3057\u3066\u6B8B\u308A\u3001\u4EBA\u304C\u7B54\u3048\u3092\u76F4\u305B\u308B\u3002\u56DE\u7B54\u306E\u4E2D\u306B\u554F\u3044\u8FD4\u3057\u304C\u3042\u308C\u3070\u3001`ask` \u3068 `answer --by <\u81EA\u5206>` \u3067\u81EA\u5206\u306E\u7B54\u3048\u3082\u8A18\u9332\u3059\u308B\n7. **\u8A70\u307E\u3063\u305F\u3089**: \u5165\u529B (\u524D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599) \u304C\u8DB3\u308A\u306A\u3044\u3053\u3068\u304C\u539F\u56E0\u306A\u3089\u3001\u8A70\u307E\u308A\u306B\u3057\u306A\u3044\u3002`npx boxglow show <block>` \u3067\u5165\u529B\u306E\u914D\u7DDA\u3092\u78BA\u304B\u3081\u3001\u8DB3\u308A\u306A\u3044\u3082\u306E\u3092\u4F5C\u308B\u30DC\u30C3\u30AF\u30B9\u304C\u7121\u3051\u308C\u3070 `npx boxglow add` \u3067\u5916 (\u4E0A\u6D41) \u306B\u4F5C\u308A\u3001`npx boxglow connect` \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u529B\u306B\u3064\u306A\u3050 (\u914D\u7DDA\u304C\u300C\u5F85\u3061\u300D\u306E\u8272\u3067\u6B8B\u308A\u3001\u4F55\u3092\u5F85\u3063\u3066\u3044\u308B\u304B\u304C\u56F3\u3067\u898B\u3048\u308B)\u3002\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u3082\u3089\u3048\u3070\u9032\u3081\u308B\u306A\u3089 `ask`\u3002\u305D\u308C\u4EE5\u5916\u306E\u3001\u8A08\u753B\u306E\u5916\u306B\u3042\u308B\u969C\u5BB3 (\u74B0\u5883\u304C\u52D5\u304B\u306A\u3044\u3001\u6A29\u9650\u3084\u30AD\u30FC\u304C\u7121\u3044\u3001\u5916\u90E8\u306E\u8FD4\u4E8B\u5F85\u3061\u3001\u539F\u56E0\u306E\u5206\u304B\u3089\u306A\u3044\u5931\u6557) \u3060\u3051\u3092 `npx boxglow blocked <block> --note "<\u56F0\u3063\u3066\u3044\u308B\u3053\u3068>"` \u3067\u8A18\u9332\u3059\u308B \u8A55\u4FA1\u3084\u691C\u67FB\u3067\u524D\u306E\u6210\u679C\u7269\u304C\u901A\u3089\u306A\u304B\u3063\u305F\u3068\u304D\u306F\u3001\u7DDA\u3067\u623B\u3055\u305A (\u5FAA\u74B0\u306B\u306A\u308B) `npx boxglow sendback <\u8A55\u4FA1\u306E\u7BB1> --to <\u4F5C\u308A\u76F4\u3059\u7BB1> --note "<\u7406\u7531>"` \u3067\u5DEE\u3057\u623B\u3059 (\u305D\u306E\u7BB1\u306F In Progress \u306B\u623B\u308A\u3001\u6210\u679C\u7269\u306F\u5DEE\u3057\u623B\u3057\u6E08\u307F\u3068\u3057\u3066\u6B8B\u308B\u3002\u7406\u7531\u306F context \u306B\u51FA\u308B)\u3002\n8. **\u6210\u679C\u7269\u306E\u78BA\u8A8D**: \u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u30FB\u6539\u540D\u3057\u305F\u3089 `npx boxglow check` \u3092\u5B9F\u884C\u3059\u308B (\u79FB\u52D5\u3092\u691C\u51FA\u3057\u3066\u30D1\u30B9\u3092\u4ED8\u3051\u66FF\u3048\u308B\u3002\u898B\u3064\u304B\u3089\u306A\u3051\u308C\u3070\u5370\u304C\u4ED8\u304F)\n9. **\u9032\u6357\u3084\u6C17\u3065\u304D\u3092\u6B8B\u3059**: `npx boxglow log <block> "<\u672C\u6587>"` \u3067\u3001\u65E5\u4ED8\u3068\u66F8\u304D\u624B\u3064\u304D\u306E\u4F5C\u696D\u8A18\u9332\u3092\u30DC\u30C3\u30AF\u30B9\u306B\u8DB3\u3059 (Markdown \u53EF\u3002\u4EBA\u306F\u753B\u9762\u306E\u300C\u8A18\u9332\u300D\u30BF\u30D6\u3067\u540C\u3058\u3082\u306E\u3092\u898B\u3066\u66F8\u304F)\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2 (checkpoint) \u306F 1 \u3064\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304C\u3001\u8A18\u9332\u306F\u7A4D\u307F\u4E0A\u304C\u308B\n10. **\u4E2D\u65AD\u30FB\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B**: \u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u7D42\u308F\u308A\u30FB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u5727\u7E2E\u30FB\u4ED6\u306E AI \u3084\u4EBA\u3078\u306E\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B\u3001`npx boxglow checkpoint <block> --note "\u5206\u304B\u3063\u305F\u3053\u3068; \u6B21\u306B\u3059\u308B\u3053\u3068; \u672A\u89E3\u6C7A\u306E\u3053\u3068"` \u3067\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u6B8B\u3059 (guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B)\u3002\u4F1A\u8A71\u306E\u5C65\u6B74\u304C\u6D88\u3048\u3066\u3082\u8A08\u753B\u306E\u4E2D\u306B\u6B8B\u308A\u3001\u6B21\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u304C `resume` \u3068 `context` \u3067\u8AAD\u3080\n11. **\u5831\u544A**: \u4F5C\u696D\u306E\u6700\u5F8C\u306B `npx boxglow status --brief` \u306E\u5185\u5BB9\u3092\u8981\u7D04\u3057\u3066\u5831\u544A\u3059\u308B\n\n### \u69CB\u9020\u306E\u7D04\u675F\n\n- **\u307E\u3060\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u306F\u5206\u5C90\u3067\u8868\u3059**: \u8A08\u753B\u3092\u4F5C\u308B\u6642\u70B9\u3067\u3001\u5224\u65AD\u6B21\u7B2C\u3067\u5F8C\u306E\u4F5C\u696D (\u9053) \u304C\u5909\u308F\u308B\u3068\u304D\u306F `npx boxglow branch "<\u984C\u540D>" --options "A|B" --question "<\u554F\u3044>" --context "<\u5224\u65AD\u6750\u6599>"` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u4F5C\u308B\u3002\u9078\u629E\u80A2\u3054\u3068\u306B\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u306E\u3067\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3059\u308B\u3002\u9053\u304C\u5F8C\u3067 1 \u3064\u306B\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B\u306F `npx boxglow join --title "<\u984C\u540D>"` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3092\u7F6E\u304D\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u5F8C\u306E\u51FA\u529B\u3092\u3053\u306E\u90E8\u54C1\u3078 `connect` \u3057\u3001\u90E8\u54C1\u306E\u51FA\u529B\u3092\u5148\u306E\u7BB1\u3078\u3064\u306A\u3050 (\u3069\u308C\u304B 1 \u3064\u306E\u9053\u304C\u5C4A\u3051\u3070\u5148\u3078\u9032\u3080)\u3002\u4EBA\u304C\u7B54\u3048\u308B\u3068\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u9053\u306E\u5148\u306F\u300C\u898B\u9001\u308A\u300D\u306B\u306A\u308A\u3001\u9032\u6357\u3068\u6B21\u306E\u5019\u88DC\u304B\u3089\u5916\u308C\u308B\u3002\u3059\u3067\u306B\u4F5C\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304C\u5B9F\u306F\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u3060\u3068\u5206\u304B\u3063\u305F\u3089\u3001`npx boxglow branch --box <block> --options "A|B" --question "<\u554F\u3044>"` \u3067\u5206\u5C90\u306B\u5909\u3048\u308B (\u4ECA\u306E\u51FA\u529B\u304C 1 \u3064\u76EE\u306E\u9078\u629E\u80A2\u306E\u9053\u306B\u306A\u308A\u3001\u7DDA\u306F\u6B8B\u308B)\u3002\u7B54\u3048\u304C\u51FA\u308B\u524D\u306E\u9053\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5206\u5C90\u5F85\u3061\u300D\u3067\u3001\u7740\u624B\u3059\u308B\u3068\u8B66\u544A\u3055\u308C\u308B (\u5148\u306B\u4E0B\u8ABF\u3079\u3059\u308B\u306A\u3069\u7406\u7531\u304C\u3042\u308C\u3070 `--reason` \u3067\u8A18\u9332\u3059\u308B)\n- \u6700\u4E0A\u4F4D\u306B\u306F\u300C\u5165\u529B\u30CE\u30FC\u30C9\u300D\u300C\u6700\u7D42\u6210\u679C\u7269\u30CE\u30FC\u30C9\u300D\u3068\u300C\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u300D\u3060\u3051\u304C\u3042\u308B\u3002\u30BF\u30B9\u30AF\u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u4E2D\u306B\u7F6E\u304F (`add` \u306E\u65E2\u5B9A\u306E\u89AA\u306F\u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9)\n- \u968E\u5C64\u306E\u6DF1\u3055\u306B\u5236\u9650\u306F\u306A\u3044\u3002`split` \u306F\u4F55\u6BB5\u3067\u3082\u4F7F\u3048\u308B\n- \u5225\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u3082\u4F7F\u3048\u305D\u3046\u306A\u30DC\u30C3\u30AF\u30B9 (\u4F8B: \u5165\u529B\u753B\u50CF\u306E\u30E2\u30CE\u30AF\u30ED\u5316) \u306F `npx boxglow export-block <block> --out <\u540D\u524D>.boxglow-block.json` \u3067\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u3057\u3001\n `npx boxglow import-block <path> --parent <block>` \u3067\u633F\u5165\u3059\u308B\u3002\u30EA\u30DD\u30B8\u30C8\u30EA\u306E `boxglow-blocks/` \u306B\u7F6E\u3044\u3066\u5171\u6709\u3057\u3066\u3088\u3044\n\n\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u304C\u591A\u3044\u3068\u304D\u306F `npx boxglow group "<\u30B0\u30EB\u30FC\u30D7\u540D>"` \u3067\u30B0\u30EB\u30FC\u30D7\u3092\u4F5C\u308A\u3001`npx boxglow group-set <\u5165\u529B\u540D> <\u30B0\u30EB\u30FC\u30D7\u540D>` \u3067\u5206\u3051\u308B (\u4F8B: PCIe \u4ED5\u69D8\u66F8 / DDR \u4ED5\u69D8\u66F8)\u3002\n\n### split \u306E JSON \u5F62\u5F0F\n\n```json\n{\n "blocks": [\n { "title": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B", "inputs": ["\u518D\u73FE\u624B\u9806"], "outputs": ["\u8ABF\u67FB\u30E1\u30E2"],\n "expect": "note:\u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u3068\u51E6\u7406\u3001\u6839\u62E0\u3001\u5909\u66F4\u5019\u88DC\u3001\u78BA\u8A8D\u65B9\u6CD5\u3001\u672A\u6C7A\u4E8B\u9805", "acceptance": "\u5909\u66F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3068\u51E6\u7406\u304C\u6C7A\u307E\u308A\u3001\u5F8C\u7D9A\u306E\u30DC\u30C3\u30AF\u30B9\u306B expect \u3068 acceptance \u3092\u8A2D\u5B9A\u3067\u304D\u308B\u3002\u307E\u305F\u306F\u3001\u8A2D\u5B9A\u3067\u304D\u306A\u3044\u7406\u7531\u3068\u5FC5\u8981\u306A\u5224\u65AD\u304C\u5206\u304B\u308B",\n "goal": "\u518D\u73FE\u3057\u3066\u7D4C\u8DEF\u3092\u8FFD\u3046\u3002\u88FD\u54C1\u30B3\u30FC\u30C9\u306E\u4FEE\u6B63\u306F\u4ECA\u56DE\u306E\u7BC4\u56F2\u5916" },\n { "title": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059", "inputs": ["\u8ABF\u67FB\u30E1\u30E2"], "outputs": ["\u4FEE\u6B63"],\n "expect": "file:src/sync/state.ts", "acceptance": "\u4FDD\u5B58\u3092\u4E00\u5EA6\u5931\u6557\u3055\u305B\u3001\u518D\u4FDD\u5B58\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3068\u64CD\u4F5C\u304C\u623B\u308B (\u30C6\u30B9\u30C8\u3067\u78BA\u8A8D)" },\n { "title": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F", "inputs": ["\u4FEE\u6B63"], "outputs": ["\u30CE\u30FC\u30C8"] }\n ],\n "connections": [\n { "from": "parent.\u518D\u73FE\u624B\u9806", "to": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B.\u518D\u73FE\u624B\u9806" },\n { "from": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B.\u8ABF\u67FB\u30E1\u30E2", "to": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059" },\n { "from": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059.\u4FEE\u6B63", "to": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F" },\n { "from": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F.\u30CE\u30FC\u30C8", "to": "parent.\u51FA\u529B" }\n ]\n}\n```\n\n`expect` (\u4E88\u5B9A\u6210\u679C\u7269: `"kind:hint"` \u307E\u305F\u306F `{ "kind", "hint" }`)\u3001`acceptance` (\u5B8C\u4E86\u6761\u4EF6)\u3001`goal` (\u4ECA\u56DE\u884C\u3046\u51E6\u7406) \u306F\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051\u306B\u66F8\u304F\u3002\n3 \u3064\u76EE\u306E\u5B50\u306E\u3088\u3046\u306B\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u306E\u5B50\u306F\u300C\u8981\u5177\u4F53\u5316\u300D\u3068\u3057\u3066\u6B8B\u308A\u3001\u7740\u624B\u3059\u308B\u756A\u306B\u306A\u3063\u3066\u304B\u3089 `port --expect` / `scope --acceptance` \u3067\u6C7A\u3081\u308B\u3002\n\u89AA\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B (\u5B50\u306E\u6210\u679C\u3092\u7D71\u5408\u3059\u308B\u306A\u3069) \u306F `"parentMakes": ["\u51FA\u529B\u540D"]` \u3067\u5370\u3092\u4ED8\u3051\u308B (\u5B50\u306E\u7D50\u7DDA\u3068\u91CD\u306A\u308B\u3068\u300C\u62C5\u5F53\u304C\u91CD\u8907\u300D\u3068\u6848\u5185\u3055\u308C\u308B)\u3002\n`"splitBy": "\u5DE5\u7A0B"` \u3067\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9\u3092\u4E00\u8A9E\u3067\u6B8B\u3059 (\u5DE5\u7A0B / \u6210\u679C\u7269 / \u6A5F\u80FD \u306A\u3069\u3002`set <block> --split-by` \u3067\u3082\u66F8\u3051\u308B)\u3002\u540C\u3058\u968E\u5C64\u306E\u5B50\u306F\u540C\u3058\u5206\u3051\u65B9\u30FB\u540C\u3058\u5177\u4F53\u5EA6\u306B\u305D\u308D\u3048\u308B\u3002\n`split` \u304C\u4FDD\u5B58\u3057\u306A\u3044\u306E\u306F\u58CA\u308C\u305F\u69CB\u9020 (\u7D50\u7DDA\u5148\u304C\u7121\u3044\u3001\u5FAA\u74B0\u3001\u5F62\u306E\u9055\u3046 expect) \u3060\u3051\u3002\u5B50\u304C 1 \u500B\u3001\u89AA\u306E\u51FA\u529B\u3092\u4F5C\u308B\u5B50\u304C\u307E\u3060\u7121\u3044\u3001\u3068\u3044\u3063\u305F\u9014\u4E2D\u306E\u5206\u89E3\u306F\u4FDD\u5B58\u3055\u308C\u3001\u4E0D\u8DB3\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u308B\u3002\n\u5206\u89E3\u306E\u5F8C\u3068\u7740\u624B\u306E\u524D\u306B `npx boxglow lint <block>` \u3092\u8AAD\u3080\u3002\u300C\u5FC5\u305A\u76F4\u3059\u300D(\u89AA\u51FA\u529B\u306E\u62C5\u5F53\u306E\u672A\u5B9A\u30FB\u91CD\u8907\u3001\u540C\u3058\u5206\u5C90\u306E\u6392\u4ED6\u306E\u9053\u306E\u4E21\u65B9\u3092\u5FC5\u9808\u306B\u3057\u3066\u3044\u308B\u3001\u4F5C\u696D\u4E2D\u306A\u306E\u306B\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6\u304C\u7121\u3044\u3001\u691C\u67FB\u306E\u5BFE\u8C61\u305D\u306E\u3082\u306E\u306E\u6B20\u843D) \u306F\u76F4\u3057\u3066\u304B\u3089\u9032\u3080\u3002\n\u300C\u7740\u624B\u306E\u524D\u306B\u57CB\u3081\u308B\u300D(\u307E\u3060\u59CB\u3081\u3066\u3044\u306A\u3044\u30DC\u30C3\u30AF\u30B9\u306E\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6) \u306F\u3001\u305D\u306E\u5B50\u306E\u7740\u624B\u306E\u756A\u3067\u57CB\u3081\u308C\u3070\u3088\u3044 (\u5148\u306E\u4ED5\u4E8B\u306E\u5206\u3092\u4ECA\u3001\u5F62\u3060\u3051\u66F8\u304B\u306A\u3044)\u3002\n\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D(\u5B50\u304C 1 \u500B\u3001\u3069\u3053\u306B\u3082\u3064\u306A\u304C\u3089\u306A\u3044\u51FA\u529B\u3001\u5F62\u3060\u3051\u306E\u8A18\u5165\u3001\u9053\u306E\u5148\u304C\u7121\u3044\u5206\u5C90\u3001\u5165\u529B 1 \u672C\u306E\u5408\u6D41\u3001\u5144\u5F1F\u306E\u540C\u3058\u4E88\u5B9A\u6210\u679C\u7269) \u306F\u5185\u5BB9\u3092\u898B\u3066\u5224\u65AD\u3059\u308B (\u6A5F\u68B0\u306F\u62D2\u5426\u3057\u306A\u3044)\u3002`context` \u306B\u3082\u4EF6\u6570\u3068\u4E0A\u4F4D 3 \u4EF6\u304C\u51FA\u308B\u3002\n\n**\u5185\u5BB9\u306E\u30EC\u30D3\u30E5\u30FC (\u610F\u5473\u306F\u6A5F\u68B0\u3067\u306F\u5224\u5B9A\u3067\u304D\u306A\u3044\u306E\u3067\u3001AI \u304B\u4EBA\u304C\u6750\u6599\u3092\u8AAD\u3093\u3067\u8A55\u4FA1\u3057\u3001\u6839\u62E0\u3092\u6B8B\u3059)**\n- \u5206\u89E3\u3057\u305F\u5F8C: `npx boxglow review-split <\u89AA>` \u3067\u6750\u6599 (\u89AA\u306E\u76EE\u7684\u30FB\u5236\u7D04\u30FB\u5B8C\u4E86\u6761\u4EF6\u30FB\u5165\u51FA\u529B\u3001\u5B50\u306E\u5BFE\u8C61\u30FB\u5165\u51FA\u529B\u30FB\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6\u3001\u7D50\u7DDA) \u3068\u30C1\u30A7\u30C3\u30AF\u9805\u76EE\u3092\u8AAD\u307F\u3001\u8A55\u4FA1\u3057\u305F\u3089 `npx boxglow split-ok <\u89AA> --note "<\u6839\u62E0: \u4F55\u3092\u78BA\u8A8D\u3057\u305F\u304B>"` \u3067\u8A18\u9332\u3059\u308B\u3002\n- \u7740\u624B\u3059\u308B\u524D: `npx boxglow review-box <block>` \u3067\u6750\u6599 (\u5BFE\u8C61\u30FB\u51E6\u7406\u30FB\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u78BA\u8A8D\u65B9\u6CD5\u3001\u5165\u529B\u306E\u4F9B\u7D66\u5143\u3001\u4E0A\u6D41\u306E\u5206\u5C90\u306E\u7B54\u3048) \u3092\u8AAD\u307F\u3001`npx boxglow box-ok <block> --note "<\u6839\u62E0>"` \u3067\u8A18\u9332\u3059\u308B\u3002\n- \u8A18\u9332\u306F\u300C\u8A55\u4FA1\u3057\u305F\u3068\u7533\u544A\u3057\u6839\u62E0\u3092\u6B8B\u3057\u305F\u8A18\u9332\u300D\u3067\u3042\u308A\u3001\u59A5\u5F53\u6027\u306E\u8A3C\u660E\u3067\u306F\u306A\u3044\u3002\u6750\u6599\u304C\u5909\u308F\u308B\u3068 `context` \u306E `reviews` \u304C `stale` (\u4F55\u304C\u5909\u308F\u3063\u305F\u304B\u3068\u3001\u4F55\u3092\u78BA\u8A8D\u3059\u308C\u3070\u3088\u3044\u304B\u306E\u6848\u5185\u3064\u304D) \u306B\u306A\u308B\u3002`stale` \u306F\u300C\u5206\u89E3\u304C\u4E0D\u6B63\u300D\u3067\u306F\u306A\u304F\u300C\u524D\u56DE\u306E\u78BA\u8A8D\u5F8C\u306B\u6750\u6599\u304C\u5909\u308F\u3063\u305F\u300D\u3068\u3044\u3046\u610F\u5473\u3002\u4F4D\u7F6E\u3084\u914D\u8272\u3001\u9032\u6357\u3001\u62C5\u5F53\u306E\u5909\u66F4\u3067\u306F\u53E4\u304F\u306A\u3089\u306A\u3044\u3002\u5206\u89E3\u306E\u8A18\u9332\u306F\u5206\u5C90\u306E\u7B54\u3048\u3067\u306F\u53E4\u304F\u306A\u3089\u305A\u3001\u7740\u624B\u6E96\u5099\u306E\u8A18\u9332\u306F\u7B54\u3048\u304C\u5909\u308F\u308B\u3068\u53E4\u304F\u306A\u308B\u3002\n- \u5148\u306E\u5B50\u3092\u7740\u624B\u306E\u756A\u3067\u5177\u4F53\u5316\u3059\u308B\u3068\u3001\u89AA\u306E\u5206\u89E3\u306E\u8A18\u9332\u306F\u5FC5\u305A `stale` \u306B\u306A\u308B (\u5B50\u306E expect / acceptance \u3082\u6750\u6599\u306E\u305F\u3081)\u3002\u305D\u306E\u5B50\u306E expect\u30FBscope \u3092\u4E00\u901A\u308A\u66F8\u304D\u7D42\u3048\u3066\u304B\u3089\u3001\u5909\u308F\u3063\u305F\u5B50\u3068\u3001\u89AA\u306E\u5B8C\u4E86\u6761\u4EF6\u30FB\u5BFE\u8C61\u5916\u7BC4\u56F2\u30FB\u5144\u5F1F\u3068\u306E\u5206\u62C5\u3078\u306E\u5F71\u97FF\u3060\u3051\u3092\u78BA\u8A8D\u3057\u3001\u6574\u5408\u3059\u308C\u3070 `split-ok <\u89AA> --note "B181 \u306E\u5177\u4F53\u5316\u3092\u78BA\u8A8D\u3002\u89AA\u306E\u5BFE\u8C61\u5916\u7BC4\u56F2\u306B\u5165\u3089\u305A\u3001B182 \u3068\u306E\u5206\u62C5\u306F\u91CD\u8907\u3057\u306A\u3044"` \u306E\u3088\u3046\u306B\u66F4\u65B0\u3059\u308B\u3002port \u3084 scope \u306E\u64CD\u4F5C\u3054\u3068\u306B\u518D\u78BA\u8A8D\u306F\u3057\u306A\u3044\u3002\u8907\u6570\u306E\u5B50\u3092\u540C\u6642\u306B\u5177\u4F53\u5316\u3057\u305F\u3089\u3001\u307E\u3068\u3081\u3066\u78BA\u8A8D\u3057\u3066\u3088\u3044\u3002\n- \u7740\u624B\u306E\u6761\u4EF6\u306B\u306F\u3057\u3066\u3044\u306A\u3044 (\u65E2\u5B9A\u3067\u3082 reject \u306E\u8A08\u753B\u3067\u3082)\u3002`start` \u3092\u6B62\u3081\u308B\u306E\u306F\u8981\u5177\u4F53\u5316\u3068\u5165\u529B\u5F85\u3061\u3060\u3051\u3002\n\n**\u5206\u5C90\u30FB\u5408\u6D41\u3092 AI \u304C\u4F7F\u3046**\n- `ask` \u306B\u9078\u629E\u80A2\u3092\u4ED8\u3051\u305F\u3068\u304D\u3001\u7B54\u3048\u3067\u5F8C\u306E\u4F5C\u696D\u304C\u5206\u304B\u308C\u308B\u306A\u3089 `--branch` \u3092\u4ED8\u3051\u308B: \u305D\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u5206\u5C90\u306B\u306A\u308A\u3001\u9078\u629E\u80A2\u3054\u3068\u306E\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u3002\u5404\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3057\u3001\u9053\u304C\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B `join` \u3092\u7F6E\u304F\u3002\n- `split` \u306E JSON \u3067\u3082\u4F5C\u308C\u308B: \u5B50\u306B `"branch": { "question": "...", "options": ["A", "B"] }` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9 (\u51FA\u529B\u306F\u9078\u629E\u80A2\u306E\u540D\u524D)\u3001`"join": true` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3002\u4F8B:\n `{ "blocks": [{ "title": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B", "branch": { "question": "\u3069\u308C?", "options": ["\u30E1\u30FC\u30EB", "OAuth"] } }, { "title": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5", "outputs": ["\u8A8D\u8A3C"] }, { "title": "OAuth \u3067\u5B9F\u88C5", "outputs": ["\u8A8D\u8A3C"] }, { "title": "\u5408\u6D41", "join": true }], "connections": [{ "from": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B.\u30E1\u30FC\u30EB", "to": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5" }, { "from": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B.OAuth", "to": "OAuth \u3067\u5B9F\u88C5" }, { "from": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5.\u8A8D\u8A3C", "to": "\u5408\u6D41" }, { "from": "OAuth \u3067\u5B9F\u88C5.\u8A8D\u8A3C", "to": "\u5408\u6D41" }, { "from": "\u5408\u6D41.\u5408\u6D41", "to": "parent.\u8A8D\u8A3C" }] }`\n- `lint` \u306F\u3001\u540C\u3058\u5206\u5C90\u306E\u6392\u4ED6\u306E\u9053\u306E\u4E21\u65B9\u3092 1 \u3064\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u5FC5\u9808\u306B\u3057\u3066\u3044\u308B (\u4E21\u65B9\u304C\u5C4A\u304F\u3053\u3068\u306F\u306A\u3044) \u3092\u300C\u5FC5\u305A\u76F4\u3059\u300D\u3001\u9053\u306E\u5148\u304C\u7121\u3044\u30FB\u5408\u6D41\u306E\u5165\u529B\u304C 1 \u672C\u3092\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D\u3068\u3057\u3066\u51FA\u3059\u3002\n`parent.<\u540D\u524D>` \u306F\u5206\u89E3\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u81EA\u8EAB\u306E\u5165\u529B / \u51FA\u529B\u3002`<block>` \u306F\u77ED\u3044 ID (B12 \u306A\u3069\u3002status \u306B\u51FA\u308B) \u304B\u984C\u540D\u3002\n\u51FA\u529B\u306F\u4F5C\u308B\u7269\u3054\u3068\u306B 1 \u672C (1 \u3064\u306E\u4F5C\u696D\u3067\u8907\u6570\u306E\u7269\u304C\u3067\u304D\u308B\u306A\u3089 outputs \u306B\u5168\u90E8\u66F8\u304F\u30022 \u672C\u76EE\u4EE5\u964D\u306E expect \u306F `port <block> --expect "<\u51FA\u529B\u540D>=<kind>:<hint>"`)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F\u540C\u3058\u540D\u524D\u306B\u306A\u308B (\u3069\u3061\u3089\u5074\u3067\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u3082\u5909\u308F\u308B)\u3002\u984C\u540D\u306F\u300C\u4F55\u3092\u4F5C\u308B\u304B\u300D\u304C\u5206\u304B\u308B\u77ED\u3044\u8A00\u8449\u306B\u3059\u308B\u3002\n\u671F\u65E5\u3084\u6642\u9593\u306F `npx boxglow set <block> --due 2026-10-15 --start 2026-10-01 --estimate 8 --hours 3.5` \u3067\u8A18\u9332\u3059\u308B\u3002\n\u30DC\u30C3\u30AF\u30B9\u306B\u306F\u4ED5\u4E8B\u306E\u7A2E\u985E (\u30AB\u30C6\u30B4\u30EA) \u3092\u4ED8\u3051\u308B: `--category design` (\u8A2D\u8A08) / build (\u5B9F\u88C5) / verify (\u691C\u8A3C) / evaluate (\u8A55\u4FA1) / study (\u691C\u8A0E) / research (\u8ABF\u67FB) / ui (\u30C7\u30B6\u30A4\u30F3) / improve (\u6539\u5584) / fix (\u8AB2\u984C\u89E3\u6C7A) / docs (\u6587\u66F8) / ops (\u904B\u7528) / other (\u305D\u306E\u4ED6: \u8FF7\u3063\u305F\u3068\u304D)\u3002add \u306E\u3068\u304D\u306B\u4ED8\u3051\u3001\u5909\u3048\u308B\u306A\u3089 `npx boxglow set <block> --category verify`\u3002\n\u7D50\u7DDA\u306E\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044 (`npx boxglow connect "A.\u8A2D\u8A08\u66F8" "B"` \u3067 B \u306B\u5165\u529B\u300C\u8A2D\u8A08\u66F8\u300D\u304C\u4F5C\u3089\u308C\u3066\u3064\u306A\u304C\u308B\u3002\u968E\u5C64\u304C\u9055\u3063\u3066\u3082\u9014\u4E2D\u306E\u7BB1\u306B\u5165\u51FA\u529B\u3092\u4F5C\u3063\u3066\u901A\u308B\u3002split \u306E connections \u3082 `to: "B"` \u3067\u3088\u3044)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F\u540C\u3058\u540D\u524D\u306B\u306A\u308B (\u3064\u306A\u3044\u3060\u6642\u70B9\u3067\u305D\u308D\u3044\u3001\u3069\u3061\u3089\u5074\u3067\u540D\u524D\u3092\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u304C\u4E00\u7DD2\u306B\u5909\u308F\u308B)\u3002\u65E2\u5B58\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u51FA\u529B\u3092\u8DB3\u3059 / \u540D\u524D\u3092\u5909\u3048\u308B\u306E\u306F `npx boxglow port <block> --in <\u540D\u524D> --out <\u540D\u524D> --remove <\u540D\u524D> --rename <\u65E7>=<\u65B0>` (\u5165\u529B\u3092\u6D88\u3059\u3068\u3001\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B\u3002\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306F `port inputs`\u3002\u9593\u9055\u3048\u305F\u554F\u3044\u306F `npx boxglow unask <block>` \u3067\u53D6\u308A\u4E0B\u3052\u308B) (`project` = \u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u3002\u6700\u7D42\u6210\u679C\u7269\u306E\u540D\u524D\u3082\u3053\u308C\u3067\u5909\u3048\u308B)\u3002\u7DDA\u3092\u5916\u3059\u306E\u306F `npx boxglow disconnect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D.\u5165\u529B\u540D>`\u3001\u30DC\u30C3\u30AF\u30B9\u305D\u306E\u3082\u306E\u3092\u6D88\u3059\u306E\u306F `npx boxglow remove <block>` (\u4E2D\u306B\u30DC\u30C3\u30AF\u30B9\u304C\u3042\u308C\u3070 `--force`)\u3002MCP \u30C4\u30FC\u30EB (`boxglow_status` / `boxglow_start` / `boxglow_done` / `boxglow_ask` \u306A\u3069\u3002\u5229\u7528\u3059\u308B\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u767B\u9332\u6E08\u307F\u306A\u3089\u4F7F\u3048\u308B\u3002`.mcp.json` \u306F Claude Code \u5411\u3051\u3067\u3001Codex \u306F\u5225\u9014\u767B\u9332\u3059\u308B) \u306F\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u306E\u5225\u306E\u5165\u53E3\u3067\u3001\u3069\u3061\u3089\u3067\u66F8\u3044\u3066\u3082\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u304C\u66F4\u65B0\u3055\u308C\u308B\u3002\u8A08\u753B\u306E\u6587\u66F8\u306F `npx boxglow export --out docs/ROADMAP.md`\u3002\n**\u5168\u4F53\u306B\u52B9\u304F\u6C7A\u5B9A\u306F\u65B9\u91DD\u306B\u3059\u308B**: \u6280\u8853\u9078\u5B9A\u30FB\u4F7F\u3046\u30A8\u30F3\u30B8\u30F3\u30FB\u753B\u98A8\u306E\u6C7A\u307E\u308A\u306A\u3069\u3001\u591A\u304F\u306E\u7BB1\u306B\u52B9\u304F\u6C7A\u5B9A\u3092\u51FA\u529B\u306B\u6301\u3064\u7BB1\u306F\u3001\u305D\u306E\u51FA\u529B\u3092\u65B9\u91DD\u306B\u3059\u308B (`npx boxglow port <block> --policy "<\u51FA\u529B\u540D>"`\u3002\u7BC4\u56F2\u306F\u65E2\u5B9A\u3067\u540C\u3058\u89AA\u306E\u4E2D\u3001`--policy-scope all` \u3067\u8A08\u753B\u5168\u4F53\u3001`--advisory` \u3067\u53C2\u8003)\u3002\u7DDA\u3092\u5F15\u304B\u305A\u306B\u7BC4\u56F2\u306E\u7BB1\u3059\u3079\u3066\u3078\u5C4A\u304D\u3001\u6C7A\u307E\u308B\u307E\u3067\u7BC4\u56F2\u306E\u672A\u7740\u624B\u306E\u7BB1\u306F\u300C\u65B9\u91DD\u5F85\u3061\u300D\u306B\u306A\u308B (\u9032\u3081\u3066\u3044\u308B\u7BB1\u306F\u6B62\u307E\u3089\u306A\u3044)\u3002`context` \u306E `policies` \u306B\u4E2D\u8EAB\u304C\u51FA\u308B\u306E\u3067\u3001\u4F5C\u696D\u306E\u524D\u306B\u8AAD\u3080\u3002\u95A2\u4FC2\u306A\u3044\u7BB1\u306F `--skip-policy "<\u7BB1>.<\u51FA\u529B\u540D>"` \u3067\u5916\u3059\u3002\u5B8C\u4E86\u5F8C\u306B\u65B9\u91DD\u304C\u5909\u308F\u308B\u3068 `policyChanged` \u306B\u51FA\u308B (\u78BA\u304B\u3081\u76F4\u3059)\u30021 \u672C\u305A\u3064\u7DDA\u3067\u3064\u306A\u304C\u306A\u3044\u3002\n\n\u65B0\u3057\u3044\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u306F\u3001\u65B9\u91DD (README \u3084\u4F9D\u983C\u6587) \u304B\u3089\u6700\u4E0A\u4F4D\u306E\u5927\u9805\u76EE 3\u301C7 \u500B\u3092\u5148\u306B\u4F5C\u308A\u3001\u4EBA\u306B `ask` \u3067\u78BA\u8A8D\u3057\u3066\u304B\u3089\u3001\u7740\u624B\u3059\u308B\u5927\u9805\u76EE\u3060\u3051\u3092 `split` \u3067\u5206\u89E3\u3059\u308B (\u5148\u306E\u6BB5\u968E\u306F\u7C97\u3044\u307E\u307E)\u3002`ask` \u306E\u8CEA\u554F\u306F\u305D\u308C\u3060\u3051\u3067\u5224\u65AD\u3067\u304D\u308B\u3088\u3046\u306B\u66F8\u304D\u3001\u524D\u63D0\u30FB\u6BD4\u8F03\u30FB\u5F71\u97FF\u306F `--context` \u306B\u5165\u308C\u308B (\u300C\u3053\u308C\u3067\u3088\u3044\u3067\u3059\u304B\u300D\u306E\u3088\u3046\u306B\u5916\u3092\u6307\u3055\u306A\u3044)\u3002\u5019\u88DC\u304B\u3089 1 \u3064\u3092\u9078\u3076\u5834\u9762\u3067\u306F\u3001\u81EA\u5206\u3067\u6C7A\u3081\u308B\u3068\u304D\u3082 `ask ... --options "A|B|C"` \u3068 `answer --by <\u81EA\u5206>` \u3067\u8A18\u9332\u3057\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u5019\u88DC\u3092\u6B8B\u3059\u3002\u65B9\u91DD\u8EE2\u63DB\u306F `reopen <block> --note <\u7406\u7531>`\u3002\u3059\u3079\u3066 CLI \u3060\u3051\u3067\u6210\u7ACB\u3059\u308B (\u753B\u9762\u306F\u4EBA\u304C\u898B\u308B\u305F\u3081\u306E\u3082\u306E)\u3002\u4EBA\u304C\u3044\u306A\u3044\u904B\u7528\u306A\u3089\u3001AI \u304C `answer --by <\u81EA\u5206>` \u3067\u5224\u65AD\u3092\u8A18\u9332\u3057\u3066\u9032\u3081\u308B\u3002\n\u51FA\u529B\u306E\u540D\u524D\u306F\u300C\u5177\u4F53\u7684\u306A\u6210\u679C\u7269\u300D\u306B\u3059\u308B (\u4F8B: `\u8A2D\u8A08\u66F8 docs/design.md`\u3001`PR #12`\u3001`\u516C\u958B URL`\u3001`\u30C6\u30B9\u30C8\u7D50\u679C (vitest 53 \u4EF6)`)\u3002\u300C\u6A5F\u80FD\u4E00\u5F0F\u300D\u300C\u6240\u898B\u300D\u306E\u3088\u3046\u306A\u62BD\u8C61\u7684\u306A\u540D\u524D\u306F\u907F\u3051\u3001done \u306E\u3068\u304D\u306F\u5FC5\u305A --artifact \u3067\u30D5\u30A1\u30A4\u30EB\u30FBURL\u30FB\u30B3\u30DF\u30C3\u30C8\u3092\u4ED8\u3051\u308B\u3002\n\u3059\u3079\u3066\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5165\u529B \u2192 \u51FA\u529B\u300D\u304C\u4F55\u304B\u306B\u3064\u306A\u304C\u3063\u3066\u3044\u308B\u3088\u3046\u306B\u3059\u308B (\u3064\u306A\u304C\u3063\u3066\u3044\u306A\u3044\u30DC\u30C3\u30AF\u30B9\u306F\u8A08\u753B\u306E\u7A74\u3002\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u30CE\u30FC\u30C9\u306F\u3001\u672A\u63A5\u7D9A\u306E\u5165\u529B\u304C\u81EA\u52D5\u3067\u4E0A\u304C\u308B)\u3002\n\u8907\u6570\u4EBA\u3067\u540C\u3058 boxglow.json \u3092\u7DE8\u96C6\u3059\u308B\u306A\u3089\u3001\u5404\u81EA\u306E clone \u3067\u4E00\u5EA6 `npx boxglow git-setup` \u3092\u5B9F\u884C\u3059\u308B (\u30DC\u30C3\u30AF\u30B9\u306E\u5358\u4F4D\u3067\u81EA\u52D5\u30DE\u30FC\u30B8\u3055\u308C\u3001\u5225\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5909\u66F4\u306F\u885D\u7A81\u3057\u306A\u3044)\u3002\n\u8907\u6570\u30EA\u30DD\u30B8\u30C8\u30EA\u3092 1 \u3064\u306E\u8A08\u753B\u3067\u7BA1\u7406\u3059\u308B\u3068\u304D\u306F\u3001boxglow.json \u3092\u4E0A\u306E\u30D5\u30A9\u30EB\u30C0\u306B\u7F6E\u304D\u3001\u5404\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u306F\u74B0\u5883\u5909\u6570 BOXGLOW_FILE \u306B\u305D\u306E\u5834\u6240\u3092\u5165\u308C\u308B (\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u3054\u3068\u306B 1 \u3064\u3002`npx boxglow project "\u540D\u524D" --repo <\u30D1\u30B9>`)\u3002\n\u5165\u529B\u306F\u65E2\u5B9A\u3067\u5FC5\u9808\u3002\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B\u5165\u529B\u306F `npx boxglow port <block> --optional <\u5165\u529B\u540D>` \u3067\u300C\u4EFB\u610F\u300D\u306B\u3059\u308B (\u623B\u3059\u306E\u306F `--required`)\u3002\u5165\u51FA\u529B\u306E\u8AAC\u660E\u306F `--describe "<\u540D\u524D>=<\u8AAC\u660E>"`\u3002status \u306E\u300C\u6B21\u306E\u5019\u88DC\u300D\u306F\u5FC5\u9808\u306E\u5165\u529B\u304C\u305D\u308D\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304B\u3089\u4E26\u3076 (\u300C\u7740\u624B\u3067\u304D\u308B\u300D/\u300C\u5FC5\u9808\u306E\u5165\u529B\u5F85\u3061\u300D\u304C\u4ED8\u304F)\u3002\u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B (Inputs) \u306B\u8CC7\u6599 (\u4ED5\u69D8\u66F8\u30FB\u30B7\u30CA\u30EA\u30AA\u306A\u3069\u306E\u30D5\u30A1\u30A4\u30EB\u3084 URL) \u304C\u7121\u3044\u3068\u3001\u305D\u308C\u3092\u4F7F\u3046\u7BB1\u306F\u3059\u3079\u3066\u5165\u529B\u5F85\u3061\u306B\u306A\u308B\u3002\u8CC7\u6599\u304C\u624B\u5143\u306B\u3042\u308C\u3070\u3001\u4EBA\u306B\u983C\u307E\u305A\u306B `npx boxglow artifact inputs <\u30D1\u30B9\u304B URL> --input <\u5165\u529B\u540D>` (MCP \u306F `boxglow_artifact` \u306B block: "inputs") \u3067\u81EA\u5206\u3067\u4ED8\u3051\u308B\u3002\u9593\u9055\u3048\u3066\u4ED8\u3051\u305F\u6210\u679C\u7269\u30FB\u8CC7\u6599\u306F `npx boxglow artifact <block|inputs> --remove <\u984C\u540D\u304B\u30D1\u30B9>` \u3067\u5916\u3059\u3002\u6E08\u3093\u3060\u7BB1\u306B\u300C\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057\u300D\u304C\u4ED8\u3044\u305F\u3089\u3001\u4F5C\u696D\u304C\u65B9\u91DD\u306B\u5408\u3063\u3066\u3044\u308B\u304B\u3092\u78BA\u304B\u3081\u3001\u5408\u3063\u3066\u3044\u308C\u3070 `npx boxglow ack <block> --policy` \u3067\u5370\u3092\u6D88\u3059 (\u5408\u3063\u3066\u3044\u306A\u3051\u308C\u3070 reopen \u3057\u3066\u76F4\u3059)\u3002\n\u5165\u529B\u306E\u8AAC\u660E\u306F\u66F8\u304B\u306A\u3044 (\u3064\u306A\u304C\u3063\u305F\u51FA\u529B\u5074\u306E\u8AAC\u660E\u304C\u4F7F\u308F\u308C\u308B)\u3002\u51FA\u529B\u306E\u8AAC\u660E\u306B\u5F62\u5F0F\u30FB\u5236\u7D04\u3092\u66F8\u304F\u3002\n\n\n### \u81EA\u52D5\u3067\u52D5\u304F\u4ED5\u7D44\u307F (hooks)\n\n`setup-agent` \u306F Claude Code / Codex \u306E hooks \u306B `boxglow hook` \u3092\u767B\u9332\u3059\u308B\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u958B\u59CB\u30FB\u518D\u958B\u30FB\u5727\u7E2E\u306E\u5F8C\u306B\u306F\u8A08\u753B\u306E\u518D\u958B\u306E\u6982\u8981 (resume) \u304C\u81EA\u52D5\u3067\u6587\u8108\u306B\u5165\u308B\u3002\u5FDC\u7B54\u3092\u7D42\u3048\u308B\u3068\u304D\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 start \u3057\u305F\u7BB1\u306B\u5F15\u304D\u7D99\u304E (done \u304B checkpoint) \u304C\u7121\u3051\u308C\u3070\u300C\u8A18\u9332\u3057\u3066\u304B\u3089\u7D42\u3048\u308B\u300D\u3088\u3046\u7D9A\u884C\u304C\u6307\u793A\u3055\u308C\u308B (log \u306F\u9032\u6357\u306E\u30E1\u30E2\u3067\u3001\u5F15\u304D\u7D99\u304E\u306E\u4EE3\u308F\u308A\u306B\u306A\u3089\u306A\u3044)\u3002boxglow.json \u3092 Edit / Write / apply_patch \u3067\u76F4\u63A5\u66F8\u304D\u63DB\u3048\u308B\u64CD\u4F5C\u306F\u6B62\u3081\u3089\u308C\u308B (CLI \u304B MCP \u3067\u66F4\u65B0\u3059\u308B)\u3002\u3053\u308C\u3089\u306F\u6307\u793A\u306E\u4EE3\u308F\u308A\u3067\u306F\u306A\u304F\u3001\u5FD8\u308C\u305F\u3068\u304D\u306E\u4FDD\u967A\u306A\u306E\u3067\u3001\u4E0A\u306E\u624B\u9806\u3069\u304A\u308A\u306B\u81EA\u5206\u3067\u8A18\u9332\u3059\u308B\u3002\n\n### \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\n\n\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u306F\u3001AI \u304C\u53E4\u3044\u6307\u793A\u306E\u307E\u307E\u4F5C\u696D\u3092\u9032\u3081\u308B\u306E\u3092\u9632\u3050\u4ED5\u7D44\u307F\u3002`setup-agent` \u304C\u6709\u52B9\u306B\u3059\u308B (\u305D\u308C\u4EE5\u5916\u306E\u8A08\u753B\u3067\u306F `npx boxglow guard on`)\u3002\n\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001AI \u306E `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` \u306B `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u304C\u8981\u308B\u3002\u4EBA\u306E\u64CD\u4F5C (`--actor human`) \u306B\u306F\u8981\u6C42\u3055\u308C\u306A\u3044\u3002\n\n```\nnpx boxglow context B12 # \u5224\u65AD (\u5F15\u304D\u53D6\u308A\u6E08\u307F\u306E\u56DE\u7B54\u3092\u542B\u3080)\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E contextToken \u304C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\nnpx boxglow start B12 --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\nnpx boxglow ask B12 "<\u8CEA\u554F>" --options "A|B" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n# \u2192 \u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C: \u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\nnpx boxglow done B12 --artifact "<\u540D\u524D>=<\u30D1\u30B9>" --context-token <\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n```\n\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u308B\u5834\u5408 (\u8AAD\u307F\u76F4\u3057\u304C\u8981\u308B)**: \u4EBA\u304C\u56DE\u7B54\u3057\u305F\u30FB\u56DE\u7B54\u3092\u76F4\u3057\u305F\u3001\u4EBA\u304C\u6307\u793A (\u984C\u540D\u30FB\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6) \u3092\u5909\u3048\u305F\u3001\u4ED6\u306E AI \u3084\u4EBA\u304C\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u66F4\u65B0\u3057\u305F\u3002\u89AA\u3084\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u8D77\u304D\u305F\u5834\u5408\u3082\u540C\u3058\u3002\u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u62D2\u5426\u3055\u308C\u308B\u306E\u3067\u3001`context` \u3092\u8AAD\u307F\u76F4\u3057\u3001\u5909\u308F\u3063\u305F\u5185\u5BB9\u3092\u4F5C\u696D\u306B\u53CD\u6620\u3057\u3066\u304B\u3089\u3084\u308A\u76F4\u3059\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u3089\u306A\u3044\u5834\u5408**: `start` / `blocked` / `review` / `leave` / `ack`\u3001\u9032\u6357\u30FB\u72B6\u614B\u30FB\u671F\u65E5\u30FB\u30AB\u30C6\u30B4\u30EA\u306E\u5909\u66F4\u3001`check` \u306B\u3088\u308B\u6210\u679C\u7269\u306E\u78BA\u8A8D\u3001\u753B\u9762\u3067\u306E\u914D\u7F6E\u306E\u5909\u66F4\u3002\u540C\u3058\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4F7F\u3044\u7D9A\u3051\u3089\u308C\u308B\n- **\u81EA\u5206\u3067\u66F4\u65B0\u3067\u304D\u308B\u5834\u5408**: \u81EA\u5206\u306E `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` \u306A\u3069\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5909\u308F\u3063\u305F\u3068\u304D\u306F\u3001\u305D\u306E\u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u308B\u3002\u81EA\u5206\u3067\u5909\u3048\u305F\u5185\u5BB9\u306F\u5206\u304B\u3063\u3066\u3044\u308B\u306E\u3067\u3001\u8AAD\u307F\u76F4\u3055\u305A\u306B\u6B21\u306E\u64CD\u4F5C\u3078\u4F7F\u3046\u3002`ask` / `decision` / `answer` / `reopen` \u306F\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u7121\u3057\u3067\u3082\u5B9F\u884C\u3067\u304D\u308B\u304C\u3001\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4ED8\u3051\u305F\u3068\u304D\u3060\u3051\n- **\u6700\u521D\u306F\u77ED\u3044\u5F62\u3067\u8AAD\u3080**: `npx boxglow context <block> --brief` \u306F\u3001\u5BFE\u8C61\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u60C5\u5831 (\u8AAC\u660E\u30FB\u7BC4\u56F2\u30FB\u5224\u65AD\u30FB\u5F15\u304D\u7D99\u304E\u30FB\u5165\u51FA\u529B\u30FB\u6210\u679C\u7269) \u306F\u5168\u90E8\u3001\u8A08\u753B\u5168\u4F53\u306E\u8AAC\u660E\u3001\u89AA\u3068\u5165\u529B\u5143\u306E\u984C\u540D\u30FB\u72B6\u614B\u30FB\u5224\u65AD (\u6750\u6599\u3068\u9078\u629E\u80A2\u3064\u304D\u3002\u524D\u306E\u56DE\u7B54\u306E\u5C65\u6B74\u306F\u7701\u304F)\u30FB\u5BFE\u8C61\u306B\u3064\u306A\u304C\u308B\u51FA\u529B\u3092\u51FA\u3059\u3002\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F `--brief` \u306A\u3057\u3068\u540C\u3058\u306A\u306E\u3067\u3001\u305D\u306E\u307E\u307E `--context-token` \u306B\u4F7F\u3048\u308B\u3002`target.missingInputs` (\u4E0D\u8DB3\u3057\u3066\u3044\u308B\u5FC5\u9808\u306E\u5165\u529B) \u3068 `target.inputs[].sources` (\u3069\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u3069\u306E\u51FA\u529B\u304B\u30FB\u6210\u679C\u7269\u306E\u53C2\u7167) \u3092\u5148\u306B\u898B\u308B\u3002`omitted` \u306B\u7701\u3044\u305F\u4EF6\u6570\u304C\u51FA\u308B\u3002\u7701\u304B\u308C\u305F\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u304C\u4F5C\u696D\u306B\u95A2\u308F\u308A\u305D\u3046\u306A\u3089\u3001`--brief` \u306A\u3057\u3067\u8AAD\u3080\u304B\u3001\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E `context` \u3092\u8AAD\u3080\n- **\u77ED\u3044\u5F62\u3067\u59CB\u3081\u308B\u524D\u63D0**: \u7BC4\u56F2 (scope) \u3092 1 \u9805\u76EE\u3067\u3082\u8A2D\u5B9A\u3057\u305F\u89AA\u30FB\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8AAC\u660E\u306F\u3001\u77ED\u3044\u5F62\u3067\u306F\u7701\u304B\u308C\u308B (`omitted.descriptions` \u306B\u4EF6\u6570)\u3002\u7BC4\u56F2\u3092\u8A2D\u5B9A\u3059\u308B\u3068\u304D\u306F\u3001\u8AAC\u660E\u306B\u66F8\u3044\u305F\u5236\u7D04 (\u4E92\u63DB\u6027\u30FB\u7981\u6B62\u4E8B\u9805\u30FB\u671F\u9650\u306A\u3069) \u3092\u7BC4\u56F2\u3078\u5199\u3057\u7D42\u3048\u3066\u304B\u3089\u306B\u3059\u308B\u3002\u5199\u3057\u305F\u304B\u5206\u304B\u3089\u306A\u3044\u8A08\u753B\u30FB`omitted.descriptions` \u304C 0 \u3067\u306A\u3044\u8A08\u753B\u3067\u306F\u3001\u7740\u624B\u524D\u306B `--brief` \u306A\u3057\u3067 1 \u5EA6\u8AAD\u3080\u3002\u77ED\u3044\u5F62\u306F\u8ABF\u67FB\u306E\u51FA\u767A\u70B9\u3067\u3001\u305D\u308C\u3060\u3051\u8AAD\u3081\u3070\u5341\u5206\u3068\u3044\u3046\u4FDD\u8A3C\u3067\u306F\u306A\u3044\n- \u77ED\u3044\u5F62\u3067\u3082\u7528\u304C\u8DB3\u308A\u308B\u3088\u3046\u306B\u66F8\u304F: \u4F5C\u696D\u3092\u7E1B\u308B\u6761\u4EF6\u306F\u8AAC\u660E\u306E\u4E2D\u306B\u57CB\u3081\u305A\u306B scope (non-goals / constraints / acceptance / consult) \u306B\u66F8\u304F\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306F\u6700\u65B0\u306E 1 \u4EF6\u3060\u3051\u304C\u6B8B\u308B\u306E\u3067\u3001\u672A\u89E3\u6C7A\u306E\u70B9\u30FB\u6CE8\u610F\u70B9\u30FB\u6B21\u306E\u624B\u9806\u3092\u6BCE\u56DE\u66F8\u304D\u76F4\u3057\u3066\u6301\u3061\u8D8A\u3059\u3002\u8ABF\u3079\u59CB\u3081\u308B\u5834\u6240\u306F\u3001\u5BFE\u8C61\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8AAC\u660E\u306B\u6B21\u306E\u5F62\u3067\u66F8\u304F (\u51FA\u767A\u70B9\u3067\u3042\u308A\u3001\u305D\u306E\u30D5\u30A1\u30A4\u30EB\u3060\u3051\u8AAD\u3081\u3070\u8DB3\u308A\u308B\u3068\u3044\u3046\u610F\u5473\u3067\u306F\u306A\u3044):\n `\u5909\u66F4\u5019\u88DC: <\u30D1\u30B9> \u2014 <\u8ABF\u3079\u59CB\u3081\u308B\u7406\u7531>` / `\u95A2\u9023\u691C\u67FB: <\u30D1\u30B9\u307E\u305F\u306F\u30B3\u30DE\u30F3\u30C9> \u2014 <\u78BA\u304B\u3081\u308B\u3053\u3068>`\n- \u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u901A\u3059\u305F\u3081\u306B guard \u3092\u7121\u52B9\u306B\u3057\u306A\u3044 (AI \u304C `guard off` \u3059\u308B\u306B\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u8981\u308B)\n- MCP \u3067\u306F `boxglow_context` \u3068\u3001\u5404\u30C4\u30FC\u30EB\u306E `contextToken` \u5F15\u6570\u3092\u4F7F\u3046 (\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u30C4\u30FC\u30EB\u306E\u7D50\u679C\u306E\u6700\u5F8C\u306E\u884C\u306B\u51FA\u308B)\n- \u300C\u4ED6\u306E Boxglow \u304C\u66F8\u304D\u8FBC\u307F\u4E2D (\u30ED\u30C3\u30AF\u4E2D)\u300D\u3068\u51FA\u3066\u3001\u5C11\u3057\u5F85\u3063\u3066\u3084\u308A\u76F4\u3057\u3066\u3082\u89E3\u3051\u306A\u3044\u3068\u304D\u306F\u3001`npx boxglow unlock` \u306E\u8868\u793A (\u6301\u3061\u4E3B\u3068\u5224\u5B9A) \u3092\u4EBA\u306B\u898B\u305B\u3066\u89E3\u9664\u3092\u983C\u3080\u3002\u81EA\u5206\u3067 `--actor human` \u3092\u4ED8\u3051\u305F\u308A\u3001\u30ED\u30C3\u30AF\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u76F4\u63A5\u6D88\u3057\u305F\u308A\u3057\u306A\u3044\n\n### \u7740\u624B\u30FB\u5B8C\u4E86\u3001\u4ECA\u56DE\u306E\u7BC4\u56F2\u3001\u8A18\u9332\u306E\u9BAE\u5EA6\n\n- \u6700\u521D\u306B resume \u306E\u73FE\u6CC1 (\u6D3B\u52D5\u30FB\u5224\u65AD\u5F85\u3061\u30FB\u672A\u78BA\u8A8D\u56DE\u7B54) \u3092\u8AAD\u3080\u3002\u5019\u88DC\u306F\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2 / \u305D\u306E\u4ED6\u300D\u306E\u5404\u7D44\u3067\u300C\u7740\u624B\u3067\u304D\u308B / \u8981\u5177\u4F53\u5316 / \u5165\u529B\u5F85\u3061\u300D\u306B\u5206\u304B\u308C\u3001\u8981\u5177\u4F53\u5316\u306E\u7406\u7531\u3068\u4E0D\u8DB3\u3059\u308B\u5165\u529B\u540D\u304C\u51FA\u308B\u3002\u8981\u5177\u4F53\u5316\u3084\u5165\u529B\u5F85\u3061\u3092\u3001\u6E96\u5099\u6E08\u307F\u3068\u53D6\u308A\u9055\u3048\u306A\u3044\u3002\n- \u300C\u7740\u624B\u3067\u304D\u308B\u300D(Ready) \u306F\u3001\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u304C\u3042\u308A\u3001\u305D\u306E\u4E88\u5B9A\u6210\u679C\u7269 (expect) \u3068\u5B8C\u4E86\u6761\u4EF6 (acceptance) \u304C\u66F8\u304B\u308C\u3001\u5FC5\u9808\u306E\u5165\u529B\u304C\u305D\u308D\u3063\u3066\u3044\u308B\u3001\u3068\u3044\u3046\u6A5F\u68B0\u691C\u67FB\u306E\u7D50\u679C\u3002\u5185\u5BB9\u304C\u5177\u4F53\u7684\u304B\u3069\u3046\u304B\u307E\u3067\u306F\u4FDD\u8A3C\u3057\u306A\u3044 (`expect = src/`\u3001`acceptance = \u52D5\u4F5C\u3059\u308B` \u3067\u3082\u901A\u308B)\u3002\u5BFE\u8C61\u30FB\u51E6\u7406\u30FB\u6210\u679C\u30FB\u78BA\u8A8D\u65B9\u6CD5\u3092\u7B2C\u4E09\u8005\u304C\u8FFD\u3048\u308B\u3088\u3046\u306B\u66F8\u304F\u3002\n- \u30DC\u30C3\u30AF\u30B9\u306E\u4EFB\u610F5\u9805\u76EE\u3092 scope \u3067\u8A2D\u5B9A\u3059\u308B\u3002goal = \u4ECA\u56DE\u9054\u6210\u3059\u308B\u3053\u3068\u3001non-goals = \u4ECA\u56DE\u306F\u6271\u308F\u306A\u3044\u3053\u3068\u3001acceptance = \u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6\u3001consult = \u7BC4\u56F2\u3092\u5E83\u3052\u308B\u524D\u306B\u76F8\u8AC7\u3059\u308B\u6761\u4EF6\u3002context \u306E\u5148\u982D\u3067\u5BFE\u8C61\u3068\u89AA\u306E\u7BC4\u56F2\u3092\u8AAD\u307F\u3001\u7740\u624B\u524D\u3068\u5B8C\u4E86\u524D\u306B\u7167\u5408\u3059\u308B\u3002\u5B8C\u4E86\u6761\u4EF6\u306E\u672C\u6587\u3092AI\u304C\u6E80\u305F\u3057\u305F\u304B\u306F\u81EA\u52D5\u5224\u5B9A\u3057\u306A\u3044\u3002\n- scope B12 --goal "\u9054\u6210\u3059\u308B\u3053\u3068" --non-goals "\u4ECA\u56DE\u6271\u308F\u306A\u3044\u3053\u3068" --acceptance "\u78BA\u8A8D\u3059\u308B\u6761\u4EF6" --consult "\u76F8\u8AC7\u3059\u308B\u6761\u4EF6" \u3067\u8A2D\u5B9A\u3059\u308B\u3002scope B12 \u306F\u8868\u793A\u3060\u3051\u3002\u5404\u9805\u76EE\u306B none \u307E\u305F\u306F\u7A7A\u6587\u5B57\u3092\u6E21\u3059\u3068\u6D88\u3059\u3002\u753B\u9762\u3067\u306F\u8A73\u7D30\u30D1\u30CD\u30EB\u306E\u300C\u305D\u306E\u4ED6\u300D\u30BF\u30D6 \u2192\u300C\u4F5C\u696D\u7BC4\u56F2\u3092\u7DE8\u96C6\u300D\u3002\u8A18\u5165\u6E08\u307F\u306E\u9805\u76EE\u3060\u3051\u304C\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2\u300D\u306B\u51FA\u308B\u3002\n- focus B12 \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3068\u914D\u4E0B\u3092\u6B21\u5019\u88DC\u306E\u5148\u982D\u306B\u3059\u308B\u3002focus \u306F\u73FE\u5728\u306E\u5BFE\u8C61\u306E\u8868\u793A\u3001focus none \u306F\u89E3\u9664\u3002\u5BFE\u8C61\u5916\u3082\u5225\u306E\u7D44\u306B\u6B8B\u308B\u3002\u5019\u88DC\u306B\u51FA\u308B\u3053\u3068\u81EA\u4F53\u306F\u4F5C\u696D\u7BC4\u56F2\u306E\u62E1\u5927\u3084\u516C\u958B\u3092\u8A31\u53EF\u3057\u306A\u3044\u3002\n- start \u306E\u5FC5\u9808\u5165\u529B\u4E0D\u8DB3\u306F\u65E2\u5B9A\u3067\u8B66\u544A\u3059\u308B\u304C\u3001\u5F93\u6765\u3069\u304A\u308A\u958B\u59CB\u3067\u304D\u308B\u3002\u5148\u884C\u4F5C\u696D\u304C\u5FC5\u8981\u306A\u3089 --reason "\u5148\u306B\u884C\u3046\u7406\u7531" \u3092\u4ED8\u3051\u308B\u3002\u8B66\u544A\u306F\u51FA\u305A\u3001\u7406\u7531\u306F\u6D3B\u52D5\u3068\u30ED\u30B0\u306B\u6B8B\u308B\u3002done \u306E\u51FA\u529B\u6210\u679C\u7269\u306A\u3057\u3082\u65E2\u5B9A\u3067\u8B66\u544A\u306E\u307F\u3002\u65E2\u5B58\u306E\u51FA\u529B\u6210\u679C\u7269\u307E\u305F\u306F --artifact \u3092\u6570\u3048\u3001\u30DC\u30C3\u30AF\u30B9\u306E\u53C2\u8003\u8CC7\u6599\u306F\u6570\u3048\u306A\u3044\u3002\n- \u8A08\u753B\u3067\u9078\u3076\u5834\u5408\u3060\u3051 policy --start reject --done reject --unprepared reject \u306B\u3059\u308B\u3002\u305D\u308C\u305E\u308C warn \u306B\u623B\u305B\u308B\u3002\u5165\u529B\u5F85\u3061\u306E\u62D2\u5426\u3067\u3082\u7406\u7531\u4ED8\u304D\u306E\u958B\u59CB\u306F\u53EF\u80FD\u3060\u304C\u3001\u8981\u5177\u4F53\u5316\u306E\u62D2\u5426\u306F\u7406\u7531\u3067\u306F\u901A\u308C\u306A\u3044 (\u5148\u306B\u5177\u4F53\u5316\u3059\u308B)\u3002\u6210\u679C\u7269\u306A\u3057\u306E\u62D2\u5426\u306F set --status white \u306B\u3082\u52B9\u304F\u3002\u4EBA\u306E\u64CD\u4F5C (\u753B\u9762 / --actor human) \u306F\u62D2\u5426\u3057\u306A\u3044\u3002AI\u304C\u62D2\u5426\u3092\u907F\u3051\u308B\u305F\u3081\u306B\u4EBA\u3092\u540D\u4E57\u3063\u305F\u308A\u3001\u8A2D\u5B9A\u3092\u5F31\u3081\u305F\u308A\u3057\u306A\u3044\u3002\n- guard \u6709\u52B9\u6642\u3001scope \u306E\u5909\u66F4\u3001focus \u306E\u8A2D\u5B9A\u30FB\u89E3\u9664\u3001policy \u306E\u5909\u66F4\u306B\u3082 --context-token \u304C\u5FC5\u8981\u3002scope/focus/policy \u3092\u5909\u3048\u308B\u3068\u65B0\u3057\u3044\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u3067\u3001\u6B21\u306E\u64CD\u4F5C\u306F\u305D\u308C\u3092\u4F7F\u3046\u3002\u8868\u793A\u3060\u3051\u306B\u306F\u4E0D\u8981\u3002\n- resume \u306F\u5B8C\u4E86\u6E08\u307F\u306E\u5F15\u304D\u7D99\u304E\u672C\u6587\u3092\u96A0\u3057\u3001\u4EF6\u6570\u3060\u3051\u793A\u3059\u3002\u5C65\u6B74\u304C\u5FC5\u8981\u306A\u5834\u5408\u3060\u3051 resume --include-completed \u3067\u5C55\u958B\u3059\u308B (context / show \u3067\u306F\u500B\u5225\u306B\u8AAD\u3081\u308B)\u3002\n- \u8AAC\u660E\u306F descriptionUpdatedAt\u3001\u72B6\u614B\u306F statusChangedAt\u3001\u5F15\u304D\u7D99\u304E\u306F\u65E2\u5B58\u306E at \u3067\u65E5\u6642\u3092\u78BA\u8A8D\u3067\u304D\u308B\u3002\u72B6\u614B\u5909\u66F4\u3088\u308A\u53E4\u3044\u30E1\u30E2\u306F\u305D\u306E\u65E8\u3092\u793A\u3059\u3002\u65E7\u8A18\u9332\u306E\u4E0D\u660E\u306A\u65E5\u6642\u306F\u88DC\u308F\u306A\u3044\u3002\u300C\u65B0\u3057\u3044\u8A18\u9332\u300D\u306F\u771F\u507D\u306E\u4FDD\u8A3C\u3067\u306F\u306A\u3044\u3002\n- Done \u3067\u53E4\u3044\u72B6\u6CC1\u8AAC\u660E\u304C\u6B8B\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u5834\u5408\u3001CLI\u30FB\u8A73\u7D30\u30D1\u30CD\u30EB\u30FBresume \u306B\u898B\u76F4\u3057\u6848\u5185\u304C\u51FA\u308B\u3002\u672C\u6587\u306F\u81EA\u52D5\u3067\u6D88\u3055\u306A\u3044\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u3057\u3001\u5FC5\u8981\u306A\u3089 set B12 --note "\u73FE\u5728\u306E\u8AAC\u660E" (none \u3067\u6D88\u53BB) \u307E\u305F\u306F\u753B\u9762\u306E Notes \u3067\u76F4\u3059\u3002\n- MCP \u306F boxglow_scope / boxglow_focus / boxglow_policy\u3001boxglow_claim\u3001boxglow_port \u306E expect / self\u3001boxglow_start \u306E reason\u3001boxglow_resume \u306E includeCompleted \u3092\u4F7F\u3046\u3002\u5909\u66F4\u306B\u306F contextToken \u3092\u4ED8\u3051\u308B\u3002\n- \u30C7\u30FC\u30BF\u5F62\u5F0F\u306F v5 \u306E\u307E\u307E\u3067\u5168\u9805\u76EE\u306F\u4EFB\u610F\u3002\u65E7\u7248 (0.4.2\u4EE5\u524D) \u306F\u65B0\u3057\u3044\u898F\u5247\u3092\u5B9F\u884C\u305B\u305A\u3001\u4FDD\u5B58\u6642\u306B\u8A08\u753B\u306E workflowPolicy / focusBlockId \u3092\u843D\u3068\u3059\u3002\u3053\u308C\u3089\u3092\u4F7F\u3046\u8A08\u753B\u306E\u66F8\u304D\u624B (CLI\u30FBserve\u30FB\u753B\u9762\u30FB\u62E1\u5F35\u5185\u306E\u30A2\u30D7\u30EA) \u306F\u5BFE\u5FDC\u3057\u305F\u30D3\u30EB\u30C9\u306B\u63C3\u3048\u308B\u3002\u7248\u756A\u53F7\u3060\u3051\u3067\u306A\u304F\u30D3\u30EB\u30C9\u65E5\u6642\u3082\u78BA\u8A8D\u3059\u308B\u3002\n\n\n### Sync decisions\n\nAI may only sync already bound projects and inspect comparisons. If sync stops for a conflict or a human choice, summarize the differences and use ask to notify the user. Never resolve conflicts, create a new binding, relink, recover, adopt, restore, or confirm an account. A human must use the UI or explicitly run CLI with --actor human. AI must never add --actor human, including after a chat answer; record the answer and wait for the human to apply the sync choice.\n\nCodex\u306F\u5168CLI\u547C\u3073\u51FA\u3057\u306B `--actor codex`\u3001Claude Code\u306F `--actor claude-code` \u3092\u660E\u793A\u3059\u308B\u3002WSL\u306A\u3069\u3067\u306F\u5B9F\u884C\u74B0\u5883\u306E\u5370\u304C\u6E21\u3089\u306A\u3044\u3053\u3068\u304C\u3042\u308B\u3002\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306F `codex-\u4F5C\u696D\u540D` \u306A\u3069\u306B\u5206\u3051\u3001\u4EBA\u3092\u540D\u4E57\u3089\u306A\u3044\u3002\n\n### \u4E26\u5217\u4F5C\u696D\u306E\u53D7\u3051\u6301\u3061\n\n\u8A08\u753B\u3067\u53D7\u3051\u6301\u3061\u304C\u6709\u52B9\u306A\u3089\u3001CLI\u5B9F\u884C\u3054\u3068\u306B\u4E00\u610F\u306E `BOXGLOW_INSTANCE_ID` \u3092\u56FA\u5B9A\u3057\u3001`claims` \u3068 `context` \u3092\u8AAD\u3093\u3067\u304B\u3089 `claim` (\u5177\u4F53\u5316\u30FB\u5206\u89E3\u306E\u524D) \u307E\u305F\u306F `start` (\u5B9F\u884C) \u3059\u308B\u3002`claim` \u3067\u53D6\u3063\u305F\u53D7\u3051\u6301\u3061\u306F\u3001\u305D\u306E\u307E\u307E `start` \u306B\u5F15\u304D\u7D99\u304C\u308C\u308B\u3002\u72EC\u7ACB\u3057\u305F\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u9593\u3067\u5B9F\u884CID\u3092\u5171\u6709\u3057\u306A\u3044\u3002\u65E2\u5B9A\u306F\u30DC\u30C3\u30AF\u30B9\u306E\u307F\u3001\u5FC5\u8981\u306A\u3089 `--scope subtree`\u3002\u6210\u529F\u3057\u305FCLAIM\u884C\u306Etoken\u3092\u4FDD\u6301\u3057\u3001\u4FDD\u5B58\u3059\u308B\u64CD\u4F5C\u306B `--claim-token` \u3092\u4ED8\u3051\u308B\u3002MCP\u306F\u5B9F\u884CID\u3068\u53D7\u9818\u8A3C\u3092\u81EA\u52D5\u3067\u4FDD\u6301\u3059\u308B\u30025\u5206\u3054\u3068 (\u671F\u9650\u304C\u77ED\u3051\u308C\u3070\u534A\u5206\u4EE5\u5185) \u306B `claim-renew` / `boxglow_claim_renew` \u3092\u547C\u3073\u3001\u4E2D\u65AD\u524D\u306Fcheckpoint\u3002done/leave\u306F\u5BFE\u8C61\u306E\u53D7\u3051\u6301\u3061\u3092\u89E3\u653E\u3059\u308B\u3002\u671F\u9650\u5207\u308C\u3084\u4E16\u4EE3\u9055\u3044\u3092\u7121\u8996\u305B\u305A\u3001\u6700\u65B0context\u3092\u78BA\u8A8D\u3057\u3066\u53D6\u308A\u76F4\u3059\u3002\u540C\u540Dactor\u3067\u3082\u5225\u5B9F\u884C\u306E\u53D7\u3051\u6301\u3061\u306F\u596A\u308F\u306A\u3044\u3002\u8A2D\u5B9A\u30FB\u5F37\u5236\u89E3\u9664\u30FB\u540C\u671F\u7AF6\u5408\u306E\u89E3\u6C7A\u306F\u4EBA\u306B\u4F9D\u983C\u3057\u3001AI\u304Chuman\u3092\u540D\u4E57\u3063\u3066\u4EE3\u884C\u3057\u306A\u3044\u3002\u5171\u6709\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306E\u540C\u671F\u30B3\u30D4\u30FC\u9593\u306B\u306F\u6392\u4ED6\u4FDD\u8A3C\u304C\u306A\u3044\u3002\u8A73\u3057\u304F\u306F `docs/CLAIMS.md`\u3002\n\n\u4ED6\u8005\u306E\u5B9F\u884CID\u30FB\u53D7\u9818\u8A3C\u3092\u4F7F\u308F\u306A\u3044\u3002\u8A08\u753B\u3084claims\u306E\u51FA\u529B\u304B\u3089\u4ED6\u8005\u306E\u53D7\u9818\u8A3C\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3053\u3068\u3082\u7981\u6B62\u3002MCP\u518D\u8D77\u52D5\u5F8C\u306E\u540C\u540Dactor\u3082\u5225\u5B9F\u884C\u306A\u306E\u3067\u3001\u81EA\u52D5\u3067\u5F15\u304D\u7D99\u304C\u305A\u671F\u9650\u3092\u5F85\u3064\u304B\u4EBA\u306B\u89E3\u9664\u3092\u983C\u3080\u3002\n\n\u5165\u529B\u306E\u81EA\u52D5\u5F15\u304D\u4E0A\u3052\u306F\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u7BC4\u56F2\u3067\u6271\u3046\u3002\u5171\u6709\u5165\u529B\u306E\u5185\u5BB9\u5909\u66F4\u3084\u5225\u30DC\u30C3\u30AF\u30B9\u3078\u306E\u914D\u7F6E\u5909\u66F4\u306B\u306F\u3001\u5F71\u97FF\u3059\u308B\u7BC4\u56F2\u306E\u53D6\u5F97\u3082\u5FC5\u8981\u3002focus\u3084group\u306A\u3069\u8A08\u753B\u5168\u4F53\u306E\u8A2D\u5B9A\u306B\u306F `context root` \u2192 `claim root` \u3067root\u3092\u53D6\u5F97\u3057\u3001\u305D\u306ECLAIM\u3092\u6E21\u3059 (`start root` \u3067\u3082\u53D6\u308C\u308B\u304C\u3001\u5B9F\u884C\u4E2D\u306B\u306F\u3057\u306A\u3044 `claim` \u3092\u4F7F\u3046)\u3002root\u306E\u307F\u306E\u53D6\u5F97\u306F\u901A\u5E38\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u542B\u307E\u306A\u3044\u3002\u8A08\u753B\u8A2D\u5B9A\u306E\u5909\u66F4\u306Froot\u306E\u307F\u3067\u8DB3\u308A\u308B\u3002root\u306Esubtree\u306F\u4E26\u884C\u4F5C\u696D\u3092\u5168\u90E8\u6B62\u3081\u308B\u306E\u3067\u3001AI\u306F\u4F7F\u308F\u305A\u4EBA\u306B\u76F8\u8AC7\u3059\u308B\u3002root\u306E\u7D42\u4E86\u306F `leave root`\u3002context guard\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3082\u5F15\u304D\u7D9A\u304D\u5FC5\u8981\u3002\n\n---\n\n\u540C\u671F\u306E\u4EBA\u5C02\u7528\u64CD\u4F5C\u306F\u3001\u5F37\u5236\u7684\u306A\u6A29\u9650\u5206\u96E2\u3067\u306F\u306A\u304F\u8AA4\u64CD\u4F5C\u306E\u9632\u6B62\u3067\u3059\u3002AI \u306F `--actor human` \u3092\u540D\u4E57\u3089\u305A\u3001\u6BD4\u8F03\u3068\u505C\u6B62\u7406\u7531\u3092\u4EBA\u3078\u4F1D\u3048\u3066\u304F\u3060\u3055\u3044\u3002MCP \u3068 AI \u3068\u3057\u3066\u8B58\u5225\u3057\u305F CLI \u306F\u3001\u4EBA\u7528\u306E\u9078\u629E\u30B3\u30DE\u30F3\u30C9\u3092\u51FA\u529B\u3057\u307E\u305B\u3093\u3002\n\n\u4EBA\u306ECLI\u64CD\u4F5C\u306F `--actor human:\u540D\u524D` \u3082\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002AI\u306F\u3053\u306E\u5F62\u3067\u3082\u4EBA\u3092\u540D\u4E57\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002AI\u5411\u3051\u505C\u6B62\u6587\u306E `boxglow sync --help` \u306F\u3001AI\u74B0\u5883\u3092\u5F15\u304D\u7D99\u3044\u3060\u4EBA\u3078\u306E\u6848\u5185\u3067\u3059\u3002AI\u306E\u4EE3\u884C\u8A31\u53EF\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\n';
13789
+ var AGENTS_SNIPPET_default = '# Boxglow \u3092\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u4F7F\u308F\u305B\u308B\u6307\u793A\u66F8 (AGENTS.md / CLAUDE.md \u306B\u8CBC\u308B)\n\n\u4E0B\u306E\u300C---\u300D\u306E\u9593\u3092\u305D\u306E\u307E\u307E\u30EA\u30DD\u30B8\u30C8\u30EA\u306E AGENTS.md (Codex) \u3084 CLAUDE.md (Claude Code) \u306B\u8CBC\u308B\u3002\nboxglow.json \u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u76F4\u4E0B\u306B\u7F6E\u304F (`npx boxglow init --name "<\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D>"`)\u3002\n\n---\n\n## Boxglow (\u8A08\u753B\u3068\u9032\u6357\u306E\u5171\u6709)\n\n\u3053\u306E\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u8A08\u753B\u3068\u9032\u6357\u306F `boxglow.json` \u304C\u6B63\u672C\u3002\u4EBA\u9593\u306F Boxglow \u306E\u753B\u9762\u3067\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u898B\u3066\u3044\u308B\u3002\n\u30D5\u30A1\u30A4\u30EB\u3092\u76F4\u63A5\u7DE8\u96C6\u305B\u305A\u3001\u5FC5\u305A `npx boxglow` \u30B3\u30DE\u30F3\u30C9\u3067\u66F4\u65B0\u3059\u308B\u3053\u3068 (\u7D50\u7DDA\u30EB\u30FC\u30EB\u3068\u5C65\u6B74\u304C\u4FDD\u305F\u308C\u308B)\u3002\n\n\u30D6\u30ED\u30C3\u30AF = \u300C\u5165\u529B\u304B\u3089\u51FA\u529B (\u6210\u679C\u7269) \u3092\u4F5C\u308B\u30BF\u30B9\u30AF\u300D\u3002\u51FA\u529B\u306E\u6210\u679C\u7269\u304C\u78BA\u5B9A\u3057\u305F\u3089\u5B8C\u4E86 (WhiteBox)\u3002\n\u72B6\u614B: BlackBox (\u51FA\u529B\u3060\u3051\u6C7A\u3081\u305F) \u2192 GrayBox (\u7740\u624B\u4E2D) \u2192 WhiteBox (\u5B8C\u4E86)\u3002\n\n### \u4F5C\u696D\u306E\u305F\u3073\u306B\u5B88\u308B\u3053\u3068\n\n1. **\u6700\u521D\u306B\u8AAD\u3080**: `npx boxglow resume` (\u307E\u305F\u306F `npx boxglow status --brief`) \u3067\u3001\u4F5C\u696D\u4E2D\u30FB\u5224\u65AD\u5F85\u3061\u30FBAI \u672A\u78BA\u8A8D\u306E\u56DE\u7B54\u30FB\u6B21\u306E\u5019\u88DC\u30FB\u672A\u5B8C\u4E86\u306E\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u524D\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u7D9A\u304D\u306F\u3001\u3053\u3053\u306B\u51FA\u308B\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u304B\u3089\u518D\u958B\u3059\u308B\u3002`npx boxglow show <block>` \u3067\u62C5\u5F53\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u51FA\u529B\u3092\u78BA\u8A8D\u3059\u308B\n2. **\u6E96\u5099\u3092\u78BA\u8A8D**: \u53D6\u308A\u304B\u304B\u308B\u524D\u306B `npx boxglow context <block>` \u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E `readiness` \u304C\u6E96\u5099\u306E\u72B6\u614B: `state` \u304C `ready` \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002`unprepared` (\u8981\u5177\u4F53\u5316) \u306A\u3089 `unprepared` \u306E\u7406\u7531\u3068 `next` \u306E\u6B21\u306E\u4E00\u624B\u306B\u5F93\u3063\u3066\u5148\u306B\u5177\u4F53\u5316\u3059\u308B\u3002`waiting` \u306F\u5FC5\u9808\u306E\u5165\u529B\u304B\u5206\u5C90\u306E\u7B54\u3048\u3092\u5F85\u3063\u3066\u3044\u308B\n3. **\u53D7\u3051\u6301\u3061\u3001\u5177\u4F53\u5316**: \u5177\u4F53\u5316\u3084\u5206\u89E3\u306E\u524D\u306B `npx boxglow claim <block>` \u3067\u53D7\u3051\u6301\u3061\u3060\u3051\u3092\u53D6\u308B (\u5B9F\u884C\u4E2D\u306B\u306F\u306A\u3089\u306A\u3044\u3002\u53D7\u3051\u6301\u3061\u5236\u5FA1\u304C\u7121\u52B9\u306A\u8A08\u753B\u3067\u306F\u300C\u53D6\u5F97\u4E0D\u8981\u300D\u3067\u6B63\u5E38\u7D42\u4E86\u3059\u308B)\u3002\u305D\u306E\u3046\u3048\u3067\u4E0D\u8DB3\u3092\u57CB\u3081\u308B:\n - \u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269: `npx boxglow port <block> --expect "<\u51FA\u529B\u540D>=file:src/x.ts"` (kind \u306F file / dir / url / doc / note / decision / result\u3002hint \u306F\u30D1\u30B9\u306E\u898B\u5F53\u3084\u984C\u540D\u3002\u307E\u3060\u4F5C\u3063\u3066\u3044\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u3067\u3088\u3044)\n - \u5B8C\u4E86\u6761\u4EF6: `npx boxglow scope <block> --acceptance "<\u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6>"`\u3002\u51E6\u7406\u306E\u7BC4\u56F2\u306F `--goal`\u3002\u51FA\u529B\u3092\u4F5C\u308B\u3046\u3048\u3067\u5B88\u308B\u6761\u4EF6 (\u6027\u80FD\u30FB\u54C1\u8CEA\u30FB\u30B5\u30A4\u30BA\u30FB\u5BF8\u6CD5\u30FB\u6D88\u8CBB\u96FB\u529B\u306A\u3069) \u306F `--constraints`\n - 1 \u3064\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u51FA\u529B\u3092\u4F5C\u308B\u898B\u901A\u3057\u304C\u7ACB\u305F\u306A\u3044\u306A\u3089 `npx boxglow split <block> --spec \'<JSON>\'` \u3067\u4E2D\u306B\u5C0F\u3055\u306A\u30DC\u30C3\u30AF\u30B9\u3092\u7F6E\u304F\u3002\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051 expect / acceptance \u3092\u66F8\u304D\u3001\u5148\u306E\u5B50\u306F\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u3067\u3088\u3044 (\u8981\u5177\u4F53\u5316\u3068\u3057\u3066\u6B8B\u308B)\u3002\u5165\u529B\u306F\u4E0D\u660E\u306A\u3089\u7701\u7565\u3057\u3066\u3088\u3044 (\u81EA\u52D5\u3067\u4E0A\u306E\u968E\u5C64\u306E\u5165\u529B\u306B\u306A\u308B)\n - \u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5206\u304B\u3089\u306A\u3044\u3068\u304D\u306F\u3001\u67B6\u7A7A\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304B\u305A\u300C\u5BFE\u8C61\u3092\u7279\u5B9A\u3059\u308B\u8ABF\u67FB\u300D\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u51FA\u529B `note` \u3067\u4F5C\u3063\u3066\u59CB\u3081\u308B\n4. **\u7740\u624B\u3092\u8A18\u9332**: \u6E96\u5099\u304C\u3067\u304D\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u307F\u76F4\u3057\u3066\u304B\u3089 `npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>"`\u3002\u540C\u6642\u306B\u9032\u3081\u308B\u30DC\u30C3\u30AF\u30B9\u306F 1\u301C2 \u500B\u307E\u3067\u3002\n start \u3057\u305F\u30DC\u30C3\u30AF\u30B9\u306B\u300C\u4ECA\u3053\u3053\u300D(\u672C\u5F53\u306B\u3044\u307E\u4F5C\u696D\u3057\u3066\u3044\u308B\u30DC\u30C3\u30AF\u30B9\u3002\u8907\u6570\u306E AI \u3084\u4EBA\u304C\u3044\u308C\u3070\u3001\u3044\u304F\u3064\u3067\u3082) \u304C\u4ED8\u304D\u3001\u753B\u9762\u3067\u592A\u3044\u67A0\u3068 NOW \u306E\u672D\u304C\u4ED8\u304F\u3002\u5225\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u3082\u4ED8\u3051\u308B\u3068\u304D\u306F `npx boxglow now <block>` (\u5916\u3059\u3068\u304D\u306F `--off`\u3001\u5168\u90E8\u6D88\u3059\u3068\u304D\u306F `now none`)\u3002done / leave \u3067\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5206\u304C\u5916\u308C\u308B\u3002\u4EBA\u3082\u753B\u9762\u306E\u72B6\u614B\u30BF\u30D6\u306E NOW \u3067\u4ED8\u3051\u5916\u3057\u3059\u308B\n \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u304C\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001\u51FA\u529B\u306E `contextToken` (\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3) \u3092\u4ED8\u3051\u308B:\n `npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` (\u4E0B\u306E\u300C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\u300D\u3092\u53C2\u7167)\n \u8981\u5177\u4F53\u5316\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u306E start \u306F\u65E2\u5B9A\u3067\u306F\u8B66\u544A (\u7406\u7531\u3068\u6B21\u306E\u4E00\u624B\u304C\u51FA\u308B)\u3002`policy --unprepared reject` \u306E\u8A08\u753B\u3067\u306F\u958B\u59CB\u3067\u304D\u306A\u3044 (`--reason` \u3067\u306F\u901A\u308C\u306A\u3044\u3002\u4EBA\u306E\u64CD\u4F5C\u306F\u901A\u308B)\u3002\u51FA\u529B\u3092\u5B50\u306B\u4EFB\u305B\u304D\u308A\u306E\u89AA\u3082\u5B9F\u884C\u3059\u308B\u3082\u306E\u304C\u7121\u3044\u306E\u3067\u3001\u5B50\u3092 start \u3059\u308B\n5. **\u5B8C\u4E86\u3092\u8A18\u9332**: \u51FA\u529B\u306E\u6210\u679C\u7269\u304C\u3067\u304D\u305F\u3089 `npx boxglow done <block> --artifact "<\u540D\u524D>=<\u30EA\u30DD\u30B8\u30C8\u30EA\u5185\u306E\u30D1\u30B9>" --checked "<\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>"`\u3002\u691C\u67FB\u7D50\u679C\u306F\u6C7A\u307E\u3063\u305F 3 \u3064\u3067\u6B8B\u3059: `--checked` (\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C\u3002\u4F8B: "vitest 53 \u4EF6\u6210\u529F; e2e home 34/34")\u3001`--not-checked` (\u8A66\u3057\u3066\u3044\u306A\u3044\u3053\u3068)\u3001`--limits` (\u6B8B\u308B\u5236\u9650\u30FB\u6CE8\u610F)\u3002\u30B3\u30FC\u30C9\u4EE5\u5916\u306E\u6210\u679C\u7269 (\u6587\u66F8\u306A\u3069) \u306F\u300C\u78BA\u8A8D\u3057\u305F\u3053\u3068\u300D\u3092 `--checked` \u306B\u66F8\u304F\u3002\u7BB1\u306B\u6B8B\u308A\u3001context \u3068 show \u306B\u51FA\u308B\u3002\n guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B (\u76F4\u524D\u306E\u81EA\u5206\u306E\u64CD\u4F5C\u306E\u51FA\u529B\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u3066\u3044\u308C\u3070\u3001\u305D\u308C\u3092\u4F7F\u3046)\u3002\n HEAD \u306B\u30B3\u30DF\u30C3\u30C8\u6E08\u307F\u3067\u5185\u5BB9\u304C\u4E00\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u306F\u300C\u30B3\u30DF\u30C3\u30C8 + \u30D1\u30B9 + \u4E2D\u8EAB\u306E\u30CF\u30C3\u30B7\u30E5\u300D\u3067\u8A18\u9332\u3055\u308C\u308B (\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306F\u3057\u306A\u3044)\u3002\u672A\u30B3\u30DF\u30C3\u30C8\u30FB\u672A\u8FFD\u8DE1\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u30ED\u30FC\u30AB\u30EB\u53C2\u7167\u3068\u3057\u3066\u6B8B\u308A\u3001\u30B3\u30DF\u30C3\u30C8\u3057\u305F\u5F8C\u306E `npx boxglow check` \u3067 Git \u306E\u53C2\u7167\u306B\u88DC\u5B8C\u3055\u308C\u308B\u3002\u8A18\u9332\u306E\u305F\u3081\u3060\u3051\u306B\u30B3\u30DF\u30C3\u30C8\u3057\u306A\u3044\u3002\u5168\u968E\u5C64\u304C\u5FC5\u8981\u306A\u3089 `npx boxglow status` \u3092\u8AAD\u3080\u3002PR \u3084\u5916\u90E8\u8CC7\u6599\u306F URL \u3067\u3082\u3088\u3044\u3002\n \u6210\u679C\u7269\u3060\u3051\u5148\u306B\u4ED8\u3051\u308B\u306A\u3089 `npx boxglow artifact <block> <\u30D1\u30B9>`\u3002\u9032\u6357\u306E\u9014\u4E2D\u7D4C\u904E\u306F `npx boxglow set <block> --progress 60`\n6. **\u4EBA\u9593\u306E\u5224\u65AD\u304C\u8981\u308B**: `npx boxglow ask <block> "<\u8CEA\u554F>" --options "A|B"`\u3002\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u9032\u3081\u305A\u3001\u4ED6\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u79FB\u308B\u3002\u4EBA\u306E\u56DE\u7B54\u306F `status` \u306E\u300C\u56DE\u7B54\u3042\u308A\u300D\u306B\u51FA\u308B\u3002\u8AAD\u3093\u3060\u3089 `npx boxglow ack <block>` \u3067\u5F15\u304D\u53D6\u308B (\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E `start` / `done` / `set` \u306A\u3069\u3067\u3082\u81EA\u52D5\u3067\u5F15\u304D\u53D6\u3089\u308C\u308B)\u3002\u5F15\u304D\u53D6\u308B\u307E\u3067\u4EBA\u306E\u753B\u9762\u306B\u306F\u300CAI \u672A\u78BA\u8A8D\u300D\u3068\u3057\u3066\u6B8B\u308A\u3001\u4EBA\u304C\u7B54\u3048\u3092\u76F4\u305B\u308B\u3002\u56DE\u7B54\u306E\u4E2D\u306B\u554F\u3044\u8FD4\u3057\u304C\u3042\u308C\u3070\u3001`ask` \u3068 `answer --by <\u81EA\u5206>` \u3067\u81EA\u5206\u306E\u7B54\u3048\u3082\u8A18\u9332\u3059\u308B\n7. **\u8A70\u307E\u3063\u305F\u3089**: \u5165\u529B (\u524D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599) \u304C\u8DB3\u308A\u306A\u3044\u3053\u3068\u304C\u539F\u56E0\u306A\u3089\u3001\u8A70\u307E\u308A\u306B\u3057\u306A\u3044\u3002`npx boxglow show <block>` \u3067\u5165\u529B\u306E\u914D\u7DDA\u3092\u78BA\u304B\u3081\u3001\u8DB3\u308A\u306A\u3044\u3082\u306E\u3092\u4F5C\u308B\u30DC\u30C3\u30AF\u30B9\u304C\u7121\u3051\u308C\u3070 `npx boxglow add` \u3067\u5916 (\u4E0A\u6D41) \u306B\u4F5C\u308A\u3001`npx boxglow connect` \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u529B\u306B\u3064\u306A\u3050 (\u914D\u7DDA\u304C\u300C\u5F85\u3061\u300D\u306E\u8272\u3067\u6B8B\u308A\u3001\u4F55\u3092\u5F85\u3063\u3066\u3044\u308B\u304B\u304C\u56F3\u3067\u898B\u3048\u308B)\u3002\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u3082\u3089\u3048\u3070\u9032\u3081\u308B\u306A\u3089 `ask`\u3002\u305D\u308C\u4EE5\u5916\u306E\u3001\u8A08\u753B\u306E\u5916\u306B\u3042\u308B\u969C\u5BB3 (\u74B0\u5883\u304C\u52D5\u304B\u306A\u3044\u3001\u6A29\u9650\u3084\u30AD\u30FC\u304C\u7121\u3044\u3001\u5916\u90E8\u306E\u8FD4\u4E8B\u5F85\u3061\u3001\u539F\u56E0\u306E\u5206\u304B\u3089\u306A\u3044\u5931\u6557) \u3060\u3051\u3092 `npx boxglow blocked <block> --note "<\u56F0\u3063\u3066\u3044\u308B\u3053\u3068>"` \u3067\u8A18\u9332\u3059\u308B \u8A55\u4FA1\u3084\u691C\u67FB\u3067\u524D\u306E\u6210\u679C\u7269\u304C\u901A\u3089\u306A\u304B\u3063\u305F\u3068\u304D\u306F\u3001\u7DDA\u3067\u623B\u3055\u305A (\u5FAA\u74B0\u306B\u306A\u308B) `npx boxglow sendback <\u8A55\u4FA1\u306E\u7BB1> --to <\u4F5C\u308A\u76F4\u3059\u7BB1> --note "<\u7406\u7531>"` \u3067\u5DEE\u3057\u623B\u3059 (\u305D\u306E\u7BB1\u306F In Progress \u306B\u623B\u308A\u3001\u6210\u679C\u7269\u306F\u5DEE\u3057\u623B\u3057\u6E08\u307F\u3068\u3057\u3066\u6B8B\u308B\u3002\u7406\u7531\u306F context \u306B\u51FA\u308B)\u3002\n8. **\u6210\u679C\u7269\u306E\u78BA\u8A8D**: \u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u30FB\u6539\u540D\u3057\u305F\u3089 `npx boxglow check` \u3092\u5B9F\u884C\u3059\u308B (\u79FB\u52D5\u3092\u691C\u51FA\u3057\u3066\u30D1\u30B9\u3092\u4ED8\u3051\u66FF\u3048\u308B\u3002\u898B\u3064\u304B\u3089\u306A\u3051\u308C\u3070\u5370\u304C\u4ED8\u304F)\n9. **\u9032\u6357\u3084\u6C17\u3065\u304D\u3092\u6B8B\u3059**: `npx boxglow log <block> "<\u672C\u6587>"` \u3067\u3001\u65E5\u4ED8\u3068\u66F8\u304D\u624B\u3064\u304D\u306E\u4F5C\u696D\u8A18\u9332\u3092\u30DC\u30C3\u30AF\u30B9\u306B\u8DB3\u3059 (Markdown \u53EF\u3002\u4EBA\u306F\u753B\u9762\u306E\u300C\u8A18\u9332\u300D\u30BF\u30D6\u3067\u540C\u3058\u3082\u306E\u3092\u898B\u3066\u66F8\u304F)\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2 (checkpoint) \u306F 1 \u3064\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304C\u3001\u8A18\u9332\u306F\u7A4D\u307F\u4E0A\u304C\u308B\u3002\u672C\u6587\u3092\u7701\u304F\u3068\u8A18\u9332\u306E\u4E00\u89A7 (id \u4ED8\u304D)\u3001\u81EA\u5206\u306E\u8A18\u9332\u306F `--edit <id> "<\u672C\u6587>"` \u3067\u76F4\u3057 `--remove <id>` \u3067\u6D88\u305B\u308B\n10. **\u4E2D\u65AD\u30FB\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B**: \u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u7D42\u308F\u308A\u30FB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u5727\u7E2E\u30FB\u4ED6\u306E AI \u3084\u4EBA\u3078\u306E\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B\u3001`npx boxglow checkpoint <block> --note "\u5206\u304B\u3063\u305F\u3053\u3068; \u6B21\u306B\u3059\u308B\u3053\u3068; \u672A\u89E3\u6C7A\u306E\u3053\u3068"` \u3067\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u6B8B\u3059 (guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B)\u3002\u4F1A\u8A71\u306E\u5C65\u6B74\u304C\u6D88\u3048\u3066\u3082\u8A08\u753B\u306E\u4E2D\u306B\u6B8B\u308A\u3001\u6B21\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u304C `resume` \u3068 `context` \u3067\u8AAD\u3080\n11. **\u5831\u544A**: \u4F5C\u696D\u306E\u6700\u5F8C\u306B `npx boxglow status --brief` \u306E\u5185\u5BB9\u3092\u8981\u7D04\u3057\u3066\u5831\u544A\u3059\u308B\n\n### \u69CB\u9020\u306E\u7D04\u675F\n\n- **\u307E\u3060\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u306F\u5206\u5C90\u3067\u8868\u3059**: \u8A08\u753B\u3092\u4F5C\u308B\u6642\u70B9\u3067\u3001\u5224\u65AD\u6B21\u7B2C\u3067\u5F8C\u306E\u4F5C\u696D (\u9053) \u304C\u5909\u308F\u308B\u3068\u304D\u306F `npx boxglow branch "<\u984C\u540D>" --options "A|B" --question "<\u554F\u3044>" --context "<\u5224\u65AD\u6750\u6599>"` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u4F5C\u308B\u3002\u9078\u629E\u80A2\u3054\u3068\u306B\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u306E\u3067\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3059\u308B\u3002\u9053\u304C\u5F8C\u3067 1 \u3064\u306B\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B\u306F `npx boxglow join --title "<\u984C\u540D>"` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3092\u7F6E\u304D\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u5F8C\u306E\u51FA\u529B\u3092\u3053\u306E\u90E8\u54C1\u3078 `connect` \u3057\u3001\u90E8\u54C1\u306E\u51FA\u529B\u3092\u5148\u306E\u7BB1\u3078\u3064\u306A\u3050 (\u3069\u308C\u304B 1 \u3064\u306E\u9053\u304C\u5C4A\u3051\u3070\u5148\u3078\u9032\u3080)\u3002\u4EBA\u304C\u7B54\u3048\u308B\u3068\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u9053\u306E\u5148\u306F\u300C\u898B\u9001\u308A\u300D\u306B\u306A\u308A\u3001\u9032\u6357\u3068\u6B21\u306E\u5019\u88DC\u304B\u3089\u5916\u308C\u308B\u3002\u3059\u3067\u306B\u4F5C\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304C\u5B9F\u306F\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u3060\u3068\u5206\u304B\u3063\u305F\u3089\u3001`npx boxglow branch --box <block> --options "A|B" --question "<\u554F\u3044>"` \u3067\u5206\u5C90\u306B\u5909\u3048\u308B (\u4ECA\u306E\u51FA\u529B\u304C 1 \u3064\u76EE\u306E\u9078\u629E\u80A2\u306E\u9053\u306B\u306A\u308A\u3001\u7DDA\u306F\u6B8B\u308B)\u3002\u7B54\u3048\u304C\u51FA\u308B\u524D\u306E\u9053\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5206\u5C90\u5F85\u3061\u300D\u3067\u3001\u7740\u624B\u3059\u308B\u3068\u8B66\u544A\u3055\u308C\u308B (\u5148\u306B\u4E0B\u8ABF\u3079\u3059\u308B\u306A\u3069\u7406\u7531\u304C\u3042\u308C\u3070 `--reason` \u3067\u8A18\u9332\u3059\u308B)\n- \u6700\u4E0A\u4F4D\u306B\u306F\u300C\u5165\u529B\u30CE\u30FC\u30C9\u300D\u300C\u6700\u7D42\u6210\u679C\u7269\u30CE\u30FC\u30C9\u300D\u3068\u300C\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u300D\u3060\u3051\u304C\u3042\u308B\u3002\u30BF\u30B9\u30AF\u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u4E2D\u306B\u7F6E\u304F (`add` \u306E\u65E2\u5B9A\u306E\u89AA\u306F\u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9)\n- \u968E\u5C64\u306E\u6DF1\u3055\u306B\u5236\u9650\u306F\u306A\u3044\u3002`split` \u306F\u4F55\u6BB5\u3067\u3082\u4F7F\u3048\u308B\n- \u5225\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u3082\u4F7F\u3048\u305D\u3046\u306A\u30DC\u30C3\u30AF\u30B9 (\u4F8B: \u5165\u529B\u753B\u50CF\u306E\u30E2\u30CE\u30AF\u30ED\u5316) \u306F `npx boxglow export-block <block> --out <\u540D\u524D>.boxglow-block.json` \u3067\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306B\u3057\u3001\n `npx boxglow import-block <path> --parent <block>` \u3067\u633F\u5165\u3059\u308B\u3002\u30EA\u30DD\u30B8\u30C8\u30EA\u306E `boxglow-blocks/` \u306B\u7F6E\u3044\u3066\u5171\u6709\u3057\u3066\u3088\u3044\n\n\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u304C\u591A\u3044\u3068\u304D\u306F `npx boxglow group "<\u30B0\u30EB\u30FC\u30D7\u540D>"` \u3067\u30B0\u30EB\u30FC\u30D7\u3092\u4F5C\u308A\u3001`npx boxglow group-set <\u5165\u529B\u540D> <\u30B0\u30EB\u30FC\u30D7\u540D>` \u3067\u5206\u3051\u308B (\u4F8B: PCIe \u4ED5\u69D8\u66F8 / DDR \u4ED5\u69D8\u66F8)\u3002\n\n### split \u306E JSON \u5F62\u5F0F\n\n```json\n{\n "blocks": [\n { "title": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B", "inputs": ["\u518D\u73FE\u624B\u9806"], "outputs": ["\u8ABF\u67FB\u30E1\u30E2"],\n "expect": "note:\u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u3068\u51E6\u7406\u3001\u6839\u62E0\u3001\u5909\u66F4\u5019\u88DC\u3001\u78BA\u8A8D\u65B9\u6CD5\u3001\u672A\u6C7A\u4E8B\u9805", "acceptance": "\u5909\u66F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3068\u51E6\u7406\u304C\u6C7A\u307E\u308A\u3001\u5F8C\u7D9A\u306E\u30DC\u30C3\u30AF\u30B9\u306B expect \u3068 acceptance \u3092\u8A2D\u5B9A\u3067\u304D\u308B\u3002\u307E\u305F\u306F\u3001\u8A2D\u5B9A\u3067\u304D\u306A\u3044\u7406\u7531\u3068\u5FC5\u8981\u306A\u5224\u65AD\u304C\u5206\u304B\u308B",\n "goal": "\u518D\u73FE\u3057\u3066\u7D4C\u8DEF\u3092\u8FFD\u3046\u3002\u88FD\u54C1\u30B3\u30FC\u30C9\u306E\u4FEE\u6B63\u306F\u4ECA\u56DE\u306E\u7BC4\u56F2\u5916" },\n { "title": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059", "inputs": ["\u8ABF\u67FB\u30E1\u30E2"], "outputs": ["\u4FEE\u6B63"],\n "expect": "file:src/sync/state.ts", "acceptance": "\u4FDD\u5B58\u3092\u4E00\u5EA6\u5931\u6557\u3055\u305B\u3001\u518D\u4FDD\u5B58\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3068\u64CD\u4F5C\u304C\u623B\u308B (\u30C6\u30B9\u30C8\u3067\u78BA\u8A8D)" },\n { "title": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F", "inputs": ["\u4FEE\u6B63"], "outputs": ["\u30CE\u30FC\u30C8"] }\n ],\n "connections": [\n { "from": "parent.\u518D\u73FE\u624B\u9806", "to": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B.\u518D\u73FE\u624B\u9806" },\n { "from": "\u5BFE\u8C61\u7B87\u6240\u3092\u7279\u5B9A\u3059\u308B.\u8ABF\u67FB\u30E1\u30E2", "to": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059" },\n { "from": "\u4FDD\u5B58\u306E\u518D\u8A66\u884C\u5F8C\u306B\u540C\u671F\u72B6\u614B\u3092\u53D6\u308A\u76F4\u3059.\u4FEE\u6B63", "to": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F" },\n { "from": "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8\u3092\u66F8\u304F.\u30CE\u30FC\u30C8", "to": "parent.\u51FA\u529B" }\n ]\n}\n```\n\n`expect` (\u4E88\u5B9A\u6210\u679C\u7269: `"kind:hint"` \u307E\u305F\u306F `{ "kind", "hint" }`)\u3001`acceptance` (\u5B8C\u4E86\u6761\u4EF6)\u3001`goal` (\u4ECA\u56DE\u884C\u3046\u51E6\u7406) \u306F\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051\u306B\u66F8\u304F\u3002\n3 \u3064\u76EE\u306E\u5B50\u306E\u3088\u3046\u306B\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u306E\u5B50\u306F\u300C\u8981\u5177\u4F53\u5316\u300D\u3068\u3057\u3066\u6B8B\u308A\u3001\u7740\u624B\u3059\u308B\u756A\u306B\u306A\u3063\u3066\u304B\u3089 `port --expect` / `scope --acceptance` \u3067\u6C7A\u3081\u308B\u3002\n\u89AA\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B (\u5B50\u306E\u6210\u679C\u3092\u7D71\u5408\u3059\u308B\u306A\u3069) \u306F `"parentMakes": ["\u51FA\u529B\u540D"]` \u3067\u5370\u3092\u4ED8\u3051\u308B (\u5B50\u306E\u7D50\u7DDA\u3068\u91CD\u306A\u308B\u3068\u300C\u62C5\u5F53\u304C\u91CD\u8907\u300D\u3068\u6848\u5185\u3055\u308C\u308B)\u3002\n`"splitBy": "\u5DE5\u7A0B"` \u3067\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9\u3092\u4E00\u8A9E\u3067\u6B8B\u3059 (\u5DE5\u7A0B / \u6210\u679C\u7269 / \u6A5F\u80FD \u306A\u3069\u3002`set <block> --split-by` \u3067\u3082\u66F8\u3051\u308B)\u3002\u540C\u3058\u968E\u5C64\u306E\u5B50\u306F\u540C\u3058\u5206\u3051\u65B9\u30FB\u540C\u3058\u5177\u4F53\u5EA6\u306B\u305D\u308D\u3048\u308B\u3002\n`split` \u304C\u4FDD\u5B58\u3057\u306A\u3044\u306E\u306F\u58CA\u308C\u305F\u69CB\u9020 (\u7D50\u7DDA\u5148\u304C\u7121\u3044\u3001\u5FAA\u74B0\u3001\u5F62\u306E\u9055\u3046 expect) \u3060\u3051\u3002\u5B50\u304C 1 \u500B\u3001\u89AA\u306E\u51FA\u529B\u3092\u4F5C\u308B\u5B50\u304C\u307E\u3060\u7121\u3044\u3001\u3068\u3044\u3063\u305F\u9014\u4E2D\u306E\u5206\u89E3\u306F\u4FDD\u5B58\u3055\u308C\u3001\u4E0D\u8DB3\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u308B\u3002\n\u5206\u89E3\u306E\u5F8C\u3068\u7740\u624B\u306E\u524D\u306B `npx boxglow lint <block>` \u3092\u8AAD\u3080\u3002\u300C\u5FC5\u305A\u76F4\u3059\u300D(\u89AA\u51FA\u529B\u306E\u62C5\u5F53\u306E\u672A\u5B9A\u30FB\u91CD\u8907\u3001\u540C\u3058\u5206\u5C90\u306E\u6392\u4ED6\u306E\u9053\u306E\u4E21\u65B9\u3092\u5FC5\u9808\u306B\u3057\u3066\u3044\u308B\u3001\u4F5C\u696D\u4E2D\u306A\u306E\u306B\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6\u304C\u7121\u3044\u3001\u691C\u67FB\u306E\u5BFE\u8C61\u305D\u306E\u3082\u306E\u306E\u6B20\u843D) \u306F\u76F4\u3057\u3066\u304B\u3089\u9032\u3080\u3002\n\u300C\u7740\u624B\u306E\u524D\u306B\u57CB\u3081\u308B\u300D(\u307E\u3060\u59CB\u3081\u3066\u3044\u306A\u3044\u30DC\u30C3\u30AF\u30B9\u306E\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6) \u306F\u3001\u305D\u306E\u5B50\u306E\u7740\u624B\u306E\u756A\u3067\u57CB\u3081\u308C\u3070\u3088\u3044 (\u5148\u306E\u4ED5\u4E8B\u306E\u5206\u3092\u4ECA\u3001\u5F62\u3060\u3051\u66F8\u304B\u306A\u3044)\u3002\n\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D(\u5B50\u304C 1 \u500B\u3001\u3069\u3053\u306B\u3082\u3064\u306A\u304C\u3089\u306A\u3044\u51FA\u529B\u3001\u5F62\u3060\u3051\u306E\u8A18\u5165\u3001\u9053\u306E\u5148\u304C\u7121\u3044\u5206\u5C90\u3001\u5165\u529B 1 \u672C\u306E\u5408\u6D41\u3001\u5144\u5F1F\u306E\u540C\u3058\u4E88\u5B9A\u6210\u679C\u7269) \u306F\u5185\u5BB9\u3092\u898B\u3066\u5224\u65AD\u3059\u308B (\u6A5F\u68B0\u306F\u62D2\u5426\u3057\u306A\u3044)\u3002`context` \u306B\u3082\u4EF6\u6570\u3068\u4E0A\u4F4D 3 \u4EF6\u304C\u51FA\u308B\u3002\n\n**\u5185\u5BB9\u306E\u30EC\u30D3\u30E5\u30FC (\u610F\u5473\u306F\u6A5F\u68B0\u3067\u306F\u5224\u5B9A\u3067\u304D\u306A\u3044\u306E\u3067\u3001AI \u304B\u4EBA\u304C\u6750\u6599\u3092\u8AAD\u3093\u3067\u8A55\u4FA1\u3057\u3001\u6839\u62E0\u3092\u6B8B\u3059)**\n- \u5206\u89E3\u3057\u305F\u5F8C: `npx boxglow review-split <\u89AA>` \u3067\u6750\u6599 (\u89AA\u306E\u76EE\u7684\u30FB\u5236\u7D04\u30FB\u5B8C\u4E86\u6761\u4EF6\u30FB\u5165\u51FA\u529B\u3001\u5B50\u306E\u5BFE\u8C61\u30FB\u5165\u51FA\u529B\u30FB\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u5B8C\u4E86\u6761\u4EF6\u3001\u7D50\u7DDA) \u3068\u30C1\u30A7\u30C3\u30AF\u9805\u76EE\u3092\u8AAD\u307F\u3001\u8A55\u4FA1\u3057\u305F\u3089 `npx boxglow split-ok <\u89AA> --note "<\u6839\u62E0: \u4F55\u3092\u78BA\u8A8D\u3057\u305F\u304B>"` \u3067\u8A18\u9332\u3059\u308B\u3002\n- \u7740\u624B\u3059\u308B\u524D: `npx boxglow review-box <block>` \u3067\u6750\u6599 (\u5BFE\u8C61\u30FB\u51E6\u7406\u30FB\u4E88\u5B9A\u6210\u679C\u7269\u30FB\u78BA\u8A8D\u65B9\u6CD5\u3001\u5165\u529B\u306E\u4F9B\u7D66\u5143\u3001\u4E0A\u6D41\u306E\u5206\u5C90\u306E\u7B54\u3048) \u3092\u8AAD\u307F\u3001`npx boxglow box-ok <block> --note "<\u6839\u62E0>"` \u3067\u8A18\u9332\u3059\u308B\u3002\n- \u8A18\u9332\u306F\u300C\u8A55\u4FA1\u3057\u305F\u3068\u7533\u544A\u3057\u6839\u62E0\u3092\u6B8B\u3057\u305F\u8A18\u9332\u300D\u3067\u3042\u308A\u3001\u59A5\u5F53\u6027\u306E\u8A3C\u660E\u3067\u306F\u306A\u3044\u3002\u6750\u6599\u304C\u5909\u308F\u308B\u3068 `context` \u306E `reviews` \u304C `stale` (\u4F55\u304C\u5909\u308F\u3063\u305F\u304B\u3068\u3001\u4F55\u3092\u78BA\u8A8D\u3059\u308C\u3070\u3088\u3044\u304B\u306E\u6848\u5185\u3064\u304D) \u306B\u306A\u308B\u3002`stale` \u306F\u300C\u5206\u89E3\u304C\u4E0D\u6B63\u300D\u3067\u306F\u306A\u304F\u300C\u524D\u56DE\u306E\u78BA\u8A8D\u5F8C\u306B\u6750\u6599\u304C\u5909\u308F\u3063\u305F\u300D\u3068\u3044\u3046\u610F\u5473\u3002\u4F4D\u7F6E\u3084\u914D\u8272\u3001\u9032\u6357\u3001\u62C5\u5F53\u306E\u5909\u66F4\u3067\u306F\u53E4\u304F\u306A\u3089\u306A\u3044\u3002\u5206\u89E3\u306E\u8A18\u9332\u306F\u5206\u5C90\u306E\u7B54\u3048\u3067\u306F\u53E4\u304F\u306A\u3089\u305A\u3001\u7740\u624B\u6E96\u5099\u306E\u8A18\u9332\u306F\u7B54\u3048\u304C\u5909\u308F\u308B\u3068\u53E4\u304F\u306A\u308B\u3002\n- \u5148\u306E\u5B50\u3092\u7740\u624B\u306E\u756A\u3067\u5177\u4F53\u5316\u3059\u308B\u3068\u3001\u89AA\u306E\u5206\u89E3\u306E\u8A18\u9332\u306F\u5FC5\u305A `stale` \u306B\u306A\u308B (\u5B50\u306E expect / acceptance \u3082\u6750\u6599\u306E\u305F\u3081)\u3002\u305D\u306E\u5B50\u306E expect\u30FBscope \u3092\u4E00\u901A\u308A\u66F8\u304D\u7D42\u3048\u3066\u304B\u3089\u3001\u5909\u308F\u3063\u305F\u5B50\u3068\u3001\u89AA\u306E\u5B8C\u4E86\u6761\u4EF6\u30FB\u5BFE\u8C61\u5916\u7BC4\u56F2\u30FB\u5144\u5F1F\u3068\u306E\u5206\u62C5\u3078\u306E\u5F71\u97FF\u3060\u3051\u3092\u78BA\u8A8D\u3057\u3001\u6574\u5408\u3059\u308C\u3070 `split-ok <\u89AA> --note "B181 \u306E\u5177\u4F53\u5316\u3092\u78BA\u8A8D\u3002\u89AA\u306E\u5BFE\u8C61\u5916\u7BC4\u56F2\u306B\u5165\u3089\u305A\u3001B182 \u3068\u306E\u5206\u62C5\u306F\u91CD\u8907\u3057\u306A\u3044"` \u306E\u3088\u3046\u306B\u66F4\u65B0\u3059\u308B\u3002port \u3084 scope \u306E\u64CD\u4F5C\u3054\u3068\u306B\u518D\u78BA\u8A8D\u306F\u3057\u306A\u3044\u3002\u8907\u6570\u306E\u5B50\u3092\u540C\u6642\u306B\u5177\u4F53\u5316\u3057\u305F\u3089\u3001\u307E\u3068\u3081\u3066\u78BA\u8A8D\u3057\u3066\u3088\u3044\u3002\n- \u7740\u624B\u306E\u6761\u4EF6\u306B\u306F\u3057\u3066\u3044\u306A\u3044 (\u65E2\u5B9A\u3067\u3082 reject \u306E\u8A08\u753B\u3067\u3082)\u3002`start` \u3092\u6B62\u3081\u308B\u306E\u306F\u8981\u5177\u4F53\u5316\u3068\u5165\u529B\u5F85\u3061\u3060\u3051\u3002\n\n**\u5206\u5C90\u30FB\u5408\u6D41\u3092 AI \u304C\u4F7F\u3046**\n- `ask` \u306B\u9078\u629E\u80A2\u3092\u4ED8\u3051\u305F\u3068\u304D\u3001\u7B54\u3048\u3067\u5F8C\u306E\u4F5C\u696D\u304C\u5206\u304B\u308C\u308B\u306A\u3089 `--branch` \u3092\u4ED8\u3051\u308B: \u305D\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u5206\u5C90\u306B\u306A\u308A\u3001\u9078\u629E\u80A2\u3054\u3068\u306E\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u3002\u5404\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3057\u3001\u9053\u304C\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B `join` \u3092\u7F6E\u304F\u3002\n- `split` \u306E JSON \u3067\u3082\u4F5C\u308C\u308B: \u5B50\u306B `"branch": { "question": "...", "options": ["A", "B"] }` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9 (\u51FA\u529B\u306F\u9078\u629E\u80A2\u306E\u540D\u524D)\u3001`"join": true` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3002\u4F8B:\n `{ "blocks": [{ "title": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B", "branch": { "question": "\u3069\u308C?", "options": ["\u30E1\u30FC\u30EB", "OAuth"] } }, { "title": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5", "outputs": ["\u8A8D\u8A3C"] }, { "title": "OAuth \u3067\u5B9F\u88C5", "outputs": ["\u8A8D\u8A3C"] }, { "title": "\u5408\u6D41", "join": true }], "connections": [{ "from": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B.\u30E1\u30FC\u30EB", "to": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5" }, { "from": "\u8A8D\u8A3C\u65B9\u5F0F\u3092\u6C7A\u3081\u308B.OAuth", "to": "OAuth \u3067\u5B9F\u88C5" }, { "from": "\u30E1\u30FC\u30EB\u3067\u5B9F\u88C5.\u8A8D\u8A3C", "to": "\u5408\u6D41" }, { "from": "OAuth \u3067\u5B9F\u88C5.\u8A8D\u8A3C", "to": "\u5408\u6D41" }, { "from": "\u5408\u6D41.\u5408\u6D41", "to": "parent.\u8A8D\u8A3C" }] }`\n- `lint` \u306F\u3001\u540C\u3058\u5206\u5C90\u306E\u6392\u4ED6\u306E\u9053\u306E\u4E21\u65B9\u3092 1 \u3064\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u5FC5\u9808\u306B\u3057\u3066\u3044\u308B (\u4E21\u65B9\u304C\u5C4A\u304F\u3053\u3068\u306F\u306A\u3044) \u3092\u300C\u5FC5\u305A\u76F4\u3059\u300D\u3001\u9053\u306E\u5148\u304C\u7121\u3044\u30FB\u5408\u6D41\u306E\u5165\u529B\u304C 1 \u672C\u3092\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D\u3068\u3057\u3066\u51FA\u3059\u3002\n`parent.<\u540D\u524D>` \u306F\u5206\u89E3\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u81EA\u8EAB\u306E\u5165\u529B / \u51FA\u529B\u3002`<block>` \u306F\u77ED\u3044 ID (B12 \u306A\u3069\u3002status \u306B\u51FA\u308B) \u304B\u984C\u540D\u3002\n\u51FA\u529B\u306F\u4F5C\u308B\u7269\u3054\u3068\u306B 1 \u672C (1 \u3064\u306E\u4F5C\u696D\u3067\u8907\u6570\u306E\u7269\u304C\u3067\u304D\u308B\u306A\u3089 outputs \u306B\u5168\u90E8\u66F8\u304F\u30022 \u672C\u76EE\u4EE5\u964D\u306E expect \u306F `port <block> --expect "<\u51FA\u529B\u540D>=<kind>:<hint>"`)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F\u540C\u3058\u540D\u524D\u306B\u306A\u308B (\u3069\u3061\u3089\u5074\u3067\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u3082\u5909\u308F\u308B)\u3002\u984C\u540D\u306F\u300C\u4F55\u3092\u4F5C\u308B\u304B\u300D\u304C\u5206\u304B\u308B\u77ED\u3044\u8A00\u8449\u306B\u3059\u308B\u3002\n\u671F\u65E5\u3084\u6642\u9593\u306F `npx boxglow set <block> --due 2026-10-15 --start 2026-10-01 --estimate 8 --hours 3.5` \u3067\u8A18\u9332\u3059\u308B\u3002\n\u30DC\u30C3\u30AF\u30B9\u306B\u306F\u4ED5\u4E8B\u306E\u7A2E\u985E (\u30AB\u30C6\u30B4\u30EA) \u3092\u4ED8\u3051\u308B: `--category design` (\u8A2D\u8A08) / build (\u5B9F\u88C5) / verify (\u691C\u8A3C) / evaluate (\u8A55\u4FA1) / study (\u691C\u8A0E) / research (\u8ABF\u67FB) / ui (\u30C7\u30B6\u30A4\u30F3) / improve (\u6539\u5584) / fix (\u8AB2\u984C\u89E3\u6C7A) / docs (\u6587\u66F8) / ops (\u904B\u7528) / other (\u305D\u306E\u4ED6: \u8FF7\u3063\u305F\u3068\u304D)\u3002add \u306E\u3068\u304D\u306B\u4ED8\u3051\u3001\u5909\u3048\u308B\u306A\u3089 `npx boxglow set <block> --category verify`\u3002\n\u7D50\u7DDA\u306E\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044 (`npx boxglow connect "A.\u8A2D\u8A08\u66F8" "B"` \u3067 B \u306B\u5165\u529B\u300C\u8A2D\u8A08\u66F8\u300D\u304C\u4F5C\u3089\u308C\u3066\u3064\u306A\u304C\u308B\u3002\u968E\u5C64\u304C\u9055\u3063\u3066\u3082\u9014\u4E2D\u306E\u7BB1\u306B\u5165\u51FA\u529B\u3092\u4F5C\u3063\u3066\u901A\u308B\u3002split \u306E connections \u3082 `to: "B"` \u3067\u3088\u3044)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F\u540C\u3058\u540D\u524D\u306B\u306A\u308B (\u3064\u306A\u3044\u3060\u6642\u70B9\u3067\u305D\u308D\u3044\u3001\u3069\u3061\u3089\u5074\u3067\u540D\u524D\u3092\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u304C\u4E00\u7DD2\u306B\u5909\u308F\u308B)\u3002\u65E2\u5B58\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u51FA\u529B\u3092\u8DB3\u3059 / \u540D\u524D\u3092\u5909\u3048\u308B\u306E\u306F `npx boxglow port <block> --in <\u540D\u524D> --out <\u540D\u524D> --remove <\u540D\u524D> --rename <\u65E7>=<\u65B0>` (\u5165\u529B\u3092\u6D88\u3059\u3068\u3001\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B\u3002\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306F `port inputs`\u3002\u9593\u9055\u3048\u305F\u554F\u3044\u306F `npx boxglow unask <block>` \u3067\u53D6\u308A\u4E0B\u3052\u308B) (`project` = \u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u3002\u6700\u7D42\u6210\u679C\u7269\u306E\u540D\u524D\u3082\u3053\u308C\u3067\u5909\u3048\u308B)\u3002\u7DDA\u3092\u5916\u3059\u306E\u306F `npx boxglow disconnect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D.\u5165\u529B\u540D>` (\u968E\u5C64\u3092\u307E\u305F\u3044\u3060\u7DDA\u3082\u4E21\u7AEF\u306E\u540D\u524D\u3067\u5916\u305B\u3001\u9014\u4E2D\u306E\u4E2D\u7D99\u306E\u5165\u51FA\u529B\u3082\u6D88\u3048\u308B)\u3001\u30DC\u30C3\u30AF\u30B9\u305D\u306E\u3082\u306E\u3092\u6D88\u3059\u306E\u306F `npx boxglow remove <block>` (\u4E2D\u306B\u30DC\u30C3\u30AF\u30B9\u304C\u3042\u308C\u3070 `--force`)\u3002MCP \u30C4\u30FC\u30EB (`boxglow_status` / `boxglow_start` / `boxglow_done` / `boxglow_ask` \u306A\u3069\u3002\u5229\u7528\u3059\u308B\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u767B\u9332\u6E08\u307F\u306A\u3089\u4F7F\u3048\u308B\u3002`.mcp.json` \u306F Claude Code \u5411\u3051\u3067\u3001Codex \u306F\u5225\u9014\u767B\u9332\u3059\u308B) \u306F\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u306E\u5225\u306E\u5165\u53E3\u3067\u3001\u3069\u3061\u3089\u3067\u66F8\u3044\u3066\u3082\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u304C\u66F4\u65B0\u3055\u308C\u308B\u3002\u8A08\u753B\u306E\u6587\u66F8\u306F `npx boxglow export --out docs/ROADMAP.md`\u3002\n**\u5168\u4F53\u306B\u52B9\u304F\u6C7A\u5B9A\u306F\u65B9\u91DD\u306B\u3059\u308B**: \u6280\u8853\u9078\u5B9A\u30FB\u4F7F\u3046\u30A8\u30F3\u30B8\u30F3\u30FB\u753B\u98A8\u306E\u6C7A\u307E\u308A\u306A\u3069\u3001\u591A\u304F\u306E\u7BB1\u306B\u52B9\u304F\u6C7A\u5B9A\u3092\u51FA\u529B\u306B\u6301\u3064\u7BB1\u306F\u3001\u305D\u306E\u51FA\u529B\u3092\u65B9\u91DD\u306B\u3059\u308B (`npx boxglow port <block> --policy "<\u51FA\u529B\u540D>"`\u3002\u7BC4\u56F2\u306F\u65E2\u5B9A\u3067\u540C\u3058\u89AA\u306E\u4E2D\u3001`--policy-scope all` \u3067\u8A08\u753B\u5168\u4F53\u3001`--advisory` \u3067\u53C2\u8003)\u3002\u7DDA\u3092\u5F15\u304B\u305A\u306B\u7BC4\u56F2\u306E\u7BB1\u3059\u3079\u3066\u3078\u5C4A\u304D\u3001\u6C7A\u307E\u308B\u307E\u3067\u7BC4\u56F2\u306E\u672A\u7740\u624B\u306E\u7BB1\u306F\u300C\u65B9\u91DD\u5F85\u3061\u300D\u306B\u306A\u308B (\u9032\u3081\u3066\u3044\u308B\u7BB1\u306F\u6B62\u307E\u3089\u306A\u3044)\u3002`context` \u306E `policies` \u306B\u4E2D\u8EAB\u304C\u51FA\u308B\u306E\u3067\u3001\u4F5C\u696D\u306E\u524D\u306B\u8AAD\u3080\u3002\u95A2\u4FC2\u306A\u3044\u7BB1\u306F `--skip-policy "<\u7BB1>.<\u51FA\u529B\u540D>"` \u3067\u5916\u3059\u3002\u5B8C\u4E86\u5F8C\u306B\u65B9\u91DD\u304C\u5909\u308F\u308B\u3068 `policyChanged` \u306B\u51FA\u308B (\u78BA\u304B\u3081\u76F4\u3059)\u30021 \u672C\u305A\u3064\u7DDA\u3067\u3064\u306A\u304C\u306A\u3044\u3002\n\n\u65B0\u3057\u3044\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u306F\u3001\u65B9\u91DD (README \u3084\u4F9D\u983C\u6587) \u304B\u3089\u6700\u4E0A\u4F4D\u306E\u5927\u9805\u76EE 3\u301C7 \u500B\u3092\u5148\u306B\u4F5C\u308A\u3001\u4EBA\u306B `ask` \u3067\u78BA\u8A8D\u3057\u3066\u304B\u3089\u3001\u7740\u624B\u3059\u308B\u5927\u9805\u76EE\u3060\u3051\u3092 `split` \u3067\u5206\u89E3\u3059\u308B (\u5148\u306E\u6BB5\u968E\u306F\u7C97\u3044\u307E\u307E)\u3002`ask` \u306E\u8CEA\u554F\u306F\u305D\u308C\u3060\u3051\u3067\u5224\u65AD\u3067\u304D\u308B\u3088\u3046\u306B\u66F8\u304D\u3001\u524D\u63D0\u30FB\u6BD4\u8F03\u30FB\u5F71\u97FF\u306F `--context` \u306B\u5165\u308C\u308B (\u300C\u3053\u308C\u3067\u3088\u3044\u3067\u3059\u304B\u300D\u306E\u3088\u3046\u306B\u5916\u3092\u6307\u3055\u306A\u3044)\u3002\u5019\u88DC\u304B\u3089 1 \u3064\u3092\u9078\u3076\u5834\u9762\u3067\u306F\u3001\u81EA\u5206\u3067\u6C7A\u3081\u308B\u3068\u304D\u3082 `ask ... --options "A|B|C"` \u3068 `answer --by <\u81EA\u5206>` \u3067\u8A18\u9332\u3057\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u5019\u88DC\u3092\u6B8B\u3059\u3002\u65B9\u91DD\u8EE2\u63DB\u306F `reopen <block> --note <\u7406\u7531>`\u3002\u3059\u3079\u3066 CLI \u3060\u3051\u3067\u6210\u7ACB\u3059\u308B (\u753B\u9762\u306F\u4EBA\u304C\u898B\u308B\u305F\u3081\u306E\u3082\u306E)\u3002\u4EBA\u304C\u3044\u306A\u3044\u904B\u7528\u306A\u3089\u3001AI \u304C `answer --by <\u81EA\u5206>` \u3067\u5224\u65AD\u3092\u8A18\u9332\u3057\u3066\u9032\u3081\u308B\u3002\n\u51FA\u529B\u306E\u540D\u524D\u306F\u300C\u5177\u4F53\u7684\u306A\u6210\u679C\u7269\u300D\u306B\u3059\u308B (\u4F8B: `\u8A2D\u8A08\u66F8 docs/design.md`\u3001`PR #12`\u3001`\u516C\u958B URL`\u3001`\u30C6\u30B9\u30C8\u7D50\u679C (vitest 53 \u4EF6)`)\u3002\u300C\u6A5F\u80FD\u4E00\u5F0F\u300D\u300C\u6240\u898B\u300D\u306E\u3088\u3046\u306A\u62BD\u8C61\u7684\u306A\u540D\u524D\u306F\u907F\u3051\u3001done \u306E\u3068\u304D\u306F\u5FC5\u305A --artifact \u3067\u30D5\u30A1\u30A4\u30EB\u30FBURL\u30FB\u30B3\u30DF\u30C3\u30C8\u3092\u4ED8\u3051\u308B\u3002\n\u3059\u3079\u3066\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5165\u529B \u2192 \u51FA\u529B\u300D\u304C\u4F55\u304B\u306B\u3064\u306A\u304C\u3063\u3066\u3044\u308B\u3088\u3046\u306B\u3059\u308B (\u3064\u306A\u304C\u3063\u3066\u3044\u306A\u3044\u30DC\u30C3\u30AF\u30B9\u306F\u8A08\u753B\u306E\u7A74\u3002\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u30CE\u30FC\u30C9\u306F\u3001\u672A\u63A5\u7D9A\u306E\u5165\u529B\u304C\u81EA\u52D5\u3067\u4E0A\u304C\u308B)\u3002\n\u8907\u6570\u4EBA\u3067\u540C\u3058 boxglow.json \u3092\u7DE8\u96C6\u3059\u308B\u306A\u3089\u3001\u5404\u81EA\u306E clone \u3067\u4E00\u5EA6 `npx boxglow git-setup` \u3092\u5B9F\u884C\u3059\u308B (\u30DC\u30C3\u30AF\u30B9\u306E\u5358\u4F4D\u3067\u81EA\u52D5\u30DE\u30FC\u30B8\u3055\u308C\u3001\u5225\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5909\u66F4\u306F\u885D\u7A81\u3057\u306A\u3044)\u3002\n\u8907\u6570\u30EA\u30DD\u30B8\u30C8\u30EA\u3092 1 \u3064\u306E\u8A08\u753B\u3067\u7BA1\u7406\u3059\u308B\u3068\u304D\u306F\u3001boxglow.json \u3092\u4E0A\u306E\u30D5\u30A9\u30EB\u30C0\u306B\u7F6E\u304D\u3001\u5404\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u306F\u74B0\u5883\u5909\u6570 BOXGLOW_FILE \u306B\u305D\u306E\u5834\u6240\u3092\u5165\u308C\u308B (\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u30EA\u30DD\u30B8\u30C8\u30EA\u3054\u3068\u306B 1 \u3064\u3002`npx boxglow project "\u540D\u524D" --repo <\u30D1\u30B9>`)\u3002\n\u5165\u529B\u306F\u65E2\u5B9A\u3067\u5FC5\u9808\u3002\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B\u5165\u529B\u306F `npx boxglow port <block> --optional <\u5165\u529B\u540D>` \u3067\u300C\u4EFB\u610F\u300D\u306B\u3059\u308B (\u623B\u3059\u306E\u306F `--required`)\u3002\u5165\u51FA\u529B\u306E\u8AAC\u660E\u306F `--describe "<\u540D\u524D>=<\u8AAC\u660E>"`\u3002status \u306E\u300C\u6B21\u306E\u5019\u88DC\u300D\u306F\u5FC5\u9808\u306E\u5165\u529B\u304C\u305D\u308D\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304B\u3089\u4E26\u3076 (\u300C\u7740\u624B\u3067\u304D\u308B\u300D/\u300C\u5FC5\u9808\u306E\u5165\u529B\u5F85\u3061\u300D\u304C\u4ED8\u304F)\u3002\u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B (Inputs) \u306B\u8CC7\u6599 (\u4ED5\u69D8\u66F8\u30FB\u30B7\u30CA\u30EA\u30AA\u306A\u3069\u306E\u30D5\u30A1\u30A4\u30EB\u3084 URL) \u304C\u7121\u3044\u3068\u3001\u305D\u308C\u3092\u4F7F\u3046\u7BB1\u306F\u3059\u3079\u3066\u5165\u529B\u5F85\u3061\u306B\u306A\u308B\u3002\u8CC7\u6599\u304C\u624B\u5143\u306B\u3042\u308C\u3070\u3001\u4EBA\u306B\u983C\u307E\u305A\u306B `npx boxglow artifact inputs <\u30D1\u30B9\u304B URL> --input <\u5165\u529B\u540D>` (MCP \u306F `boxglow_artifact` \u306B block: "inputs") \u3067\u81EA\u5206\u3067\u4ED8\u3051\u308B\u3002\u4F5C\u308A\u304B\u3051\u306E\u8CC7\u6599 (\u5BF8\u6CD5\u304C\u672A\u78BA\u5B9A\u306E\u30C7\u30B6\u30A4\u30F3\u306A\u3069) \u306F\u3001\u4ED8\u3051\u305A\u306B\u304A\u304F\u306E\u3067\u3082\u5B8C\u6210\u6271\u3044\u3067\u4ED8\u3051\u308B\u306E\u3067\u3082\u306A\u304F\u3001`npx boxglow artifact <block> <\u30D1\u30B9> --draft` \u3067\u300C\u4F5C\u6210\u4E2D\u300D\u3068\u3057\u3066\u51FA\u529B\u306B\u4ED8\u3051\u308B\u3002\u4F7F\u3046\u5074\u306E\u7BB1\u306F\u5F85\u3063\u305F\u307E\u307E\u3060\u304C\u3001\u4F5C\u308A\u304B\u3051\u3067\u59CB\u3081\u3066\u3088\u3044\u5165\u529B\u306A\u3089\u4F7F\u3046\u5074\u3067 `npx boxglow port <block> --accept-draft <\u5165\u529B\u540D>` \u306B\u3059\u308B\u3068\u7740\u624B\u3067\u304D\u308B (\u4EBA\u306B\u78BA\u304B\u3081\u305F\u3044\u3068\u304D\u306F ask \u3067\u805E\u304F)\u3002\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u306F\u3001\u305D\u306E\u7BB1\u3092 done \u306B\u3059\u308B\u3068\u78BA\u5B9A\u306B\u306A\u308B (\u9014\u4E2D\u3067\u78BA\u5B9A\u3059\u308B\u306A\u3089 `artifact <block> --final <\u984C\u540D>`)\u3002\u4F7F\u3046\u5074\u306B\u6E21\u3055\u306A\u3044\u53C2\u8003\u8CC7\u6599\u306F `--link` \u3067\u7BB1\u306E\u53C2\u8003\u8CC7\u6599\u306B\u4ED8\u3051\u308B\u3002\u9593\u9055\u3048\u3066\u4ED8\u3051\u305F\u6210\u679C\u7269\u30FB\u8CC7\u6599\u306F `npx boxglow artifact <block|inputs> --remove <\u984C\u540D\u304B\u30D1\u30B9>` \u3067\u5916\u3059\u3002\u6E08\u3093\u3060\u7BB1\u306B\u300C\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057\u300D\u304C\u4ED8\u3044\u305F\u3089\u3001\u4F5C\u696D\u304C\u65B9\u91DD\u306B\u5408\u3063\u3066\u3044\u308B\u304B\u3092\u78BA\u304B\u3081\u3001\u5408\u3063\u3066\u3044\u308C\u3070 `npx boxglow ack <block> --policy` \u3067\u5370\u3092\u6D88\u3059 (\u5408\u3063\u3066\u3044\u306A\u3051\u308C\u3070 reopen \u3057\u3066\u76F4\u3059)\u3002\n\u5165\u529B\u306E\u8AAC\u660E\u306F\u66F8\u304B\u306A\u3044 (\u3064\u306A\u304C\u3063\u305F\u51FA\u529B\u5074\u306E\u8AAC\u660E\u304C\u4F7F\u308F\u308C\u308B)\u3002\u51FA\u529B\u306E\u8AAC\u660E\u306B\u5F62\u5F0F\u30FB\u5236\u7D04\u3092\u66F8\u304F\u3002\n\n\n### \u81EA\u52D5\u3067\u52D5\u304F\u4ED5\u7D44\u307F (hooks)\n\n`setup-agent` \u306F Claude Code / Codex \u306E hooks \u306B `boxglow hook` \u3092\u767B\u9332\u3059\u308B\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u958B\u59CB\u30FB\u518D\u958B\u30FB\u5727\u7E2E\u306E\u5F8C\u306B\u306F\u8A08\u753B\u306E\u518D\u958B\u306E\u6982\u8981 (resume) \u304C\u81EA\u52D5\u3067\u6587\u8108\u306B\u5165\u308B\u3002\u5FDC\u7B54\u3092\u7D42\u3048\u308B\u3068\u304D\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 start \u3057\u305F\u7BB1\u306B\u5F15\u304D\u7D99\u304E (done \u304B checkpoint) \u304C\u7121\u3051\u308C\u3070\u300C\u8A18\u9332\u3057\u3066\u304B\u3089\u7D42\u3048\u308B\u300D\u3088\u3046\u7D9A\u884C\u304C\u6307\u793A\u3055\u308C\u308B (log \u306F\u9032\u6357\u306E\u30E1\u30E2\u3067\u3001\u5F15\u304D\u7D99\u304E\u306E\u4EE3\u308F\u308A\u306B\u306A\u3089\u306A\u3044)\u3002boxglow.json \u3092 Edit / Write / apply_patch \u3067\u76F4\u63A5\u66F8\u304D\u63DB\u3048\u308B\u64CD\u4F5C\u306F\u6B62\u3081\u3089\u308C\u308B (CLI \u304B MCP \u3067\u66F4\u65B0\u3059\u308B)\u3002\u3053\u308C\u3089\u306F\u6307\u793A\u306E\u4EE3\u308F\u308A\u3067\u306F\u306A\u304F\u3001\u5FD8\u308C\u305F\u3068\u304D\u306E\u4FDD\u967A\u306A\u306E\u3067\u3001\u4E0A\u306E\u624B\u9806\u3069\u304A\u308A\u306B\u81EA\u5206\u3067\u8A18\u9332\u3059\u308B\u3002\n\n### \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\n\n\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u306F\u3001AI \u304C\u53E4\u3044\u6307\u793A\u306E\u307E\u307E\u4F5C\u696D\u3092\u9032\u3081\u308B\u306E\u3092\u9632\u3050\u4ED5\u7D44\u307F\u3002`setup-agent` \u304C\u6709\u52B9\u306B\u3059\u308B (\u305D\u308C\u4EE5\u5916\u306E\u8A08\u753B\u3067\u306F `npx boxglow guard on`)\u3002\n\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001AI \u306E `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` \u306B `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u304C\u8981\u308B\u3002\u4EBA\u306E\u64CD\u4F5C (`--actor human`) \u306B\u306F\u8981\u6C42\u3055\u308C\u306A\u3044\u3002\n\n```\nnpx boxglow context B12 # \u5224\u65AD (\u5F15\u304D\u53D6\u308A\u6E08\u307F\u306E\u56DE\u7B54\u3092\u542B\u3080)\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E contextToken \u304C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\nnpx boxglow start B12 --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\nnpx boxglow ask B12 "<\u8CEA\u554F>" --options "A|B" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n# \u2192 \u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C: \u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\nnpx boxglow done B12 --artifact "<\u540D\u524D>=<\u30D1\u30B9>" --context-token <\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n```\n\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u308B\u5834\u5408 (\u8AAD\u307F\u76F4\u3057\u304C\u8981\u308B)**: \u4EBA\u304C\u56DE\u7B54\u3057\u305F\u30FB\u56DE\u7B54\u3092\u76F4\u3057\u305F\u3001\u4EBA\u304C\u6307\u793A (\u984C\u540D\u30FB\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6) \u3092\u5909\u3048\u305F\u3001\u4ED6\u306E AI \u3084\u4EBA\u304C\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u66F4\u65B0\u3057\u305F\u3002\u89AA\u3084\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u8D77\u304D\u305F\u5834\u5408\u3082\u540C\u3058\u3002\u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u62D2\u5426\u3055\u308C\u308B\u306E\u3067\u3001`context` \u3092\u8AAD\u307F\u76F4\u3057\u3001\u5909\u308F\u3063\u305F\u5185\u5BB9\u3092\u4F5C\u696D\u306B\u53CD\u6620\u3057\u3066\u304B\u3089\u3084\u308A\u76F4\u3059\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u3089\u306A\u3044\u5834\u5408**: `start` / `blocked` / `review` / `leave` / `ack`\u3001\u9032\u6357\u30FB\u72B6\u614B\u30FB\u671F\u65E5\u30FB\u30AB\u30C6\u30B4\u30EA\u306E\u5909\u66F4\u3001`check` \u306B\u3088\u308B\u6210\u679C\u7269\u306E\u78BA\u8A8D\u3001\u753B\u9762\u3067\u306E\u914D\u7F6E\u306E\u5909\u66F4\u3002\u540C\u3058\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4F7F\u3044\u7D9A\u3051\u3089\u308C\u308B\n- **\u81EA\u5206\u3067\u66F4\u65B0\u3067\u304D\u308B\u5834\u5408**: \u81EA\u5206\u306E `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` \u306A\u3069\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5909\u308F\u3063\u305F\u3068\u304D\u306F\u3001\u305D\u306E\u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u308B\u3002\u81EA\u5206\u3067\u5909\u3048\u305F\u5185\u5BB9\u306F\u5206\u304B\u3063\u3066\u3044\u308B\u306E\u3067\u3001\u8AAD\u307F\u76F4\u3055\u305A\u306B\u6B21\u306E\u64CD\u4F5C\u3078\u4F7F\u3046\u3002`ask` / `decision` / `answer` / `reopen` \u306F\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u7121\u3057\u3067\u3082\u5B9F\u884C\u3067\u304D\u308B\u304C\u3001\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4ED8\u3051\u305F\u3068\u304D\u3060\u3051\n- **\u6700\u521D\u306F\u77ED\u3044\u5F62\u3067\u8AAD\u3080**: `npx boxglow context <block> --brief` \u306F\u3001\u5BFE\u8C61\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u60C5\u5831 (\u8AAC\u660E\u30FB\u7BC4\u56F2\u30FB\u5224\u65AD\u30FB\u5F15\u304D\u7D99\u304E\u30FB\u5165\u51FA\u529B\u30FB\u6210\u679C\u7269) \u306F\u5168\u90E8\u3001\u8A08\u753B\u5168\u4F53\u306E\u8AAC\u660E\u3001\u89AA\u3068\u5165\u529B\u5143\u306E\u984C\u540D\u30FB\u72B6\u614B\u30FB\u5224\u65AD (\u6750\u6599\u3068\u9078\u629E\u80A2\u3064\u304D\u3002\u524D\u306E\u56DE\u7B54\u306E\u5C65\u6B74\u306F\u7701\u304F)\u30FB\u5BFE\u8C61\u306B\u3064\u306A\u304C\u308B\u51FA\u529B\u3092\u51FA\u3059\u3002\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F `--brief` \u306A\u3057\u3068\u540C\u3058\u306A\u306E\u3067\u3001\u305D\u306E\u307E\u307E `--context-token` \u306B\u4F7F\u3048\u308B\u3002`target.missingInputs` (\u4E0D\u8DB3\u3057\u3066\u3044\u308B\u5FC5\u9808\u306E\u5165\u529B) \u3068 `target.inputs[].sources` (\u3069\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u3069\u306E\u51FA\u529B\u304B\u30FB\u6210\u679C\u7269\u306E\u53C2\u7167) \u3092\u5148\u306B\u898B\u308B\u3002`omitted` \u306B\u7701\u3044\u305F\u4EF6\u6570\u304C\u51FA\u308B\u3002\u7701\u304B\u308C\u305F\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u304C\u4F5C\u696D\u306B\u95A2\u308F\u308A\u305D\u3046\u306A\u3089\u3001`--brief` \u306A\u3057\u3067\u8AAD\u3080\u304B\u3001\u305D\u306E\u30DC\u30C3\u30AF\u30B9\u306E `context` \u3092\u8AAD\u3080\n- **\u77ED\u3044\u5F62\u3067\u59CB\u3081\u308B\u524D\u63D0**: \u7BC4\u56F2 (scope) \u3092 1 \u9805\u76EE\u3067\u3082\u8A2D\u5B9A\u3057\u305F\u89AA\u30FB\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8AAC\u660E\u306F\u3001\u77ED\u3044\u5F62\u3067\u306F\u7701\u304B\u308C\u308B (`omitted.descriptions` \u306B\u4EF6\u6570)\u3002\u7BC4\u56F2\u3092\u8A2D\u5B9A\u3059\u308B\u3068\u304D\u306F\u3001\u8AAC\u660E\u306B\u66F8\u3044\u305F\u5236\u7D04 (\u4E92\u63DB\u6027\u30FB\u7981\u6B62\u4E8B\u9805\u30FB\u671F\u9650\u306A\u3069) \u3092\u7BC4\u56F2\u3078\u5199\u3057\u7D42\u3048\u3066\u304B\u3089\u306B\u3059\u308B\u3002\u5199\u3057\u305F\u304B\u5206\u304B\u3089\u306A\u3044\u8A08\u753B\u30FB`omitted.descriptions` \u304C 0 \u3067\u306A\u3044\u8A08\u753B\u3067\u306F\u3001\u7740\u624B\u524D\u306B `--brief` \u306A\u3057\u3067 1 \u5EA6\u8AAD\u3080\u3002\u77ED\u3044\u5F62\u306F\u8ABF\u67FB\u306E\u51FA\u767A\u70B9\u3067\u3001\u305D\u308C\u3060\u3051\u8AAD\u3081\u3070\u5341\u5206\u3068\u3044\u3046\u4FDD\u8A3C\u3067\u306F\u306A\u3044\n- \u77ED\u3044\u5F62\u3067\u3082\u7528\u304C\u8DB3\u308A\u308B\u3088\u3046\u306B\u66F8\u304F: \u4F5C\u696D\u3092\u7E1B\u308B\u6761\u4EF6\u306F\u8AAC\u660E\u306E\u4E2D\u306B\u57CB\u3081\u305A\u306B scope (non-goals / constraints / acceptance / consult) \u306B\u66F8\u304F\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306F\u6700\u65B0\u306E 1 \u4EF6\u3060\u3051\u304C\u6B8B\u308B\u306E\u3067\u3001\u672A\u89E3\u6C7A\u306E\u70B9\u30FB\u6CE8\u610F\u70B9\u30FB\u6B21\u306E\u624B\u9806\u3092\u6BCE\u56DE\u66F8\u304D\u76F4\u3057\u3066\u6301\u3061\u8D8A\u3059\u3002\u8ABF\u3079\u59CB\u3081\u308B\u5834\u6240\u306F\u3001\u5BFE\u8C61\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8AAC\u660E\u306B\u6B21\u306E\u5F62\u3067\u66F8\u304F (\u51FA\u767A\u70B9\u3067\u3042\u308A\u3001\u305D\u306E\u30D5\u30A1\u30A4\u30EB\u3060\u3051\u8AAD\u3081\u3070\u8DB3\u308A\u308B\u3068\u3044\u3046\u610F\u5473\u3067\u306F\u306A\u3044):\n `\u5909\u66F4\u5019\u88DC: <\u30D1\u30B9> \u2014 <\u8ABF\u3079\u59CB\u3081\u308B\u7406\u7531>` / `\u95A2\u9023\u691C\u67FB: <\u30D1\u30B9\u307E\u305F\u306F\u30B3\u30DE\u30F3\u30C9> \u2014 <\u78BA\u304B\u3081\u308B\u3053\u3068>`\n- \u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u901A\u3059\u305F\u3081\u306B guard \u3092\u7121\u52B9\u306B\u3057\u306A\u3044 (AI \u304C `guard off` \u3059\u308B\u306B\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u8981\u308B)\n- MCP \u3067\u306F `boxglow_context` \u3068\u3001\u5404\u30C4\u30FC\u30EB\u306E `contextToken` \u5F15\u6570\u3092\u4F7F\u3046 (\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u30C4\u30FC\u30EB\u306E\u7D50\u679C\u306E\u6700\u5F8C\u306E\u884C\u306B\u51FA\u308B)\n- \u300C\u4ED6\u306E Boxglow \u304C\u66F8\u304D\u8FBC\u307F\u4E2D (\u30ED\u30C3\u30AF\u4E2D)\u300D\u3068\u51FA\u3066\u3001\u5C11\u3057\u5F85\u3063\u3066\u3084\u308A\u76F4\u3057\u3066\u3082\u89E3\u3051\u306A\u3044\u3068\u304D\u306F\u3001`npx boxglow unlock` \u306E\u8868\u793A (\u6301\u3061\u4E3B\u3068\u5224\u5B9A) \u3092\u4EBA\u306B\u898B\u305B\u3066\u89E3\u9664\u3092\u983C\u3080\u3002\u81EA\u5206\u3067 `--actor human` \u3092\u4ED8\u3051\u305F\u308A\u3001\u30ED\u30C3\u30AF\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u76F4\u63A5\u6D88\u3057\u305F\u308A\u3057\u306A\u3044\n\n### \u7740\u624B\u30FB\u5B8C\u4E86\u3001\u4ECA\u56DE\u306E\u7BC4\u56F2\u3001\u8A18\u9332\u306E\u9BAE\u5EA6\n\n- \u6700\u521D\u306B resume \u306E\u73FE\u6CC1 (\u6D3B\u52D5\u30FB\u5224\u65AD\u5F85\u3061\u30FB\u672A\u78BA\u8A8D\u56DE\u7B54) \u3092\u8AAD\u3080\u3002\u5019\u88DC\u306F\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2 / \u305D\u306E\u4ED6\u300D\u306E\u5404\u7D44\u3067\u300C\u7740\u624B\u3067\u304D\u308B / \u8981\u5177\u4F53\u5316 / \u5165\u529B\u5F85\u3061\u300D\u306B\u5206\u304B\u308C\u3001\u8981\u5177\u4F53\u5316\u306E\u7406\u7531\u3068\u4E0D\u8DB3\u3059\u308B\u5165\u529B\u540D\u304C\u51FA\u308B\u3002\u8981\u5177\u4F53\u5316\u3084\u5165\u529B\u5F85\u3061\u3092\u3001\u6E96\u5099\u6E08\u307F\u3068\u53D6\u308A\u9055\u3048\u306A\u3044\u3002\n- \u300C\u7740\u624B\u3067\u304D\u308B\u300D(Ready) \u306F\u3001\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u304C\u3042\u308A\u3001\u305D\u306E\u4E88\u5B9A\u6210\u679C\u7269 (expect) \u3068\u5B8C\u4E86\u6761\u4EF6 (acceptance) \u304C\u66F8\u304B\u308C\u3001\u5FC5\u9808\u306E\u5165\u529B\u304C\u305D\u308D\u3063\u3066\u3044\u308B\u3001\u3068\u3044\u3046\u6A5F\u68B0\u691C\u67FB\u306E\u7D50\u679C\u3002\u5185\u5BB9\u304C\u5177\u4F53\u7684\u304B\u3069\u3046\u304B\u307E\u3067\u306F\u4FDD\u8A3C\u3057\u306A\u3044 (`expect = src/`\u3001`acceptance = \u52D5\u4F5C\u3059\u308B` \u3067\u3082\u901A\u308B)\u3002\u5BFE\u8C61\u30FB\u51E6\u7406\u30FB\u6210\u679C\u30FB\u78BA\u8A8D\u65B9\u6CD5\u3092\u7B2C\u4E09\u8005\u304C\u8FFD\u3048\u308B\u3088\u3046\u306B\u66F8\u304F\u3002\n- \u30DC\u30C3\u30AF\u30B9\u306E\u4EFB\u610F5\u9805\u76EE\u3092 scope \u3067\u8A2D\u5B9A\u3059\u308B\u3002goal = \u4ECA\u56DE\u9054\u6210\u3059\u308B\u3053\u3068\u3001non-goals = \u4ECA\u56DE\u306F\u6271\u308F\u306A\u3044\u3053\u3068\u3001acceptance = \u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6\u3001consult = \u7BC4\u56F2\u3092\u5E83\u3052\u308B\u524D\u306B\u76F8\u8AC7\u3059\u308B\u6761\u4EF6\u3002context \u306E\u5148\u982D\u3067\u5BFE\u8C61\u3068\u89AA\u306E\u7BC4\u56F2\u3092\u8AAD\u307F\u3001\u7740\u624B\u524D\u3068\u5B8C\u4E86\u524D\u306B\u7167\u5408\u3059\u308B\u3002\u5B8C\u4E86\u6761\u4EF6\u306E\u672C\u6587\u3092AI\u304C\u6E80\u305F\u3057\u305F\u304B\u306F\u81EA\u52D5\u5224\u5B9A\u3057\u306A\u3044\u3002\n- scope B12 --goal "\u9054\u6210\u3059\u308B\u3053\u3068" --non-goals "\u4ECA\u56DE\u6271\u308F\u306A\u3044\u3053\u3068" --acceptance "\u78BA\u8A8D\u3059\u308B\u6761\u4EF6" --consult "\u76F8\u8AC7\u3059\u308B\u6761\u4EF6" \u3067\u8A2D\u5B9A\u3059\u308B\u3002scope B12 \u306F\u8868\u793A\u3060\u3051\u3002\u5404\u9805\u76EE\u306B none \u307E\u305F\u306F\u7A7A\u6587\u5B57\u3092\u6E21\u3059\u3068\u6D88\u3059\u3002\u753B\u9762\u3067\u306F\u8A73\u7D30\u30D1\u30CD\u30EB\u306E\u300C\u305D\u306E\u4ED6\u300D\u30BF\u30D6 \u2192\u300C\u4F5C\u696D\u7BC4\u56F2\u3092\u7DE8\u96C6\u300D\u3002\u8A18\u5165\u6E08\u307F\u306E\u9805\u76EE\u3060\u3051\u304C\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2\u300D\u306B\u51FA\u308B\u3002\n- focus B12 \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3068\u914D\u4E0B\u3092\u6B21\u5019\u88DC\u306E\u5148\u982D\u306B\u3059\u308B\u3002focus \u306F\u73FE\u5728\u306E\u5BFE\u8C61\u306E\u8868\u793A\u3001focus none \u306F\u89E3\u9664\u3002\u5BFE\u8C61\u5916\u3082\u5225\u306E\u7D44\u306B\u6B8B\u308B\u3002\u5019\u88DC\u306B\u51FA\u308B\u3053\u3068\u81EA\u4F53\u306F\u4F5C\u696D\u7BC4\u56F2\u306E\u62E1\u5927\u3084\u516C\u958B\u3092\u8A31\u53EF\u3057\u306A\u3044\u3002\n- start \u306E\u5FC5\u9808\u5165\u529B\u4E0D\u8DB3\u306F\u65E2\u5B9A\u3067\u8B66\u544A\u3059\u308B\u304C\u3001\u5F93\u6765\u3069\u304A\u308A\u958B\u59CB\u3067\u304D\u308B\u3002\u5148\u884C\u4F5C\u696D\u304C\u5FC5\u8981\u306A\u3089 --reason "\u5148\u306B\u884C\u3046\u7406\u7531" \u3092\u4ED8\u3051\u308B\u3002\u8B66\u544A\u306F\u51FA\u305A\u3001\u7406\u7531\u306F\u6D3B\u52D5\u3068\u30ED\u30B0\u306B\u6B8B\u308B\u3002done \u306E\u51FA\u529B\u6210\u679C\u7269\u306A\u3057\u3082\u65E2\u5B9A\u3067\u8B66\u544A\u306E\u307F\u3002\u65E2\u5B58\u306E\u51FA\u529B\u6210\u679C\u7269\u307E\u305F\u306F --artifact \u3092\u6570\u3048\u3001\u30DC\u30C3\u30AF\u30B9\u306E\u53C2\u8003\u8CC7\u6599\u306F\u6570\u3048\u306A\u3044\u3002\n- \u8A08\u753B\u3067\u9078\u3076\u5834\u5408\u3060\u3051 policy --start reject --done reject --unprepared reject \u306B\u3059\u308B\u3002\u305D\u308C\u305E\u308C warn \u306B\u623B\u305B\u308B\u3002\u5165\u529B\u5F85\u3061\u306E\u62D2\u5426\u3067\u3082\u7406\u7531\u4ED8\u304D\u306E\u958B\u59CB\u306F\u53EF\u80FD\u3060\u304C\u3001\u8981\u5177\u4F53\u5316\u306E\u62D2\u5426\u306F\u7406\u7531\u3067\u306F\u901A\u308C\u306A\u3044 (\u5148\u306B\u5177\u4F53\u5316\u3059\u308B)\u3002\u6210\u679C\u7269\u306A\u3057\u306E\u62D2\u5426\u306F set --status white \u306B\u3082\u52B9\u304F\u3002\u4EBA\u306E\u64CD\u4F5C (\u753B\u9762 / --actor human) \u306F\u62D2\u5426\u3057\u306A\u3044\u3002AI\u304C\u62D2\u5426\u3092\u907F\u3051\u308B\u305F\u3081\u306B\u4EBA\u3092\u540D\u4E57\u3063\u305F\u308A\u3001\u8A2D\u5B9A\u3092\u5F31\u3081\u305F\u308A\u3057\u306A\u3044\u3002\n- guard \u6709\u52B9\u6642\u3001scope \u306E\u5909\u66F4\u3001focus \u306E\u8A2D\u5B9A\u30FB\u89E3\u9664\u3001policy \u306E\u5909\u66F4\u306B\u3082 --context-token \u304C\u5FC5\u8981\u3002scope/focus/policy \u3092\u5909\u3048\u308B\u3068\u65B0\u3057\u3044\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u3067\u3001\u6B21\u306E\u64CD\u4F5C\u306F\u305D\u308C\u3092\u4F7F\u3046\u3002\u8868\u793A\u3060\u3051\u306B\u306F\u4E0D\u8981\u3002\n- resume \u306F\u5B8C\u4E86\u6E08\u307F\u306E\u5F15\u304D\u7D99\u304E\u672C\u6587\u3092\u96A0\u3057\u3001\u4EF6\u6570\u3060\u3051\u793A\u3059\u3002\u5C65\u6B74\u304C\u5FC5\u8981\u306A\u5834\u5408\u3060\u3051 resume --include-completed \u3067\u5C55\u958B\u3059\u308B (context / show \u3067\u306F\u500B\u5225\u306B\u8AAD\u3081\u308B)\u3002\n- \u8AAC\u660E\u306F descriptionUpdatedAt\u3001\u72B6\u614B\u306F statusChangedAt\u3001\u5F15\u304D\u7D99\u304E\u306F\u65E2\u5B58\u306E at \u3067\u65E5\u6642\u3092\u78BA\u8A8D\u3067\u304D\u308B\u3002\u72B6\u614B\u5909\u66F4\u3088\u308A\u53E4\u3044\u30E1\u30E2\u306F\u305D\u306E\u65E8\u3092\u793A\u3059\u3002\u65E7\u8A18\u9332\u306E\u4E0D\u660E\u306A\u65E5\u6642\u306F\u88DC\u308F\u306A\u3044\u3002\u300C\u65B0\u3057\u3044\u8A18\u9332\u300D\u306F\u771F\u507D\u306E\u4FDD\u8A3C\u3067\u306F\u306A\u3044\u3002\n- Done \u3067\u53E4\u3044\u72B6\u6CC1\u8AAC\u660E\u304C\u6B8B\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u5834\u5408\u3001CLI\u30FB\u8A73\u7D30\u30D1\u30CD\u30EB\u30FBresume \u306B\u898B\u76F4\u3057\u6848\u5185\u304C\u51FA\u308B\u3002\u672C\u6587\u306F\u81EA\u52D5\u3067\u6D88\u3055\u306A\u3044\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u3057\u3001\u5FC5\u8981\u306A\u3089 set B12 --note "\u73FE\u5728\u306E\u8AAC\u660E" (none \u3067\u6D88\u53BB) \u307E\u305F\u306F\u753B\u9762\u306E Notes \u3067\u76F4\u3059\u3002\n- MCP \u306F boxglow_scope / boxglow_focus / boxglow_policy\u3001boxglow_claim\u3001boxglow_port \u306E expect / self\u3001boxglow_start \u306E reason\u3001boxglow_resume \u306E includeCompleted \u3092\u4F7F\u3046\u3002\u5909\u66F4\u306B\u306F contextToken \u3092\u4ED8\u3051\u308B\u3002\n- \u30C7\u30FC\u30BF\u5F62\u5F0F\u306F v5 \u306E\u307E\u307E\u3067\u5168\u9805\u76EE\u306F\u4EFB\u610F\u3002\u65E7\u7248 (0.4.2\u4EE5\u524D) \u306F\u65B0\u3057\u3044\u898F\u5247\u3092\u5B9F\u884C\u305B\u305A\u3001\u4FDD\u5B58\u6642\u306B\u8A08\u753B\u306E workflowPolicy / focusBlockId \u3092\u843D\u3068\u3059\u3002\u3053\u308C\u3089\u3092\u4F7F\u3046\u8A08\u753B\u306E\u66F8\u304D\u624B (CLI\u30FBserve\u30FB\u753B\u9762\u30FB\u62E1\u5F35\u5185\u306E\u30A2\u30D7\u30EA) \u306F\u5BFE\u5FDC\u3057\u305F\u30D3\u30EB\u30C9\u306B\u63C3\u3048\u308B\u3002\u7248\u756A\u53F7\u3060\u3051\u3067\u306A\u304F\u30D3\u30EB\u30C9\u65E5\u6642\u3082\u78BA\u8A8D\u3059\u308B\u3002\n\n\n### Sync decisions\n\nAI may only sync already bound projects and inspect comparisons. If sync stops for a conflict or a human choice, summarize the differences and use ask to notify the user. Never resolve conflicts, create a new binding, relink, recover, adopt, restore, or confirm an account. A human must use the UI or explicitly run CLI with --actor human. AI must never add --actor human, including after a chat answer; record the answer and wait for the human to apply the sync choice.\n\nCodex\u306F\u5168CLI\u547C\u3073\u51FA\u3057\u306B `--actor codex`\u3001Claude Code\u306F `--actor claude-code` \u3092\u660E\u793A\u3059\u308B\u3002WSL\u306A\u3069\u3067\u306F\u5B9F\u884C\u74B0\u5883\u306E\u5370\u304C\u6E21\u3089\u306A\u3044\u3053\u3068\u304C\u3042\u308B\u3002\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306F `codex-\u4F5C\u696D\u540D` \u306A\u3069\u306B\u5206\u3051\u3001\u4EBA\u3092\u540D\u4E57\u3089\u306A\u3044\u3002\n\n### \u4E26\u5217\u4F5C\u696D\u306E\u53D7\u3051\u6301\u3061\n\n\u62C5\u5F53 (\u8AB0\u306E\u4ED5\u4E8B\u304B\u3092\u4EBA\u304C\u56F3\u3067\u898B\u3066\u5206\u304B\u308B\u305F\u3081\u306E\u5272\u308A\u5F53\u3066) \u306F `npx boxglow set <block> --assignee <\u540D\u524D>` \u3067\u6C7A\u3081\u308B (\u8907\u6570\u306F\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3001`--add-assignee` / `--remove-assignee` \u3067\u8DB3\u3059\u30FB\u5916\u3059\u3001`none` \u3067\u5916\u3059\u3002\u3044\u306A\u3044\u540D\u524D\u306F\u30E1\u30F3\u30D0\u30FC\u306B\u8DB3\u3055\u308C\u308B\u3002`npx boxglow members` \u3067\u4E00\u89A7)\u3002\u53D7\u3051\u6301\u3061 (claim) \u306F\u8907\u6570\u306E AI \u304C\u540C\u3058\u7BB1\u3092\u540C\u6642\u306B\u66F8\u304D\u63DB\u3048\u306A\u3044\u305F\u3081\u306E\u7D04\u675F\u3067\u3001\u62C5\u5F53\u3068\u306F\u5225\u306E\u3082\u306E\u3002\u300C\u3053\u306E\u7BC4\u56F2\u306F Codex \u306E\u62C5\u5F53\u300D\u3068\u6C7A\u3081\u308B\u306A\u3089\u3001\u62C5\u5F53\u3092\u4ED8\u3051\u305F\u3046\u3048\u3067\u3001\u4F5C\u696D\u3059\u308B\u3068\u304D\u306B\u53D7\u3051\u6301\u3061\u3092\u53D6\u308B\u3002\n\n\u8A08\u753B\u3067\u53D7\u3051\u6301\u3061\u304C\u6709\u52B9\u306A\u3089\u3001CLI\u5B9F\u884C\u3054\u3068\u306B\u4E00\u610F\u306E `BOXGLOW_INSTANCE_ID` \u3092\u56FA\u5B9A\u3057\u3001`claims` \u3068 `context` \u3092\u8AAD\u3093\u3067\u304B\u3089 `claim` (\u5177\u4F53\u5316\u30FB\u5206\u89E3\u306E\u524D) \u307E\u305F\u306F `start` (\u5B9F\u884C) \u3059\u308B\u3002`claim` \u3067\u53D6\u3063\u305F\u53D7\u3051\u6301\u3061\u306F\u3001\u305D\u306E\u307E\u307E `start` \u306B\u5F15\u304D\u7D99\u304C\u308C\u308B\u3002\u72EC\u7ACB\u3057\u305F\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u9593\u3067\u5B9F\u884CID\u3092\u5171\u6709\u3057\u306A\u3044\u3002\u65E2\u5B9A\u306F\u30DC\u30C3\u30AF\u30B9\u306E\u307F\u3001\u5FC5\u8981\u306A\u3089 `--scope subtree`\u3002\u6210\u529F\u3057\u305FCLAIM\u884C\u306Etoken\u3092\u4FDD\u6301\u3057\u3001\u4FDD\u5B58\u3059\u308B\u64CD\u4F5C\u306B `--claim-token` \u3092\u4ED8\u3051\u308B\u3002MCP\u306F\u5B9F\u884CID\u3068\u53D7\u9818\u8A3C\u3092\u81EA\u52D5\u3067\u4FDD\u6301\u3059\u308B\u30025\u5206\u3054\u3068 (\u671F\u9650\u304C\u77ED\u3051\u308C\u3070\u534A\u5206\u4EE5\u5185) \u306B `claim-renew` / `boxglow_claim_renew` \u3092\u547C\u3073\u3001\u4E2D\u65AD\u524D\u306Fcheckpoint\u3002done/leave\u306F\u5BFE\u8C61\u306E\u53D7\u3051\u6301\u3061\u3092\u89E3\u653E\u3059\u308B\u3002\u671F\u9650\u5207\u308C\u3084\u4E16\u4EE3\u9055\u3044\u3092\u7121\u8996\u305B\u305A\u3001\u6700\u65B0context\u3092\u78BA\u8A8D\u3057\u3066\u53D6\u308A\u76F4\u3059\u3002\u540C\u540Dactor\u3067\u3082\u5225\u5B9F\u884C\u306E\u53D7\u3051\u6301\u3061\u306F\u596A\u308F\u306A\u3044\u3002\u8A2D\u5B9A\u30FB\u5F37\u5236\u89E3\u9664\u30FB\u540C\u671F\u7AF6\u5408\u306E\u89E3\u6C7A\u306F\u4EBA\u306B\u4F9D\u983C\u3057\u3001AI\u304Chuman\u3092\u540D\u4E57\u3063\u3066\u4EE3\u884C\u3057\u306A\u3044\u3002\u5171\u6709\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306E\u540C\u671F\u30B3\u30D4\u30FC\u9593\u306B\u306F\u6392\u4ED6\u4FDD\u8A3C\u304C\u306A\u3044\u3002\u8A73\u3057\u304F\u306F `docs/CLAIMS.md`\u3002\n\n\u4ED6\u8005\u306E\u5B9F\u884CID\u30FB\u53D7\u9818\u8A3C\u3092\u4F7F\u308F\u306A\u3044\u3002\u8A08\u753B\u3084claims\u306E\u51FA\u529B\u304B\u3089\u4ED6\u8005\u306E\u53D7\u9818\u8A3C\u3092\u7D44\u307F\u7ACB\u3066\u308B\u3053\u3068\u3082\u7981\u6B62\u3002MCP\u518D\u8D77\u52D5\u5F8C\u306E\u540C\u540Dactor\u3082\u5225\u5B9F\u884C\u306A\u306E\u3067\u3001\u81EA\u52D5\u3067\u5F15\u304D\u7D99\u304C\u305A\u671F\u9650\u3092\u5F85\u3064\u304B\u4EBA\u306B\u89E3\u9664\u3092\u983C\u3080\u3002\n\n\u5165\u529B\u306E\u81EA\u52D5\u5F15\u304D\u4E0A\u3052\u306F\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u7BC4\u56F2\u3067\u6271\u3046\u3002\u5171\u6709\u5165\u529B\u306E\u5185\u5BB9\u5909\u66F4\u3084\u5225\u30DC\u30C3\u30AF\u30B9\u3078\u306E\u914D\u7F6E\u5909\u66F4\u306B\u306F\u3001\u5F71\u97FF\u3059\u308B\u7BC4\u56F2\u306E\u53D6\u5F97\u3082\u5FC5\u8981\u3002focus\u3084group\u306A\u3069\u8A08\u753B\u5168\u4F53\u306E\u8A2D\u5B9A\u306B\u306F `context root` \u2192 `claim root` \u3067root\u3092\u53D6\u5F97\u3057\u3001\u305D\u306ECLAIM\u3092\u6E21\u3059 (`start root` \u3067\u3082\u53D6\u308C\u308B\u304C\u3001\u5B9F\u884C\u4E2D\u306B\u306F\u3057\u306A\u3044 `claim` \u3092\u4F7F\u3046)\u3002root\u306E\u307F\u306E\u53D6\u5F97\u306F\u901A\u5E38\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u542B\u307E\u306A\u3044\u3002\u8A08\u753B\u8A2D\u5B9A\u306E\u5909\u66F4\u306Froot\u306E\u307F\u3067\u8DB3\u308A\u308B\u3002root\u306Esubtree\u306F\u4E26\u884C\u4F5C\u696D\u3092\u5168\u90E8\u6B62\u3081\u308B\u306E\u3067\u3001AI\u306F\u4F7F\u308F\u305A\u4EBA\u306B\u76F8\u8AC7\u3059\u308B\u3002root\u306E\u7D42\u4E86\u306F `leave root`\u3002context guard\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3082\u5F15\u304D\u7D9A\u304D\u5FC5\u8981\u3002\n\n---\n\n\u540C\u671F\u306E\u4EBA\u5C02\u7528\u64CD\u4F5C\u306F\u3001\u5F37\u5236\u7684\u306A\u6A29\u9650\u5206\u96E2\u3067\u306F\u306A\u304F\u8AA4\u64CD\u4F5C\u306E\u9632\u6B62\u3067\u3059\u3002AI \u306F `--actor human` \u3092\u540D\u4E57\u3089\u305A\u3001\u6BD4\u8F03\u3068\u505C\u6B62\u7406\u7531\u3092\u4EBA\u3078\u4F1D\u3048\u3066\u304F\u3060\u3055\u3044\u3002MCP \u3068 AI \u3068\u3057\u3066\u8B58\u5225\u3057\u305F CLI \u306F\u3001\u4EBA\u7528\u306E\u9078\u629E\u30B3\u30DE\u30F3\u30C9\u3092\u51FA\u529B\u3057\u307E\u305B\u3093\u3002\n\n\u4EBA\u306ECLI\u64CD\u4F5C\u306F `--actor human:\u540D\u524D` \u3082\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002AI\u306F\u3053\u306E\u5F62\u3067\u3082\u4EBA\u3092\u540D\u4E57\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002AI\u5411\u3051\u505C\u6B62\u6587\u306E `boxglow sync --help` \u306F\u3001AI\u74B0\u5883\u3092\u5F15\u304D\u7D99\u3044\u3060\u4EBA\u3078\u306E\u6848\u5185\u3067\u3059\u3002AI\u306E\u4EE3\u884C\u8A31\u53EF\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\n';
13482
13790
 
13483
13791
  // docs/AGENTS_SNIPPET.en.md
13484
- var AGENTS_SNIPPET_en_default = '# Instructions for agents using Boxglow (paste into AGENTS.md / CLAUDE.md)\n\nPaste the part between the "---" lines below, as is, into your repository\'s AGENTS.md (Codex) or CLAUDE.md (Claude Code).\nPut boxglow.json at the repository root (`npx boxglow init --name "<project name>"`).\n\n---\n\n## Boxglow (shared plan and progress)\n\n`boxglow.json` is the source of truth for this repository\'s plan and progress. Humans watch this file on the Boxglow screen.\nDo not edit the file directly; always update it with `npx boxglow` commands (this keeps the wiring rules and the history intact).\n\nA block = "a task that turns inputs into an output (deliverable)". It is done (WhiteBox) once the output\'s deliverable is settled.\nStatus: BlackBox (only the output is decided) \u2192 GrayBox (in progress) \u2192 WhiteBox (done).\n\n### What to do every time you work\n\n1. **Read first**: read `npx boxglow resume` (or `npx boxglow status --brief`) for work in progress, pending decisions, unread answers, next candidates, and handoffs for unfinished boxes. To continue a previous session, start from the handoff notes shown there. Check the inputs and outputs of your box with `npx boxglow show <block>`\n2. **Check readiness**: before taking on a box, read `npx boxglow context <block>`. Its `readiness` is the state of preparation: `state: "ready"` means you can start. `"unprepared"` (needs detail) means you add detail first, following the reasons in `unprepared` and the commands in `next`. `"waiting"` means a required input or a branch answer is missing\n3. **Hold, then add detail**: before adding detail or splitting, hold the box with `npx boxglow claim <block>` (this does not start it; on a plan without claims it prints "not needed" and succeeds). Then fill in what is missing:\n - the output\'s planned deliverable: `npx boxglow port <block> --expect "<output>=file:src/x.ts"` (kind: file / dir / url / doc / note / decision / result; hint: a path or title. The file need not exist yet)\n - the acceptance criteria: `npx boxglow scope <block> --acceptance "<when it counts as done>"`; the work itself with `--goal`; what the output must respect (performance, quality, size, dimensions, power, ...) with `--constraints`\n - when you cannot see how to produce the output with a single box, place smaller boxes inside it with `npx boxglow split <block> --spec \'<JSON>\'`. Write expect / acceptance only for the children you will start now; later children need only a title and an output (they stay "needs detail"). Inputs can be omitted if unknown (they automatically become inputs of the level above)\n - when you do not know which files are involved, do not invent paths: add a box "find the target" with a `note` output and start that\n4. **Record the start**: once ready, read `npx boxglow context <block>` again, then run `npx boxglow start <block> --note "<what you will do>"`. Work on at most 1-2 boxes at a time.\n The started box is marked "now" (the boxes being worked on right now; any number when several agents or people work; a thick frame and a NOW tag on the canvas). Add another with `npx boxglow now <block>` (`--off` removes one, `now none` clears all); done / leave remove that box. People toggle it with the NOW button on the Status tab\n On a plan with the context guard on, pass the `contextToken` (context token) from the context output:\n `npx boxglow start <block> --note "<what you will do>" --context-token <context token>` (see "Context token and handoff" below)\n Starting a box that still needs detail warns by default (with the reasons and the next commands). On a plan with `policy --unprepared reject` it is refused (`--reason` does not bypass it; human actions are allowed). A parent whose outputs are all made by its children has nothing to run itself: start the child instead\n5. **Record completion**: when the output\'s deliverable exists, run `npx boxglow done <block> --artifact "<name>=<path in the repository>"`. Record the verification in three fixed fields: `--checked` (checks run and their results, e.g. "vitest 53 passed; e2e home 34/34"), `--not-checked` (what was not tried), `--limits` (remaining limits / caveats). For non-code deliverables (documents etc.) write what you confirmed in `--checked`. It stays on the box and shows in context / show.\n With the guard on, add `--context-token <context token>` (if your previous command printed "New context token: <token>", use that one).\n An unchanged file already committed to HEAD is recorded as "commit + path + content hash" (nothing is uploaded). Uncommitted or untracked files remain local file references, and `npx boxglow check` turns them into Git references once they are committed; do not create a commit solely to satisfy Boxglow. Use full `npx boxglow status` when you need the entire tree. For PRs and external material, a URL is fine.\n To attach a deliverable ahead of completion, use `npx boxglow artifact <block> <path>`. Record progress along the way with `npx boxglow set <block> --progress 60`\n6. **When a human decision is needed**: `npx boxglow ask <block> "<question>" --options "A|B"`. Do not proceed with that box until it is answered; move on to another box. A human\'s answer appears under "Answered" in `status`. After reading it, acknowledge it with `npx boxglow ack <block>` (`start` / `done` / `set` etc. on that box also acknowledge it automatically). Until you acknowledge it, it stays on the human\'s screen as "Not read by the AI yet" and the human can still revise the answer. If the answer contains a question back to you, record your own answer too with `ask` and `answer --by <yourself>`\n7. **When you are stuck**: If the cause is a missing input (a deliverable of an earlier box, or material), do not mark the box as blocked. Check its input wires with `npx boxglow show <block>`; if no box produces what is missing, create one outside (upstream) with `npx boxglow add` and wire it to this box\'s input with `npx boxglow connect` (the wire stays in the waiting color, so the diagram shows what the box is waiting for). If a choice between options would let you continue, use `ask`. Record only obstacles outside the plan (an environment that does not work, missing permissions or keys, waiting for an outside reply, a failure with no known cause) with `npx boxglow blocked <block> --note "<what is in the way>"` When a check or evaluation rejects an earlier deliverable, do not wire backwards (it would be a cycle): `npx boxglow sendback <evaluating box> --to <box to redo> --note "<reason>"` sends it back (that box returns to In Progress, its artifacts are kept as rejected, and the reason appears in context).\n8. **Check deliverables**: after moving or renaming files, run `npx boxglow check` (it detects the move and updates the path; if the file cannot be found, it is flagged)\n9. **Keep progress and findings**: `npx boxglow log <block> "<text>"` adds a dated, signed work-log entry to the box (Markdown). People read and write the same log in the Log tab. The handoff note (checkpoint) is overwritten; log entries accumulate\n10. **Before an interruption or a handoff**: before the session ends, the context is compacted, or you hand over to another AI or a person, save a handoff note with `npx boxglow checkpoint <block> --note "Findings; next steps; unresolved questions"` (with the guard on, add `--context-token <context token>`). It stays in the plan even when the chat history is gone, and the next session reads it with `resume` and `context`\n11. **Report**: at the end of your work, summarize `npx boxglow status --brief` and report it\n\n### Structural rules\n\n- **Show an undecided fork as a branch**: when, at planning time, later work (a path) depends on a decision that has not been made, create a branch box with `npx boxglow branch "<title>" --options "A|B" --question "<question>" --context "<background>"`. Each option becomes a path (output); `connect` each one to the first box of that path. Where the paths come together again, add a merge part with `npx boxglow join --title "<title>"`, `connect` the last output of each path to it, and connect its output to the next box (any one path arriving is enough). Once a person answers, the boxes on the paths not chosen are skipped and drop out of progress and next candidates. If a box you already made turns out to be an undecided fork, turn it into a branch with `npx boxglow branch --box <block> --options "A|B" --question "<question>"` (its output becomes the first option\'s path; wires stay). Before the answer, boxes on the paths wait for the branch and starting them warns (record a reason with `--reason`, e.g. for early research)\n- The top level contains only the "input node", the "final deliverable node" and "project boxes". Tasks go inside a project box (the default parent of `add` is the first project box)\n- There is no limit on depth. `split` can be used at any level\n- A box that could be reused in another project (e.g. converting input images to monochrome) can be turned into a template with `npx boxglow export-block <block> --out <name>.boxglow-block.json` and\n inserted with `npx boxglow import-block <path> --parent <block>`. You may share templates by putting them in the repository\'s `boxglow-blocks/`\n\nWhen there are many top-level inputs, create a group with `npx boxglow group "<group name>"` and sort inputs into it with `npx boxglow group-set <input name> <group name>` (e.g. PCIe spec / DDR spec).\n\n### JSON format for split\n\n```json\n{\n "blocks": [\n { "title": "Find the target", "inputs": ["Repro steps"], "outputs": ["Notes"],\n "expect": "note:the files and code paths involved, evidence, candidate changes, how to check, open questions", "acceptance": "the files and code to change are known and the following boxes can be given expect and acceptance; or the reason they cannot, and the decision needed, is clear",\n "goal": "reproduce and trace the path; changing product code is out of scope here" },\n { "title": "Refresh sync state after a retried save", "inputs": ["Notes"], "outputs": ["Fix"],\n "expect": "file:src/sync/state.ts", "acceptance": "fail one save, retry, and the sync state and actions come back (covered by a test)" },\n { "title": "Write the release note", "inputs": ["Fix"], "outputs": ["Note"] }\n ],\n "connections": [\n { "from": "parent.Repro steps", "to": "Find the target.Repro steps" },\n { "from": "Find the target.Notes", "to": "Refresh sync state after a retried save" },\n { "from": "Refresh sync state after a retried save.Fix", "to": "Write the release note" },\n { "from": "Write the release note.Note", "to": "parent.Output" }\n ]\n}\n```\n\n`expect` (planned deliverable: `"kind:hint"` or `{ "kind", "hint" }`), `acceptance` and `goal` go only on the children you will start now.\nA child with just a title and an output, like the third one, stays "needs detail" until its turn; then set them with `port --expect` / `scope --acceptance`.\nOutputs the parent makes itself (integrating the children\'s results, for example) are marked with `"parentMakes": ["<output>"]` (if a child\'s wire also feeds it, readiness reports two makers).\n`"splitBy": "stage"` records in one word how the direct children are divided (stage / deliverable / feature; also `set <block> --split-by`). Siblings should follow the same division and the same level of detail.\n`split` refuses to save only a broken structure (a wire to nothing, a cycle, a malformed expect). Unfinished breakdowns (a single child, a parent output nobody makes yet) are saved and reported as gaps.\nAfter a split and before a start, read `npx boxglow lint <block>`. Fix the "must fix" items (parent outputs with no or two makers, both exclusive paths of one branch required, a box in progress without expect / acceptance, gaps on the box you are checking) before going on.\n"Fill in before starting" items (expect / acceptance of boxes not started yet) are filled when that child\'s turn comes (do not write token entries for later work now).\n"Review" items (a single child, unconnected outputs, token entries, empty branch paths, single-input merges, siblings with the same expect) are for you to judge (the tool never refuses on them). `context` also prints the counts and the top three.\n\n**Content review (meaning cannot be checked by the tool: an AI or a person reads the material, judges, and records the basis)**\n- After a split: read `npx boxglow review-split <parent>` (the parent\'s goal, constraints, acceptance and ports; the children\'s targets, ports, planned deliverables and acceptance; the wiring; a checklist). When reviewed, record it with `npx boxglow split-ok <parent> --note "<basis: what you checked>"`.\n- Before a start: read `npx boxglow review-box <block>` (target, work, planned deliverable, checks, input sources, upstream branch answers) and record with `npx boxglow box-ok <block> --note "<basis>"`.\n- A record says "reviewed, with this basis"; it does not prove validity. When the material changes, `reviews` in `context` becomes `stale` (with what changed and what to check). `stale` does not mean the breakdown is wrong; it means the material changed after the last review. Position, colours, progress and assignees do not make it stale. The breakdown record is not affected by branch answers; the readiness record is.\n- Adding detail to a later child at its turn always makes the parent\'s breakdown record `stale` (the children\'s expect / acceptance are part of the material). Finish that child\'s expect and scope first, then check only the changed child\'s effect on the parent\'s acceptance and nonGoals and on the division among siblings; if it still fits, update it with `split-ok <parent> --note "Checked B181\'s detail: not in the parent\'s nonGoals, no overlap with B182"`. Do not re-review after every port or scope command; several children detailed together can be checked together.\n- It is not a condition for `start` (in default or reject plans). Only needs-detail and missing inputs stop a start.\n\n**Branches and merges for agents**\n- When an `ask` has options and the answer changes the work that follows, add `--branch`: the box becomes a branch with one path (output) per option. `connect` each path to its first box, and put a `join` where the paths come together.\n- The split JSON can make them too: a child with `"branch": { "question": "...", "options": ["A", "B"] }` becomes a branch box (its outputs are the option names), `"join": true` a merge part. Example:\n `{ "blocks": [{ "title": "Choose auth", "branch": { "question": "Which?", "options": ["Mail", "OAuth"] } }, { "title": "Mail impl", "outputs": ["Auth"] }, { "title": "OAuth impl", "outputs": ["Auth"] }, { "title": "Merge", "join": true }], "connections": [{ "from": "Choose auth.Mail", "to": "Mail impl" }, { "from": "Choose auth.OAuth", "to": "OAuth impl" }, { "from": "Mail impl.Auth", "to": "Merge" }, { "from": "OAuth impl.Auth", "to": "Merge" }, { "from": "Merge.Merge", "to": "parent.Auth" }] }`\n- `lint` reports a box that requires inputs from both exclusive paths of one branch (they never both arrive) as must-fix, and empty paths or single-input merges as review items.\n`parent.<name>` is an input / output of the box being split. `<block>` is a short ID (such as B12; shown in status) or a title.\nA box has one output per thing it makes (when one piece of work produces several things, list them all in outputs; set expect for the second and later ones with `port <block> --expect "<output>=<kind>:<hint>"`). Connected inputs and outputs share one name (renaming either end renames the other). Make the title a short phrase that tells "what is made".\nRecord dates and hours with `npx boxglow set <block> --due 2026-10-15 --start 2026-10-01 --estimate 8 --hours 3.5`.\nGive each box a kind of work (category): `--category design` / build / verify / evaluate / study / research / ui / improve / fix / docs / ops / other (other: when unsure). Set it at add time; to change it, use `npx boxglow set <block> --category verify`.\nThe receiving side of a connection can be just a title (`npx boxglow connect "A.Design doc" "B"` creates an input "Design doc" on B and connects it; boxes in other levels work too, the ports in between are created automatically. In split\'s connections, `to: "B"` also works). Connected inputs and outputs share one name (they are aligned when connected, and renaming either end renames everything on the same wire). To add inputs / outputs to an existing box or rename them, use `npx boxglow port <block> --in <name> --out <name> --remove <name> --rename <old>=<new>` (removing an input also removes the inputs of the boxes that use it; top-level inputs are `port inputs`; withdraw a mistaken question with `npx boxglow unask <block>`) (`project` = the first project box. This also renames the final deliverable). Remove a wire with `npx boxglow disconnect <title.output name> <title.input name>`, and remove a box itself with `npx boxglow remove <block>` (`--force` if it has boxes inside). The MCP tools (`boxglow_status` / `boxglow_start` / `boxglow_done` / `boxglow_ask` etc.; available after registration in your agent; `.mcp.json` is the Claude Code configuration) are another entry point to the same commands, and either way updates the same file. Export the plan as a document with `npx boxglow export --out docs/ROADMAP.md`.\n\n**Share project-wide decisions as policies**: when a box decides something many boxes depend on (technology choice, engine, art style), make that output a policy (`npx boxglow port <block> --policy "<output>"`; scope defaults to the same parent, `--policy-scope all` for the whole plan, `--advisory` to not block). It reaches every box in scope without wires, and the boxes in scope that have not started wait for it until it is decided (work in progress is not stopped). Read `policies` in `context` before working. Exclude unrelated boxes with `--skip-policy "<box>.<output>"`. If a policy changes after a box is done, it appears in `policyChanged` (check it again). Do not wire it to each box.\nIn a new project, first create 3-7 top-level items from the direction (the README or the request), confirm them with a human via `ask`, and then `split` only the item you are about to start (leave later stages coarse). Write each `ask` question so that it can be decided on its own, and put the premises, comparison and impact in `--context` (do not point outside the question, as in "Is this OK?"). When choosing one of several candidates, even if you decide by yourself, record it with `ask ... --options "A|B|C"` and `answer --by <yourself>` so that the candidates you did not choose are kept. To change direction, use `reopen <block> --note <reason>`. Everything works with the CLI alone (the screen is for humans to watch). If no human is in the loop, the AI records its decisions with `answer --by <yourself>` and proceeds.\nName each output after a "concrete deliverable" (e.g. `Design doc docs/design.md`, `PR #12`, `Public URL`, `Test results (vitest, 53 tests)`). Avoid abstract names such as "feature set" or "findings", and always attach a file, URL or commit with --artifact when you run done.\nMake sure every box\'s "input \u2192 output" is connected to something (an unconnected box is a hole in the plan. Unconnected inputs are raised to the top-level input node automatically).\nIf several people edit the same boxglow.json, each of them runs `npx boxglow git-setup` once in their own clone (changes are merged automatically per box, and changes to different boxes do not conflict).\nTo manage several repositories with one plan, put boxglow.json in the folder above them and set the environment variable BOXGLOW_FILE to its location in each repository (one project box per repository: `npx boxglow project "name" --repo <path>`).\nInputs are required by default. Mark an input as optional with `npx boxglow port <block> --optional <input name>` if work can start without it (`--required` turns it back). Describe a port with `--describe "<name>=<description>"`. "Next candidates" in status lists boxes whose required inputs are ready first (each is marked "ready to start" or "waiting for required inputs"). When a top-level plan input (Inputs) has no material (a spec, a scenario or other file or URL), every box that uses it waits. If the material is in the repository, attach it yourself instead of asking a person: `npx boxglow artifact inputs <path or URL> --input <input name>` (MCP: `boxglow_artifact` with block "inputs"). Remove a deliverable or material attached by mistake with `npx boxglow artifact <block|inputs> --remove <title or path>`. When a finished box shows "Policy: check again", check that the work matches the policy; if it does, clear the mark with `npx boxglow ack <block> --policy` (if not, reopen and fix it).\nDo not write descriptions for inputs (the description of the connected output is used). Write the format and constraints in the output\'s description.\n\n\n### What runs automatically (hooks)\n\n`setup-agent` registers `boxglow hook` in the Claude Code / Codex hooks. After a session starts, resumes or is compacted, the plan\'s resume summary is injected into the context automatically. When you are about to finish a reply while a box started in this session has no handoff (done or checkpoint), you are told to record first and continue (a log entry is a progress note, not a handoff). Editing boxglow.json directly with Edit / Write / apply_patch is blocked (update it through the CLI or MCP). These are a safety net, not a substitute for the steps above: keep recording as instructed.\n\n### Context token and handoff\n\nThe context guard keeps an AI from continuing work on outdated instructions. `setup-agent` turns it on (on other plans, run `npx boxglow guard on`).\nWhile it is on, an AI\'s `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` need `--context-token <context token>`. Commands run by a person (`--actor human`) do not.\n\n```\nnpx boxglow context B12 # read the decisions (including acknowledged answers), input/output contracts and handoff notes. contextToken in the output is the context token\nnpx boxglow start B12 --note "<what you will do>" --context-token <context token>\nnpx boxglow ask B12 "<question>" --options "A|B" --context-token <context token>\n# -> last line of the output: New context token: <token>\nnpx boxglow done B12 --artifact "<name>=<path>" --context-token <new context token>\n```\n\n- **The context token changes (you must reread)** when a person answers a decision or revises an answer, a person changes the instructions (title, description, input/output contracts), or another AI or a person updates the handoff note. The same applies when this happens on a parent box or an input provider. The old context token is rejected: reread `context`, take the change into account in your work, then retry\n- **The context token does not change** on `start` / `blocked` / `review` / `leave` / `ack`, on changes to progress, status, dates or category, when `check` verifies deliverables, or when boxes are moved on the screen. Keep using the same context token\n- **You can update it yourself**: when your own `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` etc. changes the context, the last line of its output is "New context token: <token>". You already know what you changed, so use it for the next command without rereading. `ask` / `decision` / `answer` / `reopen` run without a context token, but they print the new context token only when you pass the latest one\n- **Read the short form first**: `npx boxglow context <block> --brief` prints everything about the box itself (description, scope, decisions, handoff, inputs/outputs, deliverables) plus the plan description and, for parents and input providers, title, status, decisions (with their context and options; the history of earlier answers is left out) and the outputs that feed the box. The context token is the same as without `--brief`, so pass it to `--context-token` as is. Look at `target.missingInputs` (required inputs that are not ready) and `target.inputs[].sources` (which output of which box, with references to its deliverables) first. `omitted` counts what was left out. If an omitted description, contract or handoff may matter to your work, read without `--brief`, or read `context` of that box\n- **Precondition for starting from the short form**: the description of a parent or input provider that has any scope field set is left out of the short form (counted in `omitted.descriptions`). Set a scope only after moving the constraints written in the description (compatibility, prohibitions, deadlines) into it. On a plan where you cannot tell, or when `omitted.descriptions` is not 0, read once without `--brief` before you start. The short form is a starting point, not a guarantee that nothing else matters\n- Write so that the short form is enough: put the conditions that bind the work in the scope (non-goals / constraints / acceptance / consult) instead of burying them in a description. Only the latest handoff note is kept, so carry the open points, cautions and next steps forward each time you write one. Say where to start looking in the description of the box, in this form (a starting point, not a claim that those files are all there is to read):\n `Change candidates: <path> \u2014 <why to start there>` / `Related checks: <path or command> \u2014 <what it verifies>`\n- Do not turn the guard off to get past an old context token (an AI needs the latest context token to run `guard off`)\n- With MCP, use `boxglow_context` and the `contextToken` argument of each tool (the new context token is the last line of the tool result)\n- If "Another Boxglow writer holds the file lock" persists after waiting and retrying, show the output of `npx boxglow unlock` (owner and verdict) to a person and ask them to remove it. Never add `--actor human` yourself or delete the lock folder directly\n\n### Readiness, current scope, and fresh resume information\n\n- Read current activity, pending decisions, and unread answers first. Candidates are grouped by current scope / other candidates, then ready / needs detail / waiting for inputs, with the reasons and missing input names. A candidate that needs detail or is waiting is not ready.\n- "Ready" is a mechanical check: the box makes at least one output itself, that output has a planned deliverable (expect), the acceptance criteria are written, and required inputs are in. It does not judge whether the text is specific (`expect = src/`, `acceptance = works` pass). Write them so a third party can follow the target, the work, the result and how it is checked.\n- Four optional scope fields are available: goal, non-goals, acceptance, and consult (when to consult before expanding scope). Read the target and parent scopes at the start of context before starting and finishing. Textual acceptance criteria are not automatically evaluated.\n- Use scope B12 --goal "Goal" --non-goals "Excluded" --acceptance "Checks" --consult "When to ask". scope B12 only reads; none or an empty string clears a field. In the inspector, use the More tab \u2192 Edit work scope. Only populated fields appear in the collapsed scope section.\n- focus B12 prioritizes that box and its descendants; focus reads the selection, and focus none clears it. Other candidates remain in a separate group. Being listed does not authorize expanding scope or publishing.\n- Missing required inputs warn on start by default but still allow the start. Supply --reason "Why starting early is appropriate" to proceed without a warning and save the reason in both activity and the log. Artifact-free done also remains warning-only by default. Existing output artifacts or --artifact count; reference material on the box does not.\n- Only enable strict checks when selected for the plan: policy --start reject --done reject --unprepared reject. Each can return to warn. A recorded start reason overrides the missing-input rejection, but not the needs-detail one (add detail first). The artifact requirement also applies to set --status white. Human operations (UI / --actor human) are never rejected. Do not impersonate a human or weaken policy to bypass rejection.\n- With guard enabled, scope writes, focus selection/clearing, and policy writes require --context-token. These changes print a new token: use it next. Read-only forms need no token.\n- resume hides completed handoff bodies and shows their count. Request resume --include-completed only when history is needed; context / show can still read individual notes.\n- descriptionUpdatedAt dates description changes; statusChangedAt dates status changes; handoffs use their existing at field. Notes predating a status change are marked. Unknown legacy dates stay unknown, and recency does not establish truth.\n- After Done, CLI, inspector, and resume flag descriptions that may still describe an earlier state. Text is never rewritten automatically. Review it, then update with set B12 --note "Current description" (none clears it) or Notes in the UI.\n- MCP: boxglow_scope / boxglow_focus / boxglow_policy, boxglow_claim, expect / self on boxglow_port, reason on boxglow_start, and includeCompleted on boxglow_resume. Pass contextToken for writes.\n- All data fields are optional; schema v5 is unchanged. Old versions (0.4.2 and earlier) do not enforce these checks and drop workflowPolicy / focusBlockId when saving. Align all writers (CLI, serve, web app, bundled extension app) to a supporting build before using these settings. Check build time as well as version.\n\n\n### Sync decisions\n\nAI may only sync already bound projects and inspect comparisons. If sync stops for a conflict or a human choice, summarize the differences and use ask to notify the user. Never resolve conflicts, create a new binding, relink, recover, adopt, restore, or confirm an account. A human must use the UI or explicitly run CLI with --actor human. AI must never add --actor human, including after a chat answer; record the answer and wait for the human to apply the sync choice.\n\nCodex must pass `--actor codex` on every CLI call; Claude Code must pass `--actor claude-code`. Execution markers may not survive a WSL boundary. Give subagents names such as `codex-task`; never impersonate a human.\n\n### Claims for parallel work\n\nWhen claims are enabled for the plan, fix a unique `BOXGLOW_INSTANCE_ID` for each independent CLI session. Do not share it between agents. Read `claims` and `context`, then acquire with `claim` (before adding detail or splitting) or `start` (to run); a claim taken with `claim` carries over to `start` (default block scope, `--scope subtree` for descendants). Keep the token from the successful CLAIM line and pass `--claim-token` on writes. MCP keeps its own instance ID and acquired receipts automatically. Renew with `claim-renew` / `boxglow_claim_renew` every 5 minutes (or within half the lease for shorter leases); checkpoint before handoff. done/leave releases the target claim. On expiry or a generation mismatch, reread context and acquire again. The same actor name does not make another instance yours. Ask a person to change claim settings, force release, or resolve sync conflicts; never impersonate human. Synced copies on different devices are not protected by a distributed lock. See `docs/CLAIMS.md`.\n\nNever use another instance\u2019s ID or receipt, including receipts reconstructed from plan data or claims output. After MCP restarts, the same actor is still a different instance: wait for expiry or ask a person to release it; never take it over automatically.\n\nAutomatically promoted inputs belong to the original box\u2019s scope. Changes to shared input content or other boxes\u2019 layout require claims for all affected boxes. For plan settings such as focus or group, use `context root` \u2192 `claim root` and pass that CLAIM receipt (`start root` also works, but `claim` does not mark it in progress). A block-scoped root claim does not include ordinary boxes and is sufficient for plan settings. A subtree claim on root blocks all parallel work: AI agents must not use it and must consult a person. End it with `leave root`. Context-guard tokens are still required.\n\n---\n\nHuman-only sync operations prevent accidental actions; they are not enforced authorization or OS-level isolation. AI must never identify itself with `--actor human`. Report the comparison and stop reason to the user. MCP and AI-identified CLI output do not provide executable human choice commands.\n\nHuman CLI actions also accept `--actor human:name`; AI must not impersonate a human using either form. The `boxglow sync --help` hint in AI halt output is for humans who inherited an AI environment, not permission for AI to apply their choice.\n';
13792
+ var AGENTS_SNIPPET_en_default = '# Instructions for agents using Boxglow (paste into AGENTS.md / CLAUDE.md)\n\nPaste the part between the "---" lines below, as is, into your repository\'s AGENTS.md (Codex) or CLAUDE.md (Claude Code).\nPut boxglow.json at the repository root (`npx boxglow init --name "<project name>"`).\n\n---\n\n## Boxglow (shared plan and progress)\n\n`boxglow.json` is the source of truth for this repository\'s plan and progress. Humans watch this file on the Boxglow screen.\nDo not edit the file directly; always update it with `npx boxglow` commands (this keeps the wiring rules and the history intact).\n\nA block = "a task that turns inputs into an output (deliverable)". It is done (WhiteBox) once the output\'s deliverable is settled.\nStatus: BlackBox (only the output is decided) \u2192 GrayBox (in progress) \u2192 WhiteBox (done).\n\n### What to do every time you work\n\n1. **Read first**: read `npx boxglow resume` (or `npx boxglow status --brief`) for work in progress, pending decisions, unread answers, next candidates, and handoffs for unfinished boxes. To continue a previous session, start from the handoff notes shown there. Check the inputs and outputs of your box with `npx boxglow show <block>`\n2. **Check readiness**: before taking on a box, read `npx boxglow context <block>`. Its `readiness` is the state of preparation: `state: "ready"` means you can start. `"unprepared"` (needs detail) means you add detail first, following the reasons in `unprepared` and the commands in `next`. `"waiting"` means a required input or a branch answer is missing\n3. **Hold, then add detail**: before adding detail or splitting, hold the box with `npx boxglow claim <block>` (this does not start it; on a plan without claims it prints "not needed" and succeeds). Then fill in what is missing:\n - the output\'s planned deliverable: `npx boxglow port <block> --expect "<output>=file:src/x.ts"` (kind: file / dir / url / doc / note / decision / result; hint: a path or title. The file need not exist yet)\n - the acceptance criteria: `npx boxglow scope <block> --acceptance "<when it counts as done>"`; the work itself with `--goal`; what the output must respect (performance, quality, size, dimensions, power, ...) with `--constraints`\n - when you cannot see how to produce the output with a single box, place smaller boxes inside it with `npx boxglow split <block> --spec \'<JSON>\'`. Write expect / acceptance only for the children you will start now; later children need only a title and an output (they stay "needs detail"). Inputs can be omitted if unknown (they automatically become inputs of the level above)\n - when you do not know which files are involved, do not invent paths: add a box "find the target" with a `note` output and start that\n4. **Record the start**: once ready, read `npx boxglow context <block>` again, then run `npx boxglow start <block> --note "<what you will do>"`. Work on at most 1-2 boxes at a time.\n The started box is marked "now" (the boxes being worked on right now; any number when several agents or people work; a thick frame and a NOW tag on the canvas). Add another with `npx boxglow now <block>` (`--off` removes one, `now none` clears all); done / leave remove that box. People toggle it with the NOW button on the Status tab\n On a plan with the context guard on, pass the `contextToken` (context token) from the context output:\n `npx boxglow start <block> --note "<what you will do>" --context-token <context token>` (see "Context token and handoff" below)\n Starting a box that still needs detail warns by default (with the reasons and the next commands). On a plan with `policy --unprepared reject` it is refused (`--reason` does not bypass it; human actions are allowed). A parent whose outputs are all made by its children has nothing to run itself: start the child instead\n5. **Record completion**: when the output\'s deliverable exists, run `npx boxglow done <block> --artifact "<name>=<path in the repository>"`. Record the verification in three fixed fields: `--checked` (checks run and their results, e.g. "vitest 53 passed; e2e home 34/34"), `--not-checked` (what was not tried), `--limits` (remaining limits / caveats). For non-code deliverables (documents etc.) write what you confirmed in `--checked`. It stays on the box and shows in context / show.\n With the guard on, add `--context-token <context token>` (if your previous command printed "New context token: <token>", use that one).\n An unchanged file already committed to HEAD is recorded as "commit + path + content hash" (nothing is uploaded). Uncommitted or untracked files remain local file references, and `npx boxglow check` turns them into Git references once they are committed; do not create a commit solely to satisfy Boxglow. Use full `npx boxglow status` when you need the entire tree. For PRs and external material, a URL is fine.\n To attach a deliverable ahead of completion, use `npx boxglow artifact <block> <path>`. Record progress along the way with `npx boxglow set <block> --progress 60`\n6. **When a human decision is needed**: `npx boxglow ask <block> "<question>" --options "A|B"`. Do not proceed with that box until it is answered; move on to another box. A human\'s answer appears under "Answered" in `status`. After reading it, acknowledge it with `npx boxglow ack <block>` (`start` / `done` / `set` etc. on that box also acknowledge it automatically). Until you acknowledge it, it stays on the human\'s screen as "Not read by the AI yet" and the human can still revise the answer. If the answer contains a question back to you, record your own answer too with `ask` and `answer --by <yourself>`\n7. **When you are stuck**: If the cause is a missing input (a deliverable of an earlier box, or material), do not mark the box as blocked. Check its input wires with `npx boxglow show <block>`; if no box produces what is missing, create one outside (upstream) with `npx boxglow add` and wire it to this box\'s input with `npx boxglow connect` (the wire stays in the waiting color, so the diagram shows what the box is waiting for). If a choice between options would let you continue, use `ask`. Record only obstacles outside the plan (an environment that does not work, missing permissions or keys, waiting for an outside reply, a failure with no known cause) with `npx boxglow blocked <block> --note "<what is in the way>"` When a check or evaluation rejects an earlier deliverable, do not wire backwards (it would be a cycle): `npx boxglow sendback <evaluating box> --to <box to redo> --note "<reason>"` sends it back (that box returns to In Progress, its artifacts are kept as rejected, and the reason appears in context).\n8. **Check deliverables**: after moving or renaming files, run `npx boxglow check` (it detects the move and updates the path; if the file cannot be found, it is flagged)\n9. **Keep progress and findings**: `npx boxglow log <block> "<text>"` adds a dated, signed work-log entry to the box (Markdown). People read and write the same log in the Log tab. The handoff note (checkpoint) is overwritten; log entries accumulate. Without text it lists the entries (with ids); fix your own with `--edit <id> "<text>"` and delete with `--remove <id>`\n10. **Before an interruption or a handoff**: before the session ends, the context is compacted, or you hand over to another AI or a person, save a handoff note with `npx boxglow checkpoint <block> --note "Findings; next steps; unresolved questions"` (with the guard on, add `--context-token <context token>`). It stays in the plan even when the chat history is gone, and the next session reads it with `resume` and `context`\n11. **Report**: at the end of your work, summarize `npx boxglow status --brief` and report it\n\n### Structural rules\n\n- **Show an undecided fork as a branch**: when, at planning time, later work (a path) depends on a decision that has not been made, create a branch box with `npx boxglow branch "<title>" --options "A|B" --question "<question>" --context "<background>"`. Each option becomes a path (output); `connect` each one to the first box of that path. Where the paths come together again, add a merge part with `npx boxglow join --title "<title>"`, `connect` the last output of each path to it, and connect its output to the next box (any one path arriving is enough). Once a person answers, the boxes on the paths not chosen are skipped and drop out of progress and next candidates. If a box you already made turns out to be an undecided fork, turn it into a branch with `npx boxglow branch --box <block> --options "A|B" --question "<question>"` (its output becomes the first option\'s path; wires stay). Before the answer, boxes on the paths wait for the branch and starting them warns (record a reason with `--reason`, e.g. for early research)\n- The top level contains only the "input node", the "final deliverable node" and "project boxes". Tasks go inside a project box (the default parent of `add` is the first project box)\n- There is no limit on depth. `split` can be used at any level\n- A box that could be reused in another project (e.g. converting input images to monochrome) can be turned into a template with `npx boxglow export-block <block> --out <name>.boxglow-block.json` and\n inserted with `npx boxglow import-block <path> --parent <block>`. You may share templates by putting them in the repository\'s `boxglow-blocks/`\n\nWhen there are many top-level inputs, create a group with `npx boxglow group "<group name>"` and sort inputs into it with `npx boxglow group-set <input name> <group name>` (e.g. PCIe spec / DDR spec).\n\n### JSON format for split\n\n```json\n{\n "blocks": [\n { "title": "Find the target", "inputs": ["Repro steps"], "outputs": ["Notes"],\n "expect": "note:the files and code paths involved, evidence, candidate changes, how to check, open questions", "acceptance": "the files and code to change are known and the following boxes can be given expect and acceptance; or the reason they cannot, and the decision needed, is clear",\n "goal": "reproduce and trace the path; changing product code is out of scope here" },\n { "title": "Refresh sync state after a retried save", "inputs": ["Notes"], "outputs": ["Fix"],\n "expect": "file:src/sync/state.ts", "acceptance": "fail one save, retry, and the sync state and actions come back (covered by a test)" },\n { "title": "Write the release note", "inputs": ["Fix"], "outputs": ["Note"] }\n ],\n "connections": [\n { "from": "parent.Repro steps", "to": "Find the target.Repro steps" },\n { "from": "Find the target.Notes", "to": "Refresh sync state after a retried save" },\n { "from": "Refresh sync state after a retried save.Fix", "to": "Write the release note" },\n { "from": "Write the release note.Note", "to": "parent.Output" }\n ]\n}\n```\n\n`expect` (planned deliverable: `"kind:hint"` or `{ "kind", "hint" }`), `acceptance` and `goal` go only on the children you will start now.\nA child with just a title and an output, like the third one, stays "needs detail" until its turn; then set them with `port --expect` / `scope --acceptance`.\nOutputs the parent makes itself (integrating the children\'s results, for example) are marked with `"parentMakes": ["<output>"]` (if a child\'s wire also feeds it, readiness reports two makers).\n`"splitBy": "stage"` records in one word how the direct children are divided (stage / deliverable / feature; also `set <block> --split-by`). Siblings should follow the same division and the same level of detail.\n`split` refuses to save only a broken structure (a wire to nothing, a cycle, a malformed expect). Unfinished breakdowns (a single child, a parent output nobody makes yet) are saved and reported as gaps.\nAfter a split and before a start, read `npx boxglow lint <block>`. Fix the "must fix" items (parent outputs with no or two makers, both exclusive paths of one branch required, a box in progress without expect / acceptance, gaps on the box you are checking) before going on.\n"Fill in before starting" items (expect / acceptance of boxes not started yet) are filled when that child\'s turn comes (do not write token entries for later work now).\n"Review" items (a single child, unconnected outputs, token entries, empty branch paths, single-input merges, siblings with the same expect) are for you to judge (the tool never refuses on them). `context` also prints the counts and the top three.\n\n**Content review (meaning cannot be checked by the tool: an AI or a person reads the material, judges, and records the basis)**\n- After a split: read `npx boxglow review-split <parent>` (the parent\'s goal, constraints, acceptance and ports; the children\'s targets, ports, planned deliverables and acceptance; the wiring; a checklist). When reviewed, record it with `npx boxglow split-ok <parent> --note "<basis: what you checked>"`.\n- Before a start: read `npx boxglow review-box <block>` (target, work, planned deliverable, checks, input sources, upstream branch answers) and record with `npx boxglow box-ok <block> --note "<basis>"`.\n- A record says "reviewed, with this basis"; it does not prove validity. When the material changes, `reviews` in `context` becomes `stale` (with what changed and what to check). `stale` does not mean the breakdown is wrong; it means the material changed after the last review. Position, colours, progress and assignees do not make it stale. The breakdown record is not affected by branch answers; the readiness record is.\n- Adding detail to a later child at its turn always makes the parent\'s breakdown record `stale` (the children\'s expect / acceptance are part of the material). Finish that child\'s expect and scope first, then check only the changed child\'s effect on the parent\'s acceptance and nonGoals and on the division among siblings; if it still fits, update it with `split-ok <parent> --note "Checked B181\'s detail: not in the parent\'s nonGoals, no overlap with B182"`. Do not re-review after every port or scope command; several children detailed together can be checked together.\n- It is not a condition for `start` (in default or reject plans). Only needs-detail and missing inputs stop a start.\n\n**Branches and merges for agents**\n- When an `ask` has options and the answer changes the work that follows, add `--branch`: the box becomes a branch with one path (output) per option. `connect` each path to its first box, and put a `join` where the paths come together.\n- The split JSON can make them too: a child with `"branch": { "question": "...", "options": ["A", "B"] }` becomes a branch box (its outputs are the option names), `"join": true` a merge part. Example:\n `{ "blocks": [{ "title": "Choose auth", "branch": { "question": "Which?", "options": ["Mail", "OAuth"] } }, { "title": "Mail impl", "outputs": ["Auth"] }, { "title": "OAuth impl", "outputs": ["Auth"] }, { "title": "Merge", "join": true }], "connections": [{ "from": "Choose auth.Mail", "to": "Mail impl" }, { "from": "Choose auth.OAuth", "to": "OAuth impl" }, { "from": "Mail impl.Auth", "to": "Merge" }, { "from": "OAuth impl.Auth", "to": "Merge" }, { "from": "Merge.Merge", "to": "parent.Auth" }] }`\n- `lint` reports a box that requires inputs from both exclusive paths of one branch (they never both arrive) as must-fix, and empty paths or single-input merges as review items.\n`parent.<name>` is an input / output of the box being split. `<block>` is a short ID (such as B12; shown in status) or a title.\nA box has one output per thing it makes (when one piece of work produces several things, list them all in outputs; set expect for the second and later ones with `port <block> --expect "<output>=<kind>:<hint>"`). Connected inputs and outputs share one name (renaming either end renames the other). Make the title a short phrase that tells "what is made".\nRecord dates and hours with `npx boxglow set <block> --due 2026-10-15 --start 2026-10-01 --estimate 8 --hours 3.5`.\nGive each box a kind of work (category): `--category design` / build / verify / evaluate / study / research / ui / improve / fix / docs / ops / other (other: when unsure). Set it at add time; to change it, use `npx boxglow set <block> --category verify`.\nThe receiving side of a connection can be just a title (`npx boxglow connect "A.Design doc" "B"` creates an input "Design doc" on B and connects it; boxes in other levels work too, the ports in between are created automatically. In split\'s connections, `to: "B"` also works). Connected inputs and outputs share one name (they are aligned when connected, and renaming either end renames everything on the same wire). To add inputs / outputs to an existing box or rename them, use `npx boxglow port <block> --in <name> --out <name> --remove <name> --rename <old>=<new>` (removing an input also removes the inputs of the boxes that use it; top-level inputs are `port inputs`; withdraw a mistaken question with `npx boxglow unask <block>`) (`project` = the first project box. This also renames the final deliverable). Remove a wire with `npx boxglow disconnect <title.output name> <title.input name>` (a wire across levels is removed by naming both ends, with the relay ports in between), and remove a box itself with `npx boxglow remove <block>` (`--force` if it has boxes inside). The MCP tools (`boxglow_status` / `boxglow_start` / `boxglow_done` / `boxglow_ask` etc.; available after registration in your agent; `.mcp.json` is the Claude Code configuration) are another entry point to the same commands, and either way updates the same file. Export the plan as a document with `npx boxglow export --out docs/ROADMAP.md`.\n\n**Share project-wide decisions as policies**: when a box decides something many boxes depend on (technology choice, engine, art style), make that output a policy (`npx boxglow port <block> --policy "<output>"`; scope defaults to the same parent, `--policy-scope all` for the whole plan, `--advisory` to not block). It reaches every box in scope without wires, and the boxes in scope that have not started wait for it until it is decided (work in progress is not stopped). Read `policies` in `context` before working. Exclude unrelated boxes with `--skip-policy "<box>.<output>"`. If a policy changes after a box is done, it appears in `policyChanged` (check it again). Do not wire it to each box.\nIn a new project, first create 3-7 top-level items from the direction (the README or the request), confirm them with a human via `ask`, and then `split` only the item you are about to start (leave later stages coarse). Write each `ask` question so that it can be decided on its own, and put the premises, comparison and impact in `--context` (do not point outside the question, as in "Is this OK?"). When choosing one of several candidates, even if you decide by yourself, record it with `ask ... --options "A|B|C"` and `answer --by <yourself>` so that the candidates you did not choose are kept. To change direction, use `reopen <block> --note <reason>`. Everything works with the CLI alone (the screen is for humans to watch). If no human is in the loop, the AI records its decisions with `answer --by <yourself>` and proceeds.\nName each output after a "concrete deliverable" (e.g. `Design doc docs/design.md`, `PR #12`, `Public URL`, `Test results (vitest, 53 tests)`). Avoid abstract names such as "feature set" or "findings", and always attach a file, URL or commit with --artifact when you run done.\nMake sure every box\'s "input \u2192 output" is connected to something (an unconnected box is a hole in the plan. Unconnected inputs are raised to the top-level input node automatically).\nIf several people edit the same boxglow.json, each of them runs `npx boxglow git-setup` once in their own clone (changes are merged automatically per box, and changes to different boxes do not conflict).\nTo manage several repositories with one plan, put boxglow.json in the folder above them and set the environment variable BOXGLOW_FILE to its location in each repository (one project box per repository: `npx boxglow project "name" --repo <path>`).\nInputs are required by default. Mark an input as optional with `npx boxglow port <block> --optional <input name>` if work can start without it (`--required` turns it back). Describe a port with `--describe "<name>=<description>"`. "Next candidates" in status lists boxes whose required inputs are ready first (each is marked "ready to start" or "waiting for required inputs"). When a top-level plan input (Inputs) has no material (a spec, a scenario or other file or URL), every box that uses it waits. If the material is in the repository, attach it yourself instead of asking a person: `npx boxglow artifact inputs <path or URL> --input <input name>` (MCP: `boxglow_artifact` with block "inputs"). Work-in-progress material (for example a design whose dimensions are not settled yet) is neither left unattached nor attached as final: attach it to the output as work in progress with `npx boxglow artifact <block> <path> --draft`. Boxes using it keep waiting, but if one may start from the draft, mark its input with `npx boxglow port <block> --accept-draft <input name>` (ask a person with ask when unsure). Finishing the box with done confirms its drafts (`artifact <block> --final <title>` confirms one earlier). Reference material that should not be passed on goes to the box itself with `--link`. Remove a deliverable or material attached by mistake with `npx boxglow artifact <block|inputs> --remove <title or path>`. When a finished box shows "Policy: check again", check that the work matches the policy; if it does, clear the mark with `npx boxglow ack <block> --policy` (if not, reopen and fix it).\nDo not write descriptions for inputs (the description of the connected output is used). Write the format and constraints in the output\'s description.\n\n\n### What runs automatically (hooks)\n\n`setup-agent` registers `boxglow hook` in the Claude Code / Codex hooks. After a session starts, resumes or is compacted, the plan\'s resume summary is injected into the context automatically. When you are about to finish a reply while a box started in this session has no handoff (done or checkpoint), you are told to record first and continue (a log entry is a progress note, not a handoff). Editing boxglow.json directly with Edit / Write / apply_patch is blocked (update it through the CLI or MCP). These are a safety net, not a substitute for the steps above: keep recording as instructed.\n\n### Context token and handoff\n\nThe context guard keeps an AI from continuing work on outdated instructions. `setup-agent` turns it on (on other plans, run `npx boxglow guard on`).\nWhile it is on, an AI\'s `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` need `--context-token <context token>`. Commands run by a person (`--actor human`) do not.\n\n```\nnpx boxglow context B12 # read the decisions (including acknowledged answers), input/output contracts and handoff notes. contextToken in the output is the context token\nnpx boxglow start B12 --note "<what you will do>" --context-token <context token>\nnpx boxglow ask B12 "<question>" --options "A|B" --context-token <context token>\n# -> last line of the output: New context token: <token>\nnpx boxglow done B12 --artifact "<name>=<path>" --context-token <new context token>\n```\n\n- **The context token changes (you must reread)** when a person answers a decision or revises an answer, a person changes the instructions (title, description, input/output contracts), or another AI or a person updates the handoff note. The same applies when this happens on a parent box or an input provider. The old context token is rejected: reread `context`, take the change into account in your work, then retry\n- **The context token does not change** on `start` / `blocked` / `review` / `leave` / `ack`, on changes to progress, status, dates or category, when `check` verifies deliverables, or when boxes are moved on the screen. Keep using the same context token\n- **You can update it yourself**: when your own `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` etc. changes the context, the last line of its output is "New context token: <token>". You already know what you changed, so use it for the next command without rereading. `ask` / `decision` / `answer` / `reopen` run without a context token, but they print the new context token only when you pass the latest one\n- **Read the short form first**: `npx boxglow context <block> --brief` prints everything about the box itself (description, scope, decisions, handoff, inputs/outputs, deliverables) plus the plan description and, for parents and input providers, title, status, decisions (with their context and options; the history of earlier answers is left out) and the outputs that feed the box. The context token is the same as without `--brief`, so pass it to `--context-token` as is. Look at `target.missingInputs` (required inputs that are not ready) and `target.inputs[].sources` (which output of which box, with references to its deliverables) first. `omitted` counts what was left out. If an omitted description, contract or handoff may matter to your work, read without `--brief`, or read `context` of that box\n- **Precondition for starting from the short form**: the description of a parent or input provider that has any scope field set is left out of the short form (counted in `omitted.descriptions`). Set a scope only after moving the constraints written in the description (compatibility, prohibitions, deadlines) into it. On a plan where you cannot tell, or when `omitted.descriptions` is not 0, read once without `--brief` before you start. The short form is a starting point, not a guarantee that nothing else matters\n- Write so that the short form is enough: put the conditions that bind the work in the scope (non-goals / constraints / acceptance / consult) instead of burying them in a description. Only the latest handoff note is kept, so carry the open points, cautions and next steps forward each time you write one. Say where to start looking in the description of the box, in this form (a starting point, not a claim that those files are all there is to read):\n `Change candidates: <path> \u2014 <why to start there>` / `Related checks: <path or command> \u2014 <what it verifies>`\n- Do not turn the guard off to get past an old context token (an AI needs the latest context token to run `guard off`)\n- With MCP, use `boxglow_context` and the `contextToken` argument of each tool (the new context token is the last line of the tool result)\n- If "Another Boxglow writer holds the file lock" persists after waiting and retrying, show the output of `npx boxglow unlock` (owner and verdict) to a person and ask them to remove it. Never add `--actor human` yourself or delete the lock folder directly\n\n### Readiness, current scope, and fresh resume information\n\n- Read current activity, pending decisions, and unread answers first. Candidates are grouped by current scope / other candidates, then ready / needs detail / waiting for inputs, with the reasons and missing input names. A candidate that needs detail or is waiting is not ready.\n- "Ready" is a mechanical check: the box makes at least one output itself, that output has a planned deliverable (expect), the acceptance criteria are written, and required inputs are in. It does not judge whether the text is specific (`expect = src/`, `acceptance = works` pass). Write them so a third party can follow the target, the work, the result and how it is checked.\n- Four optional scope fields are available: goal, non-goals, acceptance, and consult (when to consult before expanding scope). Read the target and parent scopes at the start of context before starting and finishing. Textual acceptance criteria are not automatically evaluated.\n- Use scope B12 --goal "Goal" --non-goals "Excluded" --acceptance "Checks" --consult "When to ask". scope B12 only reads; none or an empty string clears a field. In the inspector, use the More tab \u2192 Edit work scope. Only populated fields appear in the collapsed scope section.\n- focus B12 prioritizes that box and its descendants; focus reads the selection, and focus none clears it. Other candidates remain in a separate group. Being listed does not authorize expanding scope or publishing.\n- Missing required inputs warn on start by default but still allow the start. Supply --reason "Why starting early is appropriate" to proceed without a warning and save the reason in both activity and the log. Artifact-free done also remains warning-only by default. Existing output artifacts or --artifact count; reference material on the box does not.\n- Only enable strict checks when selected for the plan: policy --start reject --done reject --unprepared reject. Each can return to warn. A recorded start reason overrides the missing-input rejection, but not the needs-detail one (add detail first). The artifact requirement also applies to set --status white. Human operations (UI / --actor human) are never rejected. Do not impersonate a human or weaken policy to bypass rejection.\n- With guard enabled, scope writes, focus selection/clearing, and policy writes require --context-token. These changes print a new token: use it next. Read-only forms need no token.\n- resume hides completed handoff bodies and shows their count. Request resume --include-completed only when history is needed; context / show can still read individual notes.\n- descriptionUpdatedAt dates description changes; statusChangedAt dates status changes; handoffs use their existing at field. Notes predating a status change are marked. Unknown legacy dates stay unknown, and recency does not establish truth.\n- After Done, CLI, inspector, and resume flag descriptions that may still describe an earlier state. Text is never rewritten automatically. Review it, then update with set B12 --note "Current description" (none clears it) or Notes in the UI.\n- MCP: boxglow_scope / boxglow_focus / boxglow_policy, boxglow_claim, expect / self on boxglow_port, reason on boxglow_start, and includeCompleted on boxglow_resume. Pass contextToken for writes.\n- All data fields are optional; schema v5 is unchanged. Old versions (0.4.2 and earlier) do not enforce these checks and drop workflowPolicy / focusBlockId when saving. Align all writers (CLI, serve, web app, bundled extension app) to a supporting build before using these settings. Check build time as well as version.\n\n\n### Sync decisions\n\nAI may only sync already bound projects and inspect comparisons. If sync stops for a conflict or a human choice, summarize the differences and use ask to notify the user. Never resolve conflicts, create a new binding, relink, recover, adopt, restore, or confirm an account. A human must use the UI or explicitly run CLI with --actor human. AI must never add --actor human, including after a chat answer; record the answer and wait for the human to apply the sync choice.\n\nCodex must pass `--actor codex` on every CLI call; Claude Code must pass `--actor claude-code`. Execution markers may not survive a WSL boundary. Give subagents names such as `codex-task`; never impersonate a human.\n\n### Claims for parallel work\n\nAssignees (who a box belongs to, so people can see it on the diagram) are set with `npx boxglow set <block> --assignee <name>` (comma-separated for several; `--add-assignee` / `--remove-assignee` add or remove one; `none` clears them; a missing name is added as a member; `npx boxglow members` lists them). A claim is a separate thing: an agreement that keeps several agents from editing the same box at once. To say "this area is Codex\'s", assign it, then take a claim when working on it.\n\nWhen claims are enabled for the plan, fix a unique `BOXGLOW_INSTANCE_ID` for each independent CLI session. Do not share it between agents. Read `claims` and `context`, then acquire with `claim` (before adding detail or splitting) or `start` (to run); a claim taken with `claim` carries over to `start` (default block scope, `--scope subtree` for descendants). Keep the token from the successful CLAIM line and pass `--claim-token` on writes. MCP keeps its own instance ID and acquired receipts automatically. Renew with `claim-renew` / `boxglow_claim_renew` every 5 minutes (or within half the lease for shorter leases); checkpoint before handoff. done/leave releases the target claim. On expiry or a generation mismatch, reread context and acquire again. The same actor name does not make another instance yours. Ask a person to change claim settings, force release, or resolve sync conflicts; never impersonate human. Synced copies on different devices are not protected by a distributed lock. See `docs/CLAIMS.md`.\n\nNever use another instance\u2019s ID or receipt, including receipts reconstructed from plan data or claims output. After MCP restarts, the same actor is still a different instance: wait for expiry or ask a person to release it; never take it over automatically.\n\nAutomatically promoted inputs belong to the original box\u2019s scope. Changes to shared input content or other boxes\u2019 layout require claims for all affected boxes. For plan settings such as focus or group, use `context root` \u2192 `claim root` and pass that CLAIM receipt (`start root` also works, but `claim` does not mark it in progress). A block-scoped root claim does not include ordinary boxes and is sufficient for plan settings. A subtree claim on root blocks all parallel work: AI agents must not use it and must consult a person. End it with `leave root`. Context-guard tokens are still required.\n\n---\n\nHuman-only sync operations prevent accidental actions; they are not enforced authorization or OS-level isolation. AI must never identify itself with `--actor human`. Report the comparison and stop reason to the user. MCP and AI-identified CLI output do not provide executable human choice commands.\n\nHuman CLI actions also accept `--actor human:name`; AI must not impersonate a human using either form. The `boxglow sync --help` hint in AI halt output is for humans who inherited an AI environment, not permission for AI to apply their choice.\n';
13485
13793
 
13486
13794
  // .claude/skills/boxglow/SKILL.md
13487
- var SKILL_default = '---\nname: boxglow\ndescription: Boxglow (boxglow.json) \u3067\u8A08\u753B\u3068\u9032\u6357\u3092\u4EBA\u9593\u3068\u5171\u6709\u3059\u308B\u3002\u4F5C\u696D\u306E\u958B\u59CB\u30FB\u5206\u89E3\u30FB\u5B8C\u4E86\u30FB\u5224\u65AD\u5F85\u3061\u3092 npx boxglow \u3067\u8A18\u9332\u3059\u308B\u3002\u300C\u9032\u6357\u3092 Boxglow \u306B\u8A18\u9332\u3057\u3066\u300D\u300Cboxglow \u3067\u72B6\u6CC1\u3092\u898B\u3066\u300D\u300C/boxglow\u300D\u3067\u4F7F\u7528\u3002\n---\n\n# Boxglow \u3067\u8A08\u753B\u3068\u9032\u6357\u3092\u5171\u6709\u3059\u308B\n\n\u30EA\u30DD\u30B8\u30C8\u30EA\u76F4\u4E0B\u306E `boxglow.json` \u304C\u8A08\u753B\u306E\u6B63\u672C\u3002\u4EBA\u9593\u306F Boxglow \u306E\u753B\u9762 (https://boxglow.app/ \u3067\u300Cboxglow.json \u3092\u958B\u304F\u300D) \u3067\u898B\u3066\u3044\u308B\u3002\n\u76F4\u63A5\u7DE8\u96C6\u305B\u305A `npx boxglow` \u3067\u66F4\u65B0\u3059\u308B\u3002\n\n## \u6700\u521D\u306E\u8A08\u753B\u3065\u304F\u308A (\u65B0\u3057\u3044\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u3068\u304D)\n\n1. \u65B9\u91DD (README\u3001\u4F9D\u983C\u6587\u3001\u8981\u4EF6\u30E1\u30E2) \u3092\u8AAD\u307F\u3001`npx boxglow init --name "<\u540D\u524D>"` \u306E\u3042\u3068\u3001\u6700\u4E0A\u4F4D\u306B\u5927\u9805\u76EE (3\u301C7 \u500B) \u3092 `add` \u3067\u7F6E\u304F\u3002\n \u5404\u5927\u9805\u76EE\u306B\u306F\u300C\u5165\u529B (\u4F55\u3092\u4F7F\u3046\u304B)\u300D\u3068\u300C\u51FA\u529B (\u5177\u4F53\u7684\u306A\u6210\u679C\u7269: \u30D5\u30A1\u30A4\u30EB\u30FBURL\u30FBPR)\u300D\u3092\u5FC5\u305A\u66F8\u304D\u3001\u6700\u7D42\u6210\u679C\u7269\u307E\u3067\u7DDA\u3067\u3064\u306A\u3050 (`connect`)\n2. \u4F5C\u3063\u305F\u3089 `npx boxglow ask <\u6700\u521D\u306E\u5927\u9805\u76EE> "\u3053\u306E\u5927\u9805\u76EE\u306E\u5206\u3051\u65B9\u3067\u3088\u3044\u3067\u3059\u304B?" --options "\u3088\u3044|\u76F4\u3057\u305F\u3044"` \u3067\u4EBA\u306E\u78BA\u8A8D\u3092\u53D6\u308B\u3002\n \u4EBA\u306F\u753B\u9762\u3067\u3082\u3001`npx boxglow answer <block> "<\u56DE\u7B54>"` \u3067\u3082\u3001\u30C1\u30E3\u30C3\u30C8\u3067\u3082\u7B54\u3048\u3089\u308C\u308B\u3002\u30C1\u30E3\u30C3\u30C8\u3067\u7B54\u3048\u304C\u8FD4\u3063\u305F\u3089 AI \u304C `answer --by human` \u3067\u8A18\u9332\u3059\u308B\u3002\n \u4EBA\u304C\u753B\u9762\u3092\u4F7F\u308F\u306A\u3044\u904B\u7528 (AI \u3060\u3051\u3067\u9032\u3081\u308B\u6307\u793A\u304C\u3042\u308B\u3068\u304D) \u306F\u3001AI \u81EA\u8EAB\u304C `answer --by claude-code "<\u5224\u65AD\u3068\u7406\u7531>"` \u3067\u8A18\u9332\u3057\u3066\u5148\u3078\u9032\u3080\u3002\u5224\u65AD\u306E\u8A18\u9332\u3092\u6B8B\u3059\u3053\u3068\u304C\u76EE\u7684\u3067\u3001\u753B\u9762\u306F\u5FC5\u9808\u3067\u306F\u306A\u3044\n3. \u7740\u624B\u3059\u308B\u5927\u9805\u76EE\u3060\u3051\u3092 `split` \u3067\u5206\u89E3\u3059\u308B (\u5148\u306E\u6BB5\u968E\u306F\u7C97\u3044\u307E\u307E\u3002\u9032\u3081\u306A\u304C\u3089\u7D30\u304B\u304F\u3059\u308B)\n\n## \u624B\u9806\n\n1. `npx boxglow resume` (\u307E\u305F\u306F `npx boxglow status --brief`) \u3092\u8AAD\u3080\u3002\u4F5C\u696D\u4E2D\u306E\u30DC\u30C3\u30AF\u30B9\u3001\u5224\u65AD\u5F85\u3061\u3001AI \u672A\u78BA\u8A8D\u306E\u56DE\u7B54\u3001\u6B21\u306E\u5019\u88DC\u3001\u672A\u5B8C\u4E86\u306E\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u628A\u63E1\u3059\u308B\u3002\u5168\u968E\u5C64\u304C\u8981\u308B\u3068\u304D\u306F `npx boxglow status`\n2. \u62C5\u5F53\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u3092\u6C7A\u3081\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E `readiness.state` \u304C `ready` \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002`unprepared` (\u8981\u5177\u4F53\u5316) \u306A\u3089 `unprepared` \u306E\u7406\u7531\u3068 `next` \u306E\u6B21\u306E\u4E00\u624B\u306B\u5F93\u3063\u3066\u5148\u306B\u5177\u4F53\u5316\u3059\u308B\u3002`waiting` \u306F\u5FC5\u9808\u306E\u5165\u529B\u304B\u5206\u5C90\u306E\u7B54\u3048\u3092\u5F85\u3063\u3066\u3044\u308B\n3. \u5177\u4F53\u5316\u3084\u5206\u89E3\u306E\u524D\u306B `npx boxglow claim <block>` \u3067\u53D7\u3051\u6301\u3061\u3060\u3051\u3092\u53D6\u308B (\u5B9F\u884C\u4E2D\u306B\u306F\u306A\u3089\u306A\u3044\u3002\u53D7\u3051\u6301\u3061\u5236\u5FA1\u304C\u7121\u52B9\u306A\u8A08\u753B\u3067\u306F\u300C\u53D6\u5F97\u4E0D\u8981\u300D\u3067\u6B63\u5E38\u7D42\u4E86\u3059\u308B)\u3002\u4E0D\u8DB3\u3092\u57CB\u3081\u308B:\n \u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269 `npx boxglow port <block> --expect "<\u51FA\u529B\u540D>=file:src/x.ts"` (kind \u306F file / dir / url / doc / note / decision / result\u3002\u307E\u3060\u7121\u3044\u30D5\u30A1\u30A4\u30EB\u3067\u3088\u3044)\u3001\u5B8C\u4E86\u6761\u4EF6 `npx boxglow scope <block> --acceptance "<\u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6>"`\u3002\n \u5927\u304D\u3044\u30DC\u30C3\u30AF\u30B9\u306F `npx boxglow split <block> --spec \'<JSON>\'` \u3067\u5206\u89E3\u3059\u308B (\u5F62\u5F0F\u306F `npx boxglow help`)\u3002\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051 expect / acceptance \u3092\u66F8\u304D\u3001\u5148\u306E\u5B50\u306F\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u3067\u3088\u3044\u3002\n \u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5206\u304B\u3089\u306A\u3044\u3068\u304D\u306F\u3001\u67B6\u7A7A\u306E\u30D1\u30B9\u3092\u66F8\u304B\u305A\u300C\u5BFE\u8C61\u3092\u7279\u5B9A\u3059\u308B\u8ABF\u67FB\u300D\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u51FA\u529B `note` \u3067\u4F5C\u3063\u3066\u59CB\u3081\u308B\u3002\n \u5206\u89E3\u306E\u5F8C\u306F `npx boxglow lint <block>` \u3092\u8AAD\u307F\u3001\u300C\u5FC5\u305A\u76F4\u3059\u300D\u3092\u76F4\u3057\u3066\u304B\u3089\u9032\u3080 (\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D\u306F\u5185\u5BB9\u3092\u898B\u3066\u5224\u65AD)\u3002\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9\u306F `"splitBy": "\u5DE5\u7A0B"` (\u307E\u305F\u306F `set --split-by`) \u3067\u4E00\u8A9E\u6B8B\u3059\u3002\n \u5185\u5BB9\u306E\u30EC\u30D3\u30E5\u30FC: `review-split <\u89AA>` \u306E\u6750\u6599\u3068\u30C1\u30A7\u30C3\u30AF\u9805\u76EE\u3092\u8AAD\u3093\u3067 `split-ok <\u89AA> --note "<\u6839\u62E0>"`\u3001\u7740\u624B\u306E\u524D\u306F `review-box <block>` \u2192 `box-ok <block> --note "<\u6839\u62E0>"` (\u6750\u6599\u304C\u5909\u308F\u308B\u3068 context \u306E reviews \u304C stale \u306B\u306A\u308B)\u3002\n \u7B54\u3048\u3067\u5F8C\u306E\u4F5C\u696D\u304C\u5206\u304B\u308C\u308B\u554F\u3044\u306F `ask ... --options "A|B" --branch` \u3067\u5206\u5C90\u306B\u3059\u308B (split \u306E JSON \u3067\u3082 `"branch": { question, options }` / `"join": true`)\n4. \u6E96\u5099\u304C\u3067\u304D\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u307F\u76F4\u3057\u3001`npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>"`\u3002\n \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u304C\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001\u51FA\u529B\u306E `contextToken` (\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3) \u3092 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3067\u4ED8\u3051\u308B\u3002\n \u8981\u5177\u4F53\u5316\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u306E start \u306F\u65E2\u5B9A\u3067\u306F\u8B66\u544A\u3001`policy --unprepared reject` \u306E\u8A08\u753B\u3067\u306F\u958B\u59CB\u3067\u304D\u306A\u3044 (`--reason` \u3067\u306F\u901A\u308C\u306A\u3044)\u3002\u51FA\u529B\u3092\u5B50\u306B\u4EFB\u305B\u304D\u308A\u306E\u89AA\u306F\u5B9F\u884C\u3059\u308B\u3082\u306E\u304C\u7121\u3044\u306E\u3067\u3001\u5B50\u3092 start \u3059\u308B\n5. \u6210\u679C\u7269\u304C\u3067\u304D\u305F\u3089 `npx boxglow done <block> --artifact "<\u540D\u524D>=<URL \u307E\u305F\u306F\u30D1\u30B9>" --checked "<\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>"` (\u691C\u67FB\u7D50\u679C\u306F `--checked` \u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C / `--not-checked` \u8A66\u3057\u3066\u3044\u306A\u3044\u3053\u3068 / `--limits` \u6B8B\u308B\u5236\u9650 \u306E 3 \u3064\u3067\u6B8B\u3059\u3002\u30B3\u30FC\u30C9\u4EE5\u5916\u306E\u6210\u679C\u7269\u306F\u300C\u78BA\u8A8D\u3057\u305F\u3053\u3068\u300D\u3092\u66F8\u304F\u3002guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B\u3002\u76F4\u524D\u306E\u81EA\u5206\u306E\u64CD\u4F5C\u306E\u51FA\u529B\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u3066\u3044\u308C\u3070\u3001\u305D\u308C\u3092\u4F7F\u3046)\n6. \u4EBA\u9593\u306E\u5224\u65AD\u304C\u8981\u308B\u3068\u304D\u306F `npx boxglow ask <block> "<\u8CEA\u554F>" --options "A|B"` \u3057\u3066\u4ED6\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u79FB\u308B\n7. \u8A70\u307E\u3063\u305F\u3089: \u5165\u529B (\u524D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599) \u304C\u8DB3\u308A\u306A\u3044\u3053\u3068\u304C\u539F\u56E0\u306A\u3089\u3001\u8A70\u307E\u308A\u306B\u3057\u306A\u3044\u3002`npx boxglow show <block>` \u3067\u5165\u529B\u306E\u914D\u7DDA\u3092\u78BA\u304B\u3081\u3001\u8DB3\u308A\u306A\u3044\u3082\u306E\u3092\u4F5C\u308B\u30DC\u30C3\u30AF\u30B9\u304C\u7121\u3051\u308C\u3070 `npx boxglow add` \u3067\u5916 (\u4E0A\u6D41) \u306B\u4F5C\u308A\u3001`npx boxglow connect` \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u529B\u306B\u3064\u306A\u3050 (\u914D\u7DDA\u304C\u300C\u5F85\u3061\u300D\u306E\u8272\u3067\u6B8B\u308A\u3001\u4F55\u3092\u5F85\u3063\u3066\u3044\u308B\u304B\u304C\u56F3\u3067\u898B\u3048\u308B)\u3002\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u3082\u3089\u3048\u3070\u9032\u3081\u308B\u306A\u3089 `ask`\u3002\u305D\u308C\u4EE5\u5916\u306E\u3001\u8A08\u753B\u306E\u5916\u306B\u3042\u308B\u969C\u5BB3 (\u74B0\u5883\u304C\u52D5\u304B\u306A\u3044\u3001\u6A29\u9650\u3084\u30AD\u30FC\u304C\u7121\u3044\u3001\u5916\u90E8\u306E\u8FD4\u4E8B\u5F85\u3061\u3001\u539F\u56E0\u306E\u5206\u304B\u3089\u306A\u3044\u5931\u6557) \u3060\u3051\u3092 `npx boxglow blocked <block> --note "<\u56F0\u3063\u3066\u3044\u308B\u3053\u3068>"` \u3067\u8A18\u9332\u3059\u308B\n8. \u4E2D\u65AD\u30FB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u5727\u7E2E\u30FB\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B `npx boxglow checkpoint <block> --note "\u5206\u304B\u3063\u305F\u3053\u3068; \u6B21\u306B\u3059\u308B\u3053\u3068; \u672A\u89E3\u6C7A\u306E\u3053\u3068"` \u3067\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u6B8B\u3059\n9. \u6700\u5F8C\u306B `npx boxglow status --brief` \u3092\u8981\u7D04\u3057\u3066\u5831\u544A\u3059\u308B\n\n## \u7D04\u675F\n\n- **\u307E\u3060\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u306F\u5206\u5C90\u3067\u8868\u3059**: \u8A08\u753B\u3092\u4F5C\u308B\u6642\u70B9\u3067\u3001\u5224\u65AD\u6B21\u7B2C\u3067\u5F8C\u306E\u4F5C\u696D (\u9053) \u304C\u5909\u308F\u308B\u3068\u304D\u306F `npx boxglow branch "<\u984C\u540D>" --options "A|B" --question "<\u554F\u3044>" --context "<\u5224\u65AD\u6750\u6599>"` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u4F5C\u308B\u3002\u9078\u629E\u80A2\u3054\u3068\u306B\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u306E\u3067\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3059\u308B\u3002\u9053\u304C\u5F8C\u3067 1 \u3064\u306B\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B\u306F `npx boxglow join --title "<\u984C\u540D>"` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3092\u7F6E\u304D\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u5F8C\u306E\u51FA\u529B\u3092\u3053\u306E\u90E8\u54C1\u3078 `connect` \u3057\u3001\u90E8\u54C1\u306E\u51FA\u529B\u3092\u5148\u306E\u7BB1\u3078\u3064\u306A\u3050 (\u3069\u308C\u304B 1 \u3064\u306E\u9053\u304C\u5C4A\u3051\u3070\u5148\u3078\u9032\u3080)\u3002\u4EBA\u304C\u7B54\u3048\u308B\u3068\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u9053\u306E\u5148\u306F\u300C\u898B\u9001\u308A\u300D\u306B\u306A\u308A\u3001\u9032\u6357\u3068\u6B21\u306E\u5019\u88DC\u304B\u3089\u5916\u308C\u308B\u3002\u3059\u3067\u306B\u4F5C\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304C\u5B9F\u306F\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u3060\u3068\u5206\u304B\u3063\u305F\u3089\u3001`npx boxglow branch --box <block> --options "A|B" --question "<\u554F\u3044>"` \u3067\u5206\u5C90\u306B\u5909\u3048\u308B (\u4ECA\u306E\u51FA\u529B\u304C 1 \u3064\u76EE\u306E\u9078\u629E\u80A2\u306E\u9053\u306B\u306A\u308A\u3001\u7DDA\u306F\u6B8B\u308B)\u3002\u7B54\u3048\u304C\u51FA\u308B\u524D\u306E\u9053\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5206\u5C90\u5F85\u3061\u300D\u3067\u3001\u7740\u624B\u3059\u308B\u3068\u8B66\u544A\u3055\u308C\u308B (\u5148\u306B\u4E0B\u8ABF\u3079\u3059\u308B\u306A\u3069\u7406\u7531\u304C\u3042\u308C\u3070 `--reason` \u3067\u8A18\u9332\u3059\u308B)\n- `ask` \u306E\u8CEA\u554F\u306F\u3001\u305D\u308C\u3060\u3051\u3067\u5224\u65AD\u3067\u304D\u308B\u3088\u3046\u306B\u66F8\u304F\u3002\u300C\u3053\u308C\u3067\u3088\u3044\u3067\u3059\u304B\u300D\u300C\u4E0A\u8A18\u306E\u6848\u300D\u306E\u3088\u3046\u306B\u5916\u3092\u6307\u3055\u305A\u3001\u524D\u63D0\u30FB\u6BD4\u8F03\u30FB\u5F71\u97FF\u3092 `--context` \u306B\u66F8\u304F (\u4EBA\u306F\u4E00\u89A7\u306E\u4E2D\u306E\u8CEA\u554F\u3060\u3051\u3092\u8AAD\u3093\u3067\u7B54\u3048\u308B)\n- \u5019\u88DC\u304B\u3089 1 \u3064\u3092\u9078\u3076\u5834\u9762 (\u65B9\u5F0F\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA\u30FB\u8A2D\u8A08\u306E\u9078\u629E) \u3067\u306F\u3001AI \u304C\u81EA\u5206\u3067\u6C7A\u3081\u308B\u3068\u304D\u3082 `ask <block> "<\u554F\u3044>" --options "A|B|C"` \u2192 `answer --by claude-code "<\u9078\u3093\u3060\u3082\u306E>\u3002\u7406\u7531: ..."` \u306E\u5F62\u3067\u8A18\u9332\u3057\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u5019\u88DC\u3092\u30DC\u30C3\u30AF\u30B9\u306B\u6B8B\u3059 (\u65B9\u91DD\u8EE2\u63DB\u306E\u3068\u304D\u306B\u623B\u308C\u308B)\n- \u65B9\u91DD\u8EE2\u63DB\u306F `reopen <block> --note "<\u7406\u7531>"` \u3067\u524D\u306E\u7B54\u3048\u3092\u5C65\u6B74\u306B\u6B8B\u3057\u3066\u9078\u3073\u76F4\u3059 (\u5019\u88DC\u306F\u6D88\u3055\u306A\u3044)\n\n- \u540C\u6642\u306B\u4F5C\u696D\u4E2D\u306B\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u306F 1\u301C2 \u500B\u307E\u3067\n- \u6210\u679C\u7269 (artifact) \u306F\u5F8C\u304B\u3089\u4EBA\u304C\u958B\u3051\u308B\u3082\u306E (\u30B3\u30DF\u30C3\u30C8\u3001PR\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9) \u306B\u3059\u308B\n- \u51FA\u529B\u306F\u5177\u4F53\u7684\u306A\u6210\u679C\u7269\u306E\u540D\u524D\u306B\u3059\u308B (\u30D5\u30A1\u30A4\u30EB\u30FBPR\u30FBURL\u30FB\u30C6\u30B9\u30C8\u7D50\u679C)\u3002\u62BD\u8C61\u7684\u306A\u540D\u524D (\u6A5F\u80FD\u4E00\u5F0F\u3001\u6240\u898B) \u306F\u907F\u3051\u308B\u30021 \u3064\u306E\u4F5C\u696D\u3067\u8907\u6570\u306E\u7269\u304C\u3067\u304D\u308B\u306A\u3089\u51FA\u529B\u3092\u5206\u3051\u308B (`port <block> --out "<\u540D\u524D>"` \u3067\u8DB3\u3059)\n- \u7D50\u7DDA\u306E\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044 (`connect "A.\u8A2D\u8A08\u66F8" "B"` \u3067 B \u306B\u5165\u529B\u300C\u8A2D\u8A08\u66F8\u300D\u304C\u4F5C\u3089\u308C\u308B)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F 1 \u3064\u306E\u540D\u524D (\u3069\u3061\u3089\u5074\u3067\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u3082\u540C\u3058\u540D\u524D\u306B\u306A\u308B)\n- \u30DC\u30C3\u30AF\u30B9\u306F\u5FC5\u305A\u300C\u5165\u529B \u2192 \u51FA\u529B\u300D\u3067\u3064\u306A\u3050\u3002\u8DB3\u308A\u306A\u3044\u5165\u51FA\u529B\u306F `port`\u3001\u5916\u3059\u306E\u306F `disconnect`\u3001\u30DC\u30C3\u30AF\u30B9\u305D\u306E\u3082\u306E\u3092\u6D88\u3059\u306E\u306F `remove`\u3002\u6587\u66F8\u5316\u306F `export --out docs/ROADMAP.md`\n- \u30DC\u30C3\u30AF\u30B9\u3092 add \u3059\u308B\u3068\u304D\u306F\u4ED5\u4E8B\u306E\u7A2E\u985E\u3092 `--category` \u3067\u4ED8\u3051\u308B (design \u8A2D\u8A08 / build \u5B9F\u88C5 / verify \u691C\u8A3C / evaluate \u8A55\u4FA1 / study \u691C\u8A0E / research \u8ABF\u67FB / ui \u30C7\u30B6\u30A4\u30F3 / improve \u6539\u5584 / fix \u8AB2\u984C\u89E3\u6C7A / docs \u6587\u66F8 / ops \u904B\u7528 / other \u305D\u306E\u4ED6)\u3002\u753B\u9762\u3067\u306F\u8272\u306E\u5E2F\u3068\u672D\u306B\u306A\u308B\n- boxglow.json \u304C\u307E\u3060\u7121\u3051\u308C\u3070 `npx boxglow init --name "<\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D>"` \u3067\u4F5C\u308A\u3001\u6700\u7D42\u6210\u679C\u7269\u3068\u6700\u4E0A\u4F4D\u306E\u30DC\u30C3\u30AF\u30B9\u3092 `add` \u3067\u7F6E\u304F\n\n## \u81EA\u52D5\u3067\u52D5\u304F\u4ED5\u7D44\u307F (hooks)\n\n`setup-agent` \u304C Claude Code / Codex \u306E hooks \u306B `boxglow hook` \u3092\u767B\u9332\u3057\u3066\u3044\u308B\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u958B\u59CB\u30FB\u518D\u958B\u30FB\u5727\u7E2E\u306E\u5F8C\u306B\u8A08\u753B\u306E\u518D\u958B\u306E\u6982\u8981 (resume) \u304C\u6587\u8108\u306B\u5165\u308B\u3002\u5FDC\u7B54\u3092\u7D42\u3048\u308B\u3068\u304D\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 start \u3057\u305F\u7BB1\u306B\u5F15\u304D\u7D99\u304E (done \u304B checkpoint) \u304C\u7121\u3051\u308C\u3070\u300C\u8A18\u9332\u3057\u3066\u304B\u3089\u7D42\u3048\u308B\u300D\u3088\u3046\u7D9A\u884C\u304C\u6307\u793A\u3055\u308C\u308B (log \u306F\u9032\u6357\u306E\u30E1\u30E2\u3067\u3001\u5F15\u304D\u7D99\u304E\u306E\u4EE3\u308F\u308A\u306B\u306A\u3089\u306A\u3044)\u3002boxglow.json \u3092\u76F4\u63A5\u66F8\u304D\u63DB\u3048\u308B\u64CD\u4F5C (Edit / Write / apply_patch) \u306F\u6B62\u3081\u3089\u308C\u308B\u3002\u3053\u308C\u306F\u5FD8\u308C\u305F\u3068\u304D\u306E\u4FDD\u967A\u3067\u3001\u4E0A\u306E\u624B\u9806\u3069\u304A\u308A\u306B\u81EA\u5206\u3067\u8A18\u9332\u3059\u308B\u3002\n\u5206\u89E3\u3084\u7740\u624B\u6E96\u5099\u306E\u30EC\u30D3\u30E5\u30FC\u306F\u3001\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 `boxglow-review` \u306B\u4EFB\u305B\u3089\u308C\u308B (review-split / review-box \u306E\u6750\u6599\u3092\u8AAD\u3093\u3067\u8A55\u4FA1\u3068\u6839\u62E0\u3092\u8FD4\u3059\u3002split-ok / box-ok \u306E\u8A18\u9332\u306F\u3001\u8FD4\u3063\u3066\u304D\u305F\u6839\u62E0\u3067\u89AA\u3067\u3042\u308B\u81EA\u5206\u304C\u884C\u3046)\u3002\n\n## \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\n\n\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u306F\u3001AI \u304C\u53E4\u3044\u6307\u793A\u306E\u307E\u307E\u4F5C\u696D\u3092\u9032\u3081\u308B\u306E\u3092\u9632\u3050\u4ED5\u7D44\u307F\u3002`setup-agent` \u304C\u6709\u52B9\u306B\u3059\u308B (\u305D\u308C\u4EE5\u5916\u306E\u8A08\u753B\u3067\u306F `npx boxglow guard on`)\u3002\n\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001AI \u306E `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` \u306B `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u304C\u8981\u308B\u3002\u4EBA\u306E\u64CD\u4F5C (`--actor human`) \u306B\u306F\u8981\u6C42\u3055\u308C\u306A\u3044\u3002\n\n```\nnpx boxglow context B12 # \u5224\u65AD (\u5F15\u304D\u53D6\u308A\u6E08\u307F\u306E\u56DE\u7B54\u3092\u542B\u3080)\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E contextToken \u304C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\nnpx boxglow start B12 --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\nnpx boxglow ask B12 "<\u8CEA\u554F>" --options "A|B" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n# \u2192 \u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C: \u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\nnpx boxglow done B12 --artifact "<\u540D\u524D>=<\u30D1\u30B9>" --context-token <\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n```\n\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u308B\u5834\u5408 (\u8AAD\u307F\u76F4\u3057\u304C\u8981\u308B)**: \u4EBA\u304C\u56DE\u7B54\u3057\u305F\u30FB\u56DE\u7B54\u3092\u76F4\u3057\u305F\u3001\u4EBA\u304C\u6307\u793A (\u984C\u540D\u30FB\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6) \u3092\u5909\u3048\u305F\u3001\u4ED6\u306E AI \u3084\u4EBA\u304C\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u66F4\u65B0\u3057\u305F\u3002\u89AA\u3084\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u8D77\u304D\u305F\u5834\u5408\u3082\u540C\u3058\u3002\u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u62D2\u5426\u3055\u308C\u308B\u306E\u3067\u3001`context` \u3092\u8AAD\u307F\u76F4\u3057\u3001\u5909\u308F\u3063\u305F\u5185\u5BB9\u3092\u4F5C\u696D\u306B\u53CD\u6620\u3057\u3066\u304B\u3089\u3084\u308A\u76F4\u3059\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u3089\u306A\u3044\u5834\u5408**: `start` / `blocked` / `review` / `leave` / `ack`\u3001\u9032\u6357\u30FB\u72B6\u614B\u30FB\u671F\u65E5\u30FB\u30AB\u30C6\u30B4\u30EA\u306E\u5909\u66F4\u3001`check` \u306B\u3088\u308B\u6210\u679C\u7269\u306E\u78BA\u8A8D\u3001\u753B\u9762\u3067\u306E\u914D\u7F6E\u306E\u5909\u66F4\u3002\u540C\u3058\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4F7F\u3044\u7D9A\u3051\u3089\u308C\u308B\n- **\u81EA\u5206\u3067\u66F4\u65B0\u3067\u304D\u308B\u5834\u5408**: \u81EA\u5206\u306E `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` \u306A\u3069\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5909\u308F\u3063\u305F\u3068\u304D\u306F\u3001\u305D\u306E\u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u308B\u3002\u8AAD\u307F\u76F4\u3055\u305A\u306B\u6B21\u306E\u64CD\u4F5C\u3078\u4F7F\u3046\u3002`ask` / `decision` / `answer` / `reopen` \u306F\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u7121\u3057\u3067\u3082\u5B9F\u884C\u3067\u304D\u308B\u304C\u3001\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4ED8\u3051\u305F\u3068\u304D\u3060\u3051\n- \u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u901A\u3059\u305F\u3081\u306B guard \u3092\u7121\u52B9\u306B\u3057\u306A\u3044 (AI \u304C `guard off` \u3059\u308B\u306B\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u8981\u308B)\n- \u518D\u958B\u3059\u308B\u3068\u304D\u306F `npx boxglow resume` \u3092\u8AAD\u307F\u3001\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306E\u3042\u308B\u30DC\u30C3\u30AF\u30B9\u306F `context` \u3067\u4E2D\u8EAB\u3092\u78BA\u304B\u3081\u3066\u304B\u3089\u7D9A\u3051\u308B\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306F\u4F1A\u8A71\u306E\u5C65\u6B74\u3084\u6D3B\u52D5\u30ED\u30B0\u306E\u4E0A\u9650\u3068\u306F\u5225\u306B\u3001\u8A08\u753B\u306E\u4E2D\u306B\u6B8B\u308B\n- MCP \u3067\u306F `boxglow_context` \u3068\u3001\u5404\u30C4\u30FC\u30EB\u306E `contextToken` \u5F15\u6570\u3092\u4F7F\u3046\n- \u300C\u4ED6\u306E Boxglow \u304C\u66F8\u304D\u8FBC\u307F\u4E2D (\u30ED\u30C3\u30AF\u4E2D)\u300D\u3068\u51FA\u3066\u3001\u5C11\u3057\u5F85\u3063\u3066\u3084\u308A\u76F4\u3057\u3066\u3082\u89E3\u3051\u306A\u3044\u3068\u304D\u306F\u3001`npx boxglow unlock` \u306E\u8868\u793A (\u6301\u3061\u4E3B\u3068\u5224\u5B9A) \u3092\u4EBA\u306B\u898B\u305B\u3066\u89E3\u9664\u3092\u983C\u3080\u3002\u81EA\u5206\u3067 `--actor human` \u3092\u4ED8\u3051\u305F\u308A\u3001\u30ED\u30C3\u30AF\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u76F4\u63A5\u6D88\u3057\u305F\u308A\u3057\u306A\u3044\n\n\n### \u7740\u624B\u30FB\u5B8C\u4E86\u3001\u4ECA\u56DE\u306E\u7BC4\u56F2\u3001\u8A18\u9332\u306E\u9BAE\u5EA6\n\n- \u6700\u521D\u306B resume \u306E\u73FE\u6CC1 (\u6D3B\u52D5\u30FB\u5224\u65AD\u5F85\u3061\u30FB\u672A\u78BA\u8A8D\u56DE\u7B54) \u3092\u8AAD\u3080\u3002\u5019\u88DC\u306F\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2 / \u305D\u306E\u4ED6\u300D\u306E\u5404\u7D44\u3067\u300C\u7740\u624B\u3067\u304D\u308B / \u8981\u5177\u4F53\u5316 / \u5165\u529B\u5F85\u3061\u300D\u306B\u5206\u304B\u308C\u3001\u8981\u5177\u4F53\u5316\u306E\u7406\u7531\u3068\u4E0D\u8DB3\u3059\u308B\u5165\u529B\u540D\u304C\u51FA\u308B\u3002\u8981\u5177\u4F53\u5316\u3084\u5165\u529B\u5F85\u3061\u3092\u3001\u6E96\u5099\u6E08\u307F\u3068\u53D6\u308A\u9055\u3048\u306A\u3044\u3002\u300C\u7740\u624B\u3067\u304D\u308B\u300D\u306F\u6A5F\u68B0\u691C\u67FB (\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u30FBexpect\u30FBacceptance\u30FB\u5FC5\u9808\u306E\u5165\u529B) \u306E\u7D50\u679C\u3067\u3001\u5185\u5BB9\u306E\u5177\u4F53\u3055\u307E\u3067\u306F\u4FDD\u8A3C\u3057\u306A\u3044\u3002\n- \u30DC\u30C3\u30AF\u30B9\u306E\u4EFB\u610F5\u9805\u76EE\u3092 scope \u3067\u8A2D\u5B9A\u3059\u308B\u3002goal = \u4ECA\u56DE\u9054\u6210\u3059\u308B\u3053\u3068\u3001non-goals = \u4ECA\u56DE\u306F\u6271\u308F\u306A\u3044\u3053\u3068\u3001constraints = \u51FA\u529B\u3092\u4F5C\u308B\u3046\u3048\u3067\u5B88\u308B\u6761\u4EF6 (\u6027\u80FD\u30FB\u54C1\u8CEA\u30FB\u30B5\u30A4\u30BA\u30FB\u5BF8\u6CD5\u30FB\u6D88\u8CBB\u96FB\u529B\u306A\u3069)\u3001acceptance = \u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6\u3001consult = \u7BC4\u56F2\u3092\u5E83\u3052\u308B\u524D\u306B\u76F8\u8AC7\u3059\u308B\u6761\u4EF6\u3002context \u306E\u5148\u982D\u3067\u5BFE\u8C61\u3068\u89AA\u306E\u7BC4\u56F2\u3092\u8AAD\u307F\u3001\u7740\u624B\u524D\u3068\u5B8C\u4E86\u524D\u306B\u7167\u5408\u3059\u308B\u3002\u5B8C\u4E86\u6761\u4EF6\u306E\u672C\u6587\u3092AI\u304C\u6E80\u305F\u3057\u305F\u304B\u306F\u81EA\u52D5\u5224\u5B9A\u3057\u306A\u3044\u3002\n- scope B12 --goal "\u9054\u6210\u3059\u308B\u3053\u3068" --non-goals "\u4ECA\u56DE\u6271\u308F\u306A\u3044\u3053\u3068" --constraints "\u5B88\u308B\u6761\u4EF6" --acceptance "\u78BA\u8A8D\u3059\u308B\u6761\u4EF6" --consult "\u76F8\u8AC7\u3059\u308B\u6761\u4EF6" \u3067\u8A2D\u5B9A\u3059\u308B\u3002scope B12 \u306F\u8868\u793A\u3060\u3051\u3002\u5404\u9805\u76EE\u306B none \u307E\u305F\u306F\u7A7A\u6587\u5B57\u3092\u6E21\u3059\u3068\u6D88\u3059\u3002\u753B\u9762\u3067\u306F\u8A73\u7D30\u30D1\u30CD\u30EB\u306E\u300C\u305D\u306E\u4ED6\u300D\u30BF\u30D6 \u2192\u300C\u4F5C\u696D\u7BC4\u56F2\u3092\u7DE8\u96C6\u300D\u3002\u8A18\u5165\u6E08\u307F\u306E\u9805\u76EE\u3060\u3051\u304C\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2\u300D\u306B\u51FA\u308B\u3002\n- focus B12 \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3068\u914D\u4E0B\u3092\u6B21\u5019\u88DC\u306E\u5148\u982D\u306B\u3059\u308B\u3002focus \u306F\u73FE\u5728\u306E\u5BFE\u8C61\u306E\u8868\u793A\u3001focus none \u306F\u89E3\u9664\u3002\u5BFE\u8C61\u5916\u3082\u5225\u306E\u7D44\u306B\u6B8B\u308B\u3002\u5019\u88DC\u306B\u51FA\u308B\u3053\u3068\u81EA\u4F53\u306F\u4F5C\u696D\u7BC4\u56F2\u306E\u62E1\u5927\u3084\u516C\u958B\u3092\u8A31\u53EF\u3057\u306A\u3044\u3002\n- \u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306B\u8CC7\u6599\u304C\u7121\u3044\u3068\u3001\u4F7F\u3046\u7BB1\u306F\u3059\u3079\u3066\u5165\u529B\u5F85\u3061\u306B\u306A\u308B\u3002\u8CC7\u6599\u304C\u30EA\u30DD\u30B8\u30C8\u30EA\u306B\u3042\u308C\u3070 `npx boxglow artifact inputs <\u30D1\u30B9\u304B URL> --input <\u5165\u529B\u540D>` \u3067\u81EA\u5206\u3067\u4ED8\u3051\u308B (\u4EBA\u306B\u983C\u307E\u306A\u3044)\u3002\u5916\u3059\u306E\u306F `artifact <block|inputs> --remove <\u984C\u540D\u304B\u30D1\u30B9>`\u3002\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B\u5165\u529B\u306F `port <block> --optional <\u5165\u529B\u540D>`\u3002\n- \u6E08\u3093\u3060\u7BB1\u306E\u300C\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057\u300D\u306F\u3001\u4F5C\u696D\u304C\u65B9\u91DD\u306B\u5408\u3063\u3066\u3044\u308C\u3070 `npx boxglow ack <block> --policy` \u3067\u6D88\u3059 (\u5408\u3063\u3066\u3044\u306A\u3051\u308C\u3070 reopen)\u3002\n- start \u306E\u5FC5\u9808\u5165\u529B\u4E0D\u8DB3\u306F\u65E2\u5B9A\u3067\u8B66\u544A\u3059\u308B\u304C\u3001\u5F93\u6765\u3069\u304A\u308A\u958B\u59CB\u3067\u304D\u308B\u3002\u5148\u884C\u4F5C\u696D\u304C\u5FC5\u8981\u306A\u3089 --reason "\u5148\u306B\u884C\u3046\u7406\u7531" \u3092\u4ED8\u3051\u308B\u3002\u8B66\u544A\u306F\u51FA\u305A\u3001\u7406\u7531\u306F\u6D3B\u52D5\u3068\u30ED\u30B0\u306B\u6B8B\u308B\u3002done \u306E\u51FA\u529B\u6210\u679C\u7269\u306A\u3057\u3082\u65E2\u5B9A\u3067\u8B66\u544A\u306E\u307F\u3002\u65E2\u5B58\u306E\u51FA\u529B\u6210\u679C\u7269\u307E\u305F\u306F --artifact \u3092\u6570\u3048\u3001\u30DC\u30C3\u30AF\u30B9\u306E\u53C2\u8003\u8CC7\u6599\u306F\u6570\u3048\u306A\u3044\u3002\n- \u8A08\u753B\u3067\u9078\u3076\u5834\u5408\u3060\u3051 policy --start reject --done reject --unprepared reject \u306B\u3059\u308B\u3002\u305D\u308C\u305E\u308C warn \u306B\u623B\u305B\u308B\u3002\u5165\u529B\u5F85\u3061\u306E\u62D2\u5426\u3067\u3082\u7406\u7531\u4ED8\u304D\u306E\u958B\u59CB\u306F\u53EF\u80FD\u3060\u304C\u3001\u8981\u5177\u4F53\u5316\u306E\u62D2\u5426\u306F\u7406\u7531\u3067\u306F\u901A\u308C\u306A\u3044\u3002\u6210\u679C\u7269\u306A\u3057\u306E\u62D2\u5426\u306F set --status white \u306B\u3082\u52B9\u304F\u3002\u4EBA\u306E\u64CD\u4F5C (\u753B\u9762 / --actor human) \u306F\u62D2\u5426\u3057\u306A\u3044\u3002AI\u304C\u62D2\u5426\u3092\u907F\u3051\u308B\u305F\u3081\u306B\u4EBA\u3092\u540D\u4E57\u3063\u305F\u308A\u3001\u8A2D\u5B9A\u3092\u5F31\u3081\u305F\u308A\u3057\u306A\u3044\u3002\n- guard \u6709\u52B9\u6642\u3001scope \u306E\u5909\u66F4\u3001focus \u306E\u8A2D\u5B9A\u30FB\u89E3\u9664\u3001policy \u306E\u5909\u66F4\u306B\u3082 --context-token \u304C\u5FC5\u8981\u3002scope/focus/policy \u3092\u5909\u3048\u308B\u3068\u65B0\u3057\u3044\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u3067\u3001\u6B21\u306E\u64CD\u4F5C\u306F\u305D\u308C\u3092\u4F7F\u3046\u3002\u8868\u793A\u3060\u3051\u306B\u306F\u4E0D\u8981\u3002\n- resume \u306F\u5B8C\u4E86\u6E08\u307F\u306E\u5F15\u304D\u7D99\u304E\u672C\u6587\u3092\u96A0\u3057\u3001\u4EF6\u6570\u3060\u3051\u793A\u3059\u3002\u5C65\u6B74\u304C\u5FC5\u8981\u306A\u5834\u5408\u3060\u3051 resume --include-completed \u3067\u5C55\u958B\u3059\u308B (context / show \u3067\u306F\u500B\u5225\u306B\u8AAD\u3081\u308B)\u3002\n- \u8AAC\u660E\u306F descriptionUpdatedAt\u3001\u72B6\u614B\u306F statusChangedAt\u3001\u5F15\u304D\u7D99\u304E\u306F\u65E2\u5B58\u306E at \u3067\u65E5\u6642\u3092\u78BA\u8A8D\u3067\u304D\u308B\u3002\u72B6\u614B\u5909\u66F4\u3088\u308A\u53E4\u3044\u30E1\u30E2\u306F\u305D\u306E\u65E8\u3092\u793A\u3059\u3002\u65E7\u8A18\u9332\u306E\u4E0D\u660E\u306A\u65E5\u6642\u306F\u88DC\u308F\u306A\u3044\u3002\u300C\u65B0\u3057\u3044\u8A18\u9332\u300D\u306F\u771F\u507D\u306E\u4FDD\u8A3C\u3067\u306F\u306A\u3044\u3002\n- Done \u3067\u53E4\u3044\u72B6\u6CC1\u8AAC\u660E\u304C\u6B8B\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u5834\u5408\u3001CLI\u30FB\u8A73\u7D30\u30D1\u30CD\u30EB\u30FBresume \u306B\u898B\u76F4\u3057\u6848\u5185\u304C\u51FA\u308B\u3002\u672C\u6587\u306F\u81EA\u52D5\u3067\u6D88\u3055\u306A\u3044\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u3057\u3001\u5FC5\u8981\u306A\u3089 set B12 --note "\u73FE\u5728\u306E\u8AAC\u660E" (none \u3067\u6D88\u53BB) \u307E\u305F\u306F\u753B\u9762\u306E Notes \u3067\u76F4\u3059\u3002\n- MCP \u306F boxglow_scope / boxglow_focus / boxglow_policy\u3001boxglow_start \u306E reason\u3001boxglow_resume \u306E includeCompleted \u3092\u4F7F\u3046\u3002\u5909\u66F4\u306B\u306F contextToken \u3092\u4ED8\u3051\u308B\u3002\n- \u30C7\u30FC\u30BF\u5F62\u5F0F\u306F v5 \u306E\u307E\u307E\u3067\u5168\u9805\u76EE\u306F\u4EFB\u610F\u3002\u65E7\u7248 (0.4.2\u4EE5\u524D) \u306F\u65B0\u3057\u3044\u898F\u5247\u3092\u5B9F\u884C\u305B\u305A\u3001\u4FDD\u5B58\u6642\u306B\u8A08\u753B\u306E workflowPolicy / focusBlockId \u3092\u843D\u3068\u3059\u3002\u3053\u308C\u3089\u3092\u4F7F\u3046\u8A08\u753B\u306E\u66F8\u304D\u624B (CLI\u30FBserve\u30FB\u753B\u9762\u30FB\u62E1\u5F35\u5185\u306E\u30A2\u30D7\u30EA) \u306F\u5BFE\u5FDC\u3057\u305F\u30D3\u30EB\u30C9\u306B\u63C3\u3048\u308B\u3002\u7248\u756A\u53F7\u3060\u3051\u3067\u306A\u304F\u30D3\u30EB\u30C9\u65E5\u6642\u3082\u78BA\u8A8D\u3059\u308B\u3002\n';
13795
+ var SKILL_default = '---\nname: boxglow\ndescription: Boxglow (boxglow.json) \u3067\u8A08\u753B\u3068\u9032\u6357\u3092\u4EBA\u9593\u3068\u5171\u6709\u3059\u308B\u3002\u4F5C\u696D\u306E\u958B\u59CB\u30FB\u5206\u89E3\u30FB\u5B8C\u4E86\u30FB\u5224\u65AD\u5F85\u3061\u3092 npx boxglow \u3067\u8A18\u9332\u3059\u308B\u3002\u300C\u9032\u6357\u3092 Boxglow \u306B\u8A18\u9332\u3057\u3066\u300D\u300Cboxglow \u3067\u72B6\u6CC1\u3092\u898B\u3066\u300D\u300C/boxglow\u300D\u3067\u4F7F\u7528\u3002\n---\n\n# Boxglow \u3067\u8A08\u753B\u3068\u9032\u6357\u3092\u5171\u6709\u3059\u308B\n\n\u30EA\u30DD\u30B8\u30C8\u30EA\u76F4\u4E0B\u306E `boxglow.json` \u304C\u8A08\u753B\u306E\u6B63\u672C\u3002\u4EBA\u9593\u306F Boxglow \u306E\u753B\u9762 (https://boxglow.app/ \u3067\u300Cboxglow.json \u3092\u958B\u304F\u300D) \u3067\u898B\u3066\u3044\u308B\u3002\n\u76F4\u63A5\u7DE8\u96C6\u305B\u305A `npx boxglow` \u3067\u66F4\u65B0\u3059\u308B\u3002\n\n## \u6700\u521D\u306E\u8A08\u753B\u3065\u304F\u308A (\u65B0\u3057\u3044\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u3068\u304D)\n\n1. \u65B9\u91DD (README\u3001\u4F9D\u983C\u6587\u3001\u8981\u4EF6\u30E1\u30E2) \u3092\u8AAD\u307F\u3001`npx boxglow init --name "<\u540D\u524D>"` \u306E\u3042\u3068\u3001\u6700\u4E0A\u4F4D\u306B\u5927\u9805\u76EE (3\u301C7 \u500B) \u3092 `add` \u3067\u7F6E\u304F\u3002\n \u5404\u5927\u9805\u76EE\u306B\u306F\u300C\u5165\u529B (\u4F55\u3092\u4F7F\u3046\u304B)\u300D\u3068\u300C\u51FA\u529B (\u5177\u4F53\u7684\u306A\u6210\u679C\u7269: \u30D5\u30A1\u30A4\u30EB\u30FBURL\u30FBPR)\u300D\u3092\u5FC5\u305A\u66F8\u304D\u3001\u6700\u7D42\u6210\u679C\u7269\u307E\u3067\u7DDA\u3067\u3064\u306A\u3050 (`connect`)\n2. \u4F5C\u3063\u305F\u3089 `npx boxglow ask <\u6700\u521D\u306E\u5927\u9805\u76EE> "\u3053\u306E\u5927\u9805\u76EE\u306E\u5206\u3051\u65B9\u3067\u3088\u3044\u3067\u3059\u304B?" --options "\u3088\u3044|\u76F4\u3057\u305F\u3044"` \u3067\u4EBA\u306E\u78BA\u8A8D\u3092\u53D6\u308B\u3002\n \u4EBA\u306F\u753B\u9762\u3067\u3082\u3001`npx boxglow answer <block> "<\u56DE\u7B54>"` \u3067\u3082\u3001\u30C1\u30E3\u30C3\u30C8\u3067\u3082\u7B54\u3048\u3089\u308C\u308B\u3002\u30C1\u30E3\u30C3\u30C8\u3067\u7B54\u3048\u304C\u8FD4\u3063\u305F\u3089 AI \u304C `answer --by human` \u3067\u8A18\u9332\u3059\u308B\u3002\n \u4EBA\u304C\u753B\u9762\u3092\u4F7F\u308F\u306A\u3044\u904B\u7528 (AI \u3060\u3051\u3067\u9032\u3081\u308B\u6307\u793A\u304C\u3042\u308B\u3068\u304D) \u306F\u3001AI \u81EA\u8EAB\u304C `answer --by claude-code "<\u5224\u65AD\u3068\u7406\u7531>"` \u3067\u8A18\u9332\u3057\u3066\u5148\u3078\u9032\u3080\u3002\u5224\u65AD\u306E\u8A18\u9332\u3092\u6B8B\u3059\u3053\u3068\u304C\u76EE\u7684\u3067\u3001\u753B\u9762\u306F\u5FC5\u9808\u3067\u306F\u306A\u3044\n3. \u7740\u624B\u3059\u308B\u5927\u9805\u76EE\u3060\u3051\u3092 `split` \u3067\u5206\u89E3\u3059\u308B (\u5148\u306E\u6BB5\u968E\u306F\u7C97\u3044\u307E\u307E\u3002\u9032\u3081\u306A\u304C\u3089\u7D30\u304B\u304F\u3059\u308B)\n\n## \u624B\u9806\n\n1. `npx boxglow resume` (\u307E\u305F\u306F `npx boxglow status --brief`) \u3092\u8AAD\u3080\u3002\u4F5C\u696D\u4E2D\u306E\u30DC\u30C3\u30AF\u30B9\u3001\u5224\u65AD\u5F85\u3061\u3001AI \u672A\u78BA\u8A8D\u306E\u56DE\u7B54\u3001\u6B21\u306E\u5019\u88DC\u3001\u672A\u5B8C\u4E86\u306E\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u628A\u63E1\u3059\u308B\u3002\u5168\u968E\u5C64\u304C\u8981\u308B\u3068\u304D\u306F `npx boxglow status`\n2. \u62C5\u5F53\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u3092\u6C7A\u3081\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E `readiness.state` \u304C `ready` \u306A\u3089\u7740\u624B\u3067\u304D\u308B\u3002`unprepared` (\u8981\u5177\u4F53\u5316) \u306A\u3089 `unprepared` \u306E\u7406\u7531\u3068 `next` \u306E\u6B21\u306E\u4E00\u624B\u306B\u5F93\u3063\u3066\u5148\u306B\u5177\u4F53\u5316\u3059\u308B\u3002`waiting` \u306F\u5FC5\u9808\u306E\u5165\u529B\u304B\u5206\u5C90\u306E\u7B54\u3048\u3092\u5F85\u3063\u3066\u3044\u308B\n3. \u5177\u4F53\u5316\u3084\u5206\u89E3\u306E\u524D\u306B `npx boxglow claim <block>` \u3067\u53D7\u3051\u6301\u3061\u3060\u3051\u3092\u53D6\u308B (\u5B9F\u884C\u4E2D\u306B\u306F\u306A\u3089\u306A\u3044\u3002\u53D7\u3051\u6301\u3061\u5236\u5FA1\u304C\u7121\u52B9\u306A\u8A08\u753B\u3067\u306F\u300C\u53D6\u5F97\u4E0D\u8981\u300D\u3067\u6B63\u5E38\u7D42\u4E86\u3059\u308B)\u3002\u4E0D\u8DB3\u3092\u57CB\u3081\u308B:\n \u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269 `npx boxglow port <block> --expect "<\u51FA\u529B\u540D>=file:src/x.ts"` (kind \u306F file / dir / url / doc / note / decision / result\u3002\u307E\u3060\u7121\u3044\u30D5\u30A1\u30A4\u30EB\u3067\u3088\u3044)\u3001\u5B8C\u4E86\u6761\u4EF6 `npx boxglow scope <block> --acceptance "<\u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6>"`\u3002\n \u5927\u304D\u3044\u30DC\u30C3\u30AF\u30B9\u306F `npx boxglow split <block> --spec \'<JSON>\'` \u3067\u5206\u89E3\u3059\u308B (\u5F62\u5F0F\u306F `npx boxglow help`)\u3002\u4ECA\u56DE\u7740\u624B\u3059\u308B\u5B50\u3060\u3051 expect / acceptance \u3092\u66F8\u304D\u3001\u5148\u306E\u5B50\u306F\u984C\u540D\u3068\u51FA\u529B\u3060\u3051\u3067\u3088\u3044\u3002\n \u5BFE\u8C61\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5206\u304B\u3089\u306A\u3044\u3068\u304D\u306F\u3001\u67B6\u7A7A\u306E\u30D1\u30B9\u3092\u66F8\u304B\u305A\u300C\u5BFE\u8C61\u3092\u7279\u5B9A\u3059\u308B\u8ABF\u67FB\u300D\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u51FA\u529B `note` \u3067\u4F5C\u3063\u3066\u59CB\u3081\u308B\u3002\n \u5206\u89E3\u306E\u5F8C\u306F `npx boxglow lint <block>` \u3092\u8AAD\u307F\u3001\u300C\u5FC5\u305A\u76F4\u3059\u300D\u3092\u76F4\u3057\u3066\u304B\u3089\u9032\u3080 (\u300C\u898B\u76F4\u3057\u5019\u88DC\u300D\u306F\u5185\u5BB9\u3092\u898B\u3066\u5224\u65AD)\u3002\u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9\u306F `"splitBy": "\u5DE5\u7A0B"` (\u307E\u305F\u306F `set --split-by`) \u3067\u4E00\u8A9E\u6B8B\u3059\u3002\n \u5185\u5BB9\u306E\u30EC\u30D3\u30E5\u30FC: `review-split <\u89AA>` \u306E\u6750\u6599\u3068\u30C1\u30A7\u30C3\u30AF\u9805\u76EE\u3092\u8AAD\u3093\u3067 `split-ok <\u89AA> --note "<\u6839\u62E0>"`\u3001\u7740\u624B\u306E\u524D\u306F `review-box <block>` \u2192 `box-ok <block> --note "<\u6839\u62E0>"` (\u6750\u6599\u304C\u5909\u308F\u308B\u3068 context \u306E reviews \u304C stale \u306B\u306A\u308B)\u3002\n \u7B54\u3048\u3067\u5F8C\u306E\u4F5C\u696D\u304C\u5206\u304B\u308C\u308B\u554F\u3044\u306F `ask ... --options "A|B" --branch` \u3067\u5206\u5C90\u306B\u3059\u308B (split \u306E JSON \u3067\u3082 `"branch": { question, options }` / `"join": true`)\n4. \u6E96\u5099\u304C\u3067\u304D\u305F\u3089 `npx boxglow context <block>` \u3092\u8AAD\u307F\u76F4\u3057\u3001`npx boxglow start <block> --note "<\u4F55\u3092\u3059\u308B\u304B>"`\u3002\n \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u304C\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001\u51FA\u529B\u306E `contextToken` (\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3) \u3092 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3067\u4ED8\u3051\u308B\u3002\n \u8981\u5177\u4F53\u5316\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u306E start \u306F\u65E2\u5B9A\u3067\u306F\u8B66\u544A\u3001`policy --unprepared reject` \u306E\u8A08\u753B\u3067\u306F\u958B\u59CB\u3067\u304D\u306A\u3044 (`--reason` \u3067\u306F\u901A\u308C\u306A\u3044)\u3002\u51FA\u529B\u3092\u5B50\u306B\u4EFB\u305B\u304D\u308A\u306E\u89AA\u306F\u5B9F\u884C\u3059\u308B\u3082\u306E\u304C\u7121\u3044\u306E\u3067\u3001\u5B50\u3092 start \u3059\u308B\n5. \u6210\u679C\u7269\u304C\u3067\u304D\u305F\u3089 `npx boxglow done <block> --artifact "<\u540D\u524D>=<URL \u307E\u305F\u306F\u30D1\u30B9>" --checked "<\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>"` (\u691C\u67FB\u7D50\u679C\u306F `--checked` \u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C / `--not-checked` \u8A66\u3057\u3066\u3044\u306A\u3044\u3053\u3068 / `--limits` \u6B8B\u308B\u5236\u9650 \u306E 3 \u3064\u3067\u6B8B\u3059\u3002\u30B3\u30FC\u30C9\u4EE5\u5916\u306E\u6210\u679C\u7269\u306F\u300C\u78BA\u8A8D\u3057\u305F\u3053\u3068\u300D\u3092\u66F8\u304F\u3002guard \u304C\u6709\u52B9\u306A\u3089 `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u3092\u4ED8\u3051\u308B\u3002\u76F4\u524D\u306E\u81EA\u5206\u306E\u64CD\u4F5C\u306E\u51FA\u529B\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u3066\u3044\u308C\u3070\u3001\u305D\u308C\u3092\u4F7F\u3046)\n6. \u4EBA\u9593\u306E\u5224\u65AD\u304C\u8981\u308B\u3068\u304D\u306F `npx boxglow ask <block> "<\u8CEA\u554F>" --options "A|B"` \u3057\u3066\u4ED6\u306E\u30DC\u30C3\u30AF\u30B9\u3078\u79FB\u308B\n7. \u8A70\u307E\u3063\u305F\u3089: \u5165\u529B (\u524D\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u6210\u679C\u7269\u30FB\u8CC7\u6599) \u304C\u8DB3\u308A\u306A\u3044\u3053\u3068\u304C\u539F\u56E0\u306A\u3089\u3001\u8A70\u307E\u308A\u306B\u3057\u306A\u3044\u3002`npx boxglow show <block>` \u3067\u5165\u529B\u306E\u914D\u7DDA\u3092\u78BA\u304B\u3081\u3001\u8DB3\u308A\u306A\u3044\u3082\u306E\u3092\u4F5C\u308B\u30DC\u30C3\u30AF\u30B9\u304C\u7121\u3051\u308C\u3070 `npx boxglow add` \u3067\u5916 (\u4E0A\u6D41) \u306B\u4F5C\u308A\u3001`npx boxglow connect` \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u5165\u529B\u306B\u3064\u306A\u3050 (\u914D\u7DDA\u304C\u300C\u5F85\u3061\u300D\u306E\u8272\u3067\u6B8B\u308A\u3001\u4F55\u3092\u5F85\u3063\u3066\u3044\u308B\u304B\u304C\u56F3\u3067\u898B\u3048\u308B)\u3002\u9078\u629E\u80A2\u304B\u3089\u9078\u3093\u3067\u3082\u3089\u3048\u3070\u9032\u3081\u308B\u306A\u3089 `ask`\u3002\u305D\u308C\u4EE5\u5916\u306E\u3001\u8A08\u753B\u306E\u5916\u306B\u3042\u308B\u969C\u5BB3 (\u74B0\u5883\u304C\u52D5\u304B\u306A\u3044\u3001\u6A29\u9650\u3084\u30AD\u30FC\u304C\u7121\u3044\u3001\u5916\u90E8\u306E\u8FD4\u4E8B\u5F85\u3061\u3001\u539F\u56E0\u306E\u5206\u304B\u3089\u306A\u3044\u5931\u6557) \u3060\u3051\u3092 `npx boxglow blocked <block> --note "<\u56F0\u3063\u3066\u3044\u308B\u3053\u3068>"` \u3067\u8A18\u9332\u3059\u308B\n8. \u4E2D\u65AD\u30FB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u5727\u7E2E\u30FB\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B `npx boxglow checkpoint <block> --note "\u5206\u304B\u3063\u305F\u3053\u3068; \u6B21\u306B\u3059\u308B\u3053\u3068; \u672A\u89E3\u6C7A\u306E\u3053\u3068"` \u3067\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u6B8B\u3059\n9. \u6700\u5F8C\u306B `npx boxglow status --brief` \u3092\u8981\u7D04\u3057\u3066\u5831\u544A\u3059\u308B\n\n## \u7D04\u675F\n\n- **\u307E\u3060\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u306F\u5206\u5C90\u3067\u8868\u3059**: \u8A08\u753B\u3092\u4F5C\u308B\u6642\u70B9\u3067\u3001\u5224\u65AD\u6B21\u7B2C\u3067\u5F8C\u306E\u4F5C\u696D (\u9053) \u304C\u5909\u308F\u308B\u3068\u304D\u306F `npx boxglow branch "<\u984C\u540D>" --options "A|B" --question "<\u554F\u3044>" --context "<\u5224\u65AD\u6750\u6599>"` \u3067\u5206\u5C90\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u4F5C\u308B\u3002\u9078\u629E\u80A2\u3054\u3068\u306B\u9053 (\u51FA\u529B) \u304C\u3067\u304D\u308B\u306E\u3067\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u521D\u306E\u30DC\u30C3\u30AF\u30B9\u3078 `connect` \u3059\u308B\u3002\u9053\u304C\u5F8C\u3067 1 \u3064\u306B\u307E\u3068\u307E\u308B\u3068\u3053\u308D\u306B\u306F `npx boxglow join --title "<\u984C\u540D>"` \u3067\u5408\u6D41\u306E\u90E8\u54C1\u3092\u7F6E\u304D\u3001\u305D\u308C\u305E\u308C\u306E\u9053\u306E\u6700\u5F8C\u306E\u51FA\u529B\u3092\u3053\u306E\u90E8\u54C1\u3078 `connect` \u3057\u3001\u90E8\u54C1\u306E\u51FA\u529B\u3092\u5148\u306E\u7BB1\u3078\u3064\u306A\u3050 (\u3069\u308C\u304B 1 \u3064\u306E\u9053\u304C\u5C4A\u3051\u3070\u5148\u3078\u9032\u3080)\u3002\u4EBA\u304C\u7B54\u3048\u308B\u3068\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u9053\u306E\u5148\u306F\u300C\u898B\u9001\u308A\u300D\u306B\u306A\u308A\u3001\u9032\u6357\u3068\u6B21\u306E\u5019\u88DC\u304B\u3089\u5916\u308C\u308B\u3002\u3059\u3067\u306B\u4F5C\u3063\u305F\u30DC\u30C3\u30AF\u30B9\u304C\u5B9F\u306F\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u5206\u304B\u308C\u9053\u3060\u3068\u5206\u304B\u3063\u305F\u3089\u3001`npx boxglow branch --box <block> --options "A|B" --question "<\u554F\u3044>"` \u3067\u5206\u5C90\u306B\u5909\u3048\u308B (\u4ECA\u306E\u51FA\u529B\u304C 1 \u3064\u76EE\u306E\u9078\u629E\u80A2\u306E\u9053\u306B\u306A\u308A\u3001\u7DDA\u306F\u6B8B\u308B)\u3002\u7B54\u3048\u304C\u51FA\u308B\u524D\u306E\u9053\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u300C\u5206\u5C90\u5F85\u3061\u300D\u3067\u3001\u7740\u624B\u3059\u308B\u3068\u8B66\u544A\u3055\u308C\u308B (\u5148\u306B\u4E0B\u8ABF\u3079\u3059\u308B\u306A\u3069\u7406\u7531\u304C\u3042\u308C\u3070 `--reason` \u3067\u8A18\u9332\u3059\u308B)\n- `ask` \u306E\u8CEA\u554F\u306F\u3001\u305D\u308C\u3060\u3051\u3067\u5224\u65AD\u3067\u304D\u308B\u3088\u3046\u306B\u66F8\u304F\u3002\u300C\u3053\u308C\u3067\u3088\u3044\u3067\u3059\u304B\u300D\u300C\u4E0A\u8A18\u306E\u6848\u300D\u306E\u3088\u3046\u306B\u5916\u3092\u6307\u3055\u305A\u3001\u524D\u63D0\u30FB\u6BD4\u8F03\u30FB\u5F71\u97FF\u3092 `--context` \u306B\u66F8\u304F (\u4EBA\u306F\u4E00\u89A7\u306E\u4E2D\u306E\u8CEA\u554F\u3060\u3051\u3092\u8AAD\u3093\u3067\u7B54\u3048\u308B)\n- \u5019\u88DC\u304B\u3089 1 \u3064\u3092\u9078\u3076\u5834\u9762 (\u65B9\u5F0F\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA\u30FB\u8A2D\u8A08\u306E\u9078\u629E) \u3067\u306F\u3001AI \u304C\u81EA\u5206\u3067\u6C7A\u3081\u308B\u3068\u304D\u3082 `ask <block> "<\u554F\u3044>" --options "A|B|C"` \u2192 `answer --by claude-code "<\u9078\u3093\u3060\u3082\u306E>\u3002\u7406\u7531: ..."` \u306E\u5F62\u3067\u8A18\u9332\u3057\u3001\u9078\u3070\u306A\u304B\u3063\u305F\u5019\u88DC\u3092\u30DC\u30C3\u30AF\u30B9\u306B\u6B8B\u3059 (\u65B9\u91DD\u8EE2\u63DB\u306E\u3068\u304D\u306B\u623B\u308C\u308B)\n- \u65B9\u91DD\u8EE2\u63DB\u306F `reopen <block> --note "<\u7406\u7531>"` \u3067\u524D\u306E\u7B54\u3048\u3092\u5C65\u6B74\u306B\u6B8B\u3057\u3066\u9078\u3073\u76F4\u3059 (\u5019\u88DC\u306F\u6D88\u3055\u306A\u3044)\n\n- \u540C\u6642\u306B\u4F5C\u696D\u4E2D\u306B\u3059\u308B\u30DC\u30C3\u30AF\u30B9\u306F 1\u301C2 \u500B\u307E\u3067\n- \u6210\u679C\u7269 (artifact) \u306F\u5F8C\u304B\u3089\u4EBA\u304C\u958B\u3051\u308B\u3082\u306E (\u30B3\u30DF\u30C3\u30C8\u3001PR\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9) \u306B\u3059\u308B\n- \u51FA\u529B\u306F\u5177\u4F53\u7684\u306A\u6210\u679C\u7269\u306E\u540D\u524D\u306B\u3059\u308B (\u30D5\u30A1\u30A4\u30EB\u30FBPR\u30FBURL\u30FB\u30C6\u30B9\u30C8\u7D50\u679C)\u3002\u62BD\u8C61\u7684\u306A\u540D\u524D (\u6A5F\u80FD\u4E00\u5F0F\u3001\u6240\u898B) \u306F\u907F\u3051\u308B\u30021 \u3064\u306E\u4F5C\u696D\u3067\u8907\u6570\u306E\u7269\u304C\u3067\u304D\u308B\u306A\u3089\u51FA\u529B\u3092\u5206\u3051\u308B (`port <block> --out "<\u540D\u524D>"` \u3067\u8DB3\u3059)\n- \u7D50\u7DDA\u306E\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044 (`connect "A.\u8A2D\u8A08\u66F8" "B"` \u3067 B \u306B\u5165\u529B\u300C\u8A2D\u8A08\u66F8\u300D\u304C\u4F5C\u3089\u308C\u308B)\u3002\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306F 1 \u3064\u306E\u540D\u524D (\u3069\u3061\u3089\u5074\u3067\u5909\u3048\u3066\u3082\u3001\u3064\u306A\u304C\u308B\u5148\u3082\u540C\u3058\u540D\u524D\u306B\u306A\u308B)\n- \u30DC\u30C3\u30AF\u30B9\u306F\u5FC5\u305A\u300C\u5165\u529B \u2192 \u51FA\u529B\u300D\u3067\u3064\u306A\u3050\u3002\u8DB3\u308A\u306A\u3044\u5165\u51FA\u529B\u306F `port`\u3001\u5916\u3059\u306E\u306F `disconnect`\u3001\u30DC\u30C3\u30AF\u30B9\u305D\u306E\u3082\u306E\u3092\u6D88\u3059\u306E\u306F `remove`\u3002\u6587\u66F8\u5316\u306F `export --out docs/ROADMAP.md`\n- \u30DC\u30C3\u30AF\u30B9\u3092 add \u3059\u308B\u3068\u304D\u306F\u4ED5\u4E8B\u306E\u7A2E\u985E\u3092 `--category` \u3067\u4ED8\u3051\u308B (design \u8A2D\u8A08 / build \u5B9F\u88C5 / verify \u691C\u8A3C / evaluate \u8A55\u4FA1 / study \u691C\u8A0E / research \u8ABF\u67FB / ui \u30C7\u30B6\u30A4\u30F3 / improve \u6539\u5584 / fix \u8AB2\u984C\u89E3\u6C7A / docs \u6587\u66F8 / ops \u904B\u7528 / other \u305D\u306E\u4ED6)\u3002\u753B\u9762\u3067\u306F\u8272\u306E\u5E2F\u3068\u672D\u306B\u306A\u308B\n- boxglow.json \u304C\u307E\u3060\u7121\u3051\u308C\u3070 `npx boxglow init --name "<\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u540D>"` \u3067\u4F5C\u308A\u3001\u6700\u7D42\u6210\u679C\u7269\u3068\u6700\u4E0A\u4F4D\u306E\u30DC\u30C3\u30AF\u30B9\u3092 `add` \u3067\u7F6E\u304F\n\n## \u81EA\u52D5\u3067\u52D5\u304F\u4ED5\u7D44\u307F (hooks)\n\n`setup-agent` \u304C Claude Code / Codex \u306E hooks \u306B `boxglow hook` \u3092\u767B\u9332\u3057\u3066\u3044\u308B\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u958B\u59CB\u30FB\u518D\u958B\u30FB\u5727\u7E2E\u306E\u5F8C\u306B\u8A08\u753B\u306E\u518D\u958B\u306E\u6982\u8981 (resume) \u304C\u6587\u8108\u306B\u5165\u308B\u3002\u5FDC\u7B54\u3092\u7D42\u3048\u308B\u3068\u304D\u3001\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 start \u3057\u305F\u7BB1\u306B\u5F15\u304D\u7D99\u304E (done \u304B checkpoint) \u304C\u7121\u3051\u308C\u3070\u300C\u8A18\u9332\u3057\u3066\u304B\u3089\u7D42\u3048\u308B\u300D\u3088\u3046\u7D9A\u884C\u304C\u6307\u793A\u3055\u308C\u308B (log \u306F\u9032\u6357\u306E\u30E1\u30E2\u3067\u3001\u5F15\u304D\u7D99\u304E\u306E\u4EE3\u308F\u308A\u306B\u306A\u3089\u306A\u3044)\u3002boxglow.json \u3092\u76F4\u63A5\u66F8\u304D\u63DB\u3048\u308B\u64CD\u4F5C (Edit / Write / apply_patch) \u306F\u6B62\u3081\u3089\u308C\u308B\u3002\u3053\u308C\u306F\u5FD8\u308C\u305F\u3068\u304D\u306E\u4FDD\u967A\u3067\u3001\u4E0A\u306E\u624B\u9806\u3069\u304A\u308A\u306B\u81EA\u5206\u3067\u8A18\u9332\u3059\u308B\u3002\n\u5206\u89E3\u3084\u7740\u624B\u6E96\u5099\u306E\u30EC\u30D3\u30E5\u30FC\u306F\u3001\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 `boxglow-review` \u306B\u4EFB\u305B\u3089\u308C\u308B (review-split / review-box \u306E\u6750\u6599\u3092\u8AAD\u3093\u3067\u8A55\u4FA1\u3068\u6839\u62E0\u3092\u8FD4\u3059\u3002split-ok / box-ok \u306E\u8A18\u9332\u306F\u3001\u8FD4\u3063\u3066\u304D\u305F\u6839\u62E0\u3067\u89AA\u3067\u3042\u308B\u81EA\u5206\u304C\u884C\u3046)\u3002\n\n## \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3068\u5F15\u304D\u7D99\u304E\n\n\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42 (guard) \u306F\u3001AI \u304C\u53E4\u3044\u6307\u793A\u306E\u307E\u307E\u4F5C\u696D\u3092\u9032\u3081\u308B\u306E\u3092\u9632\u3050\u4ED5\u7D44\u307F\u3002`setup-agent` \u304C\u6709\u52B9\u306B\u3059\u308B (\u305D\u308C\u4EE5\u5916\u306E\u8A08\u753B\u3067\u306F `npx boxglow guard on`)\u3002\n\u6709\u52B9\u306A\u8A08\u753B\u3067\u306F\u3001AI \u306E `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` \u306B `--context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>` \u304C\u8981\u308B\u3002\u4EBA\u306E\u64CD\u4F5C (`--actor human`) \u306B\u306F\u8981\u6C42\u3055\u308C\u306A\u3044\u3002\n\n```\nnpx boxglow context B12 # \u5224\u65AD (\u5F15\u304D\u53D6\u308A\u6E08\u307F\u306E\u56DE\u7B54\u3092\u542B\u3080)\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6\u30FB\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u8AAD\u3080\u3002\u51FA\u529B\u306E contextToken \u304C\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\nnpx boxglow start B12 --note "<\u4F55\u3092\u3059\u308B\u304B>" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\nnpx boxglow ask B12 "<\u8CEA\u554F>" --options "A|B" --context-token <\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n# \u2192 \u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C: \u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\nnpx boxglow done B12 --artifact "<\u540D\u524D>=<\u30D1\u30B9>" --context-token <\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3>\n```\n\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u308B\u5834\u5408 (\u8AAD\u307F\u76F4\u3057\u304C\u8981\u308B)**: \u4EBA\u304C\u56DE\u7B54\u3057\u305F\u30FB\u56DE\u7B54\u3092\u76F4\u3057\u305F\u3001\u4EBA\u304C\u6307\u793A (\u984C\u540D\u30FB\u8AAC\u660E\u30FB\u5165\u51FA\u529B\u306E\u6761\u4EF6) \u3092\u5909\u3048\u305F\u3001\u4ED6\u306E AI \u3084\u4EBA\u304C\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u3092\u66F4\u65B0\u3057\u305F\u3002\u89AA\u3084\u5165\u529B\u5143\u306E\u30DC\u30C3\u30AF\u30B9\u3067\u8D77\u304D\u305F\u5834\u5408\u3082\u540C\u3058\u3002\u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u62D2\u5426\u3055\u308C\u308B\u306E\u3067\u3001`context` \u3092\u8AAD\u307F\u76F4\u3057\u3001\u5909\u308F\u3063\u305F\u5185\u5BB9\u3092\u4F5C\u696D\u306B\u53CD\u6620\u3057\u3066\u304B\u3089\u3084\u308A\u76F4\u3059\n- **\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u5909\u308F\u3089\u306A\u3044\u5834\u5408**: `start` / `blocked` / `review` / `leave` / `ack`\u3001\u9032\u6357\u30FB\u72B6\u614B\u30FB\u671F\u65E5\u30FB\u30AB\u30C6\u30B4\u30EA\u306E\u5909\u66F4\u3001`check` \u306B\u3088\u308B\u6210\u679C\u7269\u306E\u78BA\u8A8D\u3001\u753B\u9762\u3067\u306E\u914D\u7F6E\u306E\u5909\u66F4\u3002\u540C\u3058\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4F7F\u3044\u7D9A\u3051\u3089\u308C\u308B\n- **\u81EA\u5206\u3067\u66F4\u65B0\u3067\u304D\u308B\u5834\u5408**: \u81EA\u5206\u306E `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` \u306A\u3069\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5909\u308F\u3063\u305F\u3068\u304D\u306F\u3001\u305D\u306E\u51FA\u529B\u306E\u6700\u5F8C\u306E\u884C\u306B\u300C\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3: <token>\u300D\u304C\u51FA\u308B\u3002\u8AAD\u307F\u76F4\u3055\u305A\u306B\u6B21\u306E\u64CD\u4F5C\u3078\u4F7F\u3046\u3002`ask` / `decision` / `answer` / `reopen` \u306F\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u7121\u3057\u3067\u3082\u5B9F\u884C\u3067\u304D\u308B\u304C\u3001\u65B0\u3057\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u4ED8\u3051\u305F\u3068\u304D\u3060\u3051\n- \u53E4\u3044\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u3092\u901A\u3059\u305F\u3081\u306B guard \u3092\u7121\u52B9\u306B\u3057\u306A\u3044 (AI \u304C `guard off` \u3059\u308B\u306B\u306F\u6700\u65B0\u306E\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u304C\u8981\u308B)\n- \u518D\u958B\u3059\u308B\u3068\u304D\u306F `npx boxglow resume` \u3092\u8AAD\u307F\u3001\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306E\u3042\u308B\u30DC\u30C3\u30AF\u30B9\u306F `context` \u3067\u4E2D\u8EAB\u3092\u78BA\u304B\u3081\u3066\u304B\u3089\u7D9A\u3051\u308B\u3002\u5F15\u304D\u7D99\u304E\u30E1\u30E2\u306F\u4F1A\u8A71\u306E\u5C65\u6B74\u3084\u6D3B\u52D5\u30ED\u30B0\u306E\u4E0A\u9650\u3068\u306F\u5225\u306B\u3001\u8A08\u753B\u306E\u4E2D\u306B\u6B8B\u308B\n- MCP \u3067\u306F `boxglow_context` \u3068\u3001\u5404\u30C4\u30FC\u30EB\u306E `contextToken` \u5F15\u6570\u3092\u4F7F\u3046\n- \u300C\u4ED6\u306E Boxglow \u304C\u66F8\u304D\u8FBC\u307F\u4E2D (\u30ED\u30C3\u30AF\u4E2D)\u300D\u3068\u51FA\u3066\u3001\u5C11\u3057\u5F85\u3063\u3066\u3084\u308A\u76F4\u3057\u3066\u3082\u89E3\u3051\u306A\u3044\u3068\u304D\u306F\u3001`npx boxglow unlock` \u306E\u8868\u793A (\u6301\u3061\u4E3B\u3068\u5224\u5B9A) \u3092\u4EBA\u306B\u898B\u305B\u3066\u89E3\u9664\u3092\u983C\u3080\u3002\u81EA\u5206\u3067 `--actor human` \u3092\u4ED8\u3051\u305F\u308A\u3001\u30ED\u30C3\u30AF\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u76F4\u63A5\u6D88\u3057\u305F\u308A\u3057\u306A\u3044\n\n\n### \u7740\u624B\u30FB\u5B8C\u4E86\u3001\u4ECA\u56DE\u306E\u7BC4\u56F2\u3001\u8A18\u9332\u306E\u9BAE\u5EA6\n\n- \u6700\u521D\u306B resume \u306E\u73FE\u6CC1 (\u6D3B\u52D5\u30FB\u5224\u65AD\u5F85\u3061\u30FB\u672A\u78BA\u8A8D\u56DE\u7B54) \u3092\u8AAD\u3080\u3002\u5019\u88DC\u306F\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2 / \u305D\u306E\u4ED6\u300D\u306E\u5404\u7D44\u3067\u300C\u7740\u624B\u3067\u304D\u308B / \u8981\u5177\u4F53\u5316 / \u5165\u529B\u5F85\u3061\u300D\u306B\u5206\u304B\u308C\u3001\u8981\u5177\u4F53\u5316\u306E\u7406\u7531\u3068\u4E0D\u8DB3\u3059\u308B\u5165\u529B\u540D\u304C\u51FA\u308B\u3002\u8981\u5177\u4F53\u5316\u3084\u5165\u529B\u5F85\u3061\u3092\u3001\u6E96\u5099\u6E08\u307F\u3068\u53D6\u308A\u9055\u3048\u306A\u3044\u3002\u300C\u7740\u624B\u3067\u304D\u308B\u300D\u306F\u6A5F\u68B0\u691C\u67FB (\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u30FBexpect\u30FBacceptance\u30FB\u5FC5\u9808\u306E\u5165\u529B) \u306E\u7D50\u679C\u3067\u3001\u5185\u5BB9\u306E\u5177\u4F53\u3055\u307E\u3067\u306F\u4FDD\u8A3C\u3057\u306A\u3044\u3002\n- \u30DC\u30C3\u30AF\u30B9\u306E\u4EFB\u610F5\u9805\u76EE\u3092 scope \u3067\u8A2D\u5B9A\u3059\u308B\u3002goal = \u4ECA\u56DE\u9054\u6210\u3059\u308B\u3053\u3068\u3001non-goals = \u4ECA\u56DE\u306F\u6271\u308F\u306A\u3044\u3053\u3068\u3001constraints = \u51FA\u529B\u3092\u4F5C\u308B\u3046\u3048\u3067\u5B88\u308B\u6761\u4EF6 (\u6027\u80FD\u30FB\u54C1\u8CEA\u30FB\u30B5\u30A4\u30BA\u30FB\u5BF8\u6CD5\u30FB\u6D88\u8CBB\u96FB\u529B\u306A\u3069)\u3001acceptance = \u5B8C\u4E86\u3068\u5224\u65AD\u3059\u308B\u6761\u4EF6\u3001consult = \u7BC4\u56F2\u3092\u5E83\u3052\u308B\u524D\u306B\u76F8\u8AC7\u3059\u308B\u6761\u4EF6\u3002context \u306E\u5148\u982D\u3067\u5BFE\u8C61\u3068\u89AA\u306E\u7BC4\u56F2\u3092\u8AAD\u307F\u3001\u7740\u624B\u524D\u3068\u5B8C\u4E86\u524D\u306B\u7167\u5408\u3059\u308B\u3002\u5B8C\u4E86\u6761\u4EF6\u306E\u672C\u6587\u3092AI\u304C\u6E80\u305F\u3057\u305F\u304B\u306F\u81EA\u52D5\u5224\u5B9A\u3057\u306A\u3044\u3002\n- scope B12 --goal "\u9054\u6210\u3059\u308B\u3053\u3068" --non-goals "\u4ECA\u56DE\u6271\u308F\u306A\u3044\u3053\u3068" --constraints "\u5B88\u308B\u6761\u4EF6" --acceptance "\u78BA\u8A8D\u3059\u308B\u6761\u4EF6" --consult "\u76F8\u8AC7\u3059\u308B\u6761\u4EF6" \u3067\u8A2D\u5B9A\u3059\u308B\u3002scope B12 \u306F\u8868\u793A\u3060\u3051\u3002\u5404\u9805\u76EE\u306B none \u307E\u305F\u306F\u7A7A\u6587\u5B57\u3092\u6E21\u3059\u3068\u6D88\u3059\u3002\u753B\u9762\u3067\u306F\u8A73\u7D30\u30D1\u30CD\u30EB\u306E\u300C\u305D\u306E\u4ED6\u300D\u30BF\u30D6 \u2192\u300C\u4F5C\u696D\u7BC4\u56F2\u3092\u7DE8\u96C6\u300D\u3002\u8A18\u5165\u6E08\u307F\u306E\u9805\u76EE\u3060\u3051\u304C\u300C\u4ECA\u56DE\u306E\u7BC4\u56F2\u300D\u306B\u51FA\u308B\u3002\n- focus B12 \u3067\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3068\u914D\u4E0B\u3092\u6B21\u5019\u88DC\u306E\u5148\u982D\u306B\u3059\u308B\u3002focus \u306F\u73FE\u5728\u306E\u5BFE\u8C61\u306E\u8868\u793A\u3001focus none \u306F\u89E3\u9664\u3002\u5BFE\u8C61\u5916\u3082\u5225\u306E\u7D44\u306B\u6B8B\u308B\u3002\u5019\u88DC\u306B\u51FA\u308B\u3053\u3068\u81EA\u4F53\u306F\u4F5C\u696D\u7BC4\u56F2\u306E\u62E1\u5927\u3084\u516C\u958B\u3092\u8A31\u53EF\u3057\u306A\u3044\u3002\n- \u62C5\u5F53 (\u8AB0\u306E\u4ED5\u4E8B\u304B) \u306F `npx boxglow set <block> --assignee <\u540D\u524D>` \u3067\u6C7A\u3081\u308B (\u3044\u306A\u3044\u540D\u524D\u306F\u30E1\u30F3\u30D0\u30FC\u306B\u8DB3\u3055\u308C\u308B\u3002`members` \u3067\u4E00\u89A7)\u3002\u53D7\u3051\u6301\u3061 (claim) \u306F\u540C\u6642\u306B\u66F8\u304D\u63DB\u3048\u306A\u3044\u305F\u3081\u306E\u7D04\u675F\u3067\u3001\u62C5\u5F53\u3068\u306F\u5225\u3002\n- \u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306B\u8CC7\u6599\u304C\u7121\u3044\u3068\u3001\u4F7F\u3046\u7BB1\u306F\u3059\u3079\u3066\u5165\u529B\u5F85\u3061\u306B\u306A\u308B\u3002\u8CC7\u6599\u304C\u30EA\u30DD\u30B8\u30C8\u30EA\u306B\u3042\u308C\u3070 `npx boxglow artifact inputs <\u30D1\u30B9\u304B URL> --input <\u5165\u529B\u540D>` \u3067\u81EA\u5206\u3067\u4ED8\u3051\u308B (\u4EBA\u306B\u983C\u307E\u306A\u3044)\u3002\u5916\u3059\u306E\u306F `artifact <block|inputs> --remove <\u984C\u540D\u304B\u30D1\u30B9>`\u3002\u4F5C\u308A\u304B\u3051\u306E\u8CC7\u6599\u306F `artifact <block> <\u30D1\u30B9> --draft` (\u4F5C\u6210\u4E2D\u3002\u4F7F\u3046\u5074\u306F\u5F85\u3061\u3002done \u3067\u78BA\u5B9A)\u3001\u4F5C\u308A\u304B\u3051\u3067\u59CB\u3081\u3066\u3088\u3044\u4F7F\u3046\u5074\u306E\u5165\u529B\u306F `port <block> --accept-draft <\u5165\u529B\u540D>`\u3001\u4F7F\u3046\u5074\u306B\u6E21\u3055\u306A\u3044\u53C2\u8003\u8CC7\u6599\u306F `--link`\u3002\u7121\u304F\u3066\u3082\u7740\u624B\u3067\u304D\u308B\u5165\u529B\u306F `port <block> --optional <\u5165\u529B\u540D>`\u3002\n- \u6E08\u3093\u3060\u7BB1\u306E\u300C\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057\u300D\u306F\u3001\u4F5C\u696D\u304C\u65B9\u91DD\u306B\u5408\u3063\u3066\u3044\u308C\u3070 `npx boxglow ack <block> --policy` \u3067\u6D88\u3059 (\u5408\u3063\u3066\u3044\u306A\u3051\u308C\u3070 reopen)\u3002\n- start \u306E\u5FC5\u9808\u5165\u529B\u4E0D\u8DB3\u306F\u65E2\u5B9A\u3067\u8B66\u544A\u3059\u308B\u304C\u3001\u5F93\u6765\u3069\u304A\u308A\u958B\u59CB\u3067\u304D\u308B\u3002\u5148\u884C\u4F5C\u696D\u304C\u5FC5\u8981\u306A\u3089 --reason "\u5148\u306B\u884C\u3046\u7406\u7531" \u3092\u4ED8\u3051\u308B\u3002\u8B66\u544A\u306F\u51FA\u305A\u3001\u7406\u7531\u306F\u6D3B\u52D5\u3068\u30ED\u30B0\u306B\u6B8B\u308B\u3002done \u306E\u51FA\u529B\u6210\u679C\u7269\u306A\u3057\u3082\u65E2\u5B9A\u3067\u8B66\u544A\u306E\u307F\u3002\u65E2\u5B58\u306E\u51FA\u529B\u6210\u679C\u7269\u307E\u305F\u306F --artifact \u3092\u6570\u3048\u3001\u30DC\u30C3\u30AF\u30B9\u306E\u53C2\u8003\u8CC7\u6599\u306F\u6570\u3048\u306A\u3044\u3002\n- \u8A08\u753B\u3067\u9078\u3076\u5834\u5408\u3060\u3051 policy --start reject --done reject --unprepared reject \u306B\u3059\u308B\u3002\u305D\u308C\u305E\u308C warn \u306B\u623B\u305B\u308B\u3002\u5165\u529B\u5F85\u3061\u306E\u62D2\u5426\u3067\u3082\u7406\u7531\u4ED8\u304D\u306E\u958B\u59CB\u306F\u53EF\u80FD\u3060\u304C\u3001\u8981\u5177\u4F53\u5316\u306E\u62D2\u5426\u306F\u7406\u7531\u3067\u306F\u901A\u308C\u306A\u3044\u3002\u6210\u679C\u7269\u306A\u3057\u306E\u62D2\u5426\u306F set --status white \u306B\u3082\u52B9\u304F\u3002\u4EBA\u306E\u64CD\u4F5C (\u753B\u9762 / --actor human) \u306F\u62D2\u5426\u3057\u306A\u3044\u3002AI\u304C\u62D2\u5426\u3092\u907F\u3051\u308B\u305F\u3081\u306B\u4EBA\u3092\u540D\u4E57\u3063\u305F\u308A\u3001\u8A2D\u5B9A\u3092\u5F31\u3081\u305F\u308A\u3057\u306A\u3044\u3002\n- guard \u6709\u52B9\u6642\u3001scope \u306E\u5909\u66F4\u3001focus \u306E\u8A2D\u5B9A\u30FB\u89E3\u9664\u3001policy \u306E\u5909\u66F4\u306B\u3082 --context-token \u304C\u5FC5\u8981\u3002scope/focus/policy \u3092\u5909\u3048\u308B\u3068\u65B0\u3057\u3044\u30C8\u30FC\u30AF\u30F3\u304C\u51FA\u308B\u306E\u3067\u3001\u6B21\u306E\u64CD\u4F5C\u306F\u305D\u308C\u3092\u4F7F\u3046\u3002\u8868\u793A\u3060\u3051\u306B\u306F\u4E0D\u8981\u3002\n- resume \u306F\u5B8C\u4E86\u6E08\u307F\u306E\u5F15\u304D\u7D99\u304E\u672C\u6587\u3092\u96A0\u3057\u3001\u4EF6\u6570\u3060\u3051\u793A\u3059\u3002\u5C65\u6B74\u304C\u5FC5\u8981\u306A\u5834\u5408\u3060\u3051 resume --include-completed \u3067\u5C55\u958B\u3059\u308B (context / show \u3067\u306F\u500B\u5225\u306B\u8AAD\u3081\u308B)\u3002\n- \u8AAC\u660E\u306F descriptionUpdatedAt\u3001\u72B6\u614B\u306F statusChangedAt\u3001\u5F15\u304D\u7D99\u304E\u306F\u65E2\u5B58\u306E at \u3067\u65E5\u6642\u3092\u78BA\u8A8D\u3067\u304D\u308B\u3002\u72B6\u614B\u5909\u66F4\u3088\u308A\u53E4\u3044\u30E1\u30E2\u306F\u305D\u306E\u65E8\u3092\u793A\u3059\u3002\u65E7\u8A18\u9332\u306E\u4E0D\u660E\u306A\u65E5\u6642\u306F\u88DC\u308F\u306A\u3044\u3002\u300C\u65B0\u3057\u3044\u8A18\u9332\u300D\u306F\u771F\u507D\u306E\u4FDD\u8A3C\u3067\u306F\u306A\u3044\u3002\n- Done \u3067\u53E4\u3044\u72B6\u6CC1\u8AAC\u660E\u304C\u6B8B\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u5834\u5408\u3001CLI\u30FB\u8A73\u7D30\u30D1\u30CD\u30EB\u30FBresume \u306B\u898B\u76F4\u3057\u6848\u5185\u304C\u51FA\u308B\u3002\u672C\u6587\u306F\u81EA\u52D5\u3067\u6D88\u3055\u306A\u3044\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u3057\u3001\u5FC5\u8981\u306A\u3089 set B12 --note "\u73FE\u5728\u306E\u8AAC\u660E" (none \u3067\u6D88\u53BB) \u307E\u305F\u306F\u753B\u9762\u306E Notes \u3067\u76F4\u3059\u3002\n- MCP \u306F boxglow_scope / boxglow_focus / boxglow_policy\u3001boxglow_start \u306E reason\u3001boxglow_resume \u306E includeCompleted \u3092\u4F7F\u3046\u3002\u5909\u66F4\u306B\u306F contextToken \u3092\u4ED8\u3051\u308B\u3002\n- \u30C7\u30FC\u30BF\u5F62\u5F0F\u306F v5 \u306E\u307E\u307E\u3067\u5168\u9805\u76EE\u306F\u4EFB\u610F\u3002\u65E7\u7248 (0.4.2\u4EE5\u524D) \u306F\u65B0\u3057\u3044\u898F\u5247\u3092\u5B9F\u884C\u305B\u305A\u3001\u4FDD\u5B58\u6642\u306B\u8A08\u753B\u306E workflowPolicy / focusBlockId \u3092\u843D\u3068\u3059\u3002\u3053\u308C\u3089\u3092\u4F7F\u3046\u8A08\u753B\u306E\u66F8\u304D\u624B (CLI\u30FBserve\u30FB\u753B\u9762\u30FB\u62E1\u5F35\u5185\u306E\u30A2\u30D7\u30EA) \u306F\u5BFE\u5FDC\u3057\u305F\u30D3\u30EB\u30C9\u306B\u63C3\u3048\u308B\u3002\u7248\u756A\u53F7\u3060\u3051\u3067\u306A\u304F\u30D3\u30EB\u30C9\u65E5\u6642\u3082\u78BA\u8A8D\u3059\u308B\u3002\n';
13488
13796
 
13489
13797
  // .claude/skills/boxglow/SKILL.en.md
13490
- var SKILL_en_default = '---\nname: boxglow\ndescription: Share the plan and progress with humans through Boxglow (boxglow.json). Record starting, splitting, finishing and pending decisions with npx boxglow. Use for "record progress in Boxglow", "check the status with boxglow", or "/boxglow".\n---\n\n# Share the plan and progress with Boxglow\n\n`boxglow.json` at the repository root is the source of truth for the plan. Humans watch it on the Boxglow screen (https://boxglow.app/, "Open boxglow.json").\nDo not edit it directly; update it with `npx boxglow`.\n\n## Making the first plan (for a new project)\n\n1. Read the direction (README, the request, requirement notes), run `npx boxglow init --name "<name>"`, then place the top-level items (3-7 of them) with `add`.\n For each item, always write its "inputs (what it uses)" and "output (a concrete deliverable: file, URL, PR)", and connect them all the way to the final deliverable (`connect`)\n2. Once created, get a human\'s confirmation with `npx boxglow ask <first top-level item> "Is this breakdown into top-level items OK?" --options "OK|Needs changes"`.\n The human can answer on the screen, with `npx boxglow answer <block> "<answer>"`, or in chat. If the answer comes back in chat, the AI records it with `answer --by human`.\n If the human does not use the screen (when you are told to proceed with the AI alone), the AI records its own decision with `answer --by claude-code "<decision and reason>"` and moves on. The point is to keep a record of decisions; the screen is not required\n3. `split` only the item you are about to start (leave later stages coarse, and refine them as you go)\n\n## Steps\n\n1. Read `npx boxglow resume` (or `npx boxglow status --brief`). Take in the handoff notes, the answers not yet read by the AI, the pending decisions, the boxes in progress and the next candidates. Use `npx boxglow status` when you need the whole tree\n2. Once you have chosen a box, read `npx boxglow context <block>`. If `readiness.state` is `ready` you can start. `unprepared` (needs detail) means you add detail first, following the reasons in `unprepared` and the commands in `next`. `waiting` means a required input or a branch answer is missing\n3. Before adding detail or splitting, hold the box with `npx boxglow claim <block>` (it does not start the box; on a plan without claims it prints "not needed" and succeeds). Fill in what is missing:\n the output\'s planned deliverable `npx boxglow port <block> --expect "<output>=file:src/x.ts"` (kind: file / dir / url / doc / note / decision / result; the file need not exist yet) and the acceptance criteria `npx boxglow scope <block> --acceptance "<when it counts as done>"`.\n Split a large box with `npx boxglow split <block> --spec \'<JSON>\'` (see `npx boxglow help` for the format). Write expect / acceptance only for the children you will start now; later children need only a title and an output.\n When you do not know which files are involved, do not invent paths: add a box "find the target" with a `note` output and start that.\n After a split, read `npx boxglow lint <block>` and fix the "must fix" items before going on ("review" items are yours to judge). Record how the children are divided with `"splitBy": "stage"` (or `set --split-by`).\n Content review: read `review-split <parent>` (material and checklist) and record `split-ok <parent> --note "<basis>"`; before a start, `review-box <block>` \u2192 `box-ok <block> --note "<basis>"` (when the material changes, `reviews` in context goes stale).\n When an answer changes the work that follows, `ask ... --options "A|B" --branch` turns the box into a branch (in the split JSON: `"branch": { question, options }` / `"join": true`)\n4. Once ready, read `npx boxglow context <block>` again and run `npx boxglow start <block> --note "<what you will do>"`.\n On a plan with the context guard on, pass the `contextToken` (context token) from the context output as `--context-token <context token>`.\n Starting a box that still needs detail warns by default; on a plan with `policy --unprepared reject` it is refused (`--reason` does not bypass it). A parent whose outputs are all made by its children has nothing to run itself: start the child instead\n5. When the deliverable exists, run `npx boxglow done <block> --artifact "<name>=<URL or path>" --checked "<checks run and results>"` (record the verification in three fixed fields: `--checked` checks run and results / `--not-checked` what was not tried / `--limits` remaining limits; for non-code deliverables write what you confirmed) (with the guard on, add `--context-token <context token>`; if your previous command printed "New context token: <token>", use that one)\n6. When a human decision is needed, run `npx boxglow ask <block> "<question>" --options "A|B"` and move on to another box\n7. When you are stuck: If the cause is a missing input (a deliverable of an earlier box, or material), do not mark the box as blocked. Check its input wires with `npx boxglow show <block>`; if no box produces what is missing, create one outside (upstream) with `npx boxglow add` and wire it to this box\'s input with `npx boxglow connect` (the wire stays in the waiting color, so the diagram shows what the box is waiting for). If a choice between options would let you continue, use `ask`. Record only obstacles outside the plan (an environment that does not work, missing permissions or keys, waiting for an outside reply, a failure with no known cause) with `npx boxglow blocked <block> --note "<what is in the way>"`\n8. Before an interruption, context compaction or a handoff, save a handoff note with `npx boxglow checkpoint <block> --note "Findings; next steps; unresolved questions"`\n9. At the end, summarize `npx boxglow status --brief` and report it\n\n## Rules\n\n- **Show an undecided fork as a branch**: when, at planning time, later work (a path) depends on a decision that has not been made, create a branch box with `npx boxglow branch "<title>" --options "A|B" --question "<question>" --context "<background>"`. Each option becomes a path (output); `connect` each one to the first box of that path. Where the paths come together again, add a merge part with `npx boxglow join --title "<title>"`, `connect` the last output of each path to it, and connect its output to the next box (any one path arriving is enough). Once a person answers, the boxes on the paths not chosen are skipped and drop out of progress and next candidates. If a box you already made turns out to be an undecided fork, turn it into a branch with `npx boxglow branch --box <block> --options "A|B" --question "<question>"` (its output becomes the first option\'s path; wires stay). Before the answer, boxes on the paths wait for the branch and starting them warns (record a reason with `--reason`, e.g. for early research)\n- Write each `ask` question so that it can be decided on its own. Do not point outside the question, as in "Is this OK?" or "the plan above"; put the premises, comparison and impact in `--context` (the human reads only the question in a list and answers it)\n- When choosing one of several candidates (an approach, a library, a design choice), even if the AI decides by itself, record it as `ask <block> "<question>" --options "A|B|C"` \u2192 `answer --by claude-code "<the choice>. Reason: ..."` so that the candidates not chosen stay on the box (you can come back to them when the direction changes)\n- To change direction, use `reopen <block> --note "<reason>"`: the previous answer stays in the history and you choose again (candidates are not deleted)\n\n- Keep at most 1-2 boxes in progress at a time\n- Make deliverables (artifacts) something a human can open later (a commit, a PR, a file path)\n- Name outputs after concrete deliverables (file, PR, URL, test results). Avoid abstract names (feature set, findings). When one piece of work produces several things, give it one output per thing (`port <block> --out "<name>"` adds one)\n- The receiving side of a connection can be just a title (`connect "A.Design doc" "B"` creates an input "Design doc" on B). Connected inputs and outputs share one name (renaming either end renames the other)\n- Always connect boxes as "input \u2192 output". Add missing inputs / outputs with `port`, remove a wire with `disconnect`, and remove a box itself with `remove`. Export a document with `export --out docs/ROADMAP.md`\n- When you add a box, give it a kind of work with `--category` (design / build / verify / evaluate / study / research / ui / improve / fix / docs / ops / other). On the screen it becomes a colored band and a tag\n- If boxglow.json does not exist yet, create it with `npx boxglow init --name "<project name>"` and place the final deliverable and the top-level boxes with `add`\n\n## What runs automatically (hooks)\n\n`setup-agent` registers `boxglow hook` in the Claude Code / Codex hooks. After a session starts, resumes or is compacted, the plan\'s resume summary is injected into the context. When you are about to finish a reply while a box started in this session has no handoff (done or checkpoint), you are told to record first and continue (a log entry is a progress note, not a handoff). Editing boxglow.json directly (Edit / Write / apply_patch) is blocked. This is a safety net; keep recording as the steps above say.\nReviews of a split or of readiness can be delegated to the subagent `boxglow-review` (it reads review-split / review-box and returns its evaluation and reasoning; you, the parent, record split-ok / box-ok with that reasoning).\n\n## Context token and handoff\n\nThe context guard keeps an AI from continuing work on outdated instructions. `setup-agent` turns it on (on other plans, run `npx boxglow guard on`).\nWhile it is on, an AI\'s `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` need `--context-token <context token>`. Commands run by a person (`--actor human`) do not.\n\n```\nnpx boxglow context B12 # read the decisions (including acknowledged answers), input/output contracts and handoff notes. contextToken in the output is the context token\nnpx boxglow start B12 --note "<what you will do>" --context-token <context token>\nnpx boxglow ask B12 "<question>" --options "A|B" --context-token <context token>\n# -> last line of the output: New context token: <token>\nnpx boxglow done B12 --artifact "<name>=<path>" --context-token <new context token>\n```\n\n- **The context token changes (you must reread)** when a person answers a decision or revises an answer, a person changes the instructions (title, description, input/output contracts), or another AI or a person updates the handoff note. The same applies when this happens on a parent box or an input provider. The old context token is rejected: reread `context`, take the change into account in your work, then retry\n- **The context token does not change** on `start` / `blocked` / `review` / `leave` / `ack`, on changes to progress, status, dates or category, when `check` verifies deliverables, or when boxes are moved on the screen. Keep using the same context token\n- **You can update it yourself**: when your own `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` etc. changes the context, the last line of its output is "New context token: <token>". Use it for the next command without rereading. `ask` / `decision` / `answer` / `reopen` run without a context token, but they print the new context token only when you pass the latest one\n- Do not turn the guard off to get past an old context token (an AI needs the latest context token to run `guard off`)\n- When resuming, read `npx boxglow resume`, and check a box that has a handoff note with `context` before continuing. Handoff notes stay in the plan, independent of the chat history and the activity-log limit\n- With MCP, use `boxglow_context` and the `contextToken` argument of each tool\n- If "Another Boxglow writer holds the file lock" persists after waiting and retrying, show the output of `npx boxglow unlock` (owner and verdict) to a person and ask them to remove it. Never add `--actor human` yourself or delete the lock folder directly\n\n\n### Readiness, current scope, and fresh resume information\n\n- Read current activity, pending decisions, and unread answers first. Candidates are grouped by current scope / other candidates, then ready / needs detail / waiting for inputs, with the reasons and missing input names. A candidate that needs detail or is waiting is not ready. "Ready" is a mechanical check (an output of its own, expect, acceptance, required inputs) and does not judge how specific the text is.\n- Four optional scope fields are available: goal, non-goals, acceptance, and consult (when to consult before expanding scope). Read the target and parent scopes at the start of context before starting and finishing. Textual acceptance criteria are not automatically evaluated.\n- Use scope B12 --goal "Goal" --non-goals "Excluded" --acceptance "Checks" --consult "When to ask". scope B12 only reads; none or an empty string clears a field. In the inspector, use the More tab \u2192 Edit work scope. Only populated fields appear in the collapsed scope section.\n- focus B12 prioritizes that box and its descendants; focus reads the selection, and focus none clears it. Other candidates remain in a separate group. Being listed does not authorize expanding scope or publishing.\n- When a top-level plan input has no material, every box that uses it waits. If the material is in the repository, attach it yourself with `npx boxglow artifact inputs <path or URL> --input <input name>` (do not ask a person). Remove one with `artifact <block|inputs> --remove <title or path>`. Make an input optional with `port <block> --optional <input name>`.\n- When a finished box shows "Policy: check again" and the work matches the policy, clear it with `npx boxglow ack <block> --policy` (otherwise reopen it).\n- Missing required inputs warn on start by default but still allow the start. Supply --reason "Why starting early is appropriate" to proceed without a warning and save the reason in both activity and the log. Artifact-free done also remains warning-only by default. Existing output artifacts or --artifact count; reference material on the box does not.\n- Only enable strict checks when selected for the plan: policy --start reject --done reject --unprepared reject. Each can return to warn. A recorded start reason overrides the missing-input rejection, but not the needs-detail one. The artifact requirement also applies to set --status white. Human operations (UI / --actor human) are never rejected. Do not impersonate a human or weaken policy to bypass rejection.\n- With guard enabled, scope writes, focus selection/clearing, and policy writes require --context-token. These changes print a new token: use it next. Read-only forms need no token.\n- resume hides completed handoff bodies and shows their count. Request resume --include-completed only when history is needed; context / show can still read individual notes.\n- descriptionUpdatedAt dates description changes; statusChangedAt dates status changes; handoffs use their existing at field. Notes predating a status change are marked. Unknown legacy dates stay unknown, and recency does not establish truth.\n- After Done, CLI, inspector, and resume flag descriptions that may still describe an earlier state. Text is never rewritten automatically. Review it, then update with set B12 --note "Current description" (none clears it) or Notes in the UI.\n- MCP: boxglow_scope / boxglow_focus / boxglow_policy, reason on boxglow_start, and includeCompleted on boxglow_resume. Pass contextToken for writes.\n- All data fields are optional; schema v5 is unchanged. Old versions (0.4.2 and earlier) do not enforce these checks and drop workflowPolicy / focusBlockId when saving. Align all writers (CLI, serve, web app, bundled extension app) to a supporting build before using these settings. Check build time as well as version.\n';
13798
+ var SKILL_en_default = '---\nname: boxglow\ndescription: Share the plan and progress with humans through Boxglow (boxglow.json). Record starting, splitting, finishing and pending decisions with npx boxglow. Use for "record progress in Boxglow", "check the status with boxglow", or "/boxglow".\n---\n\n# Share the plan and progress with Boxglow\n\n`boxglow.json` at the repository root is the source of truth for the plan. Humans watch it on the Boxglow screen (https://boxglow.app/, "Open boxglow.json").\nDo not edit it directly; update it with `npx boxglow`.\n\n## Making the first plan (for a new project)\n\n1. Read the direction (README, the request, requirement notes), run `npx boxglow init --name "<name>"`, then place the top-level items (3-7 of them) with `add`.\n For each item, always write its "inputs (what it uses)" and "output (a concrete deliverable: file, URL, PR)", and connect them all the way to the final deliverable (`connect`)\n2. Once created, get a human\'s confirmation with `npx boxglow ask <first top-level item> "Is this breakdown into top-level items OK?" --options "OK|Needs changes"`.\n The human can answer on the screen, with `npx boxglow answer <block> "<answer>"`, or in chat. If the answer comes back in chat, the AI records it with `answer --by human`.\n If the human does not use the screen (when you are told to proceed with the AI alone), the AI records its own decision with `answer --by claude-code "<decision and reason>"` and moves on. The point is to keep a record of decisions; the screen is not required\n3. `split` only the item you are about to start (leave later stages coarse, and refine them as you go)\n\n## Steps\n\n1. Read `npx boxglow resume` (or `npx boxglow status --brief`). Take in the handoff notes, the answers not yet read by the AI, the pending decisions, the boxes in progress and the next candidates. Use `npx boxglow status` when you need the whole tree\n2. Once you have chosen a box, read `npx boxglow context <block>`. If `readiness.state` is `ready` you can start. `unprepared` (needs detail) means you add detail first, following the reasons in `unprepared` and the commands in `next`. `waiting` means a required input or a branch answer is missing\n3. Before adding detail or splitting, hold the box with `npx boxglow claim <block>` (it does not start the box; on a plan without claims it prints "not needed" and succeeds). Fill in what is missing:\n the output\'s planned deliverable `npx boxglow port <block> --expect "<output>=file:src/x.ts"` (kind: file / dir / url / doc / note / decision / result; the file need not exist yet) and the acceptance criteria `npx boxglow scope <block> --acceptance "<when it counts as done>"`.\n Split a large box with `npx boxglow split <block> --spec \'<JSON>\'` (see `npx boxglow help` for the format). Write expect / acceptance only for the children you will start now; later children need only a title and an output.\n When you do not know which files are involved, do not invent paths: add a box "find the target" with a `note` output and start that.\n After a split, read `npx boxglow lint <block>` and fix the "must fix" items before going on ("review" items are yours to judge). Record how the children are divided with `"splitBy": "stage"` (or `set --split-by`).\n Content review: read `review-split <parent>` (material and checklist) and record `split-ok <parent> --note "<basis>"`; before a start, `review-box <block>` \u2192 `box-ok <block> --note "<basis>"` (when the material changes, `reviews` in context goes stale).\n When an answer changes the work that follows, `ask ... --options "A|B" --branch` turns the box into a branch (in the split JSON: `"branch": { question, options }` / `"join": true`)\n4. Once ready, read `npx boxglow context <block>` again and run `npx boxglow start <block> --note "<what you will do>"`.\n On a plan with the context guard on, pass the `contextToken` (context token) from the context output as `--context-token <context token>`.\n Starting a box that still needs detail warns by default; on a plan with `policy --unprepared reject` it is refused (`--reason` does not bypass it). A parent whose outputs are all made by its children has nothing to run itself: start the child instead\n5. When the deliverable exists, run `npx boxglow done <block> --artifact "<name>=<URL or path>" --checked "<checks run and results>"` (record the verification in three fixed fields: `--checked` checks run and results / `--not-checked` what was not tried / `--limits` remaining limits; for non-code deliverables write what you confirmed) (with the guard on, add `--context-token <context token>`; if your previous command printed "New context token: <token>", use that one)\n6. When a human decision is needed, run `npx boxglow ask <block> "<question>" --options "A|B"` and move on to another box\n7. When you are stuck: If the cause is a missing input (a deliverable of an earlier box, or material), do not mark the box as blocked. Check its input wires with `npx boxglow show <block>`; if no box produces what is missing, create one outside (upstream) with `npx boxglow add` and wire it to this box\'s input with `npx boxglow connect` (the wire stays in the waiting color, so the diagram shows what the box is waiting for). If a choice between options would let you continue, use `ask`. Record only obstacles outside the plan (an environment that does not work, missing permissions or keys, waiting for an outside reply, a failure with no known cause) with `npx boxglow blocked <block> --note "<what is in the way>"`\n8. Before an interruption, context compaction or a handoff, save a handoff note with `npx boxglow checkpoint <block> --note "Findings; next steps; unresolved questions"`\n9. At the end, summarize `npx boxglow status --brief` and report it\n\n## Rules\n\n- **Show an undecided fork as a branch**: when, at planning time, later work (a path) depends on a decision that has not been made, create a branch box with `npx boxglow branch "<title>" --options "A|B" --question "<question>" --context "<background>"`. Each option becomes a path (output); `connect` each one to the first box of that path. Where the paths come together again, add a merge part with `npx boxglow join --title "<title>"`, `connect` the last output of each path to it, and connect its output to the next box (any one path arriving is enough). Once a person answers, the boxes on the paths not chosen are skipped and drop out of progress and next candidates. If a box you already made turns out to be an undecided fork, turn it into a branch with `npx boxglow branch --box <block> --options "A|B" --question "<question>"` (its output becomes the first option\'s path; wires stay). Before the answer, boxes on the paths wait for the branch and starting them warns (record a reason with `--reason`, e.g. for early research)\n- Write each `ask` question so that it can be decided on its own. Do not point outside the question, as in "Is this OK?" or "the plan above"; put the premises, comparison and impact in `--context` (the human reads only the question in a list and answers it)\n- When choosing one of several candidates (an approach, a library, a design choice), even if the AI decides by itself, record it as `ask <block> "<question>" --options "A|B|C"` \u2192 `answer --by claude-code "<the choice>. Reason: ..."` so that the candidates not chosen stay on the box (you can come back to them when the direction changes)\n- To change direction, use `reopen <block> --note "<reason>"`: the previous answer stays in the history and you choose again (candidates are not deleted)\n\n- Keep at most 1-2 boxes in progress at a time\n- Make deliverables (artifacts) something a human can open later (a commit, a PR, a file path)\n- Name outputs after concrete deliverables (file, PR, URL, test results). Avoid abstract names (feature set, findings). When one piece of work produces several things, give it one output per thing (`port <block> --out "<name>"` adds one)\n- The receiving side of a connection can be just a title (`connect "A.Design doc" "B"` creates an input "Design doc" on B). Connected inputs and outputs share one name (renaming either end renames the other)\n- Always connect boxes as "input \u2192 output". Add missing inputs / outputs with `port`, remove a wire with `disconnect`, and remove a box itself with `remove`. Export a document with `export --out docs/ROADMAP.md`\n- When you add a box, give it a kind of work with `--category` (design / build / verify / evaluate / study / research / ui / improve / fix / docs / ops / other). On the screen it becomes a colored band and a tag\n- If boxglow.json does not exist yet, create it with `npx boxglow init --name "<project name>"` and place the final deliverable and the top-level boxes with `add`\n\n## What runs automatically (hooks)\n\n`setup-agent` registers `boxglow hook` in the Claude Code / Codex hooks. After a session starts, resumes or is compacted, the plan\'s resume summary is injected into the context. When you are about to finish a reply while a box started in this session has no handoff (done or checkpoint), you are told to record first and continue (a log entry is a progress note, not a handoff). Editing boxglow.json directly (Edit / Write / apply_patch) is blocked. This is a safety net; keep recording as the steps above say.\nReviews of a split or of readiness can be delegated to the subagent `boxglow-review` (it reads review-split / review-box and returns its evaluation and reasoning; you, the parent, record split-ok / box-ok with that reasoning).\n\n## Context token and handoff\n\nThe context guard keeps an AI from continuing work on outdated instructions. `setup-agent` turns it on (on other plans, run `npx boxglow guard on`).\nWhile it is on, an AI\'s `start` / `done` / `set` / `split` / `artifact` / `ack` / `blocked` / `review` / `leave` / `checkpoint` need `--context-token <context token>`. Commands run by a person (`--actor human`) do not.\n\n```\nnpx boxglow context B12 # read the decisions (including acknowledged answers), input/output contracts and handoff notes. contextToken in the output is the context token\nnpx boxglow start B12 --note "<what you will do>" --context-token <context token>\nnpx boxglow ask B12 "<question>" --options "A|B" --context-token <context token>\n# -> last line of the output: New context token: <token>\nnpx boxglow done B12 --artifact "<name>=<path>" --context-token <new context token>\n```\n\n- **The context token changes (you must reread)** when a person answers a decision or revises an answer, a person changes the instructions (title, description, input/output contracts), or another AI or a person updates the handoff note. The same applies when this happens on a parent box or an input provider. The old context token is rejected: reread `context`, take the change into account in your work, then retry\n- **The context token does not change** on `start` / `blocked` / `review` / `leave` / `ack`, on changes to progress, status, dates or category, when `check` verifies deliverables, or when boxes are moved on the screen. Keep using the same context token\n- **You can update it yourself**: when your own `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` etc. changes the context, the last line of its output is "New context token: <token>". Use it for the next command without rereading. `ask` / `decision` / `answer` / `reopen` run without a context token, but they print the new context token only when you pass the latest one\n- Do not turn the guard off to get past an old context token (an AI needs the latest context token to run `guard off`)\n- When resuming, read `npx boxglow resume`, and check a box that has a handoff note with `context` before continuing. Handoff notes stay in the plan, independent of the chat history and the activity-log limit\n- With MCP, use `boxglow_context` and the `contextToken` argument of each tool\n- If "Another Boxglow writer holds the file lock" persists after waiting and retrying, show the output of `npx boxglow unlock` (owner and verdict) to a person and ask them to remove it. Never add `--actor human` yourself or delete the lock folder directly\n\n\n### Readiness, current scope, and fresh resume information\n\n- Read current activity, pending decisions, and unread answers first. Candidates are grouped by current scope / other candidates, then ready / needs detail / waiting for inputs, with the reasons and missing input names. A candidate that needs detail or is waiting is not ready. "Ready" is a mechanical check (an output of its own, expect, acceptance, required inputs) and does not judge how specific the text is.\n- Four optional scope fields are available: goal, non-goals, acceptance, and consult (when to consult before expanding scope). Read the target and parent scopes at the start of context before starting and finishing. Textual acceptance criteria are not automatically evaluated.\n- Use scope B12 --goal "Goal" --non-goals "Excluded" --acceptance "Checks" --consult "When to ask". scope B12 only reads; none or an empty string clears a field. In the inspector, use the More tab \u2192 Edit work scope. Only populated fields appear in the collapsed scope section.\n- focus B12 prioritizes that box and its descendants; focus reads the selection, and focus none clears it. Other candidates remain in a separate group. Being listed does not authorize expanding scope or publishing.\n- Set who a box belongs to with `npx boxglow set <block> --assignee <name>` (a missing name becomes a member; `members` lists them). A claim is a separate agreement that keeps agents from editing the same box at once.\n- When a top-level plan input has no material, every box that uses it waits. If the material is in the repository, attach it yourself with `npx boxglow artifact inputs <path or URL> --input <input name>` (do not ask a person). Remove one with `artifact <block|inputs> --remove <title or path>`. Attach work-in-progress material with `artifact <block> <path> --draft` (boxes using it wait; done confirms it), let a consumer start from drafts with `port <block> --accept-draft <input name>`, and keep reference material on the box with `--link`. Make an input optional with `port <block> --optional <input name>`.\n- When a finished box shows "Policy: check again" and the work matches the policy, clear it with `npx boxglow ack <block> --policy` (otherwise reopen it).\n- Missing required inputs warn on start by default but still allow the start. Supply --reason "Why starting early is appropriate" to proceed without a warning and save the reason in both activity and the log. Artifact-free done also remains warning-only by default. Existing output artifacts or --artifact count; reference material on the box does not.\n- Only enable strict checks when selected for the plan: policy --start reject --done reject --unprepared reject. Each can return to warn. A recorded start reason overrides the missing-input rejection, but not the needs-detail one. The artifact requirement also applies to set --status white. Human operations (UI / --actor human) are never rejected. Do not impersonate a human or weaken policy to bypass rejection.\n- With guard enabled, scope writes, focus selection/clearing, and policy writes require --context-token. These changes print a new token: use it next. Read-only forms need no token.\n- resume hides completed handoff bodies and shows their count. Request resume --include-completed only when history is needed; context / show can still read individual notes.\n- descriptionUpdatedAt dates description changes; statusChangedAt dates status changes; handoffs use their existing at field. Notes predating a status change are marked. Unknown legacy dates stay unknown, and recency does not establish truth.\n- After Done, CLI, inspector, and resume flag descriptions that may still describe an earlier state. Text is never rewritten automatically. Review it, then update with set B12 --note "Current description" (none clears it) or Notes in the UI.\n- MCP: boxglow_scope / boxglow_focus / boxglow_policy, reason on boxglow_start, and includeCompleted on boxglow_resume. Pass contextToken for writes.\n- All data fields are optional; schema v5 is unchanged. Old versions (0.4.2 and earlier) do not enforce these checks and drop workflowPolicy / focusBlockId when saving. Align all writers (CLI, serve, web app, bundled extension app) to a supporting build before using these settings. Check build time as well as version.\n';
13491
13799
 
13492
13800
  // src/model/export.ts
13493
13801
  var STATUS_LABEL = {
@@ -13501,7 +13809,7 @@ function portLine(p, port2) {
13501
13809
  if (desc) parts2.push(`: ${desc}`);
13502
13810
  if (port2.direction === "in" && !port2.required) parts2.push(" " + t("(\u4EFB\u610F)"));
13503
13811
  if (port2.artifacts.length > 0) {
13504
- parts2.push(" / " + port2.artifacts.map((a) => a.url ? `[${a.title}](${a.url})` : a.title).join(", "));
13812
+ parts2.push(" / " + port2.artifacts.map((a) => (a.url ? `[${a.title}](${a.url})` : a.title) + (a.draft ? " " + t("(\u4F5C\u6210\u4E2D)") : "")).join(", "));
13505
13813
  }
13506
13814
  const links = port2.direction === "in" ? incomingEdges(p, { portId: port2.id, side: "outer" }).map((e) => describeEndpointSource(p, e.from.portId)) : outgoingEdges(p, { portId: port2.id, side: "outer" }).map((e) => describeEndpointTarget(p, e.to.portId));
13507
13815
  if (links.length > 0) parts2.push(` (${port2.direction === "in" ? t("\u4F9B\u7D66\u5143: {list}", { list: links.join(", ") }) : t("\u884C\u304D\u5148: {list}", { list: links.join(", ") })})`);
@@ -13823,7 +14131,8 @@ function treeLines(p, parentId, depth, lines) {
13823
14131
  const v = effectiveProgress(p, b.id);
13824
14132
  return v > 0 ? ` ${v}%` : "";
13825
14133
  })();
13826
- const who = b.assigneeIds.length === 0 && b.kind !== "project" ? " " + t("(\u672A\u62C5\u5F53)") : "";
14134
+ const names = b.assigneeIds.map((id) => p.members.find((m) => m.id === id)?.name).filter(Boolean);
14135
+ const who = b.kind === "project" ? "" : names.length === 0 ? " " + t("(\u672A\u62C5\u5F53)") : " " + t("(\u62C5\u5F53: {names})", { names: names.join(", ") });
13827
14136
  const due = b.dueDate && b.status !== "white" ? ` ${t("\u671F\u65E5 {date}", { date: b.dueDate })}${isOverdue(b) ? " " + t("(\u8D85\u904E)") : ""}` : "";
13828
14137
  lines.push(`${" ".repeat(depth)}- ${MARK[b.status]}${pct} ${b.key ?? ""} ${b.title}${tag}${who}${due} -> ${outs}${act}`);
13829
14138
  treeLines(p, b.id, depth + 1, lines);
@@ -13896,6 +14205,8 @@ function blockReport(p, blockId) {
13896
14205
  if (b.issue) lines.push(`- ${t("\u8AB2\u984C: {key}", { key: issueKeyOf(b.issue) })} <${b.issue}>`);
13897
14206
  if (b.startDate || b.dueDate) lines.push(`- ${t("\u65E5\u7A0B:")} ${b.startDate ? t("\u958B\u59CB {date}", { date: b.startDate }) : ""}${b.startDate && b.dueDate ? " / " : ""}${b.dueDate ? t("\u671F\u65E5 {date}", { date: b.dueDate }) + (isOverdue(b) ? " " + t("(\u8D85\u904E)") : "") : ""}`);
13898
14207
  if (b.estimateHours !== void 0 || b.actualHours !== void 0) lines.push(`- ${t("\u6642\u9593:")} ${b.estimateHours !== void 0 ? t("\u898B\u7A4D {hours}h", { hours: b.estimateHours }) : ""}${b.estimateHours !== void 0 && b.actualHours !== void 0 ? " / " : ""}${b.actualHours !== void 0 ? t("\u5B9F\u7E3E {hours}h", { hours: b.actualHours }) : ""}`);
14208
+ const assignees = b.assigneeIds.map((id) => p.members.find((m) => m.id === id)?.name).filter(Boolean);
14209
+ if (assignees.length) lines.push(`- ${t("\u62C5\u5F53: {names}", { names: assignees.join(", ") })}`);
13899
14210
  if (b.activity) lines.push(`- ${t("\u6D3B\u52D5:")} ${b.activity.actor} ${t(ACTIVITY_LABEL[b.activity.state])} ${b.activity.note} (${b.activity.since})`);
13900
14211
  for (const item of scopeEntries(b.scope)) lines.push("", "## " + item.label, item.text);
13901
14212
  if (b.description) lines.push("", ...[freshnessText(b, b.descriptionUpdatedAt, "known")].filter(Boolean), b.description);
@@ -13911,7 +14222,7 @@ function blockReport(p, blockId) {
13911
14222
  lines.push("", "## " + t("\u51FA\u529B"));
13912
14223
  for (const q of portsOf(p, blockId, "out")) {
13913
14224
  const dst = outgoingEdges(p, { portId: q.id, side: "outer" }).map((e) => `${name(p.ports[e.to.portId].blockId)}.${p.ports[e.to.portId].name}`);
13914
- const arts = q.artifacts.map((a) => a.url ? `${a.title} <${a.url}>` : a.title);
14225
+ const arts = q.artifacts.map((a) => (a.url ? `${a.title} <${a.url}>` : a.title) + (a.draft ? " " + t("(\u4F5C\u6210\u4E2D)") : ""));
13915
14226
  lines.push(`- ${q.name}${q.description ? ": " + q.description : ""}${dst.length ? " -> " + dst.join(", ") : ""}${arts.length ? " " + t("\u6210\u679C\u7269: {list}", { list: arts.join(", ") }) : ""}`);
13916
14227
  }
13917
14228
  const kids = childrenOf(p, blockId);
@@ -13933,6 +14244,12 @@ function blockReport(p, blockId) {
13933
14244
  lines.push("", "## " + t("\u8CC7\u6599"));
13934
14245
  for (const a of b.artifacts) lines.push(`- ${a.url ? `${a.title} <${a.url}>` : a.title}`);
13935
14246
  }
14247
+ const entries = b.log ?? [];
14248
+ if (entries.length > 0) {
14249
+ lines.push("", "## " + t("\u8A18\u9332"));
14250
+ for (const e of entries.slice(-5)) lines.push(`- ${e.at} ${e.by} (log: ${e.id})`, " " + e.text.replace(/\n/g, "\n "));
14251
+ if (entries.length > 5) lines.push(t("(\u307B\u304B {count} \u4EF6\u3002\u5168\u90E8\u306F log {block})", { count: entries.length - 5, block: b.key ?? b.id }));
14252
+ }
13936
14253
  lines.push("");
13937
14254
  return lines.join("\n");
13938
14255
  }
@@ -13964,7 +14281,7 @@ function assignmentRows(p, target, opts = {}) {
13964
14281
  ...b.dueDate ? { dueDate: b.dueDate } : {},
13965
14282
  overdue: !!b.dueDate && b.status !== "white" && b.dueDate < today,
13966
14283
  ...typeof b.estimateHours === "number" ? { estimateHours: b.estimateHours } : {},
13967
- missingInputs: b.status === "white" ? [] : waitingFor(p, b.id),
14284
+ missingInputs: b.status === "white" ? [] : markDraftInputs(p, b.id, waitingFor(p, b.id)),
13968
14285
  pendingDecisions: b.decisions.filter((d) => d.answer === void 0).length,
13969
14286
  unprepared: b.status === "white" ? [] : unpreparedReasons(p, b.id).map((r) => reasonText(p, r)),
13970
14287
  assignees: p.members.filter((m) => b.assigneeIds.includes(m.id)).map((m) => m.name)
@@ -14082,7 +14399,7 @@ var READING_HEADER_SPACE = 56;
14082
14399
  var READING_CHANNEL_REDUCTION = 48;
14083
14400
  var COLUMN_LABEL_SPACE = 40;
14084
14401
  function layoutScope(p, scopeId, options = {}) {
14085
- let q = structuredClone(p);
14402
+ let q = { ...p, blocks: { ...p.blocks }, terminals: { ...p.terminals }, ...p.inputGroups ? { inputGroups: p.inputGroups.map((g) => ({ ...g })) } : {} };
14086
14403
  const kids = childrenOf(q, scopeId);
14087
14404
  if (kids.length === 0) return q;
14088
14405
  for (const k of kids) if (options.recursive !== false && childrenOf(q, k.id).length > 0) q = layoutScope(q, k.id);
@@ -14194,7 +14511,7 @@ function layoutScope(p, scopeId, options = {}) {
14194
14511
  let y = rowTop + (compact ? Math.round((rowHeight - col.height) / 16) * 8 : 0);
14195
14512
  options.columns?.push({ x, y: rowTop - COLUMN_LABEL_SPACE, width: col.width, ids: col.members.map((m) => m.id), index: col.L });
14196
14513
  col.members.forEach((m, i) => {
14197
- q.blocks[m.id].position = { x, y };
14514
+ q.blocks[m.id] = { ...q.blocks[m.id], position: { x, y } };
14198
14515
  y += col.sizes[i].height + verticalGap;
14199
14516
  });
14200
14517
  x += col.width + (compact ? readingGap(col.L) : gapAfter(col.L));
@@ -14419,6 +14736,25 @@ function resolveRef(p, ref) {
14419
14736
  if (!best) throw new Error(t("\u300C{ref}\u300D\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 (<\u984C\u540D>.<\u30DD\u30FC\u30C8\u540D> \u306E\u5F62\u3002\u984C\u540D\u306F status \u306B\u51FA\u308B\u984C\u540D\u304B B \u756A\u53F7)", { ref }));
14420
14737
  return { blockId: best.blockId, portName: best.portName };
14421
14738
  }
14739
+ function describeNewWires(before, after) {
14740
+ const added = Object.values(after.edges).filter((e) => !before.edges[e.id] && !e.auto);
14741
+ const label = (portId) => {
14742
+ const port2 = after.ports[portId];
14743
+ return `${port2.blockId === ROOT_ID ? "inputs" : after.blocks[port2.blockId]?.title ?? "?"}.${port2.name}`;
14744
+ };
14745
+ const starts = added.filter((e) => !added.some((x) => x.to.portId === e.from.portId));
14746
+ return starts.map((first) => {
14747
+ const names = [label(first.from.portId), label(first.to.portId)];
14748
+ let cur = first;
14749
+ for (let i = 0; i < added.length; i++) {
14750
+ const next = added.find((x) => x.from.portId === cur.to.portId);
14751
+ if (!next) break;
14752
+ names.push(label(next.to.portId));
14753
+ cur = next;
14754
+ }
14755
+ return names.join(" -> ");
14756
+ }).join(", ");
14757
+ }
14422
14758
  var sink = (text2) => process.stdout.write(text2);
14423
14759
  var out = (text2) => sink(text2.endsWith("\n") ? text2 : text2 + "\n");
14424
14760
  function mainWithRetry(argv, onRetry) {
@@ -14492,6 +14828,7 @@ boxglow CLI: AI \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 (Claude Code / Codex \u306A
14492
14828
  --brief = \u77ED\u3044\u5F62: \u5BFE\u8C61\u306E\u60C5\u5831\u306F\u5168\u90E8\u3001\u89AA\u30FB\u4E0A\u6D41\u306F\u984C\u540D\u30FB\u72B6\u614B\u30FB\u6709\u52B9\u306A\u5224\u65AD\u30FB\u5BFE\u8C61\u306B\u3064\u306A\u304C\u308B\u51FA\u529B\u3060\u3051\u3002\u7701\u3044\u305F\u3082\u306E\u306E\u4EF6\u6570\u3068\u53D6\u308A\u65B9\u3092\u51FA\u3059 (\u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306F\u540C\u3058)
14493
14829
  checkpoint <block> --note <\u30E1\u30E2> \u5F15\u304D\u7D99\u304E\u30E1\u30E2 (\u5206\u304B\u3063\u305F\u3053\u3068\u30FB\u6B21\u306E\u624B\u9806\u30FB\u672A\u89E3\u6C7A\u306E\u70B9) \u3092\u8A08\u753B\u306B\u6B8B\u3059\u3002\u4E2D\u65AD\u3084\u5F15\u304D\u7D99\u304E\u306E\u524D\u306B\u4F7F\u3046
14494
14830
  log <block> "<\u672C\u6587>" \u4F5C\u696D\u8A18\u9332\u3092 1 \u4EF6\u8DB3\u3059 (Markdown \u53EF\u3002\u65E5\u4ED8\u3068\u66F8\u304D\u624B\u304C\u4ED8\u304F\u3002\u9032\u6357\u30FB\u6C17\u3065\u304D\u30FB\u7D4C\u7DEF\u3092\u81EA\u7531\u306B\u3002\u753B\u9762\u306E\u300C\u8A18\u9332\u300D\u30BF\u30D6\u3068\u540C\u3058)
14831
+ log <block> [--edit <id> "<\u672C\u6587>" | --remove <id>] \u672C\u6587\u306A\u3057\u3067\u8A18\u9332\u306E\u4E00\u89A7 (id \u4ED8\u304D)\u3002--edit \u3067\u66F8\u304D\u76F4\u3057\u3001--remove \u3067\u6D88\u3059 (AI \u306F\u81EA\u5206\u306E\u8A18\u9332\u3060\u3051)
14495
14832
  guard on|off \u78BA\u8A8D\u30C8\u30FC\u30AF\u30F3\u306E\u8981\u6C42\u3092\u6709\u52B9 / \u7121\u52B9\u306B\u3059\u308B (setup-agent \u306F\u6709\u52B9\u306B\u3059\u308B)\u3002\u6709\u52B9\u306A\u9593\u3001AI \u306E start / done / set / split / artifact / ack /
14496
14833
  blocked / review / leave / checkpoint \u306F --context-token <context \u3067\u5F97\u305F contextToken> \u304C\u8981\u308B (\u8AAD\u3093\u3060\u5F8C\u306B\u6307\u793A\u30FB\u56DE\u7B54\u30FB\u5F15\u304D\u7D99\u304E\u304C\u5909\u308F\u3063\u3066\u3044\u305F\u3089\u62D2\u5426)\u3002
14497
14834
  \u4EBA (--actor human) \u306B\u306F\u8981\u6C42\u3057\u306A\u3044\u3002AI \u304C off \u306B\u3059\u308B\u3068\u304D\u306F --context-token \u304C\u8981\u308B
@@ -14532,20 +14869,21 @@ boxglow CLI: AI \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 (Claude Code / Codex \u306A
14532
14869
  branch --box <block> --add-option <\u9053> / --remove-option <\u9053> \u5206\u5C90\u306E\u9053 (\u9078\u629E\u80A2) \u3092\u8DB3\u3059 / \u6D88\u3059 (\u7B54\u3048\u305F\u5F8C\u3082\u3067\u304D\u308B)
14533
14870
  join [--title <\u984C\u540D>] [--parent <block>] \u5408\u6D41\u306E\u90E8\u54C1\u3092\u8DB3\u3059 (\u5206\u304B\u308C\u305F\u9053\u3092 1 \u3064\u306B\u307E\u3068\u3081\u308B\u3002\u9053\u306E\u51FA\u529B\u3092 connect \u3067\u3064\u306A\u3050\u3068\u3001\u3069\u308C\u304B 1 \u3064\u304C\u5C4A\u3051\u3070\u5148\u3078\u9032\u3080)
14534
14871
  move <block> --parent <block|project> \u30DC\u30C3\u30AF\u30B9\u3092\u5225\u306E\u89AA\u306E\u4E2D\u3078\u79FB\u3059 (\u7DDA\u306F\u9593\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u30DD\u30FC\u30C8\u3092\u7D4C\u7531\u3057\u3066\u3064\u306A\u304C\u3063\u305F\u307E\u307E)
14535
- port <block|project|inputs> [--in <\u540D\u524D>]... [--out <\u540D\u524D>]... [--remove <\u540D\u524D>]... [--policy <\u51FA\u529B\u540D> [--policy-scope all|<block>] [--advisory]]... [--no-policy <\u51FA\u529B\u540D>]... [--skip-policy <\u7BB1>.<\u51FA\u529B\u540D>]... [--expect "<\u51FA\u529B\u540D>=<kind>:<hint>"]... [--self <\u51FA\u529B\u540D>]... [--no-self <\u51FA\u529B\u540D>]... [--rename <\u65E7\u540D>=<\u65B0\u540D>] [--optional <\u5165\u529B\u540D>]... [--required <\u5165\u529B\u540D>]... [--describe "<\u540D\u524D>=<\u8AAC\u660E>"]... [--any-of <\u5165\u529B\u540D>]... [--all-of <\u5165\u529B\u540D>]... \u65E2\u5B58\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u529B / \u51FA\u529B\u3092\u8DB3\u3059\u3001\u6D88\u3059 (\u5165\u529B\u3092\u6D88\u3059\u3068\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B)\u3001\u540D\u524D\u3092\u5909\u3048\u308B\u3002--any-of \u3067\u5408\u6D41\u306E\u5165\u529B (\u3069\u308C\u304B 1 \u3064\u304C\u5C4A\u3051\u3070\u3088\u3044) \u306B\u3059\u308B (project = \u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u3001inputs = \u6700\u4E0A\u4F4D\u306E\u5165\u529B)
14536
- disconnect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D.\u5165\u529B\u540D> \u7DDA\u3092\u5916\u3059
14872
+ port <block|project|inputs> [--in <\u540D\u524D>]... [--out <\u540D\u524D>]... [--remove <\u540D\u524D>]... [--policy <\u51FA\u529B\u540D> [--policy-scope all|<block>] [--advisory]]... [--no-policy <\u51FA\u529B\u540D>]... [--skip-policy <\u7BB1>.<\u51FA\u529B\u540D>]... [--expect "<\u51FA\u529B\u540D>=<kind>:<hint>"]... [--self <\u51FA\u529B\u540D>]... [--no-self <\u51FA\u529B\u540D>]... [--rename <\u65E7\u540D>=<\u65B0\u540D>] [--optional <\u5165\u529B\u540D>]... [--required <\u5165\u529B\u540D>]... [--accept-draft <\u5165\u529B\u540D>]... [--no-accept-draft <\u5165\u529B\u540D>]... [--describe "<\u540D\u524D>=<\u8AAC\u660E>"]... [--any-of <\u5165\u529B\u540D>]... [--all-of <\u5165\u529B\u540D>]... \u65E2\u5B58\u306E\u30DC\u30C3\u30AF\u30B9\u306B\u5165\u529B / \u51FA\u529B\u3092\u8DB3\u3059\u3001\u6D88\u3059 (\u5165\u529B\u3092\u6D88\u3059\u3068\u4F7F\u3046\u7BB1\u306E\u5165\u529B\u3082\u6D88\u3048\u308B)\u3001\u540D\u524D\u3092\u5909\u3048\u308B\u3002--any-of \u3067\u5408\u6D41\u306E\u5165\u529B (\u3069\u308C\u304B 1 \u3064\u304C\u5C4A\u3051\u3070\u3088\u3044) \u306B\u3059\u308B (project = \u6700\u521D\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u3001inputs = \u6700\u4E0A\u4F4D\u306E\u5165\u529B)
14873
+ disconnect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D.\u5165\u529B\u540D> \u7DDA\u3092\u5916\u3059 (\u968E\u5C64\u3092\u307E\u305F\u3044\u3060\u7DDA\u3082\u4E21\u7AEF\u306E\u540D\u524D\u3067\u5916\u305B\u308B\u3002\u9014\u4E2D\u306E\u7BB1\u306E\u4E2D\u7D99\u306E\u5165\u51FA\u529B\u3082\u307E\u3068\u3081\u3066\u6D88\u3048\u308B)
14537
14874
  tidy \u30D5\u30A1\u30A4\u30EB\u3092\u898F\u5247\u306B\u305D\u308D\u3048\u3066\u4FDD\u5B58\u3057\u76F4\u3059 (\u7DDA\u3067\u3064\u306A\u304C\u308B\u5165\u51FA\u529B\u306E\u540D\u524D\u3092\u305D\u308D\u3048\u308B\u3001\u91CD\u306A\u308A\u3092\u89E3\u304F)
14538
14875
  remove <block> [--force] \u30DC\u30C3\u30AF\u30B9\u3092\u6D88\u3059 (\u4E2D\u306B\u30DC\u30C3\u30AF\u30B9\u304C\u3042\u308B\u3068\u304D\u30FB\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306F --force\u3002\u6700\u5F8C\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30DC\u30C3\u30AF\u30B9\u306F\u6D88\u305B\u306A\u3044\u3002\u4E2D\u306B\u30DC\u30C3\u30AF\u30B9\u304C\u3042\u308B\u3068\u304D\u306F --force\u3002\u7DDA\u3082\u5916\u308C\u308B\u3002\u5143\u306B\u623B\u305B\u306A\u3044\u306E\u3067 Git \u3067\u7BA1\u7406\u3057\u3066\u3044\u308B\u3053\u3068)
14539
14876
  serve [--port 4174] [--open] [--sync|--no-sync] \u30ED\u30FC\u30AB\u30EB\u30B5\u30FC\u30D0: \u540C\u68B1\u306E Web \u30A2\u30D7\u30EA\u3092 http://localhost:4174/?serve=1 \u3067\u914D\u4FE1\u3057\u3001boxglow.json \u3092\u8AAD\u307F\u66F8\u304D (Firefox / Safari \u3067\u3082\u4F7F\u3048\u308B)
14540
14877
  \u901A\u5E38\u306F\u300C\u540C\u671F\u3092\u59CB\u3081\u308B\u300D\u304B\u3089\u958B\u59CB\u3002--sync = \u660E\u793A\u6709\u52B9\u5316\u3001--no-sync = \u7121\u52B9\u3002\u9001\u308A\u5148\u306F --server > BOXGLOW_SERVER > \u65E2\u5B58\u306E\u7D50\u3073\u4ED8\u3051 > \u88FD\u54C1\u65E2\u5B9A\u3002\u7A7A/off \u3082\u7121\u52B9
14541
14878
  mcp [--file <path>] MCP \u30B5\u30FC\u30D0 (\u6A19\u6E96\u5165\u51FA\u529B)\u3002Claude Code \u306A\u3069\u304B\u3089 status / start / done / ask ... \u3092\u30C4\u30FC\u30EB\u3068\u3057\u3066\u4F7F\u3046 (.mcp.json \u306F setup-agent \u304C\u66F8\u304F)
14542
- connect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D[.\u5165\u529B\u540D]> \u7D50\u7DDA (\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044: \u51FA\u529B\u540D\u3068\u540C\u3058\u540D\u524D\u306E\u5165\u529B\u3092\u4F5C\u3063\u3066\u3064\u306A\u3050\u3002\u89AA\u5B50\u306F\u81EA\u52D5\u3067\u5185\u5074\u306E\u9762\u3002\u6700\u7D42\u6210\u679C\u7269\u3078\u306F project)
14879
+ connect <\u984C\u540D.\u51FA\u529B\u540D> <\u984C\u540D[.\u5165\u529B\u540D]> \u7D50\u7DDA (\u53D7\u3051\u5074\u306F\u984C\u540D\u3060\u3051\u3067\u3088\u3044: \u51FA\u529B\u540D\u3068\u540C\u3058\u540D\u524D\u306E\u5165\u529B\u3092\u4F5C\u3063\u3066\u3064\u306A\u3050\u3002\u89AA\u5B50\u306F\u81EA\u52D5\u3067\u5185\u5074\u306E\u9762\u3002\u968E\u5C64\u304C\u9055\u3048\u3070\u9014\u4E2D\u306E\u7BB1\u306B\u5165\u51FA\u529B\u3092\u4F5C\u3063\u3066\u901A\u3059\u3002\u6700\u7D42\u6210\u679C\u7269\u3078\u306F project)
14543
14880
  now [<block>|none] [--off] \u4ECA\u3053\u3053 (\u672C\u5F53\u306B\u3044\u307E\u4F5C\u696D\u3057\u3066\u3044\u308B\u30DC\u30C3\u30AF\u30B9\u3002\u8907\u6570\u306E AI \u3084\u4EBA\u304C\u3044\u308C\u3070\u3001\u3044\u304F\u3064\u3067\u3082) \u3092\u4ED8\u3051\u308B / \u5916\u3059 (--off) / \u5168\u90E8\u6D88\u3059 (none) / \u898B\u308B\u3002start \u3067\u81EA\u52D5\u3067\u4ED8\u304D\u3001done / leave \u3067\u5916\u308C\u308B\u3002\u753B\u9762\u3067\u306F\u592A\u3044\u67A0\u3068 NOW \u306E\u672D
14544
14881
  start <block> [--note <\u4F55\u3092\u3059\u308B\u304B>] [--reason <\u7406\u7531>] \u5165\u529B\u5F85\u3061\u306F\u65E2\u5B9A\u3067\u8B66\u544A\u3002\u7406\u7531\u3092\u8A18\u9332\u3059\u308B\u3068\u8B66\u544A\u306A\u3057\u3067\u958B\u59CB\u3002\u4ECA\u3053\u3053\u306B\u3082\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u304C\u4ED8\u304F\u3002
14545
14882
  \u8981\u5177\u4F53\u5316 (\u81EA\u8EAB\u304C\u4F5C\u308B\u51FA\u529B\u304C\u7121\u3044\u3001\u51FA\u529B\u306E\u4E88\u5B9A\u6210\u679C\u7269 expect\u30FB\u5B8C\u4E86\u6761\u4EF6 acceptance \u304C\u672A\u5B9A) \u3082\u65E2\u5B9A\u306F\u8B66\u544A (policy --unprepared reject \u3067 AI \u306F\u958B\u59CB\u4E0D\u53EF\u3002\u7406\u7531\u3067\u306F\u901A\u308C\u306A\u3044)
14546
14883
  done <block> [--artifact <\u984C\u540D>=<URL \u307E\u305F\u306F\u30D1\u30B9>]... [--output <\u51FA\u529B\u540D>] [--note] [--checked <\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>] [--not-checked <\u672A\u5B9F\u65BD>] [--limits <\u6B8B\u308B\u5236\u9650>] \u5B8C\u4E86 (\u6210\u679C\u7269\u3092\u4ED8\u3051\u3066 white)
14547
14884
  \u30D1\u30B9\u304C Git \u7BA1\u7406\u4E0B\u306A\u3089\u300C\u30B3\u30DF\u30C3\u30C8 + \u30D1\u30B9 + blob\u300D\u3067\u8A18\u9332\u3059\u308B (\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3057\u306A\u3044)\u3002--checked \u4EE5\u4E0B\u306F\u691C\u67FB\u7D50\u679C\u3068\u3057\u3066\u7BB1\u306B\u6B8B\u308B (context\u30FBshow \u306B\u51FA\u308B)
14548
- artifact <block> <URL \u307E\u305F\u306F\u30D1\u30B9> [--title <\u984C\u540D>] [--output <\u51FA\u529B\u540D>] \u6210\u679C\u7269\u3060\u3051\u4ED8\u3051\u308B (\u5B8C\u4E86\u306B\u306F\u3057\u306A\u3044)
14885
+ artifact <block> <URL \u307E\u305F\u306F\u30D1\u30B9> [--title <\u984C\u540D>] [--output <\u51FA\u529B\u540D>] [--draft | --link] \u6210\u679C\u7269\u3060\u3051\u4ED8\u3051\u308B (\u5B8C\u4E86\u306B\u306F\u3057\u306A\u3044)\u3002--draft = \u4F5C\u6210\u4E2D (\u4F7F\u3046\u5074\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u5B8C\u4E86\u3067\u78BA\u5B9A)\u3001--link = \u51FA\u529B\u3067\u306F\u306A\u304F\u7BB1\u306E\u53C2\u8003\u8CC7\u6599\u306B\u4ED8\u3051\u308B
14886
+ artifact <block|inputs> --final <\u984C\u540D\u304B\u30D1\u30B9|all> \u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u3092\u78BA\u5B9A\u306B\u3059\u308B
14549
14887
  artifact inputs <URL \u307E\u305F\u306F\u30D1\u30B9> [--input <\u5165\u529B\u540D>] [--title <\u984C\u540D>] \u8A08\u753B\u306E\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306B\u8CC7\u6599\u3092\u4ED8\u3051\u308B (\u5165\u529B\u304C 1 \u3064\u306A\u3089 --input \u306F\u7701\u7565\u53EF)
14550
14888
  artifact <block|inputs> --remove <\u984C\u540D\u304B\u30D1\u30B9\u304B URL> [--output <\u51FA\u529B\u540D> | --input <\u5165\u529B\u540D>] \u4ED8\u3051\u305F\u6210\u679C\u7269\u30FB\u8CC7\u6599\u3092\u5916\u3059
14551
14889
  check Git \u306E\u6210\u679C\u7269\u304C\u4ECA\u3082\u898B\u3064\u304B\u308B\u304B\u78BA\u8A8D\u3057\u3001\u79FB\u52D5\u3057\u3066\u3044\u308C\u3070\u30D1\u30B9\u3092\u4ED8\u3051\u66FF\u3048\u308B\u3002\u672A\u30B3\u30DF\u30C3\u30C8\u306E\u3068\u304D\u306B\u8A18\u9332\u3057\u305F\u6210\u679C\u7269\u306F\u3001\u30B3\u30DF\u30C3\u30C8\u6E08\u307F\u306B\u306A\u3063\u3066\u3044\u308C\u3070 Git \u306E\u53C2\u7167\u306B\u88DC\u5B8C\u3059\u308B
@@ -14554,16 +14892,20 @@ boxglow CLI: AI \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8 (Claude Code / Codex \u306A
14554
14892
  review <block> [--note] \u78BA\u8A8D\u5F85\u3061
14555
14893
  ask <block> <\u8CEA\u554F> [--options "A|B"] [--context <\u5224\u65AD\u6750\u6599>] [--branch] \u4EBA\u9593\u306B\u5224\u65AD\u3092\u6C42\u3081\u308B (\u5224\u65AD\u5F85\u3061\u306B\u306A\u308B)\u3002--branch = \u7B54\u3048\u3067\u5F8C\u306E\u4F5C\u696D\u304C\u5206\u304B\u308C\u308B\u554F\u3044: \u305D\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u5206\u5C90\u306B\u3059\u308B (\u9078\u629E\u80A2\u3054\u3068\u306B\u9053)\u3002\u8CEA\u554F\u3060\u3051\u3067\u5224\u65AD\u3067\u304D\u308B\u3088\u3046\u3001\u524D\u63D0\u30FB\u6BD4\u8F03\u30FB\u5F71\u97FF\u3092 --context \u306B\u66F8\u304F
14556
14894
  decision <block> --id <decision id> [--question] [--options "A|B"] [--context] \u672A\u56DE\u7B54\u306E\u5224\u65AD\u3092\u66F8\u304D\u76F4\u3059
14557
- answer <block> <\u56DE\u7B54> [--id <decision id>] [--by <\u540D\u524D>] \u5224\u65AD\u306B\u7B54\u3048\u308B (\u65E2\u5B9A\u306F\u6700\u65B0\u306E\u672A\u56DE\u7B54)
14895
+ answer <block> <\u56DE\u7B54> [--id <decision id>] [--by <\u540D\u524D>] \u5224\u65AD\u306B\u7B54\u3048\u308B (\u65E2\u5B9A\u306F\u6700\u65B0\u306E\u672A\u56DE\u7B54\u3002\u7B54\u3048\u6E08\u307F\u306E --id \u3092\u6307\u3059\u3068\u7B54\u3048\u3092\u76F4\u3059)
14558
14896
  ack <block> [--id <decision id>] \u4EBA\u306E\u56DE\u7B54\u3092\u8AAD\u3093\u3067\u5F15\u304D\u53D6\u3063\u305F\u3068\u8A18\u9332\u3059\u308B (status \u306E\u300C\u56DE\u7B54\u3042\u308A\u300D\u304B\u3089\u6D88\u3048\u308B\u3002start / done / blocked / review / set / split \u3067\u3082\u81EA\u52D5\u3067\u5F15\u304D\u53D6\u308B)
14559
14897
  ack <block> --policy [<\u65B9\u91DD\u306E\u51FA\u529B\u540D>] \u6E08\u3093\u3060\u4F5C\u696D\u304C\u3001\u5B8C\u4E86\u306E\u5F8C\u306B\u6C7A\u307E\u3063\u305F\u30FB\u5909\u308F\u3063\u305F\u65B9\u91DD\u306B\u5408\u3063\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u304B\u3081\u305F (\u300C\u65B9\u91DD: \u78BA\u304B\u3081\u76F4\u3057\u300D\u3092\u6D88\u3059)
14560
14898
  reopen <block> [--id <decision id>] [--note <\u7406\u7531>] \u5224\u65AD\u3092\u3084\u308A\u76F4\u3059 (\u65B9\u91DD\u8EE2\u63DB)\u3002\u524D\u306E\u7B54\u3048\u306F\u5C65\u6B74\u306B\u3001\u5019\u88DC\u306F\u305D\u306E\u307E\u307E\u6B8B\u308B
14561
14899
  unask <block> [--id <decision id>] \u554F\u3044\u3092\u53D6\u308A\u4E0B\u3052\u308B (\u672A\u56DE\u7B54\u3060\u3051\u3002\u5206\u5C90\u306E\u554F\u3044\u306F\u6D88\u305B\u306A\u3044)
14562
14900
  set <block> [--status black|gray|white] [--progress 0..100|auto] [--title <\u984C\u540D>] [--note <\u8AAC\u660E>] [--category <\u30AB\u30C6\u30B4\u30EA>|none] [--repo <\u30D1\u30B9>|none] [--issue <URL>|none]
14563
14901
  [--start YYYY-MM-DD|none] [--due YYYY-MM-DD|none] [--estimate <\u6642\u9593>|none] [--hours <\u5B9F\u7E3E\u6642\u9593>|none] [--split-by <\u4E00\u8A9E>|none] (--split-by = \u76F4\u4E0B\u306E\u5B50\u306E\u5206\u3051\u65B9: \u5DE5\u7A0B / \u6210\u679C\u7269 / \u6A5F\u80FD \u306A\u3069)
14902
+ [--assignee <\u540D\u524D>[,<\u540D\u524D>]|none] [--add-assignee <\u540D\u524D>] [--remove-assignee <\u540D\u524D>] (\u62C5\u5F53\u3002\u540D\u524D\u306E\u30E1\u30F3\u30D0\u30FC\u304C\u3044\u306A\u3051\u308C\u3070\u8DB3\u3059)
14564
14903
  find <\u6587\u5B57> ID \u3084\u984C\u540D\u3067\u30DC\u30C3\u30AF\u30B9\u3092\u63A2\u3059
14904
+ members [--remove <\u540D\u524D,>] \u30E1\u30F3\u30D0\u30FC\u306E\u4E00\u89A7 (\u62C5\u5F53\u306E\u540D\u524D\u3068\u672A\u5B8C\u4E86\u306E\u62C5\u5F53\u306E\u6570)\u3002--remove \u3067\u4E00\u89A7\u304B\u3089\u5916\u3059 (\u62C5\u5F53\u304B\u3089\u3082\u5916\u308C\u308B)
14905
+ plan [--name <\u540D\u524D>] [--description <\u8AAC\u660E>|none] \u8A08\u753B\u306E\u540D\u524D\u3068\u8AAC\u660E\u3092\u898B\u308B / \u5909\u3048\u308B (\u4E00\u756A\u4E0A\u306E\u7BB1\u306E\u984C\u540D\u3068\u306F\u5225)
14565
14906
  list --assignee <\u540D\u524D> | --unassigned | --everyone [--all] [--unprepared] [--json] \u62C5\u5F53\u306E\u4E00\u89A7\u3092\u8868\u3067\u51FA\u3059 (\u65E2\u5B9A\u306F\u672A\u5B8C\u4E86\u3060\u3051\u3002--all \u3067\u5B8C\u4E86\u6E08\u307F\u3082\u3002--unprepared \u3067\u8981\u5177\u4F53\u5316\u3060\u3051\u3002\u4E26\u3073\u306F\u671F\u65E5\u306E\u8FD1\u3044\u9806)
14566
14907
  group <\u540D\u524D> \u6700\u4E0A\u4F4D\u306E\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u4F5C\u308B (\u4F8B: "PCIe \u4ED5\u69D8\u66F8")
14908
+ group <\u540D\u524D> [--rename <\u65B0\u3057\u3044\u540D\u524D>] [--description <\u8AAC\u660E>|none] [--remove] \u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u76F4\u3059 / \u6D88\u3059 (\u5165\u3063\u3066\u3044\u305F\u5165\u529B\u306F Inputs \u306B\u623B\u308B)
14567
14909
  group-set <\u5165\u529B\u540D> <\u30B0\u30EB\u30FC\u30D7\u540D|none> \u6700\u4E0A\u4F4D\u306E\u5165\u529B\u3092\u30B0\u30EB\u30FC\u30D7\u306B\u5165\u308C\u308B / \u5916\u3059
14568
14910
  group-export <\u30B0\u30EB\u30FC\u30D7\u540D> [--out <path>] \u30B0\u30EB\u30FC\u30D7\u3092 JSON \u306B\u66F8\u304D\u51FA\u3059 (\u4ED6\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067 group-import)
14569
14911
  group-import <path> \u30B0\u30EB\u30FC\u30D7\u306E JSON \u3092\u8AAD\u307F\u8FBC\u3080
@@ -14618,6 +14960,7 @@ Usage (npx boxglow <command> ...):
14618
14960
  --brief = short form: everything about the box itself; parents and input providers reduced to title, status, answered decisions and the outputs feeding it; says what was left out (same contextToken)
14619
14961
  checkpoint <block> --note <note> Save a handoff note (findings, next steps, unresolved questions) in the plan. Use it before an interruption or a handoff
14620
14962
  log <block> "<text>" Add a work-log entry (Markdown; dated and signed). Progress, findings, context; same as the Log tab in the UI
14963
+ log <block> [--edit <id> "<text>" | --remove <id>] Without text, list the entries (with ids). --edit rewrites one, --remove deletes one (an AI only its own)
14621
14964
  guard on|off Turn the context-token requirement on / off (setup-agent turns it on). While on, an AI's start / done / set / split / artifact / ack /
14622
14965
  blocked / review / leave / checkpoint need --context-token <contextToken from context> (rejected if instructions, answers or handoff notes changed after reading).
14623
14966
  People (--actor human) are not asked for it. An AI needs --context-token to turn it off
@@ -14658,20 +15001,21 @@ Usage (npx boxglow <command> ...):
14658
15001
  branch --box <block> --add-option <path> / --remove-option <path> Add / remove a path (option) of a branch (also after it was answered)
14659
15002
  join [--title <title>] [--parent <block>] Add a merge part (where paths come together; connect the paths' outputs to it, and any one of them arriving lets the work go on)
14660
15003
  move <block> --parent <block|project> Move a box into another parent (wires stay connected through the ports of the boxes in between)
14661
- port <block|project|inputs> [--in <name>]... [--out <name>]... [--remove <name>]... [--policy <output> [--policy-scope all|<block>] [--advisory]]... [--no-policy <output>]... [--skip-policy <box>.<output>]... [--expect "<output>=<kind>:<hint>"]... [--self <output>]... [--no-self <output>]... [--rename <old>=<new>] [--optional <input>]... [--required <input>]... [--describe "<name>=<description>"]... [--any-of <input>]... [--all-of <input>]... Add inputs / outputs to an existing box, remove them (removing an input also removes the inputs it feeds), rename them, set an output's planned deliverable (expect: kind file / dir / url / doc / note / decision / result + a path or title) or mark it as made by this box itself (--self). --any-of makes inputs a merge (any one of them is enough) (project = the first project box)
14662
- disconnect <title.output> <title.input> Remove a wire
15004
+ port <block|project|inputs> [--in <name>]... [--out <name>]... [--remove <name>]... [--policy <output> [--policy-scope all|<block>] [--advisory]]... [--no-policy <output>]... [--skip-policy <box>.<output>]... [--expect "<output>=<kind>:<hint>"]... [--self <output>]... [--no-self <output>]... [--rename <old>=<new>] [--optional <input>]... [--required <input>]... [--accept-draft <input>]... [--no-accept-draft <input>]... [--describe "<name>=<description>"]... [--any-of <input>]... [--all-of <input>]... Add inputs / outputs to an existing box, remove them (removing an input also removes the inputs it feeds), rename them, set an output's planned deliverable (expect: kind file / dir / url / doc / note / decision / result + a path or title) or mark it as made by this box itself (--self). --any-of makes inputs a merge (any one of them is enough) (project = the first project box)
15005
+ disconnect <title.output> <title.input> Remove a wire (a wire across levels can be removed by naming both ends; the relay inputs and outputs on the boxes in between go too)
14663
15006
  tidy Normalize the file and save it again (give connected inputs and outputs one name, resolve overlaps)
14664
15007
  remove <block> [--force] Delete a box (--force if it contains boxes or is a project box; the last project box cannot be deleted. Its wires are removed too. This cannot be undone, so keep the file in Git)
14665
15008
  serve [--port 4174] [--open] [--sync|--no-sync] Local server: serves the bundled web app at http://localhost:4174/?serve=1 and reads / writes boxglow.json (works in Firefox / Safari too)
14666
15009
  Normally use Start syncing in the UI. --sync enables; --no-sync disables. Server: --server > BOXGLOW_SERVER > existing binding > product default. Empty/off also disables.
14667
15010
  mcp [--file <path>] MCP server (stdio). Lets Claude Code and others use status / start / done / ask ... as tools (setup-agent writes .mcp.json)
14668
- connect <title.output> <title[.input]> Connect (the receiving side can be just a title: an input with the same name as the output is created and connected. Parent and child connect on the inner side automatically. Use project for the final deliverable)
15011
+ connect <title.output> <title[.input]> Connect (the receiving side can be just a title: an input with the same name as the output is created and connected. Parent and child connect on the inner side automatically. Across levels, inputs and outputs are added on the boxes in between. Use project for the final deliverable)
14669
15012
  now [<block>|none] [--off] The boxes being worked on right now (any number: several agents or people). start adds one, done / leave remove it, --off removes one, none clears all. Shown on the canvas with a thick frame and a NOW tag
14670
15013
  start <block> [--note <what you will do>] [--reason <reason>] Missing inputs warn by default; a recorded reason allows starting without a warning. Also marks this box as "now".
14671
15014
  A box that still needs detail (no output of its own, or an output without expect / acceptance) warns by default too (policy --unprepared reject blocks AI starts; a reason does not bypass it)
14672
15015
  done <block> [--artifact <title>=<URL or path>]... [--output <output name>] [--note] [--checked <checks run and results>] [--not-checked <not tried>] [--limits <remaining limits>] Finish (attach artifacts and turn it white)
14673
15016
  If the path is tracked by Git, it is recorded as "commit + path + blob" (nothing is uploaded). --checked etc. stay on the box as its verification (shown by context / show)
14674
- artifact <block> <URL or path> [--title <title>] [--output <output name>] Attach an artifact only (does not finish the box)
15017
+ artifact <block> <URL or path> [--title <title>] [--output <output name>] [--draft | --link] Attach an artifact only (does not finish the box). --draft = work in progress (boxes using it keep waiting; finishing the box confirms it), --link = attach to the box's reference links instead of an output
15018
+ artifact <block|inputs> --final <title, path or all> Confirm a work-in-progress artifact
14675
15019
  artifact inputs <URL or path> [--input <input name>] [--title <title>] Attach material to a top-level plan input (--input may be omitted when there is only one)
14676
15020
  artifact <block|inputs> --remove <title, path or URL> [--output <output name> | --input <input name>] Remove an attached deliverable or material
14677
15021
  check Check that Git artifacts can still be found, and update the path if they moved. Artifacts recorded while uncommitted become Git references once they are committed
@@ -14680,16 +15024,20 @@ Usage (npx boxglow <command> ...):
14680
15024
  review <block> [--note] Waiting for review
14681
15025
  ask <block> <question> [--options "A|B"] [--context <background>] [--branch] Ask a person to decide (becomes Needs decision). --branch = the answer changes the work that follows: turn the box into a branch (one path per option). Put the assumptions, comparison and impact in --context so the question can be decided on its own
14682
15026
  decision <block> --id <decision id> [--question] [--options "A|B"] [--context] Rewrite an unanswered decision
14683
- answer <block> <answer> [--id <decision id>] [--by <name>] Answer a decision (default: the latest unanswered one)
15027
+ answer <block> <answer> [--id <decision id>] [--by <name>] Answer a decision (default: the latest unanswered one. An answered --id corrects the answer)
14684
15028
  ack <block> [--id <decision id>] Record that you have read a person's answer and taken it on (removes it from "Answered" in status. start / done / blocked / review / set / split also do this automatically)
14685
15029
  ack <block> --policy [<policy output>] Record that finished work still matches a policy decided or changed after it was done (clears "Policy: check again")
14686
15030
  reopen <block> [--id <decision id>] [--note <reason>] Reopen a decision (change of direction). The previous answer stays in the history and the options are kept
14687
15031
  unask <block> [--id <decision id>] Withdraw a question (unanswered only; a branch's question cannot be removed)
14688
15032
  set <block> [--status black|gray|white] [--progress 0..100|auto] [--title <title>] [--note <description>] [--category <category>|none] [--repo <path>|none] [--issue <URL>|none]
14689
15033
  [--start YYYY-MM-DD|none] [--due YYYY-MM-DD|none] [--estimate <hours>|none] [--hours <actual hours>|none] [--split-by <word>|none] (--split-by = how the direct children are divided: stage / deliverable / feature ...)
15034
+ [--assignee <name>[,<name>]|none] [--add-assignee <name>] [--remove-assignee <name>] (assignees; a missing member is added)
14690
15035
  find <text> Find boxes by ID or title
15036
+ members [--remove <name,>] List members (names and how many open boxes each has). --remove takes them off the list (and off their boxes)
15037
+ plan [--name <name>] [--description <text>|none] Show or change the plan's name and description (not the top box's title)
14691
15038
  list --assignee <name> | --unassigned | --everyone [--all] [--unprepared] [--json] List assigned boxes as a table (open ones by default; --all adds done ones; --unprepared only those that need detail; sorted by due date)
14692
15039
  group <name> Create a top-level input group (e.g. "PCIe spec")
15040
+ group <name> [--rename <new name>] [--description <text>|none] [--remove] Change or delete an input group (its inputs go back to Inputs)
14693
15041
  group-set <input name> <group name|none> Put a top-level input into a group / take it out
14694
15042
  group-export <group name> [--out <path>] Write a group out as JSON (group-import it in another project)
14695
15043
  group-import <path> Read a group from JSON
@@ -15044,7 +15392,32 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15044
15392
  }
15045
15393
  const b = mustFind(p, rest[0]);
15046
15394
  const text2 = (str2(options.note) ?? rest.slice(1).join(" ")).trim();
15047
- if (!text2) throw new Error(t('\u8A18\u9332\u306E\u672C\u6587\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: log <block> "<\u672C\u6587>" (\u307E\u305F\u306F --note)'));
15395
+ if (options.edit === true || options.remove === true) throw new Error(t("--edit / --remove \u306B\u306F\u8A18\u9332\u306E id \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 (log {block} \u3067\u4E00\u89A7)", { block: b.key ?? b.id }));
15396
+ const target = str2(options.edit) ?? str2(options.remove);
15397
+ if (target !== void 0) {
15398
+ const entry = (b.log ?? []).find((e) => e.id === target);
15399
+ if (!entry) throw new Error(t("\u8A18\u9332 {id} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 (log {block} \u3067\u4E00\u89A7)", { id: target, block: b.key ?? b.id }));
15400
+ if (!isHumanActor(actor) && entry.by !== actor) throw new Error(t("\u307B\u304B\u306E\u66F8\u304D\u624B ({by}) \u306E\u8A18\u9332\u306F\u76F4\u305B\u307E\u305B\u3093\u3002\u76F4\u3059\u306E\u306F\u81EA\u5206\u306E\u8A18\u9332\u3060\u3051\u3067\u3059", { by: entry.by }));
15401
+ if (str2(options.remove) !== void 0) {
15402
+ save(path, removeLogEntry(p, b.id, entry.id));
15403
+ out(t("\u8A18\u9332\u3092\u6D88\u3057\u307E\u3057\u305F: {id}", { id: entry.id }));
15404
+ return;
15405
+ }
15406
+ if (!text2) throw new Error(t('\u65B0\u3057\u3044\u672C\u6587\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: log <block> --edit <id> "<\u672C\u6587>"'));
15407
+ save(path, updateLogEntry(p, b.id, entry.id, text2));
15408
+ out(t("\u8A18\u9332\u3092\u76F4\u3057\u307E\u3057\u305F: {id}", { id: entry.id }));
15409
+ return;
15410
+ }
15411
+ if (!text2) {
15412
+ const entries = b.log ?? [];
15413
+ if (entries.length === 0) {
15414
+ out(t("\u8A18\u9332\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093: {key} \u300C{title}\u300D", { key: b.key ?? "", title: b.title }));
15415
+ return;
15416
+ }
15417
+ for (const e of entries) out(`- ${e.at} ${e.by} (log: ${e.id})
15418
+ ${e.text.replace(/\n/g, "\n ")}`);
15419
+ return;
15420
+ }
15048
15421
  save(path, addLogEntry(p, b.id, actor, text2));
15049
15422
  out(t("\u8A18\u9332\u3057\u307E\u3057\u305F: {key} \u300C{title}\u300D({by})", { key: b.key ?? "", title: b.title, by: actor }));
15050
15423
  return;
@@ -15138,6 +15511,23 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15138
15511
  case "group": {
15139
15512
  const name = rest.join(" ");
15140
15513
  if (!name) throw new Error(t("<\u540D\u524D> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15514
+ if (options.rename !== void 0 || options.description !== void 0 || options.remove !== void 0) {
15515
+ const gp = inputGroupsOf(p).find((g) => g.name === name);
15516
+ if (!gp) throw new Error(t("\u30B0\u30EB\u30FC\u30D7\u300C{name}\u300D\u304C\u3042\u308A\u307E\u305B\u3093 ({list})", { name, list: inputGroupsOf(p).map((g) => g.name).join(", ") }));
15517
+ if (options.remove !== void 0) {
15518
+ save(path, removeInputGroup(p, gp.id));
15519
+ out(t("\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u6D88\u3057\u307E\u3057\u305F: \u300C{name}\u300D (\u5165\u3063\u3066\u3044\u305F\u5165\u529B\u306F Inputs \u306B\u623B\u308A\u307E\u3057\u305F)", { name }));
15520
+ return;
15521
+ }
15522
+ const patch = {};
15523
+ const rename = str2(options.rename)?.trim();
15524
+ if (options.rename !== void 0 && !rename) throw new Error(t("--rename \u306B\u306F\u65B0\u3057\u3044\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15525
+ if (rename) patch.name = rename;
15526
+ if (options.description !== void 0) patch.description = str2(options.description) === "none" ? "" : str2(options.description) ?? "";
15527
+ save(path, updateInputGroup(p, gp.id, patch));
15528
+ out(t("\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u66F4\u65B0: \u300C{name}\u300D", { name: patch.name ?? name }));
15529
+ return;
15530
+ }
15141
15531
  const r = addInputGroup(p, name);
15142
15532
  save(path, r.project);
15143
15533
  out(t("\u5165\u529B\u30B0\u30EB\u30FC\u30D7\u3092\u8FFD\u52A0: \u300C{name}\u300D", { name }));
@@ -15432,6 +15822,14 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15432
15822
  added.push(required ? t("\u5FC5\u9808 {name}", { name }) : t("\u4EFB\u610F {name}", { name }));
15433
15823
  }
15434
15824
  }
15825
+ for (const [flag, on] of [["accept-draft", true], ["no-accept-draft", false]]) {
15826
+ for (const name of list(options[flag])) {
15827
+ const port2 = portsOf(p, blockId, "in").find((x) => x.name === name);
15828
+ if (!port2) throw new Error(t("\u5165\u529B\u300C{name}\u300D\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", { name }));
15829
+ p = updatePort(p, port2.id, { acceptDraft: on ? true : void 0 });
15830
+ added.push(on ? t("\u4F5C\u6210\u4E2D\u3067\u7740\u624B\u53EF {name}", { name }) : t("\u78BA\u5B9A\u3092\u5F85\u3064 {name}", { name }));
15831
+ }
15832
+ }
15435
15833
  for (const spec of list(options.describe)) {
15436
15834
  const eq = spec.indexOf("=");
15437
15835
  if (eq < 0) throw new Error(t("--describe \u306F <\u540D\u524D>=<\u8AAC\u660E> \u306E\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: {spec}", { spec }));
@@ -15444,7 +15842,7 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15444
15842
  p = updatePort(p, hits[0].id, { description: spec.slice(eq + 1) });
15445
15843
  added.push(t("\u8AAC\u660E {name}", { name }));
15446
15844
  }
15447
- if (added.length === 0) throw new Error(t("--in <\u540D\u524D> / --out <\u540D\u524D> / --remove <\u540D\u524D> / --policy <\u51FA\u529B\u540D> / --expect <\u51FA\u529B\u540D>=<kind>:<hint> / --self <\u51FA\u529B\u540D> / --rename <\u65E7\u540D>=<\u65B0\u540D> / --any-of <\u5165\u529B\u540D> / --all-of <\u5165\u529B\u540D> / --optional <\u5165\u529B\u540D> / --required <\u5165\u529B\u540D> / --describe <\u540D\u524D>=<\u8AAC\u660E> \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15845
+ if (added.length === 0) throw new Error(t("--in <\u540D\u524D> / --out <\u540D\u524D> / --remove <\u540D\u524D> / --policy <\u51FA\u529B\u540D> / --expect <\u51FA\u529B\u540D>=<kind>:<hint> / --self <\u51FA\u529B\u540D> / --rename <\u65E7\u540D>=<\u65B0\u540D> / --any-of <\u5165\u529B\u540D> / --all-of <\u5165\u529B\u540D> / --optional <\u5165\u529B\u540D> / --required <\u5165\u529B\u540D> / --describe <\u540D\u524D>=<\u8AAC\u660E> / --accept-draft <\u5165\u529B\u540D> \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15448
15846
  save(path, p);
15449
15847
  out(t("\u30DD\u30FC\u30C8: {title}: {list}", { title: p.blocks[blockId]?.title ?? "project", list: added.join(", ") }));
15450
15848
  return;
@@ -15470,42 +15868,40 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15470
15868
  const b = resolveRef(p, rest[1] ?? "");
15471
15869
  const aPorts = portsOf(p, a.blockId).filter((x) => x.name === a.portName).map((x) => x.id);
15472
15870
  const bPorts = portsOf(p, b.blockId).filter((x) => x.name === b.portName).map((x) => x.id);
15473
- const hit = Object.values(p.edges).find((e) => aPorts.includes(e.from.portId) && bPorts.includes(e.to.portId));
15474
- if (!hit) throw new Error(t("\u7DDA\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {from} -> {to}", { from: String(rest[0]), to: String(rest[1]) }));
15475
- save(path, disconnect(p, hit.id));
15476
- out(t("\u7DDA\u3092\u5916\u3057\u307E\u3057\u305F: {from} -> {to}", { from: rest[0], to: rest[1] }));
15871
+ const route = wirePathBetween(p, aPorts, bPorts);
15872
+ if (!route) throw new Error(t("\u7DDA\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {from} -> {to}", { from: String(rest[0]), to: String(rest[1]) }));
15873
+ const r = disconnectWire(p, route[route.length - 1]);
15874
+ save(path, r.project);
15875
+ const removed = Object.keys(p.edges).filter((id) => !r.project.edges[id] && !p.edges[id].auto).length;
15876
+ out(t("\u7DDA\u3092\u5916\u3057\u307E\u3057\u305F: {from} -> {to}", { from: rest[0], to: rest[1] }) + (removed > 1 ? t(" (\u9014\u4E2D\u306E\u7BB1\u3092\u901A\u308B {count} \u672C)", { count: removed }) : ""));
15477
15877
  return;
15478
15878
  }
15479
15879
  case "connect": {
15480
15880
  const a = resolveRef(p, rest[0] ?? "");
15481
15881
  if (!(rest[1] ?? "").includes(".")) {
15482
15882
  const tb = rest[1] === "project" ? p.blocks[projectBlocks(p)[0]?.id ?? ROOT_ID] : mustFind(p, rest[1]);
15483
- const fromIsParent2 = tb.parentId === a.blockId;
15484
- const fromPort2 = portsOf(p, a.blockId, fromIsParent2 ? "in" : "out").find((x) => x.name === a.portName);
15883
+ const fromIsParent = tb.parentId === a.blockId;
15884
+ const fromPort2 = portsOf(p, a.blockId, fromIsParent ? "in" : "out").find((x) => x.name === a.portName);
15485
15885
  if (!fromPort2) throw new Error(t("\u300C{ref}\u300D\u306E\u30DD\u30FC\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", { ref: rest[0] }));
15486
- const r2 = connectToBlock(p, { portId: fromPort2.id, side: fromIsParent2 ? "inner" : "outer" }, tb.id);
15886
+ const r2 = connectToBlock(p, { portId: fromPort2.id, side: fromIsParent ? "inner" : "outer" }, tb.id);
15487
15887
  if (r2.error) throw new Error(r2.error);
15488
15888
  save(path, r2.project);
15489
- const edge2 = Object.values(r2.project.edges).find((e) => e.from.portId === fromPort2.id && !Object.values(p.edges).some((x) => x.id === e.id));
15490
- const toPort2 = edge2 ? r2.project.ports[edge2.to.portId] : void 0;
15491
- out(t("\u7D50\u7DDA: {from} -> {to}", { from: rest[0], to: `${tb.title}.${toPort2?.name ?? fromPort2.name}` }) + (toPort2?.direction === "out" ? t(" (\u89AA\u306E\u51FA\u529B)") : t(" (\u51FA\u529B\u540D\u3068\u540C\u3058\u5165\u529B\u3092\u4F7F\u3044\u307E\u3057\u305F)")));
15889
+ out(t("\u7D50\u7DDA: {route}", { route: describeNewWires(p, r2.project) || `${rest[0]} -> ${tb.title}` }));
15492
15890
  return;
15493
15891
  }
15494
15892
  const b = resolveRef(p, rest[1] ?? "");
15495
- const fromBlock = p.blocks[a.blockId];
15496
- const toBlock = p.blocks[b.blockId];
15497
- const fromIsParent = toBlock.parentId === a.blockId;
15498
- const toIsParent = fromBlock.parentId === b.blockId;
15499
- const fromPort = portsOf(p, a.blockId, fromIsParent ? "in" : "out").find((x) => x.name === a.portName);
15500
- const toPort = portsOf(p, b.blockId, toIsParent ? "out" : "in").find((x) => x.name === b.portName);
15893
+ const fromIsAncestor = ancestorsOf(p, b.blockId).some((x) => x.id === a.blockId);
15894
+ const toIsAncestor = ancestorsOf(p, a.blockId).some((x) => x.id === b.blockId);
15895
+ const fromPort = portsOf(p, a.blockId, fromIsAncestor ? "in" : "out").find((x) => x.name === a.portName);
15896
+ const toPort = portsOf(p, b.blockId, toIsAncestor ? "out" : "in").find((x) => x.name === b.portName);
15501
15897
  if (!fromPort) throw new Error(t("\u300C{ref}\u300D\u306E\u30DD\u30FC\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", { ref: rest[0] }));
15502
15898
  if (!toPort) throw new Error(t("\u300C{ref}\u300D\u306E\u30DD\u30FC\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", { ref: rest[1] }));
15503
- const from = { portId: fromPort.id, side: fromIsParent ? "inner" : "outer" };
15504
- const to = { portId: toPort.id, side: toIsParent ? "inner" : "outer" };
15505
- const r = connect(p, from, to);
15899
+ const from = { portId: fromPort.id, side: fromIsAncestor ? "inner" : "outer" };
15900
+ const to = { portId: toPort.id, side: toIsAncestor ? "inner" : "outer" };
15901
+ const r = connectAcross(p, from, to);
15506
15902
  if (r.error) throw new Error(r.error);
15507
15903
  save(path, r.project);
15508
- out(t("\u7D50\u7DDA: {from} -> {to}", { from: rest[0], to: rest[1] }));
15904
+ out(t("\u7D50\u7DDA: {route}", { route: describeNewWires(p, r.project) || `${rest[0]} -> ${rest[1]}` }));
15509
15905
  return;
15510
15906
  }
15511
15907
  case "start": {
@@ -15574,10 +15970,12 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15574
15970
  if (check.error) throw new Error(check.error);
15575
15971
  const checked = str2(options.checked), notChecked = str2(options["not-checked"]), limits = str2(options.limits);
15576
15972
  const verification = checked || notChecked || limits ? { checked: checked ?? "", ...notChecked ? { notChecked } : {}, ...limits ? { limits } : {}, at: (/* @__PURE__ */ new Date()).toISOString(), by: actor } : void 0;
15973
+ const drafts = portsOf(p, b.id, "out").reduce((n, o) => n + o.artifacts.filter((a) => a.draft).length, 0);
15577
15974
  const r = finishBlock(p, b.id, actor, { artifacts, outputName: str2(options.output), note: str2(options.note), verification });
15578
15975
  if (r.error) throw new Error(r.error);
15579
15976
  save(path, setNow(r.project, b.id, actor, false));
15580
15977
  out(t("\u5B8C\u4E86: \u300C{title}\u300D", { title: b.title }) + `${artifacts.length ? t(" \u6210\u679C\u7269: ") + artifacts.map((a) => a.title + (a.kind === "git" ? ` (git ${a.path} @ ${(a.commit ?? "").slice(0, 7)})` : "")).join(", ") : ""}`);
15978
+ if (drafts > 0) out(t("\u4F5C\u6210\u4E2D\u3060\u3063\u305F\u8CC7\u6599 {count} \u4EF6\u3092\u78BA\u5B9A\u306B\u3057\u307E\u3057\u305F", { count: drafts }));
15581
15979
  if (check.warning) out(check.warning);
15582
15980
  if (!verification && !isHumanActor(actor)) out(t('\u691C\u67FB\u7D50\u679C\u304C\u4ED8\u3044\u3066\u3044\u307E\u305B\u3093\u3002--checked "<\u5B9F\u884C\u3057\u305F\u691C\u67FB\u3068\u7D50\u679C>" (\u5FC5\u8981\u306A\u3089 --not-checked / --limits) \u3067\u6B8B\u3059\u3068\u3001\u4EBA\u304C\u5F8C\u304B\u3089\u78BA\u304B\u3081\u3089\u308C\u307E\u3059'));
15583
15981
  const reminder = descriptionReminder(r.project.blocks[b.id]);
@@ -15585,6 +15983,22 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15585
15983
  return;
15586
15984
  }
15587
15985
  case "artifact": {
15986
+ if (options.final !== void 0) {
15987
+ const key = str2(options.final) ?? "all";
15988
+ const inputs = isInputsRef(rest[0]);
15989
+ const ports = inputs ? portsOf(p, ROOT_ID, "in") : portsOf(p, mustFind(p, rest[0]).id, "out");
15990
+ const match = (a2) => !!a2.draft && (key === "all" || a2.title === key || a2.url === key || a2.path === key);
15991
+ const hit = ports.filter((x) => x.artifacts.some(match));
15992
+ if (hit.length === 0) throw new Error(t("\u4F5C\u6210\u4E2D\u306E\u8CC7\u6599\u300C{key}\u300D\u306F\u3042\u308A\u307E\u305B\u3093 ({list})", { key, list: ports.flatMap((x) => x.artifacts.filter((a2) => a2.draft).map((a2) => `${x.name}: ${a2.title}`)).join(", ") || "-" }));
15993
+ const names = [];
15994
+ for (const port2 of hit) {
15995
+ names.push(...port2.artifacts.filter(match).map((a2) => a2.title));
15996
+ p = updatePort(p, port2.id, { artifacts: port2.artifacts.map((a2) => match(a2) ? { ...a2, draft: void 0 } : a2) });
15997
+ }
15998
+ save(path, p);
15999
+ out(t("\u78BA\u5B9A\u306B\u3057\u307E\u3057\u305F: {list}", { list: names.join(", ") }));
16000
+ return;
16001
+ }
15588
16002
  if (options.remove !== void 0) {
15589
16003
  const key = str2(options.remove);
15590
16004
  if (!key) throw new Error(t("--remove <\u984C\u540D\u304B\u30D1\u30B9\u304B URL> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
@@ -15605,19 +16019,26 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15605
16019
  const target2 = name ? ins.find((x) => x.name === name) : ins.length === 1 ? ins[0] : void 0;
15606
16020
  if (!target2) throw new Error(name ? t("\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u300C{name}\u300D\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 ({list})", { name, list: ins.map((x) => x.name).join(", ") }) : t("\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u304C\u8907\u6570\u3042\u308A\u307E\u3059\u3002--input <\u5165\u529B\u540D> \u3067\u9078\u3093\u3067\u304F\u3060\u3055\u3044 ({list})", { list: ins.map((x) => x.name).join(", ") }));
15607
16021
  const a2 = artifactFrom(rest[1], str2(options.title));
16022
+ if (options.draft) a2.draft = true;
15608
16023
  save(path, updatePort(p, target2.id, { artifacts: [...target2.artifacts, a2] }));
15609
- out(t("\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306B\u8CC7\u6599\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{port}\u300D <- {artifact}", { port: target2.name, artifact: a2.title }) + `${a2.kind === "git" ? ` (git ${a2.path} @ ${(a2.commit ?? "").slice(0, 7)})` : ""}`);
16024
+ out(t("\u6700\u4E0A\u4F4D\u306E\u5165\u529B\u306B\u8CC7\u6599\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{port}\u300D <- {artifact}", { port: target2.name, artifact: a2.title }) + `${a2.kind === "git" ? ` (git ${a2.path} @ ${(a2.commit ?? "").slice(0, 7)})` : ""}` + (a2.draft ? t(" (\u4F5C\u6210\u4E2D)") : ""));
15610
16025
  return;
15611
16026
  }
15612
16027
  const b = mustFind(p, rest[0]);
15613
16028
  p = ackDecisions(p, b.id, actor);
15614
16029
  if (!rest[1]) throw new Error(t("<URL \u307E\u305F\u306F\u30D1\u30B9> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15615
16030
  const a = artifactFrom(rest[1], str2(options.title));
16031
+ if (options.link) {
16032
+ save(path, updateBlock(p, b.id, { artifacts: [...b.artifacts, a] }));
16033
+ out(t("\u53C2\u8003\u8CC7\u6599\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{title}\u300D <- {artifact}", { title: b.title, artifact: a.title }));
16034
+ return;
16035
+ }
16036
+ if (options.draft) a.draft = true;
15616
16037
  const outs = portsOf(p, b.id, "out");
15617
16038
  const target = str2(options.output) ? outs.find((o) => o.name === str2(options.output)) : outs[0];
15618
16039
  if (!target) throw new Error(t("\u51FA\u529B\u30DD\u30FC\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"));
15619
16040
  save(path, updatePort(p, target.id, { artifacts: [...target.artifacts, a] }));
15620
- out(t("\u6210\u679C\u7269\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{title}\u300D.{port} <- {artifact}", { title: b.title, port: target.name, artifact: a.title }) + `${a.kind === "git" ? ` (git ${a.path} @ ${(a.commit ?? "").slice(0, 7)})` : ""}`);
16041
+ out(t("\u6210\u679C\u7269\u3092\u4ED8\u3051\u307E\u3057\u305F: \u300C{title}\u300D.{port} <- {artifact}", { title: b.title, port: target.name, artifact: a.title }) + `${a.kind === "git" ? ` (git ${a.path} @ ${(a.commit ?? "").slice(0, 7)})` : ""}` + (a.draft ? t(" (\u4F5C\u6210\u4E2D\u3002\u4F7F\u3046\u5074\u306F\u5F85\u3063\u305F\u307E\u307E\u3002\u5B8C\u4E86\u304B --final \u3067\u78BA\u5B9A)") : ""));
15621
16042
  return;
15622
16043
  }
15623
16044
  case "check": {
@@ -15748,7 +16169,22 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15748
16169
  if (!answer) throw new Error(t("<\u56DE\u7B54> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
15749
16170
  const id = str2(options.id) ?? [...b.decisions].reverse().find((d) => d.answer === void 0)?.id;
15750
16171
  if (!id) throw new Error(t("\u672A\u56DE\u7B54\u306E\u5224\u65AD\u304C\u3042\u308A\u307E\u305B\u3093"));
15751
- save(path, answerDecision(p, b.id, id, answer, str2(options.by) ?? (actor === "agent" ? "human" : actor)));
16172
+ const decision2 = b.decisions.find((d) => d.id === id);
16173
+ if (!decision2) throw new Error(t("\u5224\u65AD {id} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093", { id }));
16174
+ const by = str2(options.by) ?? (actor === "agent" ? "human" : actor);
16175
+ if (decision2.answer !== void 0) {
16176
+ if (decision2.answer === answer.trim()) throw new Error(t("\u540C\u3058\u7B54\u3048\u3067\u3059: {answer}", { answer }));
16177
+ const q = editDecisionAnswer(p, b.id, id, answer, by);
16178
+ if (!isHumanActor(by)) {
16179
+ const qd = q.blocks[b.id].decisions.find((d) => d.id === id);
16180
+ qd.ackedBy = by;
16181
+ qd.ackedAt = qd.answeredAt;
16182
+ }
16183
+ save(path, q);
16184
+ out(t("\u7B54\u3048\u3092\u76F4\u3057\u307E\u3057\u305F: \u300C{title}\u300D {before} -> {answer}", { title: b.title, before: decision2.answer, answer: answer.trim() }));
16185
+ return;
16186
+ }
16187
+ save(path, answerDecision(p, b.id, id, answer, by));
15752
16188
  out(t("\u56DE\u7B54: \u300C{title}\u300D {answer}", { title: b.title, answer }));
15753
16189
  return;
15754
16190
  }
@@ -15795,11 +16231,56 @@ function runCommand(cmd, rest, options, actor, path, p, AGENTS_SNIPPET, SKILL_MD
15795
16231
  if (str2(options.category) !== void 0) p = setCategory(p, b.id, str2(options.category) === "none" ? null : categoryKeyOf(str2(options.category)));
15796
16232
  if (str2(options.repo) !== void 0) p = updateBlock(p, b.id, { repo: str2(options.repo) === "none" ? void 0 : str2(options.repo) });
15797
16233
  if (str2(options.issue) !== void 0) p = updateBlock(p, b.id, { issue: str2(options.issue) === "none" ? void 0 : str2(options.issue) });
16234
+ const names = (v) => list(v).flatMap((x) => x.split(",")).map((x) => x.trim()).filter(Boolean);
16235
+ if (options.assignee !== void 0 || options["add-assignee"] !== void 0 || options["remove-assignee"] !== void 0) {
16236
+ const setTo = options.assignee !== void 0 ? str2(options.assignee) === "none" ? [] : names(options.assignee) : void 0;
16237
+ const r = assignMembers(p, b.id, { set: setTo, add: names(options["add-assignee"]), remove: names(options["remove-assignee"]) });
16238
+ if (r.error) throw new Error(r.error);
16239
+ p = r.project;
16240
+ if (r.added.length) out(t("\u30E1\u30F3\u30D0\u30FC\u3092\u8DB3\u3057\u307E\u3057\u305F: {names}", { names: r.added.join(", ") }));
16241
+ }
15798
16242
  if (str2(options["split-by"]) !== void 0) p = updateBlock(p, b.id, { splitBy: str2(options["split-by"]) === "none" ? void 0 : str2(options["split-by"]).trim() });
15799
16243
  save(path, p);
15800
16244
  out(t("\u66F4\u65B0: \u300C{title}\u300D", { title: p.blocks[b.id].title }));
15801
16245
  return;
15802
16246
  }
16247
+ // メンバーの一覧 (担当の名前と、担当している未完了の箱の数)
16248
+ case "plan": {
16249
+ if (options.name === void 0 && options.description === void 0) {
16250
+ out(t("\u8A08\u753B\u306E\u540D\u524D: {name}", { name: p.name }));
16251
+ if (p.description) out(t("\u8AAC\u660E: {text}", { text: p.description }));
16252
+ return;
16253
+ }
16254
+ const name = str2(options.name)?.trim();
16255
+ if (options.name !== void 0 && !name) throw new Error(t("--name \u306B\u306F\u8A08\u753B\u306E\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
16256
+ p = { ...p, ...name ? { name } : {}, ...options.description !== void 0 ? { description: str2(options.description) === "none" ? "" : str2(options.description) ?? "" } : {} };
16257
+ save(path, p);
16258
+ out(t("\u8A08\u753B\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F: {name}", { name: p.name }));
16259
+ return;
16260
+ }
16261
+ case "members": {
16262
+ if (options.remove !== void 0) {
16263
+ const names = (str2(options.remove) ?? "").split(",").map((x) => x.trim()).filter(Boolean);
16264
+ if (names.length === 0) throw new Error(t("--remove \u306B\u306F\u5916\u3059\u30E1\u30F3\u30D0\u30FC\u306E\u540D\u524D\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"));
16265
+ for (const n of names) {
16266
+ const m = findMember(p, n);
16267
+ if (!m) throw new Error(t("\u30E1\u30F3\u30D0\u30FC\u300C{name}\u300D\u304C\u3044\u307E\u305B\u3093 ({list})", { name: n, list: p.members.map((x) => x.name).join(", ") }));
16268
+ p = removeMember(p, m.id);
16269
+ }
16270
+ save(path, p);
16271
+ out(t("\u30E1\u30F3\u30D0\u30FC\u3092\u5916\u3057\u307E\u3057\u305F: {names}", { names: names.join(", ") }));
16272
+ return;
16273
+ }
16274
+ if (p.members.length === 0) {
16275
+ out(t("\u30E1\u30F3\u30D0\u30FC\u306F\u3044\u307E\u305B\u3093\u3002\u62C5\u5F53\u306F set <block> --assignee <\u540D\u524D> \u3067\u6C7A\u3081\u307E\u3059 (\u540D\u524D\u306E\u30E1\u30F3\u30D0\u30FC\u306F\u81EA\u52D5\u3067\u8DB3\u3055\u308C\u307E\u3059)"));
16276
+ return;
16277
+ }
16278
+ for (const m of p.members) {
16279
+ const open = Object.values(p.blocks).filter((b) => b.assigneeIds.includes(m.id) && b.status !== "white").length;
16280
+ out(`- ${m.name} ${t("(\u672A\u5B8C\u4E86\u306E\u62C5\u5F53 {count} \u4EF6)", { count: open })}`);
16281
+ }
16282
+ return;
16283
+ }
15803
16284
  case "lang": {
15804
16285
  const v = (rest[0] ?? "").toLowerCase();
15805
16286
  if (!v) {