@shawnstack/quickforge 1.3.27 → 1.3.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +354 -354
- package/dist/assets/{anthropic-DJTV-dnq.js → anthropic-Bi2whCo9.js} +1 -1
- package/dist/assets/{azure-openai-responses-CCJClmNX.js → azure-openai-responses-BIluwauz.js} +1 -1
- package/dist/assets/{google-Cau7vHGt.js → google-DzMAdtX7.js} +1 -1
- package/dist/assets/{google-vertex-DwCQKpDY.js → google-vertex-BPMvmXyu.js} +1 -1
- package/dist/assets/{index-ZYbEKGUp.css → index-CcvNhwdQ.css} +1 -1
- package/dist/assets/{index-DIs9hx5A.js → index-CnT_4xVs.js} +493 -493
- package/dist/assets/{mistral-DYAFidD9.js → mistral-C3NYr8yr.js} +1 -1
- package/dist/assets/{openai-codex-responses-BwU_Avcw.js → openai-codex-responses-jn0IUTnv.js} +1 -1
- package/dist/assets/{openai-completions-CW4kmlJy.js → openai-completions-d4aAZ4cH.js} +1 -1
- package/dist/assets/{openai-responses-CT0RpWUY.js → openai-responses-D5wQx0VD.js} +1 -1
- package/dist/assets/{openai-responses-shared-UHpnxWyD.js → openai-responses-shared-DkIGPnog.js} +1 -1
- package/dist/assets/{openrouter-DGwH0jvf.js → openrouter-DslZMI-g.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/plugins/openai-documents/commands/document.md +14 -0
- package/plugins/openai-documents/plugin.json +20 -0
- package/plugins/openai-documents/skills/documents/SKILL.md +96 -0
- package/plugins/openai-presentations/commands/presentation.md +14 -0
- package/plugins/openai-presentations/plugin.json +20 -0
- package/plugins/openai-presentations/skills/presentations/SKILL.md +111 -0
- package/plugins/openai-spreadsheets/commands/spreadsheet.md +14 -0
- package/plugins/openai-spreadsheets/plugin.json +20 -0
- package/plugins/openai-spreadsheets/skills/spreadsheets/SKILL.md +124 -0
- package/server/skills.mjs +21 -6
- package/server/tools/index.mjs +2 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openai-spreadsheets",
|
|
3
|
+
"displayName": "OpenAI Spreadsheets",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Spreadsheet planning, analysis, modeling, table design, chart specification, and workbook review workflows for QuickForge agents.",
|
|
6
|
+
"apiVersion": 1,
|
|
7
|
+
"quickforgeVersion": ">=1.3.25",
|
|
8
|
+
"enabledByDefault": true,
|
|
9
|
+
"contributes": {
|
|
10
|
+
"skills": "skills",
|
|
11
|
+
"commands": "commands"
|
|
12
|
+
},
|
|
13
|
+
"permissions": {
|
|
14
|
+
"filesystem": ["read", "workspace-write"],
|
|
15
|
+
"shell": "approval-required",
|
|
16
|
+
"network": "disabled",
|
|
17
|
+
"secrets": "no-secrets",
|
|
18
|
+
"git": ["read"]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spreadsheets
|
|
3
|
+
description: Use this skill when the user asks to create, edit, analyze, model, review, visualize, or structure spreadsheet workbooks such as XLSX-oriented files, CSV/TSV tables, trackers, dashboards, financial models, formulas, charts, or data-analysis sheets.
|
|
4
|
+
metadata:
|
|
5
|
+
displayName: Spreadsheets
|
|
6
|
+
version: 0.1.0
|
|
7
|
+
tags:
|
|
8
|
+
- spreadsheets
|
|
9
|
+
- xlsx
|
|
10
|
+
- csv
|
|
11
|
+
- dashboards
|
|
12
|
+
- analysis
|
|
13
|
+
- formulas
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Spreadsheets skill
|
|
17
|
+
|
|
18
|
+
Use this skill to create or improve spreadsheet-oriented deliverables. A good spreadsheet is organized, auditable, readable, and fit for the user's purpose. For analysis-heavy tasks, correctness matters as much as formatting.
|
|
19
|
+
|
|
20
|
+
This QuickForge adaptation intentionally does **not** depend on Codex cache paths, Codex workspace dependencies, or `@oai/artifact-tool`. Prefer spreadsheet plans, CSV/TSV outputs, formulas, workbook specs, or Markdown tables first. If the user explicitly needs XLSX generation or editing, explain the available local workflow and ask before using shell commands or external tools.
|
|
21
|
+
|
|
22
|
+
## When to use
|
|
23
|
+
|
|
24
|
+
Use this skill for requests involving:
|
|
25
|
+
|
|
26
|
+
- Creating trackers, schedules, budgets, calculators, models, dashboards, reports, or tabular templates.
|
|
27
|
+
- Working with `.xlsx`, `.xls`, `.csv`, `.tsv`, or Google Sheets-targeted spreadsheet content.
|
|
28
|
+
- Designing formulas, validations, tables, pivots, charts, or workbook structure.
|
|
29
|
+
- Analyzing spreadsheet data or answering questions about provided tabular files.
|
|
30
|
+
- Reviewing or improving workbook layout, formulas, assumptions, or data quality.
|
|
31
|
+
|
|
32
|
+
## Spreadsheet principles
|
|
33
|
+
|
|
34
|
+
1. **Separate purpose, inputs, calculations, and outputs.** For non-trivial workbooks, avoid mixing everything on one sheet.
|
|
35
|
+
2. **Make assumptions visible.** Put assumptions near the top or in a dedicated sheet/section.
|
|
36
|
+
3. **Use clear labels and units.** Headers should be unambiguous.
|
|
37
|
+
4. **Prefer auditable formulas.** Explain formulas and avoid hidden magic.
|
|
38
|
+
5. **Design for maintenance.** Tables should be easy to extend.
|
|
39
|
+
6. **Validate important outputs.** Include checks for reconciliations, totals, or formula consistency when relevant.
|
|
40
|
+
7. **Use charts only when they add insight.** Every chart should have a takeaway.
|
|
41
|
+
|
|
42
|
+
## Recommended workbook structures
|
|
43
|
+
|
|
44
|
+
### Simple tracker/template
|
|
45
|
+
|
|
46
|
+
- Title and usage note.
|
|
47
|
+
- Main table with clear columns.
|
|
48
|
+
- Status or category values if useful.
|
|
49
|
+
- Summary section only if it helps.
|
|
50
|
+
|
|
51
|
+
### Analysis workbook
|
|
52
|
+
|
|
53
|
+
- Executive summary or dashboard.
|
|
54
|
+
- Source data.
|
|
55
|
+
- Assumptions.
|
|
56
|
+
- Calculations/model.
|
|
57
|
+
- Outputs/charts.
|
|
58
|
+
- Checks, if correctness depends on formulas or reconciliations.
|
|
59
|
+
|
|
60
|
+
### Financial or operations model
|
|
61
|
+
|
|
62
|
+
- Summary/dashboard.
|
|
63
|
+
- Inputs/assumptions.
|
|
64
|
+
- Historical/source data.
|
|
65
|
+
- Model/calculations.
|
|
66
|
+
- Scenarios/sensitivity.
|
|
67
|
+
- Checks.
|
|
68
|
+
|
|
69
|
+
## Recommended workflow
|
|
70
|
+
|
|
71
|
+
### New spreadsheet-oriented deliverable
|
|
72
|
+
|
|
73
|
+
1. Identify the user goal, output format, data sources, and level of rigor.
|
|
74
|
+
2. Choose workbook/sheet structure before writing formulas or tables.
|
|
75
|
+
3. Draft the table/schema/formulas/charts.
|
|
76
|
+
4. Validate calculations and edge cases.
|
|
77
|
+
5. If writing to disk, use CSV/TSV/Markdown when sufficient; ask before attempting XLSX generation.
|
|
78
|
+
|
|
79
|
+
### Editing or analyzing existing spreadsheet data
|
|
80
|
+
|
|
81
|
+
1. Read the relevant file(s) first.
|
|
82
|
+
2. Determine whether the user wants an answer, a file edit, or a new artifact.
|
|
83
|
+
3. Preserve existing formulas and patterns unless asked to refactor.
|
|
84
|
+
4. For formula changes, explain changed logic.
|
|
85
|
+
5. For data analysis, call out data quality risks and assumptions.
|
|
86
|
+
|
|
87
|
+
## Formula guidance
|
|
88
|
+
|
|
89
|
+
- Prefer formulas that are understandable to spreadsheet users.
|
|
90
|
+
- Use consistent row/column references.
|
|
91
|
+
- Document non-obvious formulas.
|
|
92
|
+
- Avoid volatile functions unless needed.
|
|
93
|
+
- For financial models, keep assumptions editable and outputs linked.
|
|
94
|
+
|
|
95
|
+
## Chart guidance
|
|
96
|
+
|
|
97
|
+
When specifying charts, include:
|
|
98
|
+
|
|
99
|
+
- Chart type.
|
|
100
|
+
- Source data range or fields.
|
|
101
|
+
- X/Y axes.
|
|
102
|
+
- Series.
|
|
103
|
+
- Main takeaway.
|
|
104
|
+
- Any annotations or formatting guidance.
|
|
105
|
+
|
|
106
|
+
Do not create charts with invented data. If data is missing, ask for it or propose placeholders.
|
|
107
|
+
|
|
108
|
+
## XLSX / Google Sheets-oriented requests
|
|
109
|
+
|
|
110
|
+
QuickForge currently provides this as a spreadsheet-planning/workflow skill, not a bundled spreadsheet runtime. For XLSX or Google Sheets deliverables:
|
|
111
|
+
|
|
112
|
+
- First create a precise workbook spec, CSV/TSV data, or formulas.
|
|
113
|
+
- If XLSX creation/editing is required, ask before running shell commands.
|
|
114
|
+
- Do not assume Excel, LibreOffice, Python libraries, Node packages, or Google APIs are available.
|
|
115
|
+
- Do not install dependencies unless the user explicitly asks and approves.
|
|
116
|
+
|
|
117
|
+
## Final response guidance
|
|
118
|
+
|
|
119
|
+
When delivering spreadsheet content inline, make it easy to copy into a sheet. When files are created or edited, include:
|
|
120
|
+
|
|
121
|
+
- The file path.
|
|
122
|
+
- The sheet/table structure.
|
|
123
|
+
- Key formulas or assumptions.
|
|
124
|
+
- Validation performed or remaining risks.
|
package/server/skills.mjs
CHANGED
|
@@ -25,6 +25,10 @@ function normalizeString(value) {
|
|
|
25
25
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
function normalizeSkillName(value) {
|
|
29
|
+
return normalizeString(value)?.toLowerCase()
|
|
30
|
+
}
|
|
31
|
+
|
|
28
32
|
function normalizeStringArray(value) {
|
|
29
33
|
if (!Array.isArray(value)) return []
|
|
30
34
|
const result = []
|
|
@@ -39,7 +43,16 @@ function normalizeStringArray(value) {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export function normalizeSkillNames(value) {
|
|
42
|
-
|
|
46
|
+
if (!Array.isArray(value)) return []
|
|
47
|
+
const result = []
|
|
48
|
+
const seen = new Set()
|
|
49
|
+
for (const item of value) {
|
|
50
|
+
const name = normalizeSkillName(item)
|
|
51
|
+
if (!name || !isValidSkillName(name) || seen.has(name)) continue
|
|
52
|
+
seen.add(name)
|
|
53
|
+
result.push(name)
|
|
54
|
+
}
|
|
55
|
+
return result
|
|
43
56
|
}
|
|
44
57
|
|
|
45
58
|
function isPathInside(root, target) {
|
|
@@ -234,10 +247,10 @@ function skillFromStandardMarkdown(rootDir, source, text) {
|
|
|
234
247
|
if (!parsed?.body) return null
|
|
235
248
|
|
|
236
249
|
const rawManifest = parseSimpleYamlMap(parsed.frontmatter)
|
|
237
|
-
const name =
|
|
250
|
+
const name = normalizeSkillName(rawManifest.name)
|
|
238
251
|
const description = normalizeString(rawManifest.description)
|
|
239
252
|
if (!name || !isValidSkillName(name)) return null
|
|
240
|
-
if (name !== path.basename(rootDir)) return null
|
|
253
|
+
if (name !== normalizeSkillName(path.basename(rootDir))) return null
|
|
241
254
|
if (!description || description.length > 1024) return null
|
|
242
255
|
|
|
243
256
|
const metadata = normalizeMetadata(rawManifest.metadata)
|
|
@@ -267,7 +280,7 @@ async function loadLegacySkillDirectory(rootDir, source) {
|
|
|
267
280
|
if (!rawManifest || typeof rawManifest !== 'object') return null
|
|
268
281
|
if (rawManifest.enabled === false) return null
|
|
269
282
|
|
|
270
|
-
const name =
|
|
283
|
+
const name = normalizeSkillName(rawManifest.name) || normalizeSkillName(path.basename(rootDir))
|
|
271
284
|
if (!isValidSkillName(name)) return null
|
|
272
285
|
|
|
273
286
|
const entry = normalizeString(rawManifest.entry) || defaultEntry
|
|
@@ -469,13 +482,15 @@ export async function listSkillSummaries() {
|
|
|
469
482
|
}
|
|
470
483
|
|
|
471
484
|
export async function findGlobalSkill(name) {
|
|
485
|
+
const skillName = normalizeSkillName(name)
|
|
472
486
|
const skills = await loadGlobalSkills()
|
|
473
|
-
return skills.find((skill) => skill.name ===
|
|
487
|
+
return skills.find((skill) => skill.name === skillName) || null
|
|
474
488
|
}
|
|
475
489
|
|
|
476
490
|
export async function findProjectSkill(name, workspaceRoot) {
|
|
491
|
+
const skillName = normalizeSkillName(name)
|
|
477
492
|
const skills = await loadProjectSkills(workspaceRoot)
|
|
478
|
-
return skills.find((skill) => skill.name ===
|
|
493
|
+
return skills.find((skill) => skill.name === skillName) || null
|
|
479
494
|
}
|
|
480
495
|
|
|
481
496
|
export async function findSkill(name) {
|
package/server/tools/index.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
loadSelectedGlobalSkills,
|
|
11
11
|
loadSelectedProjectSkills,
|
|
12
12
|
mergeSkills,
|
|
13
|
+
normalizeSkillNames,
|
|
13
14
|
readSkillResource,
|
|
14
15
|
} from '../skills.mjs'
|
|
15
16
|
import { getToolWorkspaceRoot } from '../utils/workspace.mjs'
|
|
@@ -571,7 +572,7 @@ function activeSkillsForContext(context) {
|
|
|
571
572
|
}
|
|
572
573
|
|
|
573
574
|
function activeSkillByName(context, name) {
|
|
574
|
-
const skillName =
|
|
575
|
+
const skillName = normalizeSkillNames([name])[0]
|
|
575
576
|
return activeSkillsForContext(context).find((skill) => skill.name === skillName)
|
|
576
577
|
}
|
|
577
578
|
|