From crisp-tc
Convert a legacy Data Manager .fsf form file into a Mission Control PDK plugin. Use this skill whenever the user provides an .fsf file or describes a Data Manager form and asks to recreate or migrate it as a PDK plugin (not an OpenAccess control). Also use when the user mentions converting DM buttons to a PDK Run button, or asks to "create a PDK for this DM form".
How this skill is triggered — by the user, by Claude, or both
Slash command
/crisp-tc:datamanager-to-pdkThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A DM (Data Manager) form is a Mission Control scripting artifact — a binary `.fsf` file containing:
A DM (Data Manager) form is a Mission Control scripting artifact — a binary .fsf file containing:
Application.ProfusionSupport.ADOConnection — no stored proceduresThe FSF format is a compound binary (OLE) document. To read logic from it: use the Read tool on the .fsf file. Despite being binary, the VBScript and control names are embedded as wide-character (UTF-16LE) strings that appear as readable text. Look for:
CObjCheckbox, CObjActiveX, CObjEdit, etc.)Sub, Function, ADODB.Command, Application. callsDM vs OpenAccess: Use
crisp-tc:datamanager-to-openaccessif the target is an OpenAccess ASCX control. Use this skill when the target is a PDK plugin (WPF/MVVM, single DLL deployed to%AppData%\Cantactix\MissionControl\Plugins).
| DM Form Element | PDK Equivalent |
|---|---|
ProFusionHierarchyCtrl_Src (source selector) | A SourcePlanogramDbKey int property on the ViewModel, bound to a ComboBox/TextBox |
ProFusionHierarchyCtrl_Trg (target selector) | BatchProvider.GetSpaceFiles() — the planograms selected in MC's batch panel |
Button click VBScript (cmd_Xxx) | RunCommand in ViewModel → ProcessAsync in Processor |
Application.ProfusionSupport.ADOConnection | CkbProvider.GetCkbDbConnection().ConnectionString → new DB(...) → SQLHelper |
| Inline SQL built in VBScript | Stored procedures in CKB, called via the DB class |
chk_SomeName.check = 1 | bool property on ViewModel, bound to WPF CheckBox |
grid_TagList.Object.Count / .Selected(i) | BindableCollection<TagItemViewModel>, rendered as ListBox with checkboxes |
Application.ShowStatusMsg / ShowWaitCursor | ReportProgress / ReportCompleted / ReportFailed in Processor |
Application.MessageBox | Result message shown in View after ProcessAsync completes |
| Oracle/MSS dual-path SQL | SQL Server (MSS path) only — CKB is always SQL Server |
DM forms often have 3–6 buttons. A PDK plugin typically has one Run button. Rules:
DM forms have a dedicated Source hierarchy control. In PDK, BatchProvider.GetSpaceFiles() serves as the target list. For the source, choose one of:
| Option | When to use |
|---|---|
| A — First selected pog is source | Simplest. User adds source first in the MC batch panel; plugin treats index 0 as source, rest as targets. Requires a note in the UI. |
| B — Dedicated source selector | A ComboBox/TextBox in the View where user types a DBKey or searches by name. Better UX when source ≠ any of the targets. |
| C — Master/config-driven source | Client has a fixed master planogram per store cluster. Expose as a preset setting. |
Most DM form migrations use Option B.
The request will specify which DM buttons to include. Common reductions:
| DM Button | PDK include? | Reason |
|---|---|---|
| Copy Action List | Often yes | Simple single-field copy, high value |
| Copy Tags | Often yes | Frequently used, maps cleanly to SQL |
| Copy Textboxes | Sometimes | Involves ix_spc_drawing; adds complexity |
| Copy Notes | Rarely | Very client-specific |
| Table | Relevant Columns | Purpose |
|---|---|---|
ix_spc_planogram | dbkey, pgactionlist | Planogram header; Action List is stored here |
ix_spc_performance | dbparentplanogramkey, dbparentproductkey, desc35–desc50 | Per-product per-planogram; Tags (desc35–50) live here |
ix_spc_drawing | dbparentplanogramkey, type (5=textbox) | Textboxes/annotations |
Tags are desc35 through desc50 on ix_spc_performance (16 fields, 0-indexed: i=0 → desc35, i=15 → desc50).
The DM form's grid_Tag_List shows these tags. In PDK: use a BindableCollection<TagItemViewModel> where each item has a Name and IsSelected bool. Default all to true; user unchecks to exclude.
When copying tags, the join on ix_spc_performance must match products between source and target planograms. The request may specify:
| Mode | Join on |
|---|---|
| ID | pf_s.dbparentproductkey = pf.dbparentproductkey |
| UPC | Join via ix_spc_planogram_item matching on upcp |
| BOTH | Try ID first, fall back to UPC |
Expose this as a RadioButton group in the View; pass the enum to the Processor.
Move all inline SQL to CKB stored procedures. Pattern:
VBScript variable → SQL parameter
{SourceKey} → @sourceDbKey INT
{key_string} (CSV list) → @targetDbKeys VARCHAR(MAX), parsed with STRING_SPLIT
Oracle BEGIN/COMMIT block → SQL Server BEGIN/END (no COMMIT needed; auto-commit)
Dynamic "SET col=val,..." → CASE-based bitmask column selection
CREATE PROCEDURE [dbo].[usp_CopyActionList]
@sourceDbKey INT,
@targetDbKeys VARCHAR(MAX) -- comma-separated target dbkeys
AS
BEGIN
UPDATE pl
SET pl.pgactionlist = (
SELECT pl_s.pgactionlist
FROM ix_spc_planogram pl_s
WHERE pl_s.dbkey = @sourceDbKey
)
FROM ix_spc_planogram pl
WHERE pl.dbkey IN (SELECT value FROM STRING_SPLIT(@targetDbKeys, ','))
END
CREATE PROCEDURE [dbo].[usp_CopyTags]
@sourceDbKey INT,
@targetDbKeys VARCHAR(MAX),
@tagMask BIGINT, -- bitmask: bit 0=desc35, bit 1=desc36 ... bit 15=desc50
@clearFirst BIT
AS
BEGIN
-- Optional: null out excluded tags on targets first
IF @clearFirst = 1
BEGIN
UPDATE pf SET
pf.desc35 = CASE WHEN (@tagMask & 1) = 0 THEN NULL ELSE pf.desc35 END,
pf.desc36 = CASE WHEN (@tagMask & 2) = 0 THEN NULL ELSE pf.desc36 END,
-- ... desc37–desc49 with appropriate bit shifts ...
pf.desc50 = CASE WHEN (@tagMask & 32768) = 0 THEN NULL ELSE pf.desc50 END
FROM ix_spc_performance pf
WHERE pf.dbparentplanogramkey IN (SELECT value FROM STRING_SPLIT(@targetDbKeys, ','))
END
-- Copy selected tags from source → targets (ID join)
UPDATE pf SET
pf.desc35 = CASE WHEN (@tagMask & 1) > 0 THEN pf_s.desc35 ELSE pf.desc35 END,
pf.desc36 = CASE WHEN (@tagMask & 2) > 0 THEN pf_s.desc36 ELSE pf.desc36 END,
-- ... desc37–desc49 ...
pf.desc50 = CASE WHEN (@tagMask & 32768) > 0 THEN pf_s.desc50 ELSE pf.desc50 END
FROM ix_spc_performance pf
INNER JOIN ix_spc_performance pf_s
ON pf_s.dbparentplanogramkey = @sourceDbKey
AND pf_s.dbparentproductkey = pf.dbparentproductkey -- ID join
WHERE pf.dbparentplanogramkey IN (SELECT value FROM STRING_SPLIT(@targetDbKeys, ','))
END
.fsf file — extract VBScript for each button into plain textpdk-development skill — follow its checklist for scaffolding the solutionckb-schema skill — reference table/column names when writing stored procsPDK.SegmentBreaks as structural template (C:\Users\bwolf\source\repos\PDK.SegmentBreaks\):
PDK.SegmentBreaks → [Client].[FeatureName]ProSpaceProcessor, PlanogramFileRef, flat-file logic)IsValidDB class, report progress per target pogpdk-development — full PDK project structure, base classes, XAML patterns, deploy targetckb-schema — CKB table names, stored proc conventions, SQLHelper usagedatamanager-to-openaccess — use instead of this skill when target is an OA ASCX controlnpx claudepluginhub gocrisp-proservices/techteam_skills --plugin crisp-tcProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.