@refrainai/cli 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1,482 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ filterSnapshot
4
+ } from "./chunk-XMFCXPYU.js";
5
+ import "./chunk-2H7UOFLK.js";
6
+
7
+ // src/skills/google-sheets/extract-sheet-data.ts
8
+ var EXTRACT_SHEET_DATA_SCRIPT = `
9
+ (async () => {
10
+ const MAX_ROWS = __MAX_ROWS__;
11
+ const empty = (name, tabs) => ({ sheetName: name, sheetTabs: tabs, headers: [], rows: [], totalRows: 0, totalCols: 0 });
12
+
13
+ // \u30B7\u30FC\u30C8\u540D\u306E\u53D6\u5F97
14
+ const activeTab = document.querySelector(
15
+ '.docs-sheet-tab.docs-sheet-active-tab .docs-sheet-tab-name'
16
+ );
17
+ const sheetName = activeTab ? activeTab.textContent.trim() : 'Sheet1';
18
+
19
+ // \u30B7\u30FC\u30C8\u30BF\u30D6\u4E00\u89A7
20
+ const sheetTabs = [...document.querySelectorAll('.docs-sheet-tab .docs-sheet-tab-name')]
21
+ .map(el => el.textContent.trim());
22
+
23
+ // === Primary: gridcell DOM \u62BD\u51FA ===
24
+ const cells = document.querySelectorAll('[role="gridcell"]');
25
+ if (cells.length > 0) {
26
+ const cellMap = new Map();
27
+ let maxRow = 0;
28
+ let maxCol = 0;
29
+
30
+ for (const cell of cells) {
31
+ const colIndex = cell.getAttribute('aria-colindex');
32
+ const rowIndex = cell.getAttribute('aria-rowindex');
33
+ if (!colIndex || !rowIndex) continue;
34
+
35
+ const r = parseInt(rowIndex, 10);
36
+ const c = parseInt(colIndex, 10);
37
+ const text = (cell.textContent || '').trim();
38
+
39
+ if (text || r <= 1) {
40
+ cellMap.set(r + ',' + c, text);
41
+ maxRow = Math.max(maxRow, r);
42
+ maxCol = Math.max(maxCol, c);
43
+ }
44
+ }
45
+
46
+ if (maxRow > 0 && maxCol > 0) {
47
+ const usedRows = [];
48
+ for (let r = 1; r <= Math.min(maxRow, MAX_ROWS + 1); r++) {
49
+ const row = [];
50
+ let hasContent = false;
51
+ for (let c = 1; c <= maxCol; c++) {
52
+ const val = cellMap.get(r + ',' + c) || '';
53
+ row.push(val);
54
+ if (val) hasContent = true;
55
+ }
56
+ if (hasContent || r === 1) usedRows.push(row);
57
+ }
58
+
59
+ if (usedRows.length > 0) {
60
+ const headers = usedRows[0].map((h, i) => h || ('Col' + String.fromCharCode(65 + i)));
61
+ const dataRows = usedRows.slice(1);
62
+ return {
63
+ sheetName,
64
+ sheetTabs,
65
+ headers,
66
+ rows: dataRows,
67
+ totalRows: maxRow - 1,
68
+ totalCols: maxCol,
69
+ };
70
+ }
71
+ }
72
+ }
73
+
74
+ // === Fallback: gviz API \u7D4C\u7531\u306E\u30C7\u30FC\u30BF\u53D6\u5F97 ===
75
+ const urlMatch = window.location.href.match(/\\/spreadsheets\\/d\\/([^\\/]+)/);
76
+ if (!urlMatch) return empty(sheetName, sheetTabs);
77
+
78
+ const spreadsheetId = urlMatch[1];
79
+ const gidMatch = window.location.href.match(/gid=(\\d+)/);
80
+ const gid = gidMatch ? gidMatch[1] : '0';
81
+
82
+ try {
83
+ const resp = await fetch(
84
+ 'https://docs.google.com/spreadsheets/d/' + spreadsheetId + '/gviz/tq?tqx=out:json&gid=' + gid
85
+ );
86
+ const text = await resp.text();
87
+ // \u30EC\u30B9\u30DD\u30F3\u30B9\u5F62\u5F0F: google.visualization.Query.setResponse({...})
88
+ const jsonMatch = text.match(/google\\.visualization\\.Query\\.setResponse\\(({.*})\\)/s);
89
+ if (!jsonMatch) return empty(sheetName, sheetTabs);
90
+
91
+ const data = JSON.parse(jsonMatch[1]);
92
+ const table = data.table;
93
+ if (!table || !table.cols || !table.rows) return empty(sheetName, sheetTabs);
94
+
95
+ // \u30D8\u30C3\u30C0\u30FC\u69CB\u7BC9: cols[].label \u304C\u3042\u308C\u3070\u305D\u308C\u3092\u4F7F\u7528\u3001\u306A\u3051\u308C\u3070 Col{A,B,...}
96
+ const headers = table.cols.map((col, i) =>
97
+ col.label || ('Col' + String.fromCharCode(65 + (i % 26)))
98
+ );
99
+
100
+ // \u884C\u30C7\u30FC\u30BF\u69CB\u7BC9
101
+ const allRows = table.rows.map(row =>
102
+ (row.c || []).map(cell => {
103
+ if (!cell) return '';
104
+ if (cell.f !== undefined && cell.f !== null) return String(cell.f);
105
+ if (cell.v !== undefined && cell.v !== null) return String(cell.v);
106
+ return '';
107
+ })
108
+ );
109
+
110
+ // \u7A7A\u884C\u3092\u9664\u5916 + MAX_ROWS \u5236\u9650
111
+ const dataRows = allRows
112
+ .filter(row => row.some(v => v !== ''))
113
+ .slice(0, MAX_ROWS);
114
+
115
+ return {
116
+ sheetName,
117
+ sheetTabs,
118
+ headers,
119
+ rows: dataRows,
120
+ totalRows: allRows.length,
121
+ totalCols: headers.length,
122
+ };
123
+ } catch (e) {
124
+ return empty(sheetName, sheetTabs);
125
+ }
126
+ })()
127
+ `;
128
+ var EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT = `
129
+ (async () => {
130
+ const MAX_ROWS = __MAX_ROWS__;
131
+ const QUERY = '__QUERY__';
132
+ const empty = (name, tabs) => ({ sheetName: name, sheetTabs: tabs, headers: [], rows: [], totalRows: 0, totalCols: 0, queryUsed: true });
133
+
134
+ // \u30B7\u30FC\u30C8\u540D\u306E\u53D6\u5F97
135
+ const activeTab = document.querySelector(
136
+ '.docs-sheet-tab.docs-sheet-active-tab .docs-sheet-tab-name'
137
+ );
138
+ const sheetName = activeTab ? activeTab.textContent.trim() : 'Sheet1';
139
+
140
+ // \u30B7\u30FC\u30C8\u30BF\u30D6\u4E00\u89A7
141
+ const sheetTabs = [...document.querySelectorAll('.docs-sheet-tab .docs-sheet-tab-name')]
142
+ .map(el => el.textContent.trim());
143
+
144
+ // spreadsheet ID \u3068 gid \u3092 URL \u304B\u3089\u53D6\u5F97
145
+ const urlMatch = window.location.href.match(/\\/spreadsheets\\/d\\/([^\\/]+)/);
146
+ if (!urlMatch) return empty(sheetName, sheetTabs);
147
+
148
+ const spreadsheetId = urlMatch[1];
149
+ const gidMatch = window.location.href.match(/gid=(\\d+)/);
150
+ const gid = gidMatch ? gidMatch[1] : '0';
151
+
152
+ try {
153
+ const gvizUrl = 'https://docs.google.com/spreadsheets/d/' + spreadsheetId
154
+ + '/gviz/tq?tqx=out:json&gid=' + gid
155
+ + '&tq=' + encodeURIComponent(QUERY);
156
+
157
+ const resp = await fetch(gvizUrl);
158
+ const text = await resp.text();
159
+ const jsonMatch = text.match(/google\\.visualization\\.Query\\.setResponse\\(({.*})\\)/s);
160
+ if (!jsonMatch) return empty(sheetName, sheetTabs);
161
+
162
+ const data = JSON.parse(jsonMatch[1]);
163
+ const table = data.table;
164
+ if (!table || !table.cols || !table.rows) return empty(sheetName, sheetTabs);
165
+
166
+ const headers = table.cols.map((col, i) =>
167
+ col.label || ('Col' + String.fromCharCode(65 + (i % 26)))
168
+ );
169
+
170
+ const allRows = table.rows.map(row =>
171
+ (row.c || []).map(cell => {
172
+ if (!cell) return '';
173
+ if (cell.f !== undefined && cell.f !== null) return String(cell.f);
174
+ if (cell.v !== undefined && cell.v !== null) return String(cell.v);
175
+ return '';
176
+ })
177
+ );
178
+
179
+ const dataRows = allRows
180
+ .filter(row => row.some(v => v !== ''))
181
+ .slice(0, MAX_ROWS);
182
+
183
+ return {
184
+ sheetName,
185
+ sheetTabs,
186
+ headers,
187
+ rows: dataRows,
188
+ totalRows: allRows.filter(row => row.some(v => v !== '')).length,
189
+ totalCols: headers.length,
190
+ queryUsed: true,
191
+ };
192
+ } catch (e) {
193
+ return empty(sheetName, sheetTabs);
194
+ }
195
+ })()
196
+ `;
197
+
198
+ // src/skills/google-sheets/prompts.ts
199
+ function getGoogleSheetsPrompt(locale, maxRows) {
200
+ return locale === "ja" ? getGoogleSheetsPromptJa(maxRows) : getGoogleSheetsPromptEn(maxRows);
201
+ }
202
+ function getGoogleSheetsPromptEn(maxRows) {
203
+ return `
204
+ ## Google Sheets Skill (Active)
205
+ You are working with a Google Sheets spreadsheet. The snapshot has been optimized for token efficiency:
206
+
207
+ ### Snapshot Structure
208
+ - **Spreadsheet Data** section: Cell data as a compact markdown table (up to ${maxRows} rows)
209
+ - **Page Controls** section: Toolbar buttons, menus, and sheet tabs (interactive elements only, no individual cells)
210
+
211
+ ### Data Extraction
212
+ - The spreadsheet data is **automatically available as \`extractedData\`** after each snapshot
213
+ - Use \`memory_append\` to accumulate data into a collection (the extractedData is used automatically)
214
+ - Use \`export\` to write collected data to CSV/JSON files
215
+ - For multi-sheet extraction: switch sheet tabs, observe to get new extractedData, then memory_append
216
+
217
+ ### Navigation
218
+ - Sheet tabs at the bottom allow switching between sheets \u2014 use \`click\` on the tab
219
+ - If data exceeds ${maxRows} rows, the table shows "[... N more rows not shown]". Scroll down and re-observe to get more data
220
+ - Use toolbar and menu elements from the Page Controls section for editing operations
221
+
222
+ ### CSV Download Strategy
223
+ When the goal involves downloading or exporting spreadsheet data as CSV:
224
+
225
+ 1. **Always use the data pipeline**: \`observe\` (extractedData auto-populated) \u2192 \`memory_append\` \u2192 \`export\` as CSV
226
+ 2. **Do NOT use Google Sheets' native download menu** (File > Download > CSV). The native menu triggers browser downloads that are unreliable in automated contexts. The data pipeline is faster, more reliable, and gives you full control over the output.
227
+ 3. **Step-by-step**:
228
+ - \`observe\` the spreadsheet \u2014 extractedData is automatically captured
229
+ - \`memory_append\` with a collection name (e.g. "sheet_data") \u2014 this stores the extractedData automatically. Do NOT set a \`value\` field; the skill-provided data is used.
230
+ - If multiple sheets: switch tabs \u2192 observe \u2192 memory_append for each
231
+ - \`export\` the collection as CSV to the desired file path
232
+
233
+ ### Large Spreadsheets (${maxRows}+ rows)
234
+ When the sheet has more rows than ${maxRows}, use **gviz query** (Google Visualization Query Language) to filter server-side:
235
+ - The snapshot metadata shows "\u26A0 Large sheet: use gviz query (extract action) for filtered access"
236
+ - Use \`extract\` action with a gviz fetch script to query filtered data
237
+ - Query syntax (SQL-like): \`SELECT A, B, E WHERE E = 'Pending' LIMIT 50\`
238
+ - Columns use letter labels: A, B, C, ... (matching spreadsheet columns)
239
+ - Supported: SELECT, WHERE, ORDER BY, LIMIT, OFFSET, GROUP BY, LABEL
240
+ - String comparison: \`WHERE E = 'value'\` or \`WHERE E contains 'text'\`
241
+ - Pagination: combine LIMIT + OFFSET for batch processing
242
+ - The gviz query returns structured data suitable for memory_append / export
243
+
244
+ ### Cell Editing
245
+ To edit cells in Google Sheets:
246
+
247
+ **Text/Number cells:**
248
+ 1. \`click\` the target cell
249
+ 2. \`input\` (fill) the new value
250
+ 3. \`key "Enter"\` to confirm the edit
251
+
252
+ **Dropdown/Select cells:**
253
+ 1. \`click\` the target cell to select it
254
+ 2. \`click\` the dropdown arrow that appears (or \`key "Enter"\` to open the dropdown)
255
+ 3. \`click\` the desired option from the dropdown list
256
+
257
+ **Keyboard navigation:**
258
+ - \`key "Tab"\` \u2014 move to the next cell
259
+ - \`key "Enter"\` \u2014 confirm edit and move down
260
+ - \`key "Escape"\` \u2014 cancel edit
261
+ - \`key "ArrowDown"\` / \`key "ArrowUp"\` \u2014 navigate within a dropdown or between cells
262
+
263
+ ### Batch Row Processing Pattern
264
+ For workflows that update many rows (e.g., checking each row and updating status):
265
+ 1. Use gviz WHERE filter via \`extract\` to get unprocessed rows
266
+ 2. \`memory_append\` to accumulate filtered data
267
+ 3. For each row: \`click\` the cell \u2192 \`input\`/dropdown select \u2192 \`key "Enter"\`
268
+ 4. Re-query with gviz to confirm updates
269
+
270
+ ### Important
271
+ - The cell data table is extracted context \u2014 to modify cells, use Google Sheets UI interactions (click cells, use toolbar)
272
+ - Do NOT use \`extract\` with custom scripts for basic data reading \u2014 the skill already provides structured data
273
+ - Use \`extract\` only for gviz queries on large sheets or complex transformations that need custom JavaScript
274
+ `;
275
+ }
276
+ function getGoogleSheetsPromptJa(maxRows) {
277
+ return `
278
+ ## Google Sheets \u30B9\u30AD\u30EB\uFF08\u6709\u52B9\uFF09
279
+ Google Sheets \u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u3092\u64CD\u4F5C\u3057\u3066\u3044\u307E\u3059\u3002\u30C8\u30FC\u30AF\u30F3\u52B9\u7387\u306E\u305F\u3081\u306B\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u304C\u6700\u9069\u5316\u3055\u308C\u3066\u3044\u307E\u3059:
280
+
281
+ ### \u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u69CB\u9020
282
+ - **\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u30C7\u30FC\u30BF** \u30BB\u30AF\u30B7\u30E7\u30F3: \u30BB\u30EB\u30C7\u30FC\u30BF\u304C\u30B3\u30F3\u30D1\u30AF\u30C8\u306A\u30DE\u30FC\u30AF\u30C0\u30A6\u30F3\u30C6\u30FC\u30D6\u30EB\u3067\u8868\u793A\u3055\u308C\u307E\u3059\uFF08\u6700\u5927 ${maxRows} \u884C\uFF09
283
+ - **\u30DA\u30FC\u30B8\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB** \u30BB\u30AF\u30B7\u30E7\u30F3: \u30C4\u30FC\u30EB\u30D0\u30FC\u30DC\u30BF\u30F3\u3001\u30E1\u30CB\u30E5\u30FC\u3001\u30B7\u30FC\u30C8\u30BF\u30D6\uFF08\u30A4\u30F3\u30BF\u30E9\u30AF\u30C6\u30A3\u30D6\u8981\u7D20\u306E\u307F\u3001\u500B\u5225\u30BB\u30EB\u306A\u3057\uFF09
284
+
285
+ ### \u30C7\u30FC\u30BF\u62BD\u51FA
286
+ - \u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u30C7\u30FC\u30BF\u306F\u5404\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u53D6\u5F97\u5F8C\u306B **\u81EA\u52D5\u7684\u306B \`extractedData\` \u3068\u3057\u3066\u5229\u7528\u53EF\u80FD**
287
+ - \`memory_append\` \u3067\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306B\u30C7\u30FC\u30BF\u3092\u84C4\u7A4D\uFF08extractedData \u304C\u81EA\u52D5\u7684\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\uFF09
288
+ - \`export\` \u3067\u53CE\u96C6\u3057\u305F\u30C7\u30FC\u30BF\u3092 CSV/JSON \u30D5\u30A1\u30A4\u30EB\u306B\u51FA\u529B
289
+ - \u8907\u6570\u30B7\u30FC\u30C8\u306E\u62BD\u51FA: \u30B7\u30FC\u30C8\u30BF\u30D6\u3092\u5207\u308A\u66FF\u3048 \u2192 \u89B3\u6E2C\u3057\u3066\u65B0\u3057\u3044 extractedData \u3092\u53D6\u5F97 \u2192 memory_append
290
+
291
+ ### \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3
292
+ - \u4E0B\u90E8\u306E\u30B7\u30FC\u30C8\u30BF\u30D6\u3067\u30B7\u30FC\u30C8\u3092\u5207\u308A\u66FF\u3048 \u2014 \u30BF\u30D6\u3092 \`click\` \u3057\u3066\u304F\u3060\u3055\u3044
293
+ - \u30C7\u30FC\u30BF\u304C ${maxRows} \u884C\u3092\u8D85\u3048\u308B\u5834\u5408\u3001\u30C6\u30FC\u30D6\u30EB\u306B "[... N more rows not shown]" \u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u3066\u518D\u89B3\u6E2C\u3059\u308B\u3068\u8FFD\u52A0\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3067\u304D\u307E\u3059
294
+ - \u7DE8\u96C6\u64CD\u4F5C\u306B\u306F\u30DA\u30FC\u30B8\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u30C4\u30FC\u30EB\u30D0\u30FC\u3084\u30E1\u30CB\u30E5\u30FC\u8981\u7D20\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
295
+
296
+ ### CSV \u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6226\u7565
297
+ \u30B4\u30FC\u30EB\u304C\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u30C7\u30FC\u30BF\u306E CSV \u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30FB\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306E\u5834\u5408:
298
+
299
+ 1. **\u5FC5\u305A\u30C7\u30FC\u30BF\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u3092\u4F7F\u7528**: \`observe\`\uFF08extractedData \u81EA\u52D5\u53D6\u5F97\uFF09\u2192 \`memory_append\` \u2192 \`export\` \u3067 CSV \u51FA\u529B
300
+ 2. **Google Sheets \u306E\u30CD\u30A4\u30C6\u30A3\u30D6\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30E1\u30CB\u30E5\u30FC\u306F\u4F7F\u308F\u306A\u3044\u3067\u304F\u3060\u3055\u3044**\uFF08\u30D5\u30A1\u30A4\u30EB > \u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 > CSV\uFF09\u3002\u30CD\u30A4\u30C6\u30A3\u30D6\u30E1\u30CB\u30E5\u30FC\u306F\u30D6\u30E9\u30A6\u30B6\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u767A\u751F\u3055\u305B\u3001\u81EA\u52D5\u5316\u74B0\u5883\u3067\u306F\u4E0D\u5B89\u5B9A\u3067\u3059\u3002\u30C7\u30FC\u30BF\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u65B9\u304C\u9AD8\u901F\u30FB\u9AD8\u4FE1\u983C\u6027\u3067\u3001\u51FA\u529B\u3092\u5B8C\u5168\u306B\u5236\u5FA1\u3067\u304D\u307E\u3059\u3002
301
+ 3. **\u624B\u9806**:
302
+ - \`observe\` \u3067\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u3092\u89B3\u6E2C \u2014 extractedData \u304C\u81EA\u52D5\u7684\u306B\u30AD\u30E3\u30D7\u30C1\u30E3\u3055\u308C\u307E\u3059
303
+ - \`memory_append\` \u3067\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u540D\uFF08\u4F8B: "sheet_data"\uFF09\u306B\u30C7\u30FC\u30BF\u3092\u84C4\u7A4D \u2014 extractedData \u304C\u81EA\u52D5\u7684\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\`value\` \u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u8A2D\u5B9A\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
304
+ - \u8907\u6570\u30B7\u30FC\u30C8\u306E\u5834\u5408: \u30BF\u30D6\u5207\u308A\u66FF\u3048 \u2192 observe \u2192 memory_append \u3092\u7E70\u308A\u8FD4\u3059
305
+ - \`export\` \u3067\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092 CSV \u3068\u3057\u3066\u76EE\u7684\u306E\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\u306B\u51FA\u529B
306
+
307
+ ### \u5927\u898F\u6A21\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\uFF08${maxRows} \u884C\u4EE5\u4E0A\uFF09
308
+ \u30B7\u30FC\u30C8\u306E\u884C\u6570\u304C ${maxRows} \u3092\u8D85\u3048\u308B\u5834\u5408\u3001**gviz \u30AF\u30A8\u30EA**\uFF08Google Visualization Query Language\uFF09\u3067\u30B5\u30FC\u30D0\u30FC\u30B5\u30A4\u30C9\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044:
309
+ - \u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u306B\u300C\u26A0 Large sheet: use gviz query (extract action) for filtered access\u300D\u3068\u8868\u793A\u3055\u308C\u307E\u3059
310
+ - \`extract\` \u30A2\u30AF\u30B7\u30E7\u30F3\u306B gviz \u30D5\u30A7\u30C3\u30C1\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u4F7F\u7528\u3057\u3066\u30D5\u30A3\u30EB\u30BF\u6E08\u307F\u30C7\u30FC\u30BF\u3092\u53D6\u5F97
311
+ - \u30AF\u30A8\u30EA\u69CB\u6587\uFF08SQL\u98A8\uFF09: \`SELECT A, B, E WHERE E = '\u672A\u5B8C\u4E86' LIMIT 50\`
312
+ - \u5217\u306F\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u30E9\u30D9\u30EB: A, B, C, ...\uFF08\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306E\u5217\u306B\u5BFE\u5FDC\uFF09
313
+ - \u5BFE\u5FDC: SELECT, WHERE, ORDER BY, LIMIT, OFFSET, GROUP BY, LABEL
314
+ - \u6587\u5B57\u5217\u6BD4\u8F03: \`WHERE E = '\u5024'\` \u307E\u305F\u306F \`WHERE E contains '\u30C6\u30AD\u30B9\u30C8'\`
315
+ - \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3: LIMIT + OFFSET \u3092\u7D44\u307F\u5408\u308F\u305B\u3066\u30D0\u30C3\u30C1\u51E6\u7406
316
+ - gviz \u30AF\u30A8\u30EA\u306F memory_append / export \u306B\u9069\u3057\u305F\u69CB\u9020\u5316\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059
317
+
318
+ ### \u30BB\u30EB\u7DE8\u96C6
319
+ Google Sheets \u3067\u30BB\u30EB\u3092\u7DE8\u96C6\u3059\u308B\u65B9\u6CD5:
320
+
321
+ **\u30C6\u30AD\u30B9\u30C8/\u6570\u5024\u30BB\u30EB:**
322
+ 1. \u5BFE\u8C61\u30BB\u30EB\u3092 \`click\`
323
+ 2. \`input\`\uFF08fill\uFF09\u3067\u65B0\u3057\u3044\u5024\u3092\u5165\u529B
324
+ 3. \`key "Enter"\` \u3067\u7DE8\u96C6\u3092\u78BA\u5B9A
325
+
326
+ **\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3/\u30D7\u30EB\u30C0\u30A6\u30F3\u30BB\u30EB:**
327
+ 1. \u5BFE\u8C61\u30BB\u30EB\u3092 \`click\` \u3057\u3066\u9078\u629E
328
+ 2. \u8868\u793A\u3055\u308C\u308B\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u77E2\u5370\u3092 \`click\`\uFF08\u307E\u305F\u306F \`key "Enter"\` \u3067\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u3092\u958B\u304F\uFF09
329
+ 3. \u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u30EA\u30B9\u30C8\u304B\u3089\u76EE\u7684\u306E\u9078\u629E\u80A2\u3092 \`click\`
330
+
331
+ **\u30AD\u30FC\u30DC\u30FC\u30C9\u64CD\u4F5C:**
332
+ - \`key "Tab"\` \u2014 \u6B21\u306E\u30BB\u30EB\u306B\u79FB\u52D5
333
+ - \`key "Enter"\` \u2014 \u7DE8\u96C6\u3092\u78BA\u5B9A\u3057\u3066\u4E0B\u306B\u79FB\u52D5
334
+ - \`key "Escape"\` \u2014 \u7DE8\u96C6\u3092\u30AD\u30E3\u30F3\u30BB\u30EB
335
+ - \`key "ArrowDown"\` / \`key "ArrowUp"\` \u2014 \u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u5185\u306E\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u307E\u305F\u306F\u30BB\u30EB\u9593\u79FB\u52D5
336
+
337
+ ### \u884C\u30D0\u30C3\u30C1\u51E6\u7406\u30D1\u30BF\u30FC\u30F3
338
+ \u591A\u6570\u306E\u884C\u3092\u66F4\u65B0\u3059\u308B\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\uFF08\u4F8B: \u5404\u884C\u306E\u30C1\u30A7\u30C3\u30AF\u5B8C\u4E86\u5F8C\u306B\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u66F4\u65B0\uFF09:
339
+ 1. gviz WHERE \u30D5\u30A3\u30EB\u30BF\u3067 \`extract\` \u3057\u3066\u672A\u51E6\u7406\u884C\u3092\u53D6\u5F97
340
+ 2. \`memory_append\` \u3067\u30D5\u30A3\u30EB\u30BF\u6E08\u307F\u30C7\u30FC\u30BF\u3092\u84C4\u7A4D
341
+ 3. \u5404\u884C: \u30BB\u30EB\u3092 \`click\` \u2192 \`input\` \u307E\u305F\u306F\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u9078\u629E \u2192 \`key "Enter"\`
342
+ 4. gviz \u3067\u518D\u30AF\u30A8\u30EA\u3057\u3066\u66F4\u65B0\u3092\u78BA\u8A8D
343
+
344
+ ### \u91CD\u8981
345
+ - \u30BB\u30EB\u30C7\u30FC\u30BF\u30C6\u30FC\u30D6\u30EB\u306F\u62BD\u51FA\u3055\u308C\u305F\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3067\u3059 \u2014 \u30BB\u30EB\u3092\u5909\u66F4\u3059\u308B\u306B\u306F Google Sheets \u306E UI \u64CD\u4F5C\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
346
+ - \u57FA\u672C\u7684\u306A\u30C7\u30FC\u30BF\u8AAD\u307F\u53D6\u308A\u306B \`extract\` \u306E\u30AB\u30B9\u30BF\u30E0\u30B9\u30AF\u30EA\u30D7\u30C8\u306F\u4E0D\u8981\u3067\u3059 \u2014 \u30B9\u30AD\u30EB\u304C\u69CB\u9020\u5316\u30C7\u30FC\u30BF\u3092\u63D0\u4F9B\u3057\u3066\u3044\u307E\u3059
347
+ - \u5927\u898F\u6A21\u30B7\u30FC\u30C8\u306E gviz \u30AF\u30A8\u30EA\u3084\u30AB\u30B9\u30BF\u30E0 JavaScript \u304C\u5FC5\u8981\u306A\u8907\u96D1\u306A\u5909\u63DB\u306B\u306E\u307F \`extract\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
348
+ `;
349
+ }
350
+
351
+ // src/skills/google-sheets/index.ts
352
+ var SHEETS_URL_PATTERN = /docs\.google\.com\/spreadsheets/;
353
+ var DEFAULT_MAX_ROWS = 200;
354
+ function createGoogleSheetsSkill(config) {
355
+ const maxRows = config?.maxRows ?? DEFAULT_MAX_ROWS;
356
+ let screenReaderAttempted = false;
357
+ return {
358
+ name: "google-sheets",
359
+ shouldActivate(url) {
360
+ return SHEETS_URL_PATTERN.test(url);
361
+ },
362
+ shouldActivateForStep(url, stepContext) {
363
+ if (!SHEETS_URL_PATTERN.test(url)) return false;
364
+ if (stepContext.memoryOperations?.some((op) => op.type === "append" && op.source === "extractedData")) {
365
+ return true;
366
+ }
367
+ return false;
368
+ },
369
+ getPromptAugmentation(context) {
370
+ return getGoogleSheetsPrompt(context.locale, maxRows);
371
+ },
372
+ async transformSnapshot(browser, rawSnapshot, _context) {
373
+ let sheetData = await tryExtract(browser, maxRows);
374
+ if ((!sheetData || sheetData.rows.length === 0) && !screenReaderAttempted) {
375
+ screenReaderAttempted = true;
376
+ const shortcut = process.platform === "darwin" ? "Meta+Alt+z" : "Control+Alt+z";
377
+ await browser.pressKeys(shortcut);
378
+ }
379
+ if (!sheetData || !sheetData.rows || sheetData.rows.length === 0) {
380
+ return { snapshot: filterSnapshot(rawSnapshot) };
381
+ }
382
+ const tableSection = buildMarkdownTable(sheetData, maxRows);
383
+ const extractedData = buildExtractedData(sheetData, maxRows);
384
+ const filteredControls = filterSnapshotExcludingCells(rawSnapshot);
385
+ const sheetTabs = sheetData.sheetTabs;
386
+ const tabsInfo = sheetTabs && sheetTabs.length > 1 ? ` | Sheets: ${sheetTabs.join(", ")}` : "";
387
+ const largeSheetHint = sheetData.totalRows > maxRows ? ` | \u26A0 Large sheet: use gviz query (extract action) for filtered access` : "";
388
+ const meta = `[Skill: google-sheets | Sheet: "${sheetData.sheetName}" | ${sheetData.totalRows} rows x ${sheetData.totalCols} cols | Showing ${Math.min(sheetData.rows.length, maxRows)} rows${tabsInfo}${largeSheetHint}]`;
389
+ const snapshot = `${meta}
390
+
391
+ ## Spreadsheet Data
392
+ ${tableSection}
393
+
394
+ ## Page Controls
395
+ ${filteredControls}`;
396
+ return { snapshot, extractedData };
397
+ }
398
+ };
399
+ }
400
+ function buildMarkdownTable(data, maxRows) {
401
+ const { headers, rows, totalRows } = data;
402
+ const displayRows = rows.slice(0, maxRows);
403
+ const headerLine = `| ${headers.join(" | ")} |`;
404
+ const separator = `| ${headers.map(() => "---").join(" | ")} |`;
405
+ const dataLines = displayRows.map((row) => {
406
+ const cells = row.map(
407
+ (cell) => cell.length > 50 ? `${cell.slice(0, 47)}...` : cell
408
+ );
409
+ return `| ${cells.join(" | ")} |`;
410
+ });
411
+ const lines = [headerLine, separator, ...dataLines];
412
+ if (totalRows > maxRows) {
413
+ lines.push(`
414
+ [... ${totalRows - maxRows} more rows not shown]`);
415
+ }
416
+ return lines.join("\n");
417
+ }
418
+ function buildExtractedData(data, maxRows) {
419
+ const { headers, rows } = data;
420
+ const displayRows = rows.slice(0, maxRows);
421
+ const objects = displayRows.map((row) => {
422
+ const obj = {};
423
+ for (let i = 0; i < headers.length; i++) {
424
+ obj[headers[i]] = row[i] ?? "";
425
+ }
426
+ return obj;
427
+ });
428
+ return JSON.stringify(objects);
429
+ }
430
+ async function tryExtract(browser, maxRows) {
431
+ try {
432
+ const script = EXTRACT_SHEET_DATA_SCRIPT.replace("__MAX_ROWS__", String(maxRows));
433
+ const result = await browser.evaluate(script);
434
+ const data = result;
435
+ if (data && data.rows && data.rows.length > 0) return data;
436
+ return null;
437
+ } catch {
438
+ return null;
439
+ }
440
+ }
441
+ async function querySheet(browser, query, maxRows) {
442
+ try {
443
+ const script = EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT.replace("__MAX_ROWS__", String(maxRows)).replace("__QUERY__", query.replace(/\\/g, "\\\\").replace(/'/g, "\\'"));
444
+ const result = await browser.evaluate(script);
445
+ const data = result;
446
+ if (data && data.rows && data.rows.length > 0) return data;
447
+ return null;
448
+ } catch {
449
+ return null;
450
+ }
451
+ }
452
+ function buildGvizQueryScript(query, maxRows = 500) {
453
+ return EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT.replace("__MAX_ROWS__", String(maxRows)).replace("__QUERY__", query.replace(/\\/g, "\\\\").replace(/'/g, "\\'"));
454
+ }
455
+ function filterSnapshotExcludingCells(snapshot) {
456
+ const lines = snapshot.split("\n");
457
+ const cellRoles = /* @__PURE__ */ new Set([
458
+ "gridcell",
459
+ "cell",
460
+ "columnheader",
461
+ "rowheader",
462
+ "row",
463
+ "grid"
464
+ ]);
465
+ const filteredLines = lines.filter((line) => {
466
+ const trimmed = line.trimStart();
467
+ const roleMatch = trimmed.match(/^(\S+)\s/);
468
+ if (roleMatch && cellRoles.has(roleMatch[1])) {
469
+ return false;
470
+ }
471
+ return true;
472
+ });
473
+ return filterSnapshot(filteredLines.join("\n"));
474
+ }
475
+ export {
476
+ buildGvizQueryScript,
477
+ buildMarkdownTable,
478
+ createGoogleSheetsSkill,
479
+ filterSnapshotExcludingCells,
480
+ querySheet
481
+ };
482
+ //# sourceMappingURL=google-sheets-DRWIVEVC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/skills/google-sheets/extract-sheet-data.ts","../../../src/skills/google-sheets/prompts.ts","../../../src/skills/google-sheets/index.ts"],"sourcesContent":["/**\n * Google Sheets セルデータ抽出スクリプト\n *\n * ブラウザページ内で evaluate() される JavaScript。\n * accessible grid (role=\"gridcell\") の aria 属性からセルデータを構造化抽出する。\n *\n * __MAX_ROWS__ はランタイムで実際の上限値に置換される。\n */\n\nexport interface SheetData {\n sheetName: string;\n headers: string[];\n rows: string[][];\n totalRows: number;\n totalCols: number;\n /** gviz クエリが使用された場合 true */\n queryUsed?: boolean;\n}\n\n/**\n * ブラウザ内で実行する JS スクリプト。\n * __MAX_ROWS__ プレースホルダを置換してから evaluate() に渡す。\n */\nexport const EXTRACT_SHEET_DATA_SCRIPT = `\n(async () => {\n const MAX_ROWS = __MAX_ROWS__;\n const empty = (name, tabs) => ({ sheetName: name, sheetTabs: tabs, headers: [], rows: [], totalRows: 0, totalCols: 0 });\n\n // シート名の取得\n const activeTab = document.querySelector(\n '.docs-sheet-tab.docs-sheet-active-tab .docs-sheet-tab-name'\n );\n const sheetName = activeTab ? activeTab.textContent.trim() : 'Sheet1';\n\n // シートタブ一覧\n const sheetTabs = [...document.querySelectorAll('.docs-sheet-tab .docs-sheet-tab-name')]\n .map(el => el.textContent.trim());\n\n // === Primary: gridcell DOM 抽出 ===\n const cells = document.querySelectorAll('[role=\"gridcell\"]');\n if (cells.length > 0) {\n const cellMap = new Map();\n let maxRow = 0;\n let maxCol = 0;\n\n for (const cell of cells) {\n const colIndex = cell.getAttribute('aria-colindex');\n const rowIndex = cell.getAttribute('aria-rowindex');\n if (!colIndex || !rowIndex) continue;\n\n const r = parseInt(rowIndex, 10);\n const c = parseInt(colIndex, 10);\n const text = (cell.textContent || '').trim();\n\n if (text || r <= 1) {\n cellMap.set(r + ',' + c, text);\n maxRow = Math.max(maxRow, r);\n maxCol = Math.max(maxCol, c);\n }\n }\n\n if (maxRow > 0 && maxCol > 0) {\n const usedRows = [];\n for (let r = 1; r <= Math.min(maxRow, MAX_ROWS + 1); r++) {\n const row = [];\n let hasContent = false;\n for (let c = 1; c <= maxCol; c++) {\n const val = cellMap.get(r + ',' + c) || '';\n row.push(val);\n if (val) hasContent = true;\n }\n if (hasContent || r === 1) usedRows.push(row);\n }\n\n if (usedRows.length > 0) {\n const headers = usedRows[0].map((h, i) => h || ('Col' + String.fromCharCode(65 + i)));\n const dataRows = usedRows.slice(1);\n return {\n sheetName,\n sheetTabs,\n headers,\n rows: dataRows,\n totalRows: maxRow - 1,\n totalCols: maxCol,\n };\n }\n }\n }\n\n // === Fallback: gviz API 経由のデータ取得 ===\n const urlMatch = window.location.href.match(/\\\\/spreadsheets\\\\/d\\\\/([^\\\\/]+)/);\n if (!urlMatch) return empty(sheetName, sheetTabs);\n\n const spreadsheetId = urlMatch[1];\n const gidMatch = window.location.href.match(/gid=(\\\\d+)/);\n const gid = gidMatch ? gidMatch[1] : '0';\n\n try {\n const resp = await fetch(\n 'https://docs.google.com/spreadsheets/d/' + spreadsheetId + '/gviz/tq?tqx=out:json&gid=' + gid\n );\n const text = await resp.text();\n // レスポンス形式: google.visualization.Query.setResponse({...})\n const jsonMatch = text.match(/google\\\\.visualization\\\\.Query\\\\.setResponse\\\\(({.*})\\\\)/s);\n if (!jsonMatch) return empty(sheetName, sheetTabs);\n\n const data = JSON.parse(jsonMatch[1]);\n const table = data.table;\n if (!table || !table.cols || !table.rows) return empty(sheetName, sheetTabs);\n\n // ヘッダー構築: cols[].label があればそれを使用、なければ Col{A,B,...}\n const headers = table.cols.map((col, i) =>\n col.label || ('Col' + String.fromCharCode(65 + (i % 26)))\n );\n\n // 行データ構築\n const allRows = table.rows.map(row =>\n (row.c || []).map(cell => {\n if (!cell) return '';\n if (cell.f !== undefined && cell.f !== null) return String(cell.f);\n if (cell.v !== undefined && cell.v !== null) return String(cell.v);\n return '';\n })\n );\n\n // 空行を除外 + MAX_ROWS 制限\n const dataRows = allRows\n .filter(row => row.some(v => v !== ''))\n .slice(0, MAX_ROWS);\n\n return {\n sheetName,\n sheetTabs,\n headers,\n rows: dataRows,\n totalRows: allRows.length,\n totalCols: headers.length,\n };\n } catch (e) {\n return empty(sheetName, sheetTabs);\n }\n})()\n`;\n\n/**\n * gviz クエリ付きデータ抽出スクリプト。\n * __MAX_ROWS__ と __QUERY__ プレースホルダをランタイムで置換する。\n *\n * Google Visualization Query Language 対応:\n * SELECT, WHERE, ORDER BY, LIMIT, OFFSET, LABEL\n * 例: SELECT * WHERE E = '未完了' LIMIT 50\n */\nexport const EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT = `\n(async () => {\n const MAX_ROWS = __MAX_ROWS__;\n const QUERY = '__QUERY__';\n const empty = (name, tabs) => ({ sheetName: name, sheetTabs: tabs, headers: [], rows: [], totalRows: 0, totalCols: 0, queryUsed: true });\n\n // シート名の取得\n const activeTab = document.querySelector(\n '.docs-sheet-tab.docs-sheet-active-tab .docs-sheet-tab-name'\n );\n const sheetName = activeTab ? activeTab.textContent.trim() : 'Sheet1';\n\n // シートタブ一覧\n const sheetTabs = [...document.querySelectorAll('.docs-sheet-tab .docs-sheet-tab-name')]\n .map(el => el.textContent.trim());\n\n // spreadsheet ID と gid を URL から取得\n const urlMatch = window.location.href.match(/\\\\/spreadsheets\\\\/d\\\\/([^\\\\/]+)/);\n if (!urlMatch) return empty(sheetName, sheetTabs);\n\n const spreadsheetId = urlMatch[1];\n const gidMatch = window.location.href.match(/gid=(\\\\d+)/);\n const gid = gidMatch ? gidMatch[1] : '0';\n\n try {\n const gvizUrl = 'https://docs.google.com/spreadsheets/d/' + spreadsheetId\n + '/gviz/tq?tqx=out:json&gid=' + gid\n + '&tq=' + encodeURIComponent(QUERY);\n\n const resp = await fetch(gvizUrl);\n const text = await resp.text();\n const jsonMatch = text.match(/google\\\\.visualization\\\\.Query\\\\.setResponse\\\\(({.*})\\\\)/s);\n if (!jsonMatch) return empty(sheetName, sheetTabs);\n\n const data = JSON.parse(jsonMatch[1]);\n const table = data.table;\n if (!table || !table.cols || !table.rows) return empty(sheetName, sheetTabs);\n\n const headers = table.cols.map((col, i) =>\n col.label || ('Col' + String.fromCharCode(65 + (i % 26)))\n );\n\n const allRows = table.rows.map(row =>\n (row.c || []).map(cell => {\n if (!cell) return '';\n if (cell.f !== undefined && cell.f !== null) return String(cell.f);\n if (cell.v !== undefined && cell.v !== null) return String(cell.v);\n return '';\n })\n );\n\n const dataRows = allRows\n .filter(row => row.some(v => v !== ''))\n .slice(0, MAX_ROWS);\n\n return {\n sheetName,\n sheetTabs,\n headers,\n rows: dataRows,\n totalRows: allRows.filter(row => row.some(v => v !== '')).length,\n totalCols: headers.length,\n queryUsed: true,\n };\n } catch (e) {\n return empty(sheetName, sheetTabs);\n }\n})()\n`;\n","/**\n * Google Sheets スキル用ドメイン特化プロンプト (en/ja)\n */\n\nexport function getGoogleSheetsPrompt(locale: \"en\" | \"ja\", maxRows: number): string {\n return locale === \"ja\"\n ? getGoogleSheetsPromptJa(maxRows)\n : getGoogleSheetsPromptEn(maxRows);\n}\n\nfunction getGoogleSheetsPromptEn(maxRows: number): string {\n return `\n## Google Sheets Skill (Active)\nYou are working with a Google Sheets spreadsheet. The snapshot has been optimized for token efficiency:\n\n### Snapshot Structure\n- **Spreadsheet Data** section: Cell data as a compact markdown table (up to ${maxRows} rows)\n- **Page Controls** section: Toolbar buttons, menus, and sheet tabs (interactive elements only, no individual cells)\n\n### Data Extraction\n- The spreadsheet data is **automatically available as \\`extractedData\\`** after each snapshot\n- Use \\`memory_append\\` to accumulate data into a collection (the extractedData is used automatically)\n- Use \\`export\\` to write collected data to CSV/JSON files\n- For multi-sheet extraction: switch sheet tabs, observe to get new extractedData, then memory_append\n\n### Navigation\n- Sheet tabs at the bottom allow switching between sheets — use \\`click\\` on the tab\n- If data exceeds ${maxRows} rows, the table shows \"[... N more rows not shown]\". Scroll down and re-observe to get more data\n- Use toolbar and menu elements from the Page Controls section for editing operations\n\n### CSV Download Strategy\nWhen the goal involves downloading or exporting spreadsheet data as CSV:\n\n1. **Always use the data pipeline**: \\`observe\\` (extractedData auto-populated) → \\`memory_append\\` → \\`export\\` as CSV\n2. **Do NOT use Google Sheets' native download menu** (File > Download > CSV). The native menu triggers browser downloads that are unreliable in automated contexts. The data pipeline is faster, more reliable, and gives you full control over the output.\n3. **Step-by-step**:\n - \\`observe\\` the spreadsheet — extractedData is automatically captured\n - \\`memory_append\\` with a collection name (e.g. \"sheet_data\") — this stores the extractedData automatically. Do NOT set a \\`value\\` field; the skill-provided data is used.\n - If multiple sheets: switch tabs → observe → memory_append for each\n - \\`export\\` the collection as CSV to the desired file path\n\n### Large Spreadsheets (${maxRows}+ rows)\nWhen the sheet has more rows than ${maxRows}, use **gviz query** (Google Visualization Query Language) to filter server-side:\n- The snapshot metadata shows \"⚠ Large sheet: use gviz query (extract action) for filtered access\"\n- Use \\`extract\\` action with a gviz fetch script to query filtered data\n- Query syntax (SQL-like): \\`SELECT A, B, E WHERE E = 'Pending' LIMIT 50\\`\n - Columns use letter labels: A, B, C, ... (matching spreadsheet columns)\n - Supported: SELECT, WHERE, ORDER BY, LIMIT, OFFSET, GROUP BY, LABEL\n - String comparison: \\`WHERE E = 'value'\\` or \\`WHERE E contains 'text'\\`\n - Pagination: combine LIMIT + OFFSET for batch processing\n- The gviz query returns structured data suitable for memory_append / export\n\n### Cell Editing\nTo edit cells in Google Sheets:\n\n**Text/Number cells:**\n1. \\`click\\` the target cell\n2. \\`input\\` (fill) the new value\n3. \\`key \"Enter\"\\` to confirm the edit\n\n**Dropdown/Select cells:**\n1. \\`click\\` the target cell to select it\n2. \\`click\\` the dropdown arrow that appears (or \\`key \"Enter\"\\` to open the dropdown)\n3. \\`click\\` the desired option from the dropdown list\n\n**Keyboard navigation:**\n- \\`key \"Tab\"\\` — move to the next cell\n- \\`key \"Enter\"\\` — confirm edit and move down\n- \\`key \"Escape\"\\` — cancel edit\n- \\`key \"ArrowDown\"\\` / \\`key \"ArrowUp\"\\` — navigate within a dropdown or between cells\n\n### Batch Row Processing Pattern\nFor workflows that update many rows (e.g., checking each row and updating status):\n1. Use gviz WHERE filter via \\`extract\\` to get unprocessed rows\n2. \\`memory_append\\` to accumulate filtered data\n3. For each row: \\`click\\` the cell → \\`input\\`/dropdown select → \\`key \"Enter\"\\`\n4. Re-query with gviz to confirm updates\n\n### Important\n- The cell data table is extracted context — to modify cells, use Google Sheets UI interactions (click cells, use toolbar)\n- Do NOT use \\`extract\\` with custom scripts for basic data reading — the skill already provides structured data\n- Use \\`extract\\` only for gviz queries on large sheets or complex transformations that need custom JavaScript\n`;\n}\n\nfunction getGoogleSheetsPromptJa(maxRows: number): string {\n return `\n## Google Sheets スキル(有効)\nGoogle Sheets スプレッドシートを操作しています。トークン効率のためにスナップショットが最適化されています:\n\n### スナップショット構造\n- **スプレッドシートデータ** セクション: セルデータがコンパクトなマークダウンテーブルで表示されます(最大 ${maxRows} 行)\n- **ページコントロール** セクション: ツールバーボタン、メニュー、シートタブ(インタラクティブ要素のみ、個別セルなし)\n\n### データ抽出\n- スプレッドシートデータは各スナップショット取得後に **自動的に \\`extractedData\\` として利用可能**\n- \\`memory_append\\` でコレクションにデータを蓄積(extractedData が自動的に使用されます)\n- \\`export\\` で収集したデータを CSV/JSON ファイルに出力\n- 複数シートの抽出: シートタブを切り替え → 観測して新しい extractedData を取得 → memory_append\n\n### ナビゲーション\n- 下部のシートタブでシートを切り替え — タブを \\`click\\` してください\n- データが ${maxRows} 行を超える場合、テーブルに \"[... N more rows not shown]\" と表示されます。スクロールして再観測すると追加データを取得できます\n- 編集操作にはページコントロールセクションのツールバーやメニュー要素を使用してください\n\n### CSV ダウンロード戦略\nゴールがスプレッドシートデータの CSV ダウンロード・エクスポートの場合:\n\n1. **必ずデータパイプラインを使用**: \\`observe\\`(extractedData 自動取得)→ \\`memory_append\\` → \\`export\\` で CSV 出力\n2. **Google Sheets のネイティブダウンロードメニューは使わないでください**(ファイル > ダウンロード > CSV)。ネイティブメニューはブラウザダウンロードを発生させ、自動化環境では不安定です。データパイプラインの方が高速・高信頼性で、出力を完全に制御できます。\n3. **手順**:\n - \\`observe\\` でスプレッドシートを観測 — extractedData が自動的にキャプチャされます\n - \\`memory_append\\` でコレクション名(例: \"sheet_data\")にデータを蓄積 — extractedData が自動的に使用されます。\\`value\\` フィールドは設定しないでください。\n - 複数シートの場合: タブ切り替え → observe → memory_append を繰り返す\n - \\`export\\` でコレクションを CSV として目的のファイルパスに出力\n\n### 大規模スプレッドシート(${maxRows} 行以上)\nシートの行数が ${maxRows} を超える場合、**gviz クエリ**(Google Visualization Query Language)でサーバーサイドフィルタリングを使用してください:\n- スナップショットのメタデータに「⚠ Large sheet: use gviz query (extract action) for filtered access」と表示されます\n- \\`extract\\` アクションに gviz フェッチスクリプトを使用してフィルタ済みデータを取得\n- クエリ構文(SQL風): \\`SELECT A, B, E WHERE E = '未完了' LIMIT 50\\`\n - 列はアルファベットラベル: A, B, C, ...(スプレッドシートの列に対応)\n - 対応: SELECT, WHERE, ORDER BY, LIMIT, OFFSET, GROUP BY, LABEL\n - 文字列比較: \\`WHERE E = '値'\\` または \\`WHERE E contains 'テキスト'\\`\n - ページネーション: LIMIT + OFFSET を組み合わせてバッチ処理\n- gviz クエリは memory_append / export に適した構造化データを返します\n\n### セル編集\nGoogle Sheets でセルを編集する方法:\n\n**テキスト/数値セル:**\n1. 対象セルを \\`click\\`\n2. \\`input\\`(fill)で新しい値を入力\n3. \\`key \"Enter\"\\` で編集を確定\n\n**ドロップダウン/プルダウンセル:**\n1. 対象セルを \\`click\\` して選択\n2. 表示されるドロップダウン矢印を \\`click\\`(または \\`key \"Enter\"\\` でドロップダウンを開く)\n3. ドロップダウンリストから目的の選択肢を \\`click\\`\n\n**キーボード操作:**\n- \\`key \"Tab\"\\` — 次のセルに移動\n- \\`key \"Enter\"\\` — 編集を確定して下に移動\n- \\`key \"Escape\"\\` — 編集をキャンセル\n- \\`key \"ArrowDown\"\\` / \\`key \"ArrowUp\"\\` — ドロップダウン内のナビゲーションまたはセル間移動\n\n### 行バッチ処理パターン\n多数の行を更新するワークフロー(例: 各行のチェック完了後にステータスを更新):\n1. gviz WHERE フィルタで \\`extract\\` して未処理行を取得\n2. \\`memory_append\\` でフィルタ済みデータを蓄積\n3. 各行: セルを \\`click\\` → \\`input\\` またはドロップダウン選択 → \\`key \"Enter\"\\`\n4. gviz で再クエリして更新を確認\n\n### 重要\n- セルデータテーブルは抽出されたコンテキストです — セルを変更するには Google Sheets の UI 操作を使用してください\n- 基本的なデータ読み取りに \\`extract\\` のカスタムスクリプトは不要です — スキルが構造化データを提供しています\n- 大規模シートの gviz クエリやカスタム JavaScript が必要な複雑な変換にのみ \\`extract\\` を使用してください\n`;\n}\n","/**\n * Google Sheets Skill\n *\n * Google Sheets ページで a11y ツリーの大量の gridcell 要素を\n * 構造化マークダウンテーブルに変換してトークンを節約する。\n * 抽出データは extract パイプライン (memory_append / export) と統合される。\n */\n\nimport type { AgentBrowser } from \"../../browser/browser-client\";\nimport { filterSnapshot } from \"../../browser/snapshot-filter\";\nimport type { Skill, SkillConfig, SkillContext, SkillSnapshotResult, SkillStepContext } from \"../types\";\nimport { EXTRACT_SHEET_DATA_SCRIPT, EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT, type SheetData } from \"./extract-sheet-data\";\nimport { getGoogleSheetsPrompt } from \"./prompts\";\n\nconst SHEETS_URL_PATTERN = /docs\\.google\\.com\\/spreadsheets/;\nconst DEFAULT_MAX_ROWS = 200;\n\nexport function createGoogleSheetsSkill(config?: SkillConfig): Skill {\n const maxRows = config?.maxRows ?? DEFAULT_MAX_ROWS;\n let screenReaderAttempted = false;\n\n return {\n name: \"google-sheets\",\n\n shouldActivate(url: string): boolean {\n return SHEETS_URL_PATTERN.test(url);\n },\n\n shouldActivateForStep(url: string, stepContext: SkillStepContext): boolean {\n if (!SHEETS_URL_PATTERN.test(url)) return false;\n // extractedData を参照する memoryOperations がある場合のみ有効化\n if (stepContext.memoryOperations?.some(op => op.type === \"append\" && op.source === \"extractedData\")) {\n return true;\n }\n return false;\n },\n\n getPromptAugmentation(context: SkillContext): string {\n return getGoogleSheetsPrompt(context.locale, maxRows);\n },\n\n async transformSnapshot(\n browser: AgentBrowser,\n rawSnapshot: string,\n _context: SkillContext,\n ): Promise<SkillSnapshotResult> {\n // Step 1: JS 評価でセルデータを構造化抽出\n let sheetData = await tryExtract(browser, maxRows);\n\n // Step 2: 0 行かつ未試行 → スクリーンリーダーモード有効化(将来のスナップショット用)\n if ((!sheetData || sheetData.rows.length === 0) && !screenReaderAttempted) {\n screenReaderAttempted = true;\n const shortcut = process.platform === \"darwin\"\n ? \"Meta+Alt+z\" // macOS: Cmd+Option+Z\n : \"Control+Alt+z\"; // Linux/Windows: Ctrl+Alt+Z\n await browser.pressKeys(shortcut);\n // gviz fallback はスクリプト内で処理済み → ポーリング不要\n }\n\n if (!sheetData || !sheetData.rows || sheetData.rows.length === 0) {\n return { snapshot: filterSnapshot(rawSnapshot) };\n }\n\n // Step 3: マークダウンテーブル構築(表示用)\n const tableSection = buildMarkdownTable(sheetData, maxRows);\n\n // Step 4: extractedData 構築(メモリ/ファイルパイプライン用)\n const extractedData = buildExtractedData(sheetData, maxRows);\n\n // Step 5: a11y ツリーからセル要素を除去してインタラクティブ要素のみ残す\n const filteredControls = filterSnapshotExcludingCells(rawSnapshot);\n\n // Step 6: メタ情報 + テーブル + コントロールを結合\n const sheetTabs = (sheetData as SheetData & { sheetTabs?: string[] }).sheetTabs;\n const tabsInfo = sheetTabs && sheetTabs.length > 1\n ? ` | Sheets: ${sheetTabs.join(\", \")}`\n : \"\";\n const largeSheetHint = sheetData.totalRows > maxRows\n ? ` | ⚠ Large sheet: use gviz query (extract action) for filtered access`\n : \"\";\n const meta = `[Skill: google-sheets | Sheet: \"${sheetData.sheetName}\" | ${sheetData.totalRows} rows x ${sheetData.totalCols} cols | Showing ${Math.min(sheetData.rows.length, maxRows)} rows${tabsInfo}${largeSheetHint}]`;\n\n const snapshot = `${meta}\\n\\n## Spreadsheet Data\\n${tableSection}\\n\\n## Page Controls\\n${filteredControls}`;\n\n return { snapshot, extractedData };\n },\n };\n}\n\n/**\n * SheetData をマークダウンテーブルとして構築する(AI 表示用)\n */\nexport function buildMarkdownTable(data: SheetData, maxRows: number): string {\n const { headers, rows, totalRows } = data;\n const displayRows = rows.slice(0, maxRows);\n\n // ヘッダー行\n const headerLine = `| ${headers.join(\" | \")} |`;\n const separator = `| ${headers.map(() => \"---\").join(\" | \")} |`;\n\n // データ行(セル値を 50 文字で切り詰め)\n const dataLines = displayRows.map((row) => {\n const cells = row.map((cell) =>\n cell.length > 50 ? `${cell.slice(0, 47)}...` : cell,\n );\n return `| ${cells.join(\" | \")} |`;\n });\n\n const lines = [headerLine, separator, ...dataLines];\n\n if (totalRows > maxRows) {\n lines.push(`\\n[... ${totalRows - maxRows} more rows not shown]`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * SheetData を JSON 文字列に変換する(memory/file パイプライン用)\n * extract アクションの script が返す形式と同じフラットオブジェクト配列。\n */\nfunction buildExtractedData(data: SheetData, maxRows: number): string {\n const { headers, rows } = data;\n const displayRows = rows.slice(0, maxRows);\n\n const objects = displayRows.map((row) => {\n const obj: Record<string, string> = {};\n for (let i = 0; i < headers.length; i++) {\n obj[headers[i]] = row[i] ?? \"\";\n }\n return obj;\n });\n\n return JSON.stringify(objects);\n}\n\n/**\n * gridcell データの抽出を試行する。失敗時は null を返す。\n */\nasync function tryExtract(browser: AgentBrowser, maxRows: number): Promise<SheetData | null> {\n try {\n const script = EXTRACT_SHEET_DATA_SCRIPT.replace(\"__MAX_ROWS__\", String(maxRows));\n const result = await browser.evaluate(script);\n const data = result as SheetData;\n if (data && data.rows && data.rows.length > 0) return data;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * a11y スナップショットからセル関連要素を除去し、\n * ツールバー・タブ等のインタラクティブ要素のみ残す。\n */\n/**\n * gviz クエリ付きデータ抽出を実行する。\n * Google Visualization Query Language を使ってサーバーサイドでフィルタリングする。\n */\nexport async function querySheet(\n browser: AgentBrowser,\n query: string,\n maxRows: number,\n): Promise<SheetData | null> {\n try {\n const script = EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT\n .replace(\"__MAX_ROWS__\", String(maxRows))\n .replace(\"__QUERY__\", query.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\"));\n const result = await browser.evaluate(script);\n const data = result as SheetData;\n if (data && data.rows && data.rows.length > 0) return data;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * AI が extract アクションで使用する gviz クエリ実行スクリプトを生成する。\n * Google Visualization Query Language を使ったサーバーサイドフィルタリング。\n *\n * @example\n * ```\n * const script = buildGvizQueryScript(\"SELECT * WHERE E = '未完了' LIMIT 50\", 500);\n * // → extract アクションの script に渡して使用\n * ```\n */\nexport function buildGvizQueryScript(query: string, maxRows: number = 500): string {\n return EXTRACT_SHEET_DATA_WITH_QUERY_SCRIPT\n .replace(\"__MAX_ROWS__\", String(maxRows))\n .replace(\"__QUERY__\", query.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\"));\n}\n\nexport function filterSnapshotExcludingCells(snapshot: string): string {\n const lines = snapshot.split(\"\\n\");\n const cellRoles = new Set([\n \"gridcell\",\n \"cell\",\n \"columnheader\",\n \"rowheader\",\n \"row\",\n \"grid\",\n ]);\n\n // セル関連ロールの行を除去\n const filteredLines = lines.filter((line) => {\n const trimmed = line.trimStart();\n // a11y ツリーの行は \"role \"name\" [ref=eN]\" 形式\n const roleMatch = trimmed.match(/^(\\S+)\\s/);\n if (roleMatch && cellRoles.has(roleMatch[1])) {\n return false;\n }\n return true;\n });\n\n return filterSnapshot(filteredLines.join(\"\\n\"));\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createSkill,
4
+ createSkills,
5
+ initBuiltinSkills,
6
+ listSkills,
7
+ registerSkill
8
+ } from "./chunk-AG3CFMYU.js";
9
+ import "./chunk-2H7UOFLK.js";
10
+ export {
11
+ createSkill,
12
+ createSkills,
13
+ initBuiltinSkills,
14
+ listSkills,
15
+ registerSkill
16
+ };
17
+ //# sourceMappingURL=registry-LZLYTNDJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ buildFlatRunbook,
4
+ copyVersionData,
5
+ insertSteps,
6
+ loadVersionDetail
7
+ } from "./chunk-Z33FCOTZ.js";
8
+ import "./chunk-CLYJHKPY.js";
9
+ import "./chunk-2H7UOFLK.js";
10
+ export {
11
+ buildFlatRunbook,
12
+ copyVersionData,
13
+ insertSteps,
14
+ loadVersionDetail
15
+ };
16
+ //# sourceMappingURL=runbook-data-helpers-KRR2SH76.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}