@dforge-core/dforge-mcp 0.2.45 → 0.2.47
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/CHANGELOG.md +45 -0
- package/README.md +2 -1
- package/dist/server.js +71 -3
- package/package.json +3 -3
- package/resources/docs/dsl-reference.md +1 -1
- package/resources/schemas/data-views.schema.json +50 -0
- package/scripts/install-skills.mjs +1 -0
- package/skills/dforge-1c-import/SKILL.md +375 -0
- package/skills/dforge-1c-import/references/environment.md +98 -0
- package/skills/dforge-1c-import/references/loading.md +164 -0
- package/skills/dforge-1c-import/references/measurements.md +210 -0
- package/skills/dforge-1c-import/references/print-forms.md +148 -0
- package/skills/dforge-1c-import/scripts/1c.py +178 -0
- package/skills/dforge-1c-import/scripts/README.md +164 -0
- package/skills/dforge-1c-import/scripts/lib/analyze.py +83 -0
- package/skills/dforge-1c-import/scripts/lib/attrs.py +278 -0
- package/skills/dforge-1c-import/scripts/lib/autospec.py +964 -0
- package/skills/dforge-1c-import/scripts/lib/binding.py +257 -0
- package/skills/dforge-1c-import/scripts/lib/bsl.py +811 -0
- package/skills/dforge-1c-import/scripts/lib/callgraph.py +717 -0
- package/skills/dforge-1c-import/scripts/lib/changes.py +326 -0
- package/skills/dforge-1c-import/scripts/lib/cli.py +53 -0
- package/skills/dforge-1c-import/scripts/lib/columnmap.py +346 -0
- package/skills/dforge-1c-import/scripts/lib/coverage.py +242 -0
- package/skills/dforge-1c-import/scripts/lib/custom.py +83 -0
- package/skills/dforge-1c-import/scripts/lib/delta.py +770 -0
- package/skills/dforge-1c-import/scripts/lib/deps.py +136 -0
- package/skills/dforge-1c-import/scripts/lib/docusage.py +106 -0
- package/skills/dforge-1c-import/scripts/lib/dump1c.py +408 -0
- package/skills/dforge-1c-import/scripts/lib/explore.py +55 -0
- package/skills/dforge-1c-import/scripts/lib/external.py +202 -0
- package/skills/dforge-1c-import/scripts/lib/extract_code.py +251 -0
- package/skills/dforge-1c-import/scripts/lib/forms.py +239 -0
- package/skills/dforge-1c-import/scripts/lib/genmodule.py +1432 -0
- package/skills/dforge-1c-import/scripts/lib/handlers.py +202 -0
- package/skills/dforge-1c-import/scripts/lib/handmap.py +142 -0
- package/skills/dforge-1c-import/scripts/lib/i18n_coverage.py +87 -0
- package/skills/dforge-1c-import/scripts/lib/idioms.py +273 -0
- package/skills/dforge-1c-import/scripts/lib/integrity.py +264 -0
- package/skills/dforge-1c-import/scripts/lib/inventory.py +535 -0
- package/skills/dforge-1c-import/scripts/lib/layers.py +106 -0
- package/skills/dforge-1c-import/scripts/lib/meta.py +325 -0
- package/skills/dforge-1c-import/scripts/lib/migrate.py +1318 -0
- package/skills/dforge-1c-import/scripts/lib/mxl.py +368 -0
- package/skills/dforge-1c-import/scripts/lib/naming.py +251 -0
- package/skills/dforge-1c-import/scripts/lib/onecd.py +269 -0
- package/skills/dforge-1c-import/scripts/lib/paths.py +111 -0
- package/skills/dforge-1c-import/scripts/lib/peek.py +68 -0
- package/skills/dforge-1c-import/scripts/lib/posted.py +218 -0
- package/skills/dforge-1c-import/scripts/lib/posting.py +655 -0
- package/skills/dforge-1c-import/scripts/lib/printgen.py +239 -0
- package/skills/dforge-1c-import/scripts/lib/rebuild.py +194 -0
- package/skills/dforge-1c-import/scripts/lib/recorded.py +170 -0
- package/skills/dforge-1c-import/scripts/lib/recorders.py +91 -0
- package/skills/dforge-1c-import/scripts/lib/reftargets.py +95 -0
- package/skills/dforge-1c-import/scripts/lib/reportgen.py +157 -0
- package/skills/dforge-1c-import/scripts/lib/roles.py +33 -0
- package/skills/dforge-1c-import/scripts/lib/seedstate.py +493 -0
- package/skills/dforge-1c-import/scripts/lib/sizing.py +184 -0
- package/skills/dforge-1c-import/scripts/lib/source_file.py +227 -0
- package/skills/dforge-1c-import/scripts/lib/source_mssql.py +158 -0
- package/skills/dforge-1c-import/scripts/lib/spec.py +400 -0
- package/skills/dforge-1c-import/scripts/lib/statements.py +774 -0
- package/skills/dforge-1c-import/scripts/lib/store.py +126 -0
- package/skills/dforge-1c-import/scripts/lib/subsystems.py +480 -0
- package/skills/dforge-1c-import/scripts/lib/terms.py +451 -0
- package/skills/dforge-1c-import/scripts/lib/terms_uk.py +555 -0
- package/skills/dforge-1c-import/scripts/lib/totals.py +387 -0
- package/skills/dforge-1c-import/scripts/lib/typemap.py +73 -0
- package/skills/dforge-1c-import/scripts/lib/unpack.py +136 -0
- package/skills/dforge-1c-import/scripts/lib/validate.py +508 -0
- package/skills/dforge-1c-import/scripts/project-template/.env.example +24 -0
- package/skills/dforge-1c-import/scripts/project-template/contours.py +47 -0
- package/skills/dforge-1c-import/scripts/project-template/sources.py +24 -0
- package/skills/dforge-mcp-author/SKILL.md +5 -0
- package/skills/dforge-mcp-author/references/action-dsl.md +1 -1
- package/skills/dforge-mcp-author/references/data-views.md +38 -2
- package/skills/dforge-mcp-author/references/formulas.md +32 -1
- package/skills/dforge-mcp-author/references/print-templates.md +30 -5
- package/skills/dforge-mcp-author/references/queries.md +17 -2
- package/skills/dforge-mcp-author/references/registers.md +1 -0
- package/skills/dforge-mcp-author/references/reports.md +1 -1
- package/skills/dforge-mcp-author/references/validation-checklist.md +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,51 @@ All notable changes to `@dforge-core/dforge-mcp`. This project uses semver-ish
|
|
|
4
4
|
`0.1.0-rc.N` pre-release tags; the published version is set at publish time via
|
|
5
5
|
the release workflow, so committed `package.json` versions are placeholders.
|
|
6
6
|
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
## 0.2.46 — 2026-10-29
|
|
10
|
+
|
|
11
|
+
Requires `@dforge-core/dforge-cli` 0.2.37 and `@dforge-core/metadata` 0.0.47; the vendored `dforge://schema/data-views` now accepts the grouping keys.
|
|
12
|
+
|
|
13
|
+
**`SLICE()`: an information register's value on a date, per row.** A formula function for `F` columns —
|
|
14
|
+
`SLICE('module.register', 'resource', date, 'dimension', value, …)`, 1C's `СрезПоследних` — so a print form prints each
|
|
15
|
+
line's price on its document's date, read in the query that loads the lines. Database-only (the browser keeps the loaded
|
|
16
|
+
value), read with the user's rights on the register, refused in `G` columns; install checks the register, resource and
|
|
17
|
+
dimensions. `references/formulas.md` documents it, `print-templates.md` and `registers.md` point to it. Print responses
|
|
18
|
+
(`print.render`, `print.renderPdf`, DSL `printPdf()`) now carry `warnings` for what printed empty, and an upgrade deletes
|
|
19
|
+
the print templates a package no longer declares. **Needs a platform with the `SLICE()` release (CLI 0.2.37).**
|
|
20
|
+
|
|
21
|
+
**Grids and lists group by a column.** A `grid` or `list` view's `viewConfig` can ship a default grouping:
|
|
22
|
+
`groupByField`, `groupByOptions` (narrows the Group menu) and `collapsedGroups`, plus `inlineAdd` on a list.
|
|
23
|
+
`dforge_module_validate` checks them as the install does (core `ViewGroupingValidator`, #1556): each named column is a
|
|
24
|
+
dropdown, flags, reference or user column, `groupByOptions` includes `groupByField`, and `collapsedGroups` lists option
|
|
25
|
+
values of a valid `groupByField`. `references/data-views.md` documents the keys and the validation checklist lists the
|
|
26
|
+
rules. The vendored `dforge://schema/data-views` carries them from metadata 0.0.47. **Needs platform 1.28.11.**
|
|
27
|
+
|
|
28
|
+
**`dforge-1c-import`: porting a 1C infobase.** A fifth skill. It carries the decisions a 1C port turns on, each with the
|
|
29
|
+
measurement that settles it: a register's kind, where a posting takes each value, what to carry, physical columns through
|
|
30
|
+
DBNames, vendor against client. It adds `references/loading.md` (copying the rows: swapped uuid halves, the empty reference
|
|
31
|
+
and the empty date as values in register keys and periods, the year offset, enums by `_EnumOrder`, composite references,
|
|
32
|
+
register state, triggers, dangling references, verification) and `references/print-forms.md` (MXL templates, the print
|
|
33
|
+
procedure, `Строка`/`Формат` in SQL, reproducing 1C's slips, datasets as queries). `scripts/` ships the Python toolkit
|
|
34
|
+
from a real port: it exports the infobase without 1C, generates and validates modules, copies and
|
|
35
|
+
reconciles the rows, checks postings and reads print templates, pointed at a port by `DF1C_ROOT` / `DF1C_PROJECT` and
|
|
36
|
+
started from `scripts/project-template/`. `install-skills` installs it with the other four.
|
|
37
|
+
|
|
38
|
+
The toolkit has two layers. `dump1c` is the only part that reads 1C. It reads either a server infobase on MS SQL or a
|
|
39
|
+
file infobase (`1Cv8.1CD`, formats 8.2.14 and 8.3.8, through a pure-Python reader), and writes one export to `out/`:
|
|
40
|
+
the configuration, DBNames, the schema, every table's rows as Parquet, and a manifest with the year offset and the
|
|
41
|
+
horizons. Everything else reads that export, with DuckDB for the rows (`store.py`). The export is the same whichever
|
|
42
|
+
kind of infobase it came from, so a project's `sources.QUERIES` are DuckDB SQL. **Breaking for an existing port:** a
|
|
43
|
+
query written in T-SQL (`[_Fld12]`, `TOP`, `0x01`, `CONVERT`) fails until it is rewritten (`"_Fld12"`, `LIMIT`,
|
|
44
|
+
`from_hex('01')`, `CAST`). `dump1c data --changes [--since <day>]` brings an MS SQL export up to date by reading
|
|
45
|
+
only what 1C changed. It rebuilds each table's file in place, so `delta` follows a cutover in minutes rather than
|
|
46
|
+
after a full export. It also catches accounting entries switched on or off without the document being written.
|
|
47
|
+
Register totals and document journals are left out of the export by default; name one, or pass `--derived`, to
|
|
48
|
+
export it. `delta` needs an MS SQL export: a file
|
|
49
|
+
infobase has no database-wide rowversion. `meta` now finds the configuration's root from `root` instead of a GUID
|
|
50
|
+
fixed to one configuration.
|
|
51
|
+
|
|
7
52
|
## 0.2.45 — 2026-10-25
|
|
8
53
|
|
|
9
54
|
**English is the base locale, and it lives in the definitions.** Install never reads
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
MCP server for dForge module authoring. Exposes 35 composable tools and the canonical schemas so AI agents (Claude Code, Cursor, Zed, etc.) can drive the full module lifecycle — scaffold → entities → actions → views → security → install — through structured tool calls instead of free-form JSON generation.
|
|
4
4
|
|
|
5
|
-
Ships with **
|
|
5
|
+
Ships with **five Claude Skills** (`skills/`): a router plus one skill per lifecycle stage — design (Phase 0), build (Phases 1-5), and ship (Phase 6) — and `dforge-1c-import` for porting a 1C infobase, with its Python toolkit. The router directory carries 25 reference files (field types, flags, traits, formulas, DSL, security, etc.) and two annotated example modules.
|
|
6
6
|
|
|
7
7
|
**New here?** Start with **[docs/creating-modules.md](docs/creating-modules.md)** — three ways to scaffold a module (terminal CLI, VS Code sidebar, AI wizard) and when to pick each.
|
|
8
8
|
|
|
@@ -206,6 +206,7 @@ Authoring guidance ships as **four** skills, split by lifecycle stage. Each stag
|
|
|
206
206
|
| `dforge-module-design` | 0a–0d | Identity, intake guardrails, design doc, pre-scaffold validation. Ends at `readyToScaffold: true`. |
|
|
207
207
|
| `dforge-module-build` | 1–5 | Entities, behavior, views/menus, polish, security. Loading-policy table, core-rules cheat sheet, backtrack protocol. |
|
|
208
208
|
| `dforge-module-ship` | 6 | Validate → pre-pack review → version audit → pack → install-fix loop. |
|
|
209
|
+
| `dforge-1c-import` | — | Porting a 1C:Enterprise infobase: register kinds, posting bindings, what to carry, the row copy and its conversions, print forms. `scripts/` holds the Python toolkit (read the infobase from MS SQL without 1C, generate modules, load, reconcile, check postings, read MXL templates). |
|
|
209
210
|
|
|
210
211
|
The handoff is deterministic rather than vibes-based: `dforge_module_plan({ action: "check" })` returns `currentPhase` **and** `nextSkill`, derived from the Phase 0 artifacts, the phase ledger in `docs/phase.json`, and evidence read from the module itself (entities without fields, entities without a view, entities without a Select grant).
|
|
211
212
|
|
package/dist/server.js
CHANGED
|
@@ -31002,7 +31002,7 @@ var import_node_crypto = require("crypto");
|
|
|
31002
31002
|
var fs2 = __toESM(require("fs"));
|
|
31003
31003
|
var path2 = __toESM(require("path"));
|
|
31004
31004
|
|
|
31005
|
-
// node_modules/.pnpm/@dforge-core+dforge-cli@0.2.
|
|
31005
|
+
// node_modules/.pnpm/@dforge-core+dforge-cli@0.2.37/node_modules/@dforge-core/dforge-cli/dist/lib.mjs
|
|
31006
31006
|
function buildManifest(opts, moduleId) {
|
|
31007
31007
|
const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
31008
31008
|
const manifest = {
|
|
@@ -31243,7 +31243,7 @@ function buildZedTasks() {
|
|
|
31243
31243
|
var fs = __toESM(require("fs"));
|
|
31244
31244
|
var path = __toESM(require("path"));
|
|
31245
31245
|
|
|
31246
|
-
// node_modules/.pnpm/@dforge-core+metadata@0.0.
|
|
31246
|
+
// node_modules/.pnpm/@dforge-core+metadata@0.0.47/node_modules/@dforge-core/metadata/dist/index.js
|
|
31247
31247
|
var AggType = {
|
|
31248
31248
|
Sum: "sum",
|
|
31249
31249
|
Count: "count",
|
|
@@ -34612,7 +34612,7 @@ var path10 = __toESM(require("path"));
|
|
|
34612
34612
|
var fs7 = __toESM(require("fs"));
|
|
34613
34613
|
var path9 = __toESM(require("path"));
|
|
34614
34614
|
|
|
34615
|
-
// node_modules/.pnpm/@dforge-core+metadata@0.0.
|
|
34615
|
+
// node_modules/.pnpm/@dforge-core+metadata@0.0.47/node_modules/@dforge-core/metadata/dist/dsl/index.js
|
|
34616
34616
|
var PUNCT3 = ["===", "!=="];
|
|
34617
34617
|
var PUNCT2 = [
|
|
34618
34618
|
"==",
|
|
@@ -38255,6 +38255,73 @@ function checkMenus(ctx) {
|
|
|
38255
38255
|
};
|
|
38256
38256
|
for (const [mcode, m] of Object.entries(menus)) walk(m, `menus \u2192 ${mcode}`);
|
|
38257
38257
|
}
|
|
38258
|
+
function checkViewGrouping(ctx) {
|
|
38259
|
+
const { err, entities, fieldDefsOf, views } = ctx;
|
|
38260
|
+
for (const [vcode, v] of Object.entries(views)) {
|
|
38261
|
+
const viewType = v.viewType ?? "grid";
|
|
38262
|
+
if (viewType !== "grid" && viewType !== "list") continue;
|
|
38263
|
+
const config2 = v.viewConfig;
|
|
38264
|
+
if (!config2 || typeof config2 !== "object" || Array.isArray(config2)) continue;
|
|
38265
|
+
const cfg = config2;
|
|
38266
|
+
const ent = v.dataSources?.[0]?.entityCode;
|
|
38267
|
+
if (!ent) continue;
|
|
38268
|
+
const defs = fieldDefsOf[ent];
|
|
38269
|
+
if (!defs || entities[ent]?.extends) continue;
|
|
38270
|
+
const where = `data_views \u2192 ${vcode}`;
|
|
38271
|
+
const resolve8 = (key, cd) => {
|
|
38272
|
+
const f = defs[cd];
|
|
38273
|
+
if (!f) err(where, `names '${cd}' in '${key}', which entity '${ent}' does not define`);
|
|
38274
|
+
else if (!isGroupable(f)) err(where, `names '${cd}' in '${key}', which is not a dropdown, reference or user column`);
|
|
38275
|
+
else return f;
|
|
38276
|
+
return void 0;
|
|
38277
|
+
};
|
|
38278
|
+
const readStrings = (key) => {
|
|
38279
|
+
const val = cfg[key];
|
|
38280
|
+
if (!Array.isArray(val)) return void 0;
|
|
38281
|
+
const items = [];
|
|
38282
|
+
for (const item of val) {
|
|
38283
|
+
if (typeof item === "string") items.push(item);
|
|
38284
|
+
else err(where, `has a non-string item in '${key}'`);
|
|
38285
|
+
}
|
|
38286
|
+
return items;
|
|
38287
|
+
};
|
|
38288
|
+
const groupBy = typeof cfg.groupByField === "string" ? cfg.groupByField : void 0;
|
|
38289
|
+
const groupField = groupBy !== void 0 ? resolve8("groupByField", groupBy) : void 0;
|
|
38290
|
+
const options = readStrings("groupByOptions");
|
|
38291
|
+
if (options) {
|
|
38292
|
+
for (const cd of options) resolve8("groupByOptions", cd);
|
|
38293
|
+
if (groupBy !== void 0 && !options.includes(groupBy)) {
|
|
38294
|
+
err(where, `has 'groupByOptions' without its 'groupByField' '${groupBy}'`);
|
|
38295
|
+
}
|
|
38296
|
+
}
|
|
38297
|
+
const collapsed = readStrings("collapsedGroups");
|
|
38298
|
+
if (collapsed) {
|
|
38299
|
+
if (!groupField) err(where, "sets 'collapsedGroups' without a valid 'groupByField'");
|
|
38300
|
+
else if (isDropdown(groupField)) {
|
|
38301
|
+
const values = optionValues(groupField);
|
|
38302
|
+
for (const val of collapsed.filter((c) => !values.has(c))) {
|
|
38303
|
+
err(where, `lists '${val}' in 'collapsedGroups', which is not an option of '${groupBy}'`);
|
|
38304
|
+
}
|
|
38305
|
+
}
|
|
38306
|
+
}
|
|
38307
|
+
}
|
|
38308
|
+
}
|
|
38309
|
+
function isDropdown(f) {
|
|
38310
|
+
return f.fieldTypeCd === "dropdown" || f.fieldTypeCd === "flags";
|
|
38311
|
+
}
|
|
38312
|
+
function isGroupable(f) {
|
|
38313
|
+
return isDropdown(f) || f.fieldTypeCd === "user" || f.columnType === "R";
|
|
38314
|
+
}
|
|
38315
|
+
function optionValues(f) {
|
|
38316
|
+
const result = /* @__PURE__ */ new Set();
|
|
38317
|
+
const options = f.params?.options;
|
|
38318
|
+
if (!Array.isArray(options)) return result;
|
|
38319
|
+
for (const item of options) {
|
|
38320
|
+
const val = item && typeof item === "object" ? item.value : item;
|
|
38321
|
+
if (typeof val === "string" || typeof val === "number") result.add(String(val));
|
|
38322
|
+
}
|
|
38323
|
+
return result;
|
|
38324
|
+
}
|
|
38258
38325
|
|
|
38259
38326
|
// src/tools/validate/security.ts
|
|
38260
38327
|
var fs14 = __toESM(require("fs"));
|
|
@@ -38525,6 +38592,7 @@ var CHECKS = [
|
|
|
38525
38592
|
checkEntityViews,
|
|
38526
38593
|
checkDataViews,
|
|
38527
38594
|
checkVisibleColumns,
|
|
38595
|
+
checkViewGrouping,
|
|
38528
38596
|
checkMenus,
|
|
38529
38597
|
checkRoleRights,
|
|
38530
38598
|
checkSelectCoverage,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dforge-core/dforge-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.47",
|
|
4
4
|
"description": "MCP server for dForge module authoring. Exposes 35 scaffold/patch/validate/pack/install tools and schema resources so AI agents (Claude Code, Cursor, Zed) can create and ship dForge modules.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/iash44/dForge-core",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"node": ">=18"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@dforge-core/dforge-cli": "^0.2.
|
|
30
|
-
"@dforge-core/metadata": "^0.0.
|
|
29
|
+
"@dforge-core/dforge-cli": "^0.2.37",
|
|
30
|
+
"@dforge-core/metadata": "^0.0.47",
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
32
32
|
"zod": "^4.4.3"
|
|
33
33
|
},
|
|
@@ -569,7 +569,7 @@ if (info.mimeType != 'application/pdf') { error('Receipt must be PDF') }
|
|
|
569
569
|
```
|
|
570
570
|
|
|
571
571
|
#### `printPdf(entityCd, key, templateCd)`
|
|
572
|
-
Render a print template to a PDF as the current user and return the archived file as `{ fileId, fileName, mimeType, size, checksum }
|
|
572
|
+
Render a print template to a PDF as the current user and return the archived file as `{ fileId, fileName, mimeType, size, checksum }`, plus `warnings` when a value printed empty because the user may not read it; attach it with `sendEmail()`. Pass a qualified entity code. Not in a scheduled job or a background action; max 10 per run.
|
|
573
573
|
|
|
574
574
|
```dsl
|
|
575
575
|
execute:
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"additionalProperties": false,
|
|
54
54
|
"allOf": [
|
|
55
|
+
{ "$ref": "#/$defs/rules/grid" },
|
|
55
56
|
{ "$ref": "#/$defs/rules/kanban" },
|
|
56
57
|
{ "$ref": "#/$defs/rules/calendar" },
|
|
57
58
|
{ "$ref": "#/$defs/rules/tree-grid" },
|
|
@@ -62,6 +63,17 @@
|
|
|
62
63
|
},
|
|
63
64
|
|
|
64
65
|
"rules": {
|
|
66
|
+
"grid": {
|
|
67
|
+
"if": {
|
|
68
|
+
"properties": { "viewType": { "const": "grid" } },
|
|
69
|
+
"required": ["viewType"]
|
|
70
|
+
},
|
|
71
|
+
"then": {
|
|
72
|
+
"properties": {
|
|
73
|
+
"viewConfig": { "$ref": "#/$defs/gridViewConfig" }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
65
77
|
"kanban": {
|
|
66
78
|
"if": {
|
|
67
79
|
"properties": { "viewType": { "const": "kanban" } },
|
|
@@ -131,6 +143,26 @@
|
|
|
131
143
|
}
|
|
132
144
|
},
|
|
133
145
|
|
|
146
|
+
"gridViewConfig": {
|
|
147
|
+
"type": "object",
|
|
148
|
+
"properties": {
|
|
149
|
+
"groupByField": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "Dropdown, reference or user column the rows are grouped by under header rows"
|
|
152
|
+
},
|
|
153
|
+
"groupByOptions": {
|
|
154
|
+
"type": "array",
|
|
155
|
+
"items": { "type": "string" },
|
|
156
|
+
"description": "Columns the Group by menu offers; must include groupByField"
|
|
157
|
+
},
|
|
158
|
+
"collapsedGroups": {
|
|
159
|
+
"type": "array",
|
|
160
|
+
"items": { "type": "string" },
|
|
161
|
+
"description": "Option values of groupByField whose groups start collapsed"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"additionalProperties": false
|
|
165
|
+
},
|
|
134
166
|
"kanbanViewConfig": {
|
|
135
167
|
"type": "object",
|
|
136
168
|
"required": ["groupByField"],
|
|
@@ -195,6 +227,24 @@
|
|
|
195
227
|
"type": "array",
|
|
196
228
|
"items": { "$ref": "#/$defs/listLevelConfig" },
|
|
197
229
|
"description": "Hierarchical child levels for expandable list rows"
|
|
230
|
+
},
|
|
231
|
+
"groupByField": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"description": "Dropdown, reference or user column the rows are grouped by"
|
|
234
|
+
},
|
|
235
|
+
"groupByOptions": {
|
|
236
|
+
"type": "array",
|
|
237
|
+
"items": { "type": "string" },
|
|
238
|
+
"description": "Columns the user may regroup by; must include groupByField"
|
|
239
|
+
},
|
|
240
|
+
"collapsedGroups": {
|
|
241
|
+
"type": "array",
|
|
242
|
+
"items": { "type": "string" },
|
|
243
|
+
"description": "Option values of groupByField whose groups start collapsed"
|
|
244
|
+
},
|
|
245
|
+
"inlineAdd": {
|
|
246
|
+
"type": "boolean",
|
|
247
|
+
"description": "Show an add row in each group (at the top when ungrouped)"
|
|
198
248
|
}
|
|
199
249
|
},
|
|
200
250
|
"additionalProperties": false
|
|
@@ -32,6 +32,7 @@ const SKILLS = [
|
|
|
32
32
|
["dforge-module-design", "Phase 0 — identity, intake, design, validation"],
|
|
33
33
|
["dforge-module-build", "Phases 1-5 — entities, behavior, views, security"],
|
|
34
34
|
["dforge-module-ship", "Phase 6 — validate, pack, install-fix loop"],
|
|
35
|
+
["dforge-1c-import", "porting a 1C infobase — decisions, loading, print forms,\n and the Python toolkit that does the mechanical half"],
|
|
35
36
|
];
|
|
36
37
|
|
|
37
38
|
const PKG = "@dforge-core/dforge-mcp";
|