@nomad-e/bluma-cli 0.1.39 → 0.1.41
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/dist/config/native_tools.json +140 -1
- package/dist/config/skills/xlsx/SKILL.md +38 -4
- package/dist/main.js +2002 -738
- package/package.json +1 -1
|
@@ -70,6 +70,122 @@
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
+
{
|
|
74
|
+
"type": "function",
|
|
75
|
+
"function": {
|
|
76
|
+
"name": "file_write",
|
|
77
|
+
"description": "Writes full file contents directly into the workspace. Use this when creating a new file or replacing an entire file body is cleaner than edit_tool. In sandbox mode this is ideal for generated outputs, configs, and artifact staging.",
|
|
78
|
+
"parameters": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"properties": {
|
|
81
|
+
"filepath": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Absolute or relative path to the file inside the current workspace."
|
|
84
|
+
},
|
|
85
|
+
"content": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "Full file content to write."
|
|
88
|
+
},
|
|
89
|
+
"overwrite": {
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"description": "Whether an existing file may be overwritten. Defaults to true.",
|
|
92
|
+
"default": true
|
|
93
|
+
},
|
|
94
|
+
"create_directories": {
|
|
95
|
+
"type": "boolean",
|
|
96
|
+
"description": "Create missing parent directories before writing. Defaults to true.",
|
|
97
|
+
"default": true
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"required": [
|
|
101
|
+
"filepath",
|
|
102
|
+
"content"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"type": "function",
|
|
109
|
+
"function": {
|
|
110
|
+
"name": "spawn_agent",
|
|
111
|
+
"description": "Spawns a background worker agent for a bounded subtask. Use this when work can run in parallel or should be delegated. The returned session_id can be used with wait_agent or list_agents.",
|
|
112
|
+
"parameters": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"properties": {
|
|
115
|
+
"task": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"description": "Concrete task for the worker agent to execute."
|
|
118
|
+
},
|
|
119
|
+
"title": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "Optional short title for the worker session."
|
|
122
|
+
},
|
|
123
|
+
"agent_type": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Optional worker role label such as worker, verifier, or planner.",
|
|
126
|
+
"default": "worker"
|
|
127
|
+
},
|
|
128
|
+
"context": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"description": "Optional structured context to pass to the worker."
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"required": [
|
|
134
|
+
"task"
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"type": "function",
|
|
141
|
+
"function": {
|
|
142
|
+
"name": "wait_agent",
|
|
143
|
+
"description": "Waits for a worker agent session to finish and returns its latest result event. Use this after spawn_agent when the next step depends on the worker output.",
|
|
144
|
+
"parameters": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"properties": {
|
|
147
|
+
"session_id": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"description": "Worker session id returned by spawn_agent."
|
|
150
|
+
},
|
|
151
|
+
"timeout_ms": {
|
|
152
|
+
"type": "integer",
|
|
153
|
+
"description": "Maximum time to wait before returning without completion.",
|
|
154
|
+
"default": 30000
|
|
155
|
+
},
|
|
156
|
+
"poll_interval_ms": {
|
|
157
|
+
"type": "integer",
|
|
158
|
+
"description": "Polling interval for checking worker completion.",
|
|
159
|
+
"default": 1000
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"required": [
|
|
163
|
+
"session_id"
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"type": "function",
|
|
170
|
+
"function": {
|
|
171
|
+
"name": "list_agents",
|
|
172
|
+
"description": "Lists known agent and worker sessions. Use this to inspect active or completed delegated work.",
|
|
173
|
+
"parameters": {
|
|
174
|
+
"type": "object",
|
|
175
|
+
"properties": {
|
|
176
|
+
"parent_session_id": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"description": "Optional parent session id to filter child workers."
|
|
179
|
+
},
|
|
180
|
+
"status": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"description": "Optional status filter such as running, completed, error, or cancelled."
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"required": []
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
},
|
|
73
189
|
{
|
|
74
190
|
"type": "function",
|
|
75
191
|
"function": {
|
|
@@ -507,6 +623,29 @@
|
|
|
507
623
|
}
|
|
508
624
|
}
|
|
509
625
|
},
|
|
626
|
+
{
|
|
627
|
+
"type": "function",
|
|
628
|
+
"function": {
|
|
629
|
+
"name": "web_fetch",
|
|
630
|
+
"description": "Fetch the contents of a remote URL and return cleaned text for analysis. Use this when you already know the exact page to inspect and want the content itself, not just search results.",
|
|
631
|
+
"parameters": {
|
|
632
|
+
"type": "object",
|
|
633
|
+
"properties": {
|
|
634
|
+
"url": {
|
|
635
|
+
"type": "string",
|
|
636
|
+
"description": "HTTP or HTTPS URL to fetch."
|
|
637
|
+
},
|
|
638
|
+
"max_chars": {
|
|
639
|
+
"type": "integer",
|
|
640
|
+
"description": "Optional response truncation limit in characters. Defaults to 12000."
|
|
641
|
+
}
|
|
642
|
+
},
|
|
643
|
+
"required": [
|
|
644
|
+
"url"
|
|
645
|
+
]
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
},
|
|
510
649
|
{
|
|
511
650
|
"type": "function",
|
|
512
651
|
"function": {
|
|
@@ -607,4 +746,4 @@
|
|
|
607
746
|
}
|
|
608
747
|
}
|
|
609
748
|
]
|
|
610
|
-
}
|
|
749
|
+
}
|
|
@@ -5,10 +5,12 @@ description: >
|
|
|
5
5
|
Triggers: open, read, edit, create, fix, or convert .xlsx, .xlsm, .csv,
|
|
6
6
|
or .tsv files — including adding columns, computing formulas, formatting,
|
|
7
7
|
charting, cleaning messy data, restructuring tabular data, or building
|
|
8
|
-
financial models.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
financial models. Prefer normal Excel formulas in cells (visible in the
|
|
9
|
+
formula bar, human-auditable), not hidden logic or pasted numeric results.
|
|
10
|
+
Also trigger when the user references a spreadsheet by name or path and
|
|
11
|
+
wants something done to it. The deliverable must be a spreadsheet file.
|
|
12
|
+
Do NOT trigger when the primary deliverable is a Word document, HTML
|
|
13
|
+
report, or standalone script.
|
|
12
14
|
license: Proprietary. LICENSE.txt has complete terms
|
|
13
15
|
---
|
|
14
16
|
|
|
@@ -20,6 +22,28 @@ license: Proprietary. LICENSE.txt has complete terms
|
|
|
20
22
|
> formula so the spreadsheet stays dynamic. Never compute in Python and
|
|
21
23
|
> paste the result into a cell.
|
|
22
24
|
|
|
25
|
+
### Human-readable formulas — everything visible in Excel
|
|
26
|
+
|
|
27
|
+
The workbook must behave like one a **human analyst** would open and audit:
|
|
28
|
+
|
|
29
|
+
- **Visible in the formula bar:** Any cell that depends on other cells MUST
|
|
30
|
+
store a real Excel formula (string starting with `=`). When the user
|
|
31
|
+
selects the cell, they see the formula — not a magic number that was
|
|
32
|
+
computed offline.
|
|
33
|
+
- **No “black box” outputs:** Do not replace formulas with static values
|
|
34
|
+
except for true inputs (assumptions, imported facts). Intermediate and
|
|
35
|
+
final calculated columns = formulas referencing cells/sheets.
|
|
36
|
+
- **Readable structure:** Prefer clear, conventional functions (`SUM`,
|
|
37
|
+
`AVERAGE`, `IF`, `SUMIF`, `XLOOKUP`/`VLOOKUP`, etc.) and broken-out
|
|
38
|
+
helper columns over one impenetrable mega-formula, when that makes the
|
|
39
|
+
model easier to follow — same as a careful human would build.
|
|
40
|
+
- **Auditable trail:** Another person should trace “this total → those
|
|
41
|
+
lines → those inputs” using only Excel (Show Formulas / following
|
|
42
|
+
references), without reading Python.
|
|
43
|
+
- **openpyxl:** Assign formulas as strings, e.g. `ws['D2'] = '=B2*C2'`, so
|
|
44
|
+
they remain formulas in the saved file. Never save a workbook opened with
|
|
45
|
+
`data_only=True` if you need formulas preserved (see Reading section).
|
|
46
|
+
|
|
23
47
|
## Output Quality Standards
|
|
24
48
|
|
|
25
49
|
### Professional Appearance
|
|
@@ -135,6 +159,16 @@ ws['B10'] = '=SUM(B2:B9)'
|
|
|
135
159
|
This applies to ALL calculations: totals, averages, percentages,
|
|
136
160
|
growth rates, ratios, conditional aggregations.
|
|
137
161
|
|
|
162
|
+
### Visibility checklist (model must self-verify)
|
|
163
|
+
|
|
164
|
+
- Opening the file in Excel/LibreOffice: calculated cells show **formulas**
|
|
165
|
+
in the formula bar, not only final numbers with no `=`.
|
|
166
|
+
- Totals, subtotals, ratios, and lookups reference **cell addresses** or
|
|
167
|
+
structured ranges — not constants copied from a script.
|
|
168
|
+
- If the user asked for “Excel they can trust,” err on the side of **more
|
|
169
|
+
rows/columns with simpler formulas** rather than fewer cells with opaque
|
|
170
|
+
nested functions.
|
|
171
|
+
|
|
138
172
|
### Common Formula Patterns
|
|
139
173
|
|
|
140
174
|
| Operation | Formula |
|