@pixerate/editor 0.223.0 → 0.223.2
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/agent/index.cjs +2 -2
- package/dist/agent/index.js +1 -1
- package/dist/{chunk-SVHXD2VH.js → chunk-H73MSHYZ.js} +5 -1
- package/dist/{chunk-BDT2IYXK.cjs → chunk-VXLYEYP4.cjs} +6 -2
- package/dist/tools/index.cjs +2 -2
- package/dist/tools/index.js +1 -1
- package/dist/tools/skill-evals.d.cts +6 -1
- package/dist/tools/skill-evals.d.ts +6 -1
- package/package.json +1 -1
- package/skills/README.md +6 -1
- package/skills/pixerate-chart/SKILL.md +8 -0
- package/skills/pixerate-chart-annotate/SKILL.md +96 -0
- package/skills/pixerate-chart-annotate/evals/highlight-the-point.json +78 -0
- package/skills/pixerate-chart-annotate/evals/source-and-units.json +76 -0
- package/skills/pixerate-chart-annotate/evals/target-line.json +85 -0
- package/skills/pixerate-chart-choose-and-build/SKILL.md +100 -0
- package/skills/pixerate-chart-choose-and-build/evals/colour-blind-safe.json +113 -0
- package/skills/pixerate-chart-choose-and-build/evals/honest-baseline.json +81 -0
- package/skills/pixerate-chart-choose-and-build/evals/trend-over-time.json +175 -0
- package/skills/pixerate-spreadsheet/SKILL.md +2 -0
- package/skills/pixerate-spreadsheet-analysis/SKILL.md +97 -0
- package/skills/pixerate-spreadsheet-analysis/evals/count-and-average.json +148 -0
- package/skills/pixerate-spreadsheet-analysis/evals/month-over-month.json +128 -0
- package/skills/pixerate-spreadsheet-analysis/evals/summary-by-region.json +178 -0
- package/skills/pixerate-spreadsheet-financial-model/SKILL.md +98 -0
- package/skills/pixerate-spreadsheet-financial-model/evals/find-hardcoded.json +113 -0
- package/skills/pixerate-spreadsheet-financial-model/evals/projection-with-inputs.json +118 -0
- package/skills/pixerate-spreadsheet-financial-model/evals/scenarios.json +136 -0
package/dist/agent/index.cjs
CHANGED
|
@@ -30,7 +30,7 @@ require('../chunk-4EFNS2HV.cjs');
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
var
|
|
33
|
+
var _chunkVXLYEYP4cjs = require('../chunk-VXLYEYP4.cjs');
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
@@ -2281,4 +2281,4 @@ function createCanvasComponentToolProvider(controller, options = { id: "canvas-c
|
|
|
2281
2281
|
|
|
2282
2282
|
|
|
2283
2283
|
|
|
2284
|
-
exports.AgentPlayback = _chunk3SLBXKAWcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkZ7BVK32Ccjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkZ7BVK32Ccjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkK7ENM55Pcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkK7ENM55Pcjs.PerformanceQueue; exports.PresenceStore = _chunkK7ENM55Pcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkZ7BVK32Ccjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkZ7BVK32Ccjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkZ7BVK32Ccjs.ToolRegistry; exports.ToolRegistryError = _chunkZ7BVK32Ccjs.ToolRegistryError; exports.ToolRegistryView = _chunkZ7BVK32Ccjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkZ7BVK32Ccjs.baseToolName; exports.callEvalTool =
|
|
2284
|
+
exports.AgentPlayback = _chunk3SLBXKAWcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkZ7BVK32Ccjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkZ7BVK32Ccjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkK7ENM55Pcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkK7ENM55Pcjs.PerformanceQueue; exports.PresenceStore = _chunkK7ENM55Pcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkZ7BVK32Ccjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkZ7BVK32Ccjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkZ7BVK32Ccjs.ToolRegistry; exports.ToolRegistryError = _chunkZ7BVK32Ccjs.ToolRegistryError; exports.ToolRegistryView = _chunkZ7BVK32Ccjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkZ7BVK32Ccjs.baseToolName; exports.callEvalTool = _chunkVXLYEYP4cjs.callEvalTool; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkZ7BVK32Ccjs.connectToolBridge; exports.createAgentPlayback = _chunk3SLBXKAWcjs.createAgentPlayback; exports.createCanvasComponentToolProvider = createCanvasComponentToolProvider; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createDocumentChartTools = createDocumentChartTools; exports.createEditorMcpToolProvider = createEditorMcpToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkK7ENM55Pcjs.createInstantPresenceClock; exports.createMcpServer = _chunkZ7BVK32Ccjs.createMcpServer; exports.createPlaybackToolProvider = _chunk3SLBXKAWcjs.createPlaybackToolProvider; exports.createRichTextToolProvider = createRichTextToolProvider; exports.createSpreadsheetToolProvider = createSpreadsheetToolProvider; exports.createStyleResolver = _chunkVXLYEYP4cjs.createStyleResolver; exports.createStyleToolProvider = _chunkVXLYEYP4cjs.createStyleToolProvider; exports.createToolRegistry = _chunkZ7BVK32Ccjs.createToolRegistry; exports.derivePlaybackSteps = _chunk3SLBXKAWcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkZ7BVK32Ccjs.errorResult; exports.failedEvalChecks = _chunkVXLYEYP4cjs.failedEvalChecks; exports.imageEvalFixturePixels = _chunkVXLYEYP4cjs.imageEvalFixturePixels; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkillEvals = _chunkVXLYEYP4cjs.listSkillEvals; exports.listSkills = _chunkZ7BVK32Ccjs.listSkills; exports.locatePlaybackChrome = _chunk3SLBXKAWcjs.locatePlaybackChrome; exports.matchesEvalExpectation = _chunkVXLYEYP4cjs.matchesEvalExpectation; exports.memoryStyleStore = _chunkVXLYEYP4cjs.memoryStyleStore; exports.normalizeSide = normalizeSide; exports.parseSkillFrontmatter = _chunkZ7BVK32Ccjs.parseSkillFrontmatter; exports.parseStyleDomains = _chunkVXLYEYP4cjs.parseStyleDomains; exports.planAgentCommand = planAgentCommand; exports.planCanvasPlaybackSteps = planCanvasPlaybackSteps; exports.planCanvasToolPlayback = planCanvasToolPlayback; exports.planToolCall = planToolCall; exports.playbackRectFromClient = _chunk3SLBXKAWcjs.playbackRectFromClient; exports.playbackRefsFromArgs = _chunk3SLBXKAWcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunk3SLBXKAWcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkZ7BVK32Ccjs.readSkillFile; exports.readingTime = _chunk3SLBXKAWcjs.readingTime; exports.realPresenceClock = _chunkK7ENM55Pcjs.realPresenceClock; exports.renderStyle = _chunkVXLYEYP4cjs.renderStyle; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runStyleChecks = _chunkVXLYEYP4cjs.runStyleChecks; exports.runToolScript = _chunkVXLYEYP4cjs.runToolScript; exports.searchTokens = _chunkZ7BVK32Ccjs.searchTokens; exports.searchTools = _chunkZ7BVK32Ccjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkZ7BVK32Ccjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkZ7BVK32Ccjs.toToolResult; exports.toolCallToAgentCommand = toolCallToAgentCommand; exports.toolResultError = _chunkVXLYEYP4cjs.toolResultError; exports.toolResultValue = _chunkVXLYEYP4cjs.toolResultValue; exports.toolsetInstructions = _chunkZ7BVK32Ccjs.toolsetInstructions; exports.toolsetName = _chunkZ7BVK32Ccjs.toolsetName; exports.trackPresenceDrag = _chunkK7ENM55Pcjs.trackPresenceDrag; exports.tweenPresenceCursor = _chunkK7ENM55Pcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunk3SLBXKAWcjs.unionRects; exports.unknownToolMessage = _chunkZ7BVK32Ccjs.unknownToolMessage; exports.validateAgentCommand = validateAgentCommand; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
|
package/dist/agent/index.js
CHANGED
|
@@ -100,7 +100,11 @@ function matchesEvalExpectation(actual, expected) {
|
|
|
100
100
|
return !!list && matches(list.map((row) => Array.isArray(row) ? row[index] : void 0), m);
|
|
101
101
|
}
|
|
102
102
|
case "$expr":
|
|
103
|
-
|
|
103
|
+
try {
|
|
104
|
+
return !!new Function("v", `return (${want});`)(actual);
|
|
105
|
+
} catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
104
108
|
case "$nonEmpty":
|
|
105
109
|
return !!list && matches(list.filter((a) => !isEmpty(a)), want);
|
|
106
110
|
default:
|
|
@@ -100,7 +100,11 @@ function matchesEvalExpectation(actual, expected) {
|
|
|
100
100
|
return !!list && matches(list.map((row) => Array.isArray(row) ? row[index] : void 0), m);
|
|
101
101
|
}
|
|
102
102
|
case "$expr":
|
|
103
|
-
|
|
103
|
+
try {
|
|
104
|
+
return !!new Function("v", `return (${want});`)(actual);
|
|
105
|
+
} catch (e2) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
104
108
|
case "$nonEmpty":
|
|
105
109
|
return !!list && matches(list.filter((a) => !isEmpty(a)), want);
|
|
106
110
|
default:
|
|
@@ -126,7 +130,7 @@ function toolResultValue(result) {
|
|
|
126
130
|
if (!_optionalChain([text, 'optionalAccess', _4 => _4.text])) return void 0;
|
|
127
131
|
try {
|
|
128
132
|
return JSON.parse(text.text);
|
|
129
|
-
} catch (
|
|
133
|
+
} catch (e3) {
|
|
130
134
|
return text.text;
|
|
131
135
|
}
|
|
132
136
|
}
|
package/dist/tools/index.cjs
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkVXLYEYP4cjs = require('../chunk-VXLYEYP4.cjs');
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
@@ -199,4 +199,4 @@ var _chunk2BSBFBOAcjs = require('../chunk-2BSBFBOA.cjs');
|
|
|
199
199
|
|
|
200
200
|
|
|
201
201
|
|
|
202
|
-
exports.AgentPlayback = _chunk3SLBXKAWcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkZ7BVK32Ccjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkZ7BVK32Ccjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkK7ENM55Pcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkK7ENM55Pcjs.PerformanceQueue; exports.PresenceStore = _chunkK7ENM55Pcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkZ7BVK32Ccjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkZ7BVK32Ccjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkZ7BVK32Ccjs.ToolRegistry; exports.ToolRegistryError = _chunkZ7BVK32Ccjs.ToolRegistryError; exports.ToolRegistryView = _chunkZ7BVK32Ccjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkZ7BVK32Ccjs.baseToolName; exports.callEvalTool =
|
|
202
|
+
exports.AgentPlayback = _chunk3SLBXKAWcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkZ7BVK32Ccjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkZ7BVK32Ccjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkK7ENM55Pcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkK7ENM55Pcjs.PerformanceQueue; exports.PresenceStore = _chunkK7ENM55Pcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkZ7BVK32Ccjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkZ7BVK32Ccjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkZ7BVK32Ccjs.ToolRegistry; exports.ToolRegistryError = _chunkZ7BVK32Ccjs.ToolRegistryError; exports.ToolRegistryView = _chunkZ7BVK32Ccjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkZ7BVK32Ccjs.baseToolName; exports.callEvalTool = _chunkVXLYEYP4cjs.callEvalTool; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkZ7BVK32Ccjs.connectToolBridge; exports.createAgentPlayback = _chunk3SLBXKAWcjs.createAgentPlayback; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkK7ENM55Pcjs.createInstantPresenceClock; exports.createMcpServer = _chunkZ7BVK32Ccjs.createMcpServer; exports.createPlaybackToolProvider = _chunk3SLBXKAWcjs.createPlaybackToolProvider; exports.createStyleResolver = _chunkVXLYEYP4cjs.createStyleResolver; exports.createStyleToolProvider = _chunkVXLYEYP4cjs.createStyleToolProvider; exports.createToolRegistry = _chunkZ7BVK32Ccjs.createToolRegistry; exports.derivePlaybackSteps = _chunk3SLBXKAWcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkZ7BVK32Ccjs.errorResult; exports.failedEvalChecks = _chunkVXLYEYP4cjs.failedEvalChecks; exports.imageEvalFixturePixels = _chunkVXLYEYP4cjs.imageEvalFixturePixels; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkillEvals = _chunkVXLYEYP4cjs.listSkillEvals; exports.listSkills = _chunkZ7BVK32Ccjs.listSkills; exports.locatePlaybackChrome = _chunk3SLBXKAWcjs.locatePlaybackChrome; exports.matchesEvalExpectation = _chunkVXLYEYP4cjs.matchesEvalExpectation; exports.memoryStyleStore = _chunkVXLYEYP4cjs.memoryStyleStore; exports.parseSkillFrontmatter = _chunkZ7BVK32Ccjs.parseSkillFrontmatter; exports.parseStyleDomains = _chunkVXLYEYP4cjs.parseStyleDomains; exports.playbackRectFromClient = _chunk3SLBXKAWcjs.playbackRectFromClient; exports.playbackRefsFromArgs = _chunk3SLBXKAWcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunk3SLBXKAWcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkZ7BVK32Ccjs.readSkillFile; exports.readingTime = _chunk3SLBXKAWcjs.readingTime; exports.realPresenceClock = _chunkK7ENM55Pcjs.realPresenceClock; exports.renderStyle = _chunkVXLYEYP4cjs.renderStyle; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runStyleChecks = _chunkVXLYEYP4cjs.runStyleChecks; exports.runToolScript = _chunkVXLYEYP4cjs.runToolScript; exports.searchTokens = _chunkZ7BVK32Ccjs.searchTokens; exports.searchTools = _chunkZ7BVK32Ccjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkZ7BVK32Ccjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkZ7BVK32Ccjs.toToolResult; exports.toolResultError = _chunkVXLYEYP4cjs.toolResultError; exports.toolResultValue = _chunkVXLYEYP4cjs.toolResultValue; exports.toolsetInstructions = _chunkZ7BVK32Ccjs.toolsetInstructions; exports.toolsetName = _chunkZ7BVK32Ccjs.toolsetName; exports.trackPresenceDrag = _chunkK7ENM55Pcjs.trackPresenceDrag; exports.tweenPresenceCursor = _chunkK7ENM55Pcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunk3SLBXKAWcjs.unionRects; exports.unknownToolMessage = _chunkZ7BVK32Ccjs.unknownToolMessage; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
|
package/dist/tools/index.js
CHANGED
|
@@ -20,7 +20,7 @@ export interface SkillEvalCheck extends SkillEvalToolCall {
|
|
|
20
20
|
}
|
|
21
21
|
export interface SkillEval {
|
|
22
22
|
prompt: string;
|
|
23
|
-
fixture: SpreadsheetEvalFixture | ImageEvalFixture | VectorEvalFixture | PaintEvalFixture | VideoEvalFixture;
|
|
23
|
+
fixture: SpreadsheetEvalFixture | ImageEvalFixture | VectorEvalFixture | PaintEvalFixture | VideoEvalFixture | ChartEvalFixture;
|
|
24
24
|
checks: SkillEvalCheck[];
|
|
25
25
|
solution: SkillEvalToolCall[];
|
|
26
26
|
}
|
|
@@ -67,6 +67,11 @@ export interface VideoEvalFixture {
|
|
|
67
67
|
/** Tool calls that build the starting project (settings, assets, clips, markers), run in order. */
|
|
68
68
|
setup?: SkillEvalToolCall[];
|
|
69
69
|
}
|
|
70
|
+
export interface ChartEvalFixture {
|
|
71
|
+
editor: 'chart';
|
|
72
|
+
/** Tool calls that build the starting chart (`set_chart_data`, `update_chart`), run in order. */
|
|
73
|
+
setup?: SkillEvalToolCall[];
|
|
74
|
+
}
|
|
70
75
|
/** One eval file of a skill. */
|
|
71
76
|
export interface SkillEvalFile {
|
|
72
77
|
skill: string;
|
|
@@ -20,7 +20,7 @@ export interface SkillEvalCheck extends SkillEvalToolCall {
|
|
|
20
20
|
}
|
|
21
21
|
export interface SkillEval {
|
|
22
22
|
prompt: string;
|
|
23
|
-
fixture: SpreadsheetEvalFixture | ImageEvalFixture | VectorEvalFixture | PaintEvalFixture | VideoEvalFixture;
|
|
23
|
+
fixture: SpreadsheetEvalFixture | ImageEvalFixture | VectorEvalFixture | PaintEvalFixture | VideoEvalFixture | ChartEvalFixture;
|
|
24
24
|
checks: SkillEvalCheck[];
|
|
25
25
|
solution: SkillEvalToolCall[];
|
|
26
26
|
}
|
|
@@ -67,6 +67,11 @@ export interface VideoEvalFixture {
|
|
|
67
67
|
/** Tool calls that build the starting project (settings, assets, clips, markers), run in order. */
|
|
68
68
|
setup?: SkillEvalToolCall[];
|
|
69
69
|
}
|
|
70
|
+
export interface ChartEvalFixture {
|
|
71
|
+
editor: 'chart';
|
|
72
|
+
/** Tool calls that build the starting chart (`set_chart_data`, `update_chart`), run in order. */
|
|
73
|
+
setup?: SkillEvalToolCall[];
|
|
74
|
+
}
|
|
70
75
|
/** One eval file of a skill. */
|
|
71
76
|
export interface SkillEvalFile {
|
|
72
77
|
skill: string;
|
package/package.json
CHANGED
package/skills/README.md
CHANGED
|
@@ -53,6 +53,10 @@ request like "clean up this export" finds it.
|
|
|
53
53
|
| [`pixerate-video-social-cut`](pixerate-video-social-cut/SKILL.md) | Video (`pixerate-video-editor`) | Vertical or square reframes that fill the frame, the hook first, platform lengths, titles in the safe area. |
|
|
54
54
|
| [`pixerate-video-colour-grade`](pixerate-video-colour-grade/SKILL.md) | Video (`pixerate-video-editor`) | Correct and match shots, then one look on an adjustment clip; LUTs at moderate strength with skin protected. |
|
|
55
55
|
| [`pixerate-video-montage`](pixerate-video-montage/SKILL.md) | Video (`pixerate-video-editor`) | Selects on the beat, varied pacing, short transitions with handles, music under everything and a clean ending. |
|
|
56
|
+
| [`pixerate-chart-choose-and-build`](pixerate-chart-choose-and-build/SKILL.md) | Chart (`pixerate-chart`) | From the question to the type, clean ordered data, honest axes, units and colour-blind-safe colours. |
|
|
57
|
+
| [`pixerate-chart-annotate`](pixerate-chart-annotate/SKILL.md) | Chart (`pixerate-chart`) | A takeaway title, highlights, labelled targets and ranges, callouts and a source note, kept few. |
|
|
58
|
+
| [`pixerate-spreadsheet-analysis`](pixerate-spreadsheet-analysis/SKILL.md) | Spreadsheet (`pixerate-spreadsheet`) | Summary tables with SUMIFS, COUNTIFS and AVERAGEIFS, growth, shares and rankings as live formulas that reconcile with the data. |
|
|
59
|
+
| [`pixerate-spreadsheet-financial-model`](pixerate-spreadsheet-financial-model/SKILL.md) | Spreadsheet (`pixerate-spreadsheet`) | Inputs apart from calculations, one formula pattern per row, no hard-coded numbers, scenarios and audits. |
|
|
56
60
|
| [`pixerate-talking-head-edit`](pixerate-talking-head-edit/SKILL.md) | Video (`pixerate-video-editor`) | Talking-head cleanup by transcript: fillers, long pauses and stutters found in one pass and cut as one plan reviewed before it applies. Owns the dialogue tools. |
|
|
57
61
|
| [`pixerate-bgm-alignment`](pixerate-bgm-alignment/SKILL.md) | Video (`pixerate-video-editor`) | Background music: beats and cuts on the beat, ducking under speech, loudness in LUFS. Owns the music tools. |
|
|
58
62
|
|
|
@@ -117,7 +121,8 @@ same change.
|
|
|
117
121
|
user's words), a `fixture` (the starting document: `{ "editor": "spreadsheet", "rows" }`,
|
|
118
122
|
`{ "editor": "image", "width", "height", "background", "shapes" }` or `{ "editor":
|
|
119
123
|
"vector", "width", "height", "setup" }` with commands that draw the starting art,
|
|
120
|
-
`{ "editor": "paint", "width", "height", "setup" }`
|
|
124
|
+
`{ "editor": "paint", "width", "height", "setup" }` `{ "editor": "video", "setup" }` or `{ "editor":
|
|
125
|
+
"chart", "setup" }` with tool calls), `checks` (a read-only
|
|
121
126
|
tool, or `run_command` with a read-only command such as `vector.list`, its `args`, what its result must match in `expect`, and `why`) and a `solution` (the
|
|
122
127
|
tool calls an expert would make). The test proves each eval: some check fails on the fixture,
|
|
123
128
|
and all pass after the solution. A model harness runs the same file with the model in place
|
|
@@ -44,6 +44,14 @@ Charts inside a rich-text document are not edited with these tools: use `insert_
|
|
|
44
44
|
`list_document_charts` and `update_chart_in_document` from the `pixerate-rich-text` skill
|
|
45
45
|
(a chart block goes in the prose, never inside a table row).
|
|
46
46
|
|
|
47
|
+
## Workflow skills
|
|
48
|
+
|
|
49
|
+
For these jobs, load the workflow skill too: it has the method, the checks between steps and
|
|
50
|
+
the pitfalls, and uses the tools below.
|
|
51
|
+
|
|
52
|
+
- `pixerate-chart-choose-and-build`: the type from the question, clean data, honest axes, units, colours.
|
|
53
|
+
- `pixerate-chart-annotate`: a takeaway title, highlights, targets, ranges, callouts and the source.
|
|
54
|
+
|
|
47
55
|
## Working method
|
|
48
56
|
|
|
49
57
|
0. **House style.** When the host has one (`list_toolsets` shows a `style` field on the chart
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pixerate-chart-annotate
|
|
3
|
+
description: The annotation workflow in the Pixerate chart editor - turning a correct chart into one that makes its point - a title that states the takeaway, highlighting the categories or series that matter, reference lines for targets and averages, bands for ranges, callouts on the points that need explaining, units, a source note and a check that the annotations stay few and honest. Use when asked to make a chart tell a story, highlight or call out a point, show a target, goal, threshold, average or range, add a source or footnote, or make a chart ready for a report, slide or board pack, or when highlight_chart, add_chart_reference_line, add_chart_reference_band or set_chart_callout are available. Load with pixerate-chart, which lists every tool.
|
|
4
|
+
metadata:
|
|
5
|
+
kind: workflow
|
|
6
|
+
reference: pixerate-chart
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Annotating a chart
|
|
10
|
+
|
|
11
|
+
A chart for a report or a slide should say what it means, not leave the reader to find it. Once
|
|
12
|
+
the type and data are right (`pixerate-chart-choose-and-build`), add the few marks that point at
|
|
13
|
+
the message: a title that states it, a highlight on what matters, a reference line or band for
|
|
14
|
+
the benchmark, a callout where something needs explaining, and a source note. Fewer is better:
|
|
15
|
+
every annotation competes with the data.
|
|
16
|
+
|
|
17
|
+
This skill is the method. `pixerate-chart` has the full tool reference.
|
|
18
|
+
|
|
19
|
+
## Goal and quality bar
|
|
20
|
+
|
|
21
|
+
- The title states the takeaway ("Q3 was our record quarter"), the subtitle the measure and
|
|
22
|
+
units if the axis does not.
|
|
23
|
+
- What matters stands out (`highlight`), and everything else recedes.
|
|
24
|
+
- Benchmarks are drawn, labelled, on the right axis: a target line, an average, a normal range.
|
|
25
|
+
- At most one or two reference lines, one band and a couple of callouts.
|
|
26
|
+
- The source is cited in `note`; units are stated.
|
|
27
|
+
- The data is unchanged by annotating.
|
|
28
|
+
|
|
29
|
+
## Inputs to confirm
|
|
30
|
+
|
|
31
|
+
- **The message:** the one thing the reader should take away.
|
|
32
|
+
- **Benchmarks:** targets, averages, thresholds or ranges, with their values and units.
|
|
33
|
+
- **Source** of the data, and the audience (report, slide, dashboard).
|
|
34
|
+
|
|
35
|
+
## Working method
|
|
36
|
+
|
|
37
|
+
1. **Read.** `get_chart`: the type, categories, series, existing annotations and warnings.
|
|
38
|
+
**Check:** the chart is already the right type with clean data; if not, fix that first.
|
|
39
|
+
2. **Title the takeaway.** `update_chart` `title` with the message, `subtitle` with the measure
|
|
40
|
+
and units.
|
|
41
|
+
3. **Highlight.** `highlight_chart` with the category labels or series names that carry the
|
|
42
|
+
message; the rest dims.
|
|
43
|
+
**Check:** `get_chart` `spec.highlight`.
|
|
44
|
+
4. **Benchmarks.** `add_chart_reference_line` for a target or average (`value`, `label`, `axis`);
|
|
45
|
+
`add_chart_reference_band` for a range (`from`, `to`, `label`).
|
|
46
|
+
**Check:** `spec.referenceLines` / `referenceBands` have the values and labels.
|
|
47
|
+
5. **Callouts** for points that need a word (`set_chart_callout` on a series and category), such
|
|
48
|
+
as "Launch" or "Strike".
|
|
49
|
+
6. **Source and units.** `update_chart` `note` ("Source: …"); the axis `format` or title for
|
|
50
|
+
units.
|
|
51
|
+
7. **Review.** `render_chart`; remove any annotation that does not help the message.
|
|
52
|
+
|
|
53
|
+
## Decision table
|
|
54
|
+
|
|
55
|
+
| Want to say | Annotation |
|
|
56
|
+
| --- | --- |
|
|
57
|
+
| This one is the point | `highlight_chart` on it; title states it |
|
|
58
|
+
| Above or below a goal | `add_chart_reference_line` at the target, labelled |
|
|
59
|
+
| Inside or outside a normal range | `add_chart_reference_band`, labelled |
|
|
60
|
+
| Compared with the average | Reference line at the average, labelled "Average" |
|
|
61
|
+
| Something happened here | `set_chart_callout` on that point |
|
|
62
|
+
| Where the numbers came from | `note` |
|
|
63
|
+
| The trend, not the noise | `add_chart_trendline` (say what it models) |
|
|
64
|
+
|
|
65
|
+
## Recipes
|
|
66
|
+
|
|
67
|
+
**Record quarter.** `highlight_chart` `{ names: ["Q3"] }` → `update_chart` `{ title: "Q3 was our
|
|
68
|
+
record quarter" }`.
|
|
69
|
+
|
|
70
|
+
**Target.** `add_chart_reference_line` `{ value: 100000, label: "Target" }`.
|
|
71
|
+
|
|
72
|
+
**Board-ready.** `update_chart` `{ note: "Source: internal CRM, 2026", yAxis: { format: { style:
|
|
73
|
+
"currency", currency: "USD" } } }`.
|
|
74
|
+
|
|
75
|
+
## Pitfalls
|
|
76
|
+
|
|
77
|
+
- **Neutral titles** ("Quarterly revenue") make the reader do the work; state the finding when
|
|
78
|
+
the chart has one.
|
|
79
|
+
- **Annotation clutter**: many lines, bands and callouts hide the data.
|
|
80
|
+
- **Recolouring instead of highlighting**: changing one series' colour by hand breaks palettes
|
|
81
|
+
and colour checks; `highlight_chart` keeps them.
|
|
82
|
+
- **Unlabelled lines**: a line without a label is a puzzle.
|
|
83
|
+
- **Targets on the wrong axis**: put a reference line on the axis of the series it belongs to
|
|
84
|
+
(`axis: "y2"` for a secondary-axis series).
|
|
85
|
+
- **Claims the data does not support**: the title must be true of the chart as drawn.
|
|
86
|
+
|
|
87
|
+
## Tools used
|
|
88
|
+
|
|
89
|
+
- `get_chart`, `render_chart`: read and look
|
|
90
|
+
- `update_chart`: title, subtitle, note and axis formats
|
|
91
|
+
- `highlight_chart`: what stands out
|
|
92
|
+
- `add_chart_reference_line`, `update_chart_reference_line`, `remove_chart_reference_line`: targets and averages
|
|
93
|
+
- `add_chart_reference_band`, `update_chart_reference_band`, `remove_chart_reference_band`: ranges
|
|
94
|
+
- `set_chart_callout`: notes on points
|
|
95
|
+
- `add_chart_trendline`: a fitted trend
|
|
96
|
+
- `undo_chart`: take back a step
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prompt": "Make this chart tell the reader that Q3 was our record quarter.",
|
|
3
|
+
"fixture": {
|
|
4
|
+
"editor": "chart",
|
|
5
|
+
"setup": [
|
|
6
|
+
{
|
|
7
|
+
"tool": "set_chart_data",
|
|
8
|
+
"args": {
|
|
9
|
+
"categories": [
|
|
10
|
+
"Q1",
|
|
11
|
+
"Q2",
|
|
12
|
+
"Q3",
|
|
13
|
+
"Q4"
|
|
14
|
+
],
|
|
15
|
+
"series": [
|
|
16
|
+
{
|
|
17
|
+
"name": "Revenue",
|
|
18
|
+
"values": [
|
|
19
|
+
82000,
|
|
20
|
+
91000,
|
|
21
|
+
118000,
|
|
22
|
+
96000
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"tool": "update_chart",
|
|
30
|
+
"args": {
|
|
31
|
+
"type": "bar",
|
|
32
|
+
"title": "Quarterly revenue"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"checks": [
|
|
38
|
+
{
|
|
39
|
+
"why": "Q3 stands out",
|
|
40
|
+
"tool": "get_chart",
|
|
41
|
+
"expect": {
|
|
42
|
+
"spec": {
|
|
43
|
+
"$expr": "v.highlight.includes('Q3') || v.series.some((s) => (s.callouts || [])[2]) || v.series.some((s) => s.pointColors && s.pointColors[2] && s.pointColors.filter(Boolean).length === 1)"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"why": "the title states the takeaway",
|
|
49
|
+
"tool": "get_chart",
|
|
50
|
+
"expect": {
|
|
51
|
+
"spec": {
|
|
52
|
+
"title": {
|
|
53
|
+
"$match": [
|
|
54
|
+
"q3|third quarter",
|
|
55
|
+
"i"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"solution": [
|
|
63
|
+
{
|
|
64
|
+
"tool": "highlight_chart",
|
|
65
|
+
"args": {
|
|
66
|
+
"names": [
|
|
67
|
+
"Q3"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"tool": "update_chart",
|
|
73
|
+
"args": {
|
|
74
|
+
"title": "Q3 was our record quarter"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prompt": "Before this chart goes in the board report, add the source (internal CRM, 2026) and make the units clear.",
|
|
3
|
+
"fixture": {
|
|
4
|
+
"editor": "chart",
|
|
5
|
+
"setup": [
|
|
6
|
+
{
|
|
7
|
+
"tool": "set_chart_data",
|
|
8
|
+
"args": {
|
|
9
|
+
"categories": [
|
|
10
|
+
"Q1",
|
|
11
|
+
"Q2",
|
|
12
|
+
"Q3",
|
|
13
|
+
"Q4"
|
|
14
|
+
],
|
|
15
|
+
"series": [
|
|
16
|
+
{
|
|
17
|
+
"name": "Revenue",
|
|
18
|
+
"values": [
|
|
19
|
+
82000,
|
|
20
|
+
91000,
|
|
21
|
+
118000,
|
|
22
|
+
96000
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"tool": "update_chart",
|
|
30
|
+
"args": {
|
|
31
|
+
"type": "bar",
|
|
32
|
+
"title": "Quarterly revenue"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"checks": [
|
|
38
|
+
{
|
|
39
|
+
"why": "a source note",
|
|
40
|
+
"tool": "get_chart",
|
|
41
|
+
"expect": {
|
|
42
|
+
"spec": {
|
|
43
|
+
"note": {
|
|
44
|
+
"$match": [
|
|
45
|
+
"crm",
|
|
46
|
+
"i"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"why": "the units are stated (axis title, format or subtitle)",
|
|
54
|
+
"tool": "get_chart",
|
|
55
|
+
"expect": {
|
|
56
|
+
"spec": {
|
|
57
|
+
"$expr": "/usd|\\$|dollar/i.test(v.yAxis.title + ' ' + v.subtitle) || v.yAxis.format.style === 'currency'"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"solution": [
|
|
63
|
+
{
|
|
64
|
+
"tool": "update_chart",
|
|
65
|
+
"args": {
|
|
66
|
+
"note": "Source: internal CRM, 2026",
|
|
67
|
+
"yAxis": {
|
|
68
|
+
"format": {
|
|
69
|
+
"style": "currency",
|
|
70
|
+
"currency": "USD"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prompt": "Show our quarterly target of 100,000 on the revenue chart so it's clear which quarters hit it.",
|
|
3
|
+
"fixture": {
|
|
4
|
+
"editor": "chart",
|
|
5
|
+
"setup": [
|
|
6
|
+
{
|
|
7
|
+
"tool": "set_chart_data",
|
|
8
|
+
"args": {
|
|
9
|
+
"categories": [
|
|
10
|
+
"Q1",
|
|
11
|
+
"Q2",
|
|
12
|
+
"Q3",
|
|
13
|
+
"Q4"
|
|
14
|
+
],
|
|
15
|
+
"series": [
|
|
16
|
+
{
|
|
17
|
+
"name": "Revenue",
|
|
18
|
+
"values": [
|
|
19
|
+
82000,
|
|
20
|
+
91000,
|
|
21
|
+
118000,
|
|
22
|
+
96000
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"tool": "update_chart",
|
|
30
|
+
"args": {
|
|
31
|
+
"type": "bar",
|
|
32
|
+
"title": "Quarterly revenue"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"checks": [
|
|
38
|
+
{
|
|
39
|
+
"why": "a labelled reference line at 100,000 on the value axis",
|
|
40
|
+
"tool": "get_chart",
|
|
41
|
+
"expect": {
|
|
42
|
+
"spec": {
|
|
43
|
+
"referenceLines": {
|
|
44
|
+
"$some": {
|
|
45
|
+
"value": 100000,
|
|
46
|
+
"label": {
|
|
47
|
+
"$match": [
|
|
48
|
+
"target",
|
|
49
|
+
"i"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"why": "the data is unchanged",
|
|
59
|
+
"tool": "get_chart",
|
|
60
|
+
"expect": {
|
|
61
|
+
"spec": {
|
|
62
|
+
"series": [
|
|
63
|
+
{
|
|
64
|
+
"values": [
|
|
65
|
+
82000,
|
|
66
|
+
91000,
|
|
67
|
+
118000,
|
|
68
|
+
96000
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"solution": [
|
|
77
|
+
{
|
|
78
|
+
"tool": "add_chart_reference_line",
|
|
79
|
+
"args": {
|
|
80
|
+
"value": 100000,
|
|
81
|
+
"label": "Target"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|