@namewta/speculo 0.1.14 → 0.1.16
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/package.json
CHANGED
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: officecli
|
|
3
|
+
description: Create, analyze, proofread, and modify Office documents (.docx, .xlsx, .pptx) using the officecli CLI tool. Use when the user wants to create, inspect, check formatting, find issues, add charts, or modify Office documents.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# officecli
|
|
7
|
+
|
|
8
|
+
AI-friendly CLI for .docx, .xlsx, .pptx. Single binary, no dependencies, no Office installation needed.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
If `officecli` is not installed:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# macOS / Linux
|
|
16
|
+
curl -fsSL https://d.officecli.ai/install.sh | bash
|
|
17
|
+
|
|
18
|
+
# Windows (PowerShell)
|
|
19
|
+
irm https://d.officecli.ai/install.ps1 | iex
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Verify with `officecli --version`. If still not found after install, open a new terminal.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Strategy
|
|
27
|
+
|
|
28
|
+
**L1 (read) → L2 (DOM edit) → L3 (raw XML)**. Always prefer higher layers. Add `--json` for structured output.
|
|
29
|
+
|
|
30
|
+
**Before doc work, check Specialized Skills** (bottom of this file). Fundraising decks, academic papers, financial models, dashboards, and Morph animations need their own skill loaded first — `load_skill` once, then proceed.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Help System (IMPORTANT)
|
|
35
|
+
|
|
36
|
+
**When unsure about property names, value formats, or command syntax, ALWAYS run help instead of guessing.** One help query beats guess-fail-retry loops.
|
|
37
|
+
|
|
38
|
+
`officecli help` ≡ `officecli --help`, and `officecli <cmd> --help` ≡ `officecli help <cmd>` — same content.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
officecli help # All commands + global options + schema entry points
|
|
42
|
+
officecli help docx # List all docx elements
|
|
43
|
+
officecli help docx paragraph # Full schema: properties, aliases, examples, readbacks
|
|
44
|
+
officecli help docx set paragraph # Verb-filtered: only props usable with `set`
|
|
45
|
+
officecli help docx paragraph --json # Structured schema (machine-readable)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Format aliases: `word`→`docx`, `excel`→`xlsx`, `ppt`/`powerpoint`→`pptx`. Verbs: `add`, `set`, `get`, `query`, `remove`. MCP exposes the same schema via `{"command":"help","format":"docx","type":"paragraph"}`.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Performance: Resident Mode
|
|
53
|
+
|
|
54
|
+
**Every command auto-starts a resident on first access** (60s idle timeout) — file-lock conflicts are automatically avoided. Explicit `open`/`close` is still recommended for longer sessions (12min idle):
|
|
55
|
+
```bash
|
|
56
|
+
officecli open report.docx # explicitly keep in memory
|
|
57
|
+
officecli set report.docx ... # no file I/O overhead
|
|
58
|
+
officecli close report.docx # save and release
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Opt out of auto-start: `OFFICECLI_NO_AUTO_RESIDENT=1`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Quick Start
|
|
66
|
+
|
|
67
|
+
**PPT:**
|
|
68
|
+
```bash
|
|
69
|
+
officecli create slides.pptx
|
|
70
|
+
officecli add slides.pptx / --type slide --prop title="Q4 Report" --prop background=1A1A2E
|
|
71
|
+
officecli add slides.pptx '/slide[1]' --type shape --prop text="Revenue grew 25%" --prop x=2cm --prop y=5cm --prop font=Arial --prop size=24 --prop color=FFFFFF
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Word:**
|
|
75
|
+
```bash
|
|
76
|
+
officecli create report.docx
|
|
77
|
+
officecli add report.docx /body --type paragraph --prop text="Executive Summary" --prop style=Heading1
|
|
78
|
+
officecli add report.docx /body --type paragraph --prop text="Revenue increased by 25% year-over-year."
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Excel:**
|
|
82
|
+
```bash
|
|
83
|
+
officecli create data.xlsx
|
|
84
|
+
officecli set data.xlsx /Sheet1/A1 --prop value="Name" --prop bold=true
|
|
85
|
+
officecli set data.xlsx /Sheet1/A2 --prop value="Alice"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## L1: Create, Read & Inspect
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
officecli create <file> # Create blank .docx/.xlsx/.pptx (type from extension)
|
|
94
|
+
officecli view <file> <mode> # outline | stats | issues | text | annotated | html
|
|
95
|
+
officecli get <file> <path> --depth N # Get a node and its children [--json]
|
|
96
|
+
officecli query <file> <selector> # CSS-like query
|
|
97
|
+
officecli validate <file> # Validate against OpenXML schema
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### view modes
|
|
101
|
+
|
|
102
|
+
| Mode | Description | Useful flags |
|
|
103
|
+
|------|-------------|-------------|
|
|
104
|
+
| `outline` | Document structure | |
|
|
105
|
+
| `stats` | Statistics (pages, words, shapes) | |
|
|
106
|
+
| `issues` | Formatting/content/structure problems | `--type format\|content\|structure`, `--limit N` |
|
|
107
|
+
| `text` | Plain text extraction | `--start N --end N`, `--max-lines N` |
|
|
108
|
+
| `annotated` | Text with formatting annotations | |
|
|
109
|
+
| `html` | Static HTML snapshot — same renderer as `watch`, no server needed | `--browser`, `--page N` (docx), `--start N --end N` (pptx) |
|
|
110
|
+
| `screenshot` / `svg` / `pdf` / `forms` | PNG via headless browser / SVG (pptx slide) / PDF via exporter plugin / form-fields JSON via format-handler plugin | `-o`, `--screenshot-width/-height`, pptx `--grid N` |
|
|
111
|
+
|
|
112
|
+
Use `view html` for one-shot snapshots (CI artifacts, archival, diffing); use `watch` when you need live refresh or browser-side click-to-select.
|
|
113
|
+
|
|
114
|
+
### get
|
|
115
|
+
|
|
116
|
+
Any XML path via element localName. Use `--depth N` to expand children. Add `--json` for structured output. Default text output is grep-friendly: `path (type) "text" key=val key=val ...`
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
officecli get report.docx '/body/p[3]' --depth 2 --json
|
|
120
|
+
officecli get slides.pptx '/slide[1]' --depth 1 # list all shapes on slide 1
|
|
121
|
+
officecli get data.xlsx '/Sheet1/B2' --json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Stable ID Addressing
|
|
125
|
+
|
|
126
|
+
Elements with stable IDs return `@attr=value` paths instead of positional indices. Prefer these in multi-step workflows — positional indices shift on insert/delete, stable IDs do not.
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
/slide[1]/shape[@id=550950021] # PPT shape
|
|
130
|
+
/slide[1]/table[@id=1388430425]/tr[1]/tc[2] # PPT table
|
|
131
|
+
/body/p[@paraId=1A2B3C4D] # Word paragraph
|
|
132
|
+
/comments/comment[@commentId=1] # Word comment
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
PPT also accepts `@name=` (e.g. `shape[@name=Title 1]`), with morph `!!` prefix awareness. Elements without stable IDs (slide, run, tr/tc, row) fall back to positional indices.
|
|
136
|
+
|
|
137
|
+
### query
|
|
138
|
+
|
|
139
|
+
CSS-like selectors: `[attr=value]`, `[attr!=value]`, `[attr~=text]`, `[attr>=value]`, `[attr<=value]`, `:contains("text")`, `:empty`, `:has(formula)`, `:no-alt`. Boolean `and`/`or` supported across `query`/`set`/`remove`: `cell[value>5000 or value<100]`, `cell[(type=Number or type=Date) and value>0]`. Excel row-by-column-name: `Sheet1!row[Salary>5000]`. `set` accepts selectors and Excel-native paths (parity with `get`/`query`). Bare unscoped selectors rejected on `set`/`remove`.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
officecli query report.docx 'paragraph[style=Normal] > run[font!=Arial]'
|
|
143
|
+
officecli query slides.pptx 'shape[fill=FF0000]'
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Watch & Interactive Selection
|
|
149
|
+
|
|
150
|
+
Live HTML preview that auto-refreshes on every file change. Browsers can click / shift-click / box-drag to select shapes; the CLI can read the current browser selection and act on it.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
officecli watch <file> [--port N] # Start preview server (default port 26315)
|
|
154
|
+
officecli unwatch <file> # Stop
|
|
155
|
+
officecli goto <file> <path> # Scroll watching browser(s) to element (docx: p / table / tr / tc)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Open the printed `http://localhost:N` URL. Click to select; shift/cmd/ctrl+click to multi-select; drag from empty space to box-select. PPT/Word use blue outline; Excel uses native-style green selection (double-click cell to edit inline; drag a chart to reposition).
|
|
159
|
+
|
|
160
|
+
### `get <file> selected` — read what the user clicked
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
officecli get <file> selected [--json]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Returns DocumentNodes for whatever is currently selected. Empty result if nothing selected. Exit code != 0 if no watch is running.
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# User clicks shapes in the browser, then asks "make these red"
|
|
170
|
+
PATHS=$(officecli get deck.pptx selected --json | jq -r '.data.Results[].path')
|
|
171
|
+
for p in $PATHS; do officecli set deck.pptx "$p" --prop fill=FF0000; done
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Key properties
|
|
175
|
+
|
|
176
|
+
- **Selection survives file edits.** Paths use stable `@id=` form.
|
|
177
|
+
- **All connected browsers share one selection.** Last-write-wins.
|
|
178
|
+
- **Same-file single-watch.** A given file can have only one watch process at a time.
|
|
179
|
+
- **Group shapes select as a whole.** Drilling into individual children of a group is not supported in v1.
|
|
180
|
+
- **Coverage:** `.pptx` shapes/pictures/tables/charts/connectors/groups; `.docx` top-level paragraphs and tables. Inherited layout/master decorations and Word nested elements (table cells, run-level) are not addressable. **`.xlsx` does not emit `data-path`** — `mark`/`selection` on xlsx always resolve `stale=true` (v2 candidate).
|
|
181
|
+
|
|
182
|
+
### Marks — edit proposals waiting for review
|
|
183
|
+
|
|
184
|
+
Use `mark` when changes need human review BEFORE they hit the file. Marks live in the watch process only; a separate `set` pipeline applies accepted ones. For one-shot changes use `set` directly; for permanent file annotations use `add --type comment` (Word native).
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
officecli mark <file> <path> [--prop find=... color=... note=... tofix=... regex=true] [--json]
|
|
188
|
+
officecli unmark <file> [--path <p> | --all] [--json]
|
|
189
|
+
officecli get-marks <file> [--json]
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Props: `find` (literal or regex when `regex=true`; raw form `find='r"[abc]"'`), `color` (hex / `rgb(...)` / 22 named whitelist), `note`, `tofix` (drives apply pipeline). **Path** must be `data-path` format from watch HTML — see subskills for full pipeline.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## L2: DOM Operations
|
|
197
|
+
|
|
198
|
+
### set — modify properties
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
officecli set <file> <path> --prop key=value [--prop ...]
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Any XML attribute is settable** via element path (found via `get --depth N`) — even attributes not currently present. Without `find=`, `set` applies format to the entire element.
|
|
205
|
+
|
|
206
|
+
**Value formats:**
|
|
207
|
+
|
|
208
|
+
| Type | Format | Examples |
|
|
209
|
+
|------|--------|---------|
|
|
210
|
+
| Colors | Hex (with/without `#`), named, RGB, theme | `FF0000`, `#FF0000`, `red`, `rgb(255,0,0)`, `accent1`..`accent6` |
|
|
211
|
+
| Spacing | Unit-qualified | `12pt`, `0.5cm`, `1.5x`, `150%` |
|
|
212
|
+
| Dimensions | EMU or suffixed | `914400`, `2.54cm`, `1in`, `72pt`, `96px` |
|
|
213
|
+
|
|
214
|
+
**Dotted-attr aliases** — `font.<attr>` forms accepted on shape/run/paragraph/table/row/cell/section/styles, e.g. `--prop font.color=red --prop font.bold=true --prop font.size=14pt`. Run `officecli help <fmt> <element>` for the full list.
|
|
215
|
+
|
|
216
|
+
### find — format or replace matched text
|
|
217
|
+
|
|
218
|
+
Use top-level `--find` / `--replace` on `set` (and `--find` on `query`). Legacy `--prop find=X` still works but emits a hint.
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Format matched text (auto-splits runs)
|
|
222
|
+
officecli set doc.docx '/body/p[1]' --find weather --prop bold=true --prop color=red
|
|
223
|
+
|
|
224
|
+
# Regex matching (regex= still a prop flag)
|
|
225
|
+
officecli set doc.docx '/body/p[1]' --find '\d+%' --prop regex=true --prop color=red
|
|
226
|
+
|
|
227
|
+
# Replace text (use `/` for whole-document scope)
|
|
228
|
+
officecli set doc.docx / --find draft --replace final
|
|
229
|
+
|
|
230
|
+
# docx: tracked Find&Replace
|
|
231
|
+
officecli set doc.docx / --find draft --replace final --prop revision.author=Alice
|
|
232
|
+
|
|
233
|
+
# PPT — same syntax, different paths
|
|
234
|
+
officecli set slides.pptx / --find draft --replace final
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Path controls search scope:** `/` = whole document, `/body/p[1]` or `/slide[N]/shape[M]` = specific element, `/header[1]` / `/footer[1]` = headers/footers.
|
|
238
|
+
|
|
239
|
+
**Notes:**
|
|
240
|
+
- Case-sensitive by default. Case-insensitive: `--prop 'find=(?i)error' --prop regex=true`
|
|
241
|
+
- Matches work across run boundaries
|
|
242
|
+
- No match = silent success. `--json` includes `"matched": N`
|
|
243
|
+
- **Excel:** only `find` + `replace` supported (no find + format props)
|
|
244
|
+
|
|
245
|
+
### add — add elements or clone
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
officecli add <file> <parent> --type <type> [--prop ...]
|
|
249
|
+
officecli add <file> <parent> --type <type> --after <path> [--prop ...] # insert after anchor
|
|
250
|
+
officecli add <file> <parent> --type <type> --before <path> [--prop ...] # insert before anchor
|
|
251
|
+
officecli add <file> <parent> --type <type> --index N [--prop ...] # 0-based position (legacy)
|
|
252
|
+
officecli add <file> <parent> --from <path> # clone existing element
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
`--after`, `--before`, `--index` are mutually exclusive. No position flag = append to end.
|
|
256
|
+
|
|
257
|
+
**Element types (with aliases):**
|
|
258
|
+
|
|
259
|
+
| Format | Types |
|
|
260
|
+
|--------|-------|
|
|
261
|
+
| **pptx** | slide (incl. hidden), shape (font.latin/ea/cs, direction=rtl, underline.color, highlight=COLOR (Add/Set/Get/HTML preview), effective.X+effective.X.src; arrow alias for rightArrow; slideMaster/slideLayout typed add/set/remove), picture (SVG, brightness/contrast/glow/shadow, rotation, link, tooltip), chart (direction=rtl, pieOfPie, barOfPie, axisLine/gridline per-attr setters, animation+chartBuild=byCategory|bySeries, line dropLines/hiLowLines/upDownBars, anchor=x,y,w,h shorthand), table (cell direction=rtl, fill/background, built-in PowerPoint style catalogue, /col[C] get + swap/copyFrom, row/col Move/CopyFrom), row (tr), connector (from/to accept @name=, startshape/endshape SetByPath), group (link, tooltip, deep walk by get/query/add/remove), video/audio (loop, autoStart alias), equation, notes (direction=rtl, lang), comment (legacy + modern p188 threaded round-trip), animation (15 emphasis + 16 exit presets, multi-effect chains, motion-path presets, repeat/restart/autoReverse, chart animations), transition (12 p15 presets + morph/p14), paragraph (para), run, zoom, ole (preview=, full dump round-trip via add-part+raw-set), placeholder (phType=...), model3d (rotation=ax,ay,az; full dump round-trip), smartart (dump round-trip via add-part). |
|
|
262
|
+
| **docx** | paragraph (direction/font.latin/ea/cs, bold.cs/italic.cs/size.cs, lang.latin/ea/cs, wordWrap, framePr.\*, tabs shorthand), run (lang slots, direction, underline.color, position half-pts, **revision.type=ins\|del\|format\|moveFrom\|moveTo + revision.action=accept\|reject** with .author/.date — `/revision[@author=X]` selector for filtered accept/reject), table (direction=rtl, hMerge, **virtual column ops**: add/remove/move/copyfrom on /body/tbl[N]/col), row (tr), cell (td), image, header/footer (direction), section (pageNumFmt full enum, direction=rtl, rtlGutter, pgBorders=box), bookmark, comment, footnote, endnote, formfield, sdt, chart, equation, field (28 types), hyperlink, style (direction, indents, pbdr, lineSpacing on Add/Set), toc, watermark, break, ole, **num/abstractNum/lvl**, **tab**, **textbox/shape** (full Add+Get; geometry, fill, line, wrap, alt, anchor, **rotation, verticalText (eaVert/vert/vert270/wordArt\*), gradient, shadow, opacity**), embedded **OLE round-trip on dump→batch**. docDefaults.rtl, autoHyphenation, `get /` exposes locale + /comments /footnotes /endnotes. `create --minimal` for raw OOXML scaffolding. |
|
|
263
|
+
| **xlsx** | sheet (visible/hidden/veryHidden, print margins, printTitleRows/Cols, rightToLeft sheetView, cascade-aware rename), row (c{N}= cell-content shorthand; add accepts --from /Sheet/col[L]; formula-ref rewrite on insert), col (formula-ref rewrite, named-range follow on move), cell (type=richtext+runs, merge=range/sweep, direction=rtl, phonetic; **--shift left\|up on remove, shift=right\|down on add** — Excel UI dialog parity; formula auto-detect; OFFSET/INDIRECT in calc), chart (per-axis RTL/title, anchor=x,y,w,h, pareto), image (SVG), comment (direction=rtl), table (listobject), namedrange (definedname, volatile, `[@name=X]`; formula-body inlined at parse), pivottable (cache CoW + cross-pivot sharing, labelFilter, topN, fillDownLabels, calculatedField), sparkline, validation, autofilter, shape, textbox, CF (databar/colorscale/iconset/formulacf/cellIs/topN/aboveAverage), ole, csv. Query supports `merge`/`mergedrange`. Workbook: password. Shape selector enumerates leaves inside grpSp. |
|
|
264
|
+
|
|
265
|
+
### Pivot tables (xlsx)
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
officecli add data.xlsx /Sheet1 --type pivottable \
|
|
269
|
+
--prop source="Sheet1!A1:E100" --prop rows=Region,Category \
|
|
270
|
+
--prop cols=Year --prop values="Sales:sum,Qty:count" \
|
|
271
|
+
--prop grandTotals=rows --prop subtotals=off --prop sort=asc
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Key props: `rows`, `cols`, `values` (Field:func[:showDataAs]), `filters`, `source`, `position`, `layout` (compact/outline/tabular), `repeatLabels`, `blankRows`, `aggregate`, `showDataAs` (percent_of_total/row/col, running_total), `grandTotals`, `subtotals`, `sort`. Aggregators: sum, count, average, max, min, product, stdDev, stdDevp, var, varp, countNums. Date columns auto-group. Run `officecli help xlsx pivottable` for full schema.
|
|
275
|
+
|
|
276
|
+
### Document-level properties (all formats)
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
officecli set doc.docx / --prop docDefaults.font=Arial --prop docDefaults.fontSize=11pt
|
|
280
|
+
officecli set doc.docx / --prop protection=forms --prop evenAndOddHeaders=true
|
|
281
|
+
officecli set data.xlsx / --prop calc.mode=manual --prop calc.refMode=r1c1
|
|
282
|
+
officecli set slides.pptx / --prop defaultFont=Arial --prop show.loop=true --prop print.what=handouts
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Run `officecli help <format> /` for all document-level properties (docDefaults, docGrid, CJK spacing, calc, print, show, theme, extended).
|
|
286
|
+
|
|
287
|
+
### Sort (xlsx)
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
officecli set data.xlsx /Sheet1 --prop sort="C desc" --prop sortHeader=true
|
|
291
|
+
officecli set data.xlsx '/Sheet1/A1:D100' --prop sort="A asc" --prop sortHeader=true
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Format: `COL DIR[, COL DIR ...]`. Rejects ranges with merged cells or formulas. Sidecar metadata (hyperlinks, comments, conditional formatting, drawings) follows rows automatically.
|
|
295
|
+
|
|
296
|
+
### Text-anchored insert (`--after find:X` / `--before find:X`)
|
|
297
|
+
|
|
298
|
+
Locate an insertion point by text match within a paragraph. Inline types (run, picture, hyperlink) insert within the paragraph; block types (table, paragraph) auto-split it. PPT only supports inline.
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
# Word: inline run after matched text
|
|
302
|
+
officecli add doc.docx '/body/p[1]' --type run --after find:weather --prop text=" (sunny)"
|
|
303
|
+
|
|
304
|
+
# Word: block table after matched text (auto-splits paragraph)
|
|
305
|
+
officecli add doc.docx '/body/p[1]' --type table --after "find:First sentence." --prop rows=2 --prop cols=2
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Clone
|
|
309
|
+
|
|
310
|
+
`officecli add <file> / --from '/slide[1]'` — copies with all cross-part relationships.
|
|
311
|
+
|
|
312
|
+
### move, swap, remove
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
officecli move <file> <path> [--to <parent>] [--index N] [--after <path>] [--before <path>]
|
|
316
|
+
officecli swap <file> <path1> <path2>
|
|
317
|
+
officecli remove <file> '/body/p[4]'
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
When using `--after` or `--before`, `--to` can be omitted — the target container is inferred from the anchor.
|
|
321
|
+
|
|
322
|
+
### batch — multiple operations in one save cycle
|
|
323
|
+
|
|
324
|
+
Continues on error by default (returns exit 1 if any item fails). Use `--stop-on-error` to abort on the first failure. `--force` is the docx-protection bypass.
|
|
325
|
+
|
|
326
|
+
`officecli dump <file> [<path>]` emits a replayable batch JSON for round-trip — `.docx` (full coverage) and `.pptx` (text/tables/pictures/charts/notes/theme + OLE/3D/video/audio/SmartArt/morph/p15 transitions via raw-set passthrough). Path defaults to `/` (whole document); pass a subtree path (`/body`, `/body/p[N]`, `/body/tbl[N]`, `/theme`, `/settings`, `/numbering`, `/styles`) to scope the dump. `officecli refresh <file.docx>` recalculates TOC page numbers / PAGE / cross-references after replay (Word backend on Windows; headless-HTML fallback elsewhere). `officecli plugins list` extends support to `.doc`, `.hwpx`, `.pdf` export.
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
echo '[
|
|
330
|
+
{"command":"set","path":"/Sheet1/A1","props":{"value":"Name","bold":"true"}},
|
|
331
|
+
{"command":"set","path":"/Sheet1/B1","props":{"value":"Score","bold":"true"}}
|
|
332
|
+
]' | officecli batch data.xlsx --json
|
|
333
|
+
|
|
334
|
+
officecli batch data.xlsx --commands '[{"op":"set","path":"/Sheet1/A1","props":{"value":"Done"}}]' --json
|
|
335
|
+
officecli batch data.xlsx --input updates.json --force --json
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Supports: `add`, `set`, `get`, `query`, `remove`, `move`, `swap`, `view`, `raw`, `raw-set`, `validate`. Fields: `command` (or `op`), `path`, `parent`, `type`, `from`, `to`, `index`, `after`, `before`, `props`, `selector`, `mode`, `depth`, `part`, `xpath`, `action`, `xml`.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## L3: Raw XML
|
|
343
|
+
|
|
344
|
+
Use when L2 cannot express what you need. No xmlns declarations needed — prefixes auto-registered.
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
officecli raw <file> <part> # view raw XML
|
|
348
|
+
officecli raw-set <file> <part> --xpath "..." --action replace --xml '<w:p>...</w:p>'
|
|
349
|
+
officecli add-part <file> <parent> # create new document part (returns rId)
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
`raw-set` actions: `append`, `prepend`, `insertbefore`, `insertafter`, `replace`, `remove`, `setattr`. Run `officecli help <format> raw` for available parts.
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Common Pitfalls
|
|
357
|
+
|
|
358
|
+
| Pitfall | Correct Approach |
|
|
359
|
+
|---------|-----------------|
|
|
360
|
+
| `--name "foo"` | Use `--prop name="foo"` — all attributes go through `--prop` |
|
|
361
|
+
| Unquoted `[N]` paths in zsh/bash | Always quote: `'/slide[1]'` or `"/slide[1]"` (shell glob-expands brackets) |
|
|
362
|
+
| PPT `shape[1]` for content | `shape[1]` is typically the title placeholder. Use `shape[2]+` for content shapes |
|
|
363
|
+
| `/shape[myname]` | Name indexing not supported. Use numeric index or `@name=` (PPT only) |
|
|
364
|
+
| Guessing property names | Run `officecli help <format> <element>` to see exact names |
|
|
365
|
+
| Modifying an open file | Close the file in PowerPoint/WPS first |
|
|
366
|
+
| `\n` in shell strings | Use `\\n` for newlines in `--prop text="..."` |
|
|
367
|
+
| `$` in shell text | `--prop text="$15M"` strips `$15`. Use single quotes: `--prop text='$15M'`, or heredoc batch |
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Specialized Skills
|
|
372
|
+
|
|
373
|
+
`officecli load_skill <name>` — output is a SKILL.md, follow its rules.
|
|
374
|
+
|
|
375
|
+
**Loading rule**:
|
|
376
|
+
- Pick the most specific match in "When to use"; if none fits, load the format default (`word` / `pptx` / `excel`).
|
|
377
|
+
- Scenes already contain the format default's rules — load **one** skill per artifact, never stack.
|
|
378
|
+
- Loaded rules persist across turns; don't re-load each reply.
|
|
379
|
+
- Two distinct artifacts → two separate loads.
|
|
380
|
+
|
|
381
|
+
### Word (.docx)
|
|
382
|
+
|
|
383
|
+
| Name | When to use |
|
|
384
|
+
|------|-------------|
|
|
385
|
+
| `word` | Reports, letters, memos, proposals, generic documents |
|
|
386
|
+
| `academic-paper` | Journal / conference / thesis: APA / Chicago / IEEE / MLA citations, equations, SEQ + PAGEREF cross-refs, multi-column journal layout, bibliography. NOT for business reports or letters (route those to `word`) |
|
|
387
|
+
|
|
388
|
+
### PowerPoint (.pptx)
|
|
389
|
+
|
|
390
|
+
| Name | When to use |
|
|
391
|
+
|------|-------------|
|
|
392
|
+
| `pptx` | Generic decks: board reviews, sales decks, all-hands, product launches |
|
|
393
|
+
| `pitch-deck` | **Fundraising only** — seed / Series A-C / SAFE / convertible / strategic raise. NOT for sales / product / board decks (route those to `pptx`) |
|
|
394
|
+
| `morph-ppt` | Cinematic Morph-animated presentations. NOT for static decks (route those to `pptx`) |
|
|
395
|
+
| `morph-ppt-3d` | 3D Morph: GLB models, camera moves, depth. NOT for 2D-only Morph (route those to `morph-ppt`) |
|
|
396
|
+
|
|
397
|
+
### Excel (.xlsx)
|
|
398
|
+
|
|
399
|
+
| Name | When to use |
|
|
400
|
+
|------|-------------|
|
|
401
|
+
| `excel` | Generic workbooks, formulas, pivots, trackers |
|
|
402
|
+
| `financial-model` | Financial models, scenarios, projections. NOT for general data analysis (route those to `excel`) |
|
|
403
|
+
| `data-dashboard` | CSV/tabular data → KPI / analytics / executive dashboards with charts and sparklines. NOT for raw data tracking (route those to `excel`) |
|
|
404
|
+
|
|
405
|
+
Example: a fundraising deck task → `officecli load_skill pitch-deck` → use the printed rules.
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## Notes
|
|
410
|
+
|
|
411
|
+
- Paths are **1-based** (XPath convention): `'/body/p[3]'` = third paragraph
|
|
412
|
+
- `--index` is **0-based** (array convention): `--index 0` = first position
|
|
413
|
+
- **Excel exception**: for `add --type row` and `add --type col`, `--index N` is **1-based** (matches OOXML RowIndex / column letter index). `--index 5` inserts at row 5 / column 5.
|
|
414
|
+
- After modifications, verify with `validate` and/or `view issues`
|
|
415
|
+
- **When unsure**, run `officecli help <format> <element>` instead of guessing
|
|
@@ -14,6 +14,21 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
14
14
|
|
|
15
15
|
使用垂直切片(示踪弹)将计划、规格或 PRD 分解为可独立接手的 issue。
|
|
16
16
|
|
|
17
|
+
### 铁律
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
没有精确到文件路径的改动清单,不算垂直切片
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
每个切片必须指名要读哪些文件、要改哪些文件、改动什么内容。笼统描述("改一下登录")不是切片。
|
|
24
|
+
|
|
25
|
+
### 内置文档
|
|
26
|
+
|
|
27
|
+
本工作流入口自带以下配套文档,在对应阶段读取:
|
|
28
|
+
|
|
29
|
+
- `issues-slices.md` — 进行实际切片分解时读取;含有完整结构规范(8 段 slices.md)、独立进入时的深度搜索协议(三轮自采集)、存疑时的提问协议(决策树)
|
|
30
|
+
- `../_templates/issues-slices-template.md` — 写 `slices.md` 时作为骨架填写;头部 blockquote 标注了服务工作流与产物文件名,每个 `[TODO:]` 对应结构规范中的一段
|
|
31
|
+
|
|
17
32
|
### 输入
|
|
18
33
|
|
|
19
34
|
- PRD、计划、设计记录、bug 诊断结论或当前对话上下文
|
|
@@ -40,14 +55,18 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
40
55
|
|
|
41
56
|
### 切片计划质量准则
|
|
42
57
|
|
|
43
|
-
`slices.md` 不是清单,而是一份可被下游直接接手的**切片计划**。借鉴高质量 plan
|
|
58
|
+
`slices.md` 不是清单,而是一份可被下游直接接手的**切片计划**。借鉴高质量 plan 的纪律(参考 TASK plan 的六段结构:当前现状 → 需读文件 → 需改文件 → 数据库表 → 实现要点 → 关键决策):
|
|
44
59
|
|
|
45
|
-
- **Context
|
|
60
|
+
- **Context 先行**:先写清*为什么*、**已确认决策**(范围拍板,防下游重新扯皮)、**当前现状**(现有实现与需求的差距,精确到文件路径+行号)与**关键核实结论**(探索得到的事实),再展开切片。——映射 slices.md §0
|
|
61
|
+
- **文件级精准**:每个切片须指名**需阅读的文件**(\| 文件 \| 目的 \|)和**需修改的文件**(\| 文件 \| 改动内容 \|,新增标 **新增**,重构标 **重度重构**),杜绝笼统描述。——映射 slices.md §3 切片条目
|
|
62
|
+
- **数据库变更可追溯**:涉及 schema 变更时,用「涉及的数据库表」表记录每张表的变更(新建/新增字段/语义调整),DDL 注明 sql 文件和追加位置。——映射 slices.md §2.5
|
|
63
|
+
- **实现要点前置**:每个切片列出关键实现要点(算法细节、并发控制、兜底策略),让执行者拿到切片就知道怎么下手。——映射 slices.md §3 切片条目
|
|
46
64
|
- **存疑即问**:方案有未决分支时,按本工作流「存疑时的提问协议」用 `AskUserQuestion` 一次一问、带推荐、逐步锁定,不臆测。
|
|
47
65
|
- **行号现场核对**:引用的行号/路径均为*近似*,实施时以现场代码为准;在计划内写明这一点,避免下游照搬过期行号。
|
|
48
66
|
- **保留/不动同等重要**:每个切片既写「改什么」,也写「**保留/不动什么**」——告诉执行者哪些不能碰。
|
|
49
|
-
- **验证分层**:删除型切片的验收须含残留扫描(grep 0 命中);change
|
|
67
|
+
- **验证分层**:删除型切片的验收须含残留扫描(grep 0 命中);change 级验证总览走真实运行的冒烟与(如涉及)迁移测试。——映射 slices.md §8
|
|
50
68
|
- **复用优先于新造**:能复用就不新建,在切片「复用」字段与 §1 REUSE 列显式记录。
|
|
69
|
+
- **关键决策收口**:跨切片的技术选型与取舍汇总到「关键决策」段,防止下游对同一问题反复争论。——映射 slices.md §5.5
|
|
51
70
|
- **重型小节按需**:风险登记、退役清单、架构上下文是条件段——复杂 change 铺开,单文件小改可省。
|
|
52
71
|
|
|
53
72
|
### 独立使用
|
|
@@ -56,19 +75,9 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
56
75
|
|
|
57
76
|
**独立进入流程:**
|
|
58
77
|
|
|
59
|
-
1. **change 目录**:若用户未指定 `<change>`
|
|
60
|
-
2. **信息自采集**:若同 change 目录下无上游产物(PRD、decision-log、diagnosis
|
|
61
|
-
|
|
62
|
-
- 读取 `AGENTS.md`、`README.md`、`CONTRIBUTING.md` 了解项目规范与架构约定
|
|
63
|
-
- `git log --oneline -30` 了解近期变更趋势和相关模块
|
|
64
|
-
- 搜索相关代码区域的注释、TODO、FIXME 和现有 issue 引用
|
|
65
|
-
- 读取 `speculo/.speculo/.config/RULES.md` 和 `speculo/.speculo/.config/adr/` 了解项目决策
|
|
66
|
-
3. **深度搜索**:信息仍不足时,执行以下顺序的深度探寻:
|
|
67
|
-
- 搜索项目中与用户意图关键词匹配的代码、注释和文档
|
|
68
|
-
- 追溯相关模块的 git history(`git log -p -- <path>`)
|
|
69
|
-
- 搜索 `speculo/.speculo/doc/` 和 `speculo/.speculo/archive/` 中已有的领域文档
|
|
70
|
-
- 检查现有测试文件了解模块契约和边界行为
|
|
71
|
-
4. **存疑即问**:仅在代码库探索无法确定的决策分支上,按「存疑时的提问协议」使用 `AskUserQuestion` 一次一问、带推荐、逐步锁定。
|
|
78
|
+
1. **change 目录**:若用户未指定 `<change>` 目录,按「缺少 change 目录时的自初始化」创建。
|
|
79
|
+
2. **信息自采集**:若同 change 目录下无上游产物(PRD、decision-log、diagnosis 等),按 `issues-slices.md` 的「独立进入时的深度搜索协议」(三轮:全景扫描 → 领域上下文采集 → 锁定未决分支)自行采集切片所需上下文,不要求用户先执行其他工作流。
|
|
80
|
+
3. **存疑即问**:仅在代码库探索无法确定的决策分支上,按「存疑时的提问协议」使用 `AskUserQuestion` 一次一问、带推荐、逐步锁定。
|
|
72
81
|
|
|
73
82
|
### 缺少 change 目录时的自初始化
|
|
74
83
|
|
|
@@ -99,9 +108,11 @@ keywords: [issues, slices, vertical, AFK, HITL, 切片]
|
|
|
99
108
|
- 模板:`../_templates/issues-slices-template.md`
|
|
100
109
|
- 产物:`slices.md`
|
|
101
110
|
- 完成准则:
|
|
102
|
-
- §0
|
|
103
|
-
-
|
|
111
|
+
- §0 战略与背景含**已确认决策**、**当前现状**与**关键核实结论**(独立进入时自采集,有上游则继承)
|
|
112
|
+
- 每个切片都有标题、类型、依赖、覆盖来源、**需阅读/需修改文件表**、**实现要点**、验收切片;删除型切片标注**保留/不动**
|
|
104
113
|
- 已确认粒度、依赖和 HITL/AFK 标记
|
|
114
|
+
- 涉及 schema 变更时 §2.5 数据库表已填写
|
|
115
|
+
- §5.5 关键决策已汇总跨切片技术选型
|
|
105
116
|
- §8 验证总览存在(静态 → 残留扫描 → 冒烟,按适用项)
|
|
106
117
|
- `slices.md` 无残留 `[TODO:]`
|
|
107
118
|
|
|
@@ -49,14 +49,15 @@
|
|
|
49
49
|
## `slices.md` 结构规范
|
|
50
50
|
|
|
51
51
|
`issues-slices-template.md` 提供模板骨架;AI 填写时按下述结构展开。`[必填]` 段每份都要,`[条件]` 段有则填、单文件小改可省。
|
|
52
|
-
> 最小形态(单文件小改):§0(简) + §1 + §3(单切片) + §5 + §8。复杂 change
|
|
52
|
+
> 最小形态(单文件小改):§0(简) + §1 + §3(单切片) + §5 + §8。复杂 change:全段铺开(含 §2.5 数据库表、§5.5 关键决策、切片内文件表和实现要点)。
|
|
53
53
|
|
|
54
54
|
### 0. 战略与背景(Context)—— [必填]
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
本段是整份切片计划的决策锚点,含五块:
|
|
57
57
|
|
|
58
58
|
- **一句话战略**:单句概括「做什么 + 为什么 + 怎么做到(以现有系统为基底 / 新建 / 复用)」。
|
|
59
59
|
- **已确认决策**:逐条列出与用户拍板的范围/取舍决策,防止下游重新扯皮。**有 `decision-log.md` 则继承其「已确认决策」段;独立进入(无上游)时在此自采集**。
|
|
60
|
+
- **当前现状**:逐条列出与需求不符的现有实现、缺失的能力或待修复的问题。每条含:`文件路径:行号范围` + 当前值/行为 + 为什么不满足需求。独立进入时从代码库探索采集;有上游 PRD 或 diagnosis 则继承其发现。格式示例:`RegexConstants.PASSWORD` 为正则 `^(?=.*[a-z])...`(要求四类全含)——与需求「至少三类」不符。
|
|
60
61
|
- **关键核实结论**:探索阶段确认的事实(依赖关系、唯一调用点、可删/须留边界等)。**必须显式写明「行号为近似、实施时以现场代码为准」**,避免下游照搬过期行号。
|
|
61
62
|
- **预期产出**:1–2 句描述本 change 完成后的可观察结果。
|
|
62
63
|
|
|
@@ -79,6 +80,21 @@
|
|
|
79
80
|
|
|
80
81
|
单文件修复或热点 patch 可省略本节。
|
|
81
82
|
|
|
83
|
+
### 2.5. 涉及的数据库表 —— [条件]
|
|
84
|
+
|
|
85
|
+
若 change 涉及数据库 schema 变更(新建表、新增字段、字段语义调整),用三列表格记录:
|
|
86
|
+
|
|
87
|
+
| 表 | 变更 |
|
|
88
|
+
|----|------|
|
|
89
|
+
|
|
90
|
+
变更描述规则:
|
|
91
|
+
- **新建**表:列出全部字段名 + 类型 + PRIMARY KEY + UNIQUE KEY + INDEX,注明建表 DDL 追加到哪个 sql 文件末尾
|
|
92
|
+
- **新增**字段:`字段名 类型 DEFAULT 默认值 COMMENT '注释'`,注明 ALTER TABLE 追加到哪个 sql 文件末尾
|
|
93
|
+
- **字段语义调整**:`旧字段名 → 新语义`(不变更数据库结构,仅改代码层注释/映射)
|
|
94
|
+
- **无结构变更**:纯逻辑变更(如增加唯一性校验)不产生 DDL,在此注明即可
|
|
95
|
+
|
|
96
|
+
> SQL 追加原则:所有 DDL 变更追加到对应 sql 文件末尾,遵循只追加不修改原则。
|
|
97
|
+
|
|
82
98
|
### 3. 切片(slices)—— [必填]
|
|
83
99
|
|
|
84
100
|
每个切片是**一个从数据到 UI 的端到端闭环**(窄而完整)。切片按依赖顺序排列;每个切片包含:
|
|
@@ -90,9 +106,12 @@
|
|
|
90
106
|
- **类型:** `AFK` | `HITL`
|
|
91
107
|
- **阻塞于:** 切片 M(或「无」)
|
|
92
108
|
- **覆盖:** PRD 章节 / US 编号 / 用户故事简述
|
|
109
|
+
- **需阅读的文件:** 实现本切片前需理解的现有代码(| 文件 | 目的 | 表);单文件小改可省略
|
|
93
110
|
- **交付物:** 该切片产出的具体文件/模块/功能清单
|
|
111
|
+
- **需修改的文件:** 本切片要改动的文件(| 文件 | 改动内容 | 表);新增文件标 **新增**,重度重构标 **重度重构**
|
|
94
112
|
- **保留/不动:** 本切片**不能碰**的代码/契约/数据(如冻结常量、共享依赖、邻近功能);无则写「无」
|
|
95
113
|
- **复用:** 复用哪些现有能力(模块/文件/命令)
|
|
114
|
+
- **实现要点:** 关键技术决策、算法细节、并发控制、兜底策略(编号列表);单文件小改可省略
|
|
96
115
|
- **验收切片:** 一个可独立执行的验证命令或手动检查步骤,证明本切片完成;**删除型切片须含残留扫描**(如 `grep -rn "<符号>" <范围>` 应 0 命中)
|
|
97
116
|
- **对齐:** PRD FR-xxx 或 issue 引用
|
|
98
117
|
- **ADR 引用:** (可选)关联的工程层 ADR 编号
|
|
@@ -100,7 +119,8 @@
|
|
|
100
119
|
|
|
101
120
|
- `<phase id="...">` 是稳定的阶段标识(如 `phase0-node-base`、`phase1-templates`),供 `dev/03` TDD 工作流引用。单阶段 change 用 `phase0-<slug>`。
|
|
102
121
|
- `status` 枚举:`未开始`(切片创建时) → `已实现`(TDD finish 置入) → `已验证`(finalize 置入)。状态只前进不回退。
|
|
103
|
-
-
|
|
122
|
+
- **需阅读/需修改的文件表**:借鉴高质量 plan 的双表模式——读文件表让执行者知道上下文边界,改文件表让执行者知道改动面和操作类型(新增/修改/重构)。单文件小改的切片可省略读文件表。
|
|
123
|
+
- **实现要点**:每个切片列出 3-7 条关键技术点,让执行者拿到切片就知道怎么下手。包含算法细节、并发控制、兼容/兜底策略等。
|
|
104
124
|
|
|
105
125
|
### 4. 横切关注点与铁律(贯穿所有切片)—— [必填]
|
|
106
126
|
|
|
@@ -155,15 +175,17 @@ change 级验证 roll-up,补足每切片「验收切片」的整体闭环(
|
|
|
155
175
|
## 填写引导
|
|
156
176
|
|
|
157
177
|
1. 遵循 `I-to-issues.md` 的内置切片指引与「切片计划质量准则」,以及本文件的结构规范。
|
|
158
|
-
2. **写 Context(§0)**:提炼一句话战略;**采集或继承已确认决策**(有 `decision-log.md`
|
|
178
|
+
2. **写 Context(§0)**:提炼一句话战略;**采集或继承已确认决策**(有 `decision-log.md` 则继承);**梳理当前现状**(逐条记录与需求不符的现有实现,精确到文件路径+行号);**记录关键核实结论**(写明行号为近似、现场核对);点明预期产出。未决分支按「存疑时的提问协议」逐一锁定。
|
|
159
179
|
3. **采集范围**:从 PRD / decision-log / diagnosis / 用户指令中提取 IN/REUSE/OUT 三列、架构上下文和 ADR 引用;不确定的标记 `[待确认]`。
|
|
160
|
-
4.
|
|
161
|
-
5.
|
|
162
|
-
6.
|
|
163
|
-
7.
|
|
164
|
-
8.
|
|
165
|
-
9.
|
|
166
|
-
10.
|
|
180
|
+
4. **记录数据库变更(§2.5)**:涉及 schema 变更时,用「涉及的数据库表」表记录每张表的变更(新建/新增字段/语义调整),DDL 注明 sql 文件和追加位置。
|
|
181
|
+
5. **切分垂直切片(§3)**:优先窄而完整、优先 AFK;每个切片必须写明**需阅读的文件**(\| 文件 \| 目的 \|)、**需修改的文件**(\| 文件 \| 改动内容 \|,新增标 **新增**,重构标 **重度重构**)、**实现要点**(编号列表)、用户可独立验证的「验收切片」,并标注**保留/不动**;删除型切片在验收里配残留扫描。
|
|
182
|
+
6. **标注 phase id**:为每个切片生成稳定的 `<phase id="...">` 标识(kebab-case),供 TDD 阶段直接引用。
|
|
183
|
+
7. **填条件段**:涉及删除 / 迁移 / 外部副作用时补 §6 风险与回滚、§7 退役清单;多模块时补 §2 架构上下文。
|
|
184
|
+
8. **汇总关键决策(§5.5)**:将跨切片的技术选型与取舍写入「关键决策」段(方案选择、字段复用/新建决策、SQL 追加规则等),防止下游反复争论。
|
|
185
|
+
9. **收口验证(§8)**:列出静态 / 测试 / 残留扫描 / E2E / 迁移的整体验证项。
|
|
186
|
+
10. 用编号列表向用户确认粒度、依赖、HITL/AFK 标记、phase id 和是否需要发布外部 issue。
|
|
187
|
+
11. 按依赖顺序记录切片;发布外部 issue 时也按依赖顺序发布。
|
|
188
|
+
12. 迭代直到用户批准分解;未批准前不发布外部 issue。
|
|
167
189
|
|
|
168
190
|
## 边界
|
|
169
191
|
|
|
@@ -176,10 +198,12 @@ change 级验证 roll-up,补足每切片「验收切片」的整体闭环(
|
|
|
176
198
|
## 完成准则
|
|
177
199
|
|
|
178
200
|
- `slices.md` 无残留 `[TODO:]`
|
|
179
|
-
- §0
|
|
201
|
+
- §0 战略与背景含已确认决策、**当前现状**与关键核实结论(独立进入时自采集,有上游则继承)
|
|
180
202
|
- 存疑点已按「存疑时的提问协议」逐一与用户锁定,或显式标记 `[待确认]`
|
|
181
|
-
- 每个切片都有 `<phase id="...">`
|
|
203
|
+
- 每个切片都有 `<phase id="...">` 标识、类型、依赖、覆盖来源、**需阅读/需修改文件表**、**实现要点**、验收切片;删除型切片标注保留/不动且验收含残留扫描
|
|
182
204
|
- IN/REUSE/OUT 表格完整(无法确定时标 `[待确认]` 并已获用户补充)
|
|
205
|
+
- 涉及 schema 变更时 §2.5 数据库表已填写(表名、变更类型、DDL 位置)
|
|
206
|
+
- §5.5 关键决策已汇总跨切片技术选型与取舍
|
|
183
207
|
- §8 验证总览存在(静态 / 残留扫描 / 冒烟按适用项填)
|
|
184
|
-
- 适用时已填条件段(§2 架构 / §6 风险 / §7 退役)
|
|
208
|
+
- 适用时已填条件段(§2 架构 / §2.5 数据库表 / §5.5 关键决策 / §6 风险 / §7 退役)
|
|
185
209
|
- `.status.json` 已记录 `slice_count`、`hitl_slice_count` 和 `issue_tracker_mode`
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
> **服务工作流:** `../I-to-issues/I-to-issues.md`
|
|
2
2
|
> **产物文件名:** `slices.md`
|
|
3
3
|
> **父目录规则:** 本模板产物写入 `YYYY-MM-DD-<kebab-name>/` change 目录内
|
|
4
|
+
> **填写纪律:** 本模板遵循六段高质量 plan 纪律——当前现状 → 需读文件 → 需改文件 → 数据库表 → 实现要点 → 关键决策;标「条件段」的小节按需填写,单文件小改的最小形态为 §0(简) + §1 + §3(单切片) + §5 + §8。
|
|
4
5
|
|
|
5
6
|
# 切片计划(Vertical Slices)
|
|
6
7
|
|
|
7
|
-
> 本文件是一份可被下游直接接手的切片计划:以厚 Context(已确认决策 + 关键核实结论)开篇,
|
|
8
|
-
>
|
|
8
|
+
> 本文件是一份可被下游直接接手的切片计划:以厚 Context(已确认决策 + 当前现状 + 关键核实结论)开篇,
|
|
9
|
+
> 按依赖排序的切片展开,每切片标注需读/需改文件、实现要点与保留/不动,并以分层验证收口。
|
|
9
10
|
> 每个切片有 `<phase id="...">` 标识,供 TDD 工作流直接引用。
|
|
10
11
|
> 标「条件段」的小节按需填写;单文件小改的最小形态为 §0(简) + §1 + §3(单切片) + §5 + §8。
|
|
11
12
|
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
|
|
14
15
|
- **一句话战略:** [TODO: 做什么 + 为什么 + 怎么做到(新建 / 复用 / 以现有系统为基底)。]
|
|
15
16
|
- **已确认决策:** [TODO: 逐条列出与用户拍板的范围/取舍决策;有 decision-log.md 则继承其「已确认决策」段。]
|
|
17
|
+
- **当前现状:** [TODO: 逐条列出与需求不符的现有实现——文件路径:行号 + 当前值/行为 + 为什么不满足需求;独立进入时从代码库探索采集。]
|
|
16
18
|
- **关键核实结论:** [TODO: 探索确认的事实(依赖 / 唯一调用点 / 可删须留边界)。注明:行号为近似,实施时以现场代码为准。]
|
|
17
19
|
- **预期产出:** [TODO: 1–2 句,本 change 完成后的可观察结果。]
|
|
18
20
|
|
|
@@ -26,6 +28,13 @@
|
|
|
26
28
|
## 2. 架构上下文
|
|
27
29
|
[TODO: 条件段——涉及的模块与职责分工、新增模块定位、不可逾越约束;可附 ASCII 分层图与依赖方向。单文件修复可删除本节。]
|
|
28
30
|
|
|
31
|
+
## 2.5. 涉及的数据库表
|
|
32
|
+
[TODO: 条件段——若涉及 schema 变更,用 | 表 | 变更 | 表记录:
|
|
33
|
+
- 新建表:列出全部字段 + PK + UK + INDEX,注明 DDL 追加到哪个 sql 文件末尾
|
|
34
|
+
- 新增字段:字段名 类型 DEFAULT 默认值 COMMENT '注释',注明 ALTER TABLE 追加位置
|
|
35
|
+
- 字段语义调整:旧字段名 → 新语义(不变更结构)
|
|
36
|
+
- 无 schema 变更则删除本节]
|
|
37
|
+
|
|
29
38
|
## 3. 切片
|
|
30
39
|
|
|
31
40
|
### 切片 1 · [切片名称]
|
|
@@ -34,9 +43,12 @@
|
|
|
34
43
|
- **类型:** AFK | HITL
|
|
35
44
|
- **阻塞于:** 无
|
|
36
45
|
- **覆盖:** [TODO: PRD 章节 / US 编号 / 用户故事]
|
|
46
|
+
- **需阅读的文件:** [TODO: | 文件 | 目的 |;单文件小改可省略]
|
|
37
47
|
- **交付物:** [TODO: 具体文件/模块/功能;改动面宽时可用 | 文件 | 改动 | 表逐文件列出]
|
|
48
|
+
- **需修改的文件:** [TODO: | 文件 | 改动内容 |;新增文件标 **新增**,重度重构标 **重度重构**]
|
|
38
49
|
- **保留/不动:** [TODO: 本切片不能碰的代码/契约/数据;无则写「无」]
|
|
39
50
|
- **复用:** [TODO: 复用哪些现有能力]
|
|
51
|
+
- **实现要点:** [TODO: 关键技术决策、算法细节、并发控制、兜底策略(编号列表);单文件小改可省略]
|
|
40
52
|
- **验收切片:** [TODO: 可独立执行的验证命令或步骤;删除型须含残留扫描 grep 0 命中]
|
|
41
53
|
- **对齐:** [TODO: PRD FR-xxx 或 issue 引用]
|
|
42
54
|
- **ADR 引用:** [TODO: 关联的 ADR 编号,可选]
|
|
@@ -47,9 +59,12 @@
|
|
|
47
59
|
- **类型:** AFK | HITL
|
|
48
60
|
- **阻塞于:** 切片 1
|
|
49
61
|
- **覆盖:** [TODO]
|
|
62
|
+
- **需阅读的文件:** [TODO: | 文件 | 目的 |;单文件小改可省略]
|
|
50
63
|
- **交付物:** [TODO]
|
|
64
|
+
- **需修改的文件:** [TODO: | 文件 | 改动内容 |]
|
|
51
65
|
- **保留/不动:** [TODO]
|
|
52
66
|
- **复用:** [TODO]
|
|
67
|
+
- **实现要点:** [TODO]
|
|
53
68
|
- **验收切片:** [TODO]
|
|
54
69
|
- **对齐:** [TODO]
|
|
55
70
|
- **ADR 引用:** [TODO]
|
|
@@ -67,6 +82,9 @@ P1 phase1-xxx 切片名称 依赖 P0
|
|
|
67
82
|
]
|
|
68
83
|
```
|
|
69
84
|
|
|
85
|
+
## 5.5. 关键决策
|
|
86
|
+
[TODO: 汇总影响全局或跨切片的技术选型与取舍,如方案选择(工具类 vs 正则)、字段复用/新建决策、SQL 追加规则等。防止下游对同一问题反复争论。单文件小改可删除本节。]
|
|
87
|
+
|
|
70
88
|
## 6. 风险与回滚
|
|
71
89
|
[TODO: 条件段——本期涉及删除/数据迁移/外部副作用/高耦合时填:风险 / 触发条件 / 缓解 / 回滚 表;有 prd-overview.md 风险则继承细化。纯增量小改可删除本节。]
|
|
72
90
|
|