@qingflow-tech/qingflow-app-user-mcp 1.0.8 → 1.0.10
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 +2 -2
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/skills/qingflow-record-update/SKILL.md +2 -0
- package/src/qingflow_mcp/builder_facade/models.py +36 -2
- package/src/qingflow_mcp/builder_facade/service.py +476 -95
- package/src/qingflow_mcp/cli/commands/builder.py +40 -11
- package/src/qingflow_mcp/cli/main.py +204 -3
- package/src/qingflow_mcp/response_trim.py +15 -10
- package/src/qingflow_mcp/server_app_builder.py +29 -3
- package/src/qingflow_mcp/tools/ai_builder_tools.py +1199 -32
- package/src/qingflow_mcp/tools/record_tools.py +200 -6
package/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
Install:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install @qingflow-tech/qingflow-app-user-mcp@1.0.
|
|
6
|
+
npm install @qingflow-tech/qingflow-app-user-mcp@1.0.10
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
Run:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npx -y -p @qingflow-tech/qingflow-app-user-mcp@1.0.
|
|
12
|
+
npx -y -p @qingflow-tech/qingflow-app-user-mcp@1.0.10 qingflow-app-user-mcp
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Environment:
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
@@ -35,6 +35,8 @@ metadata:
|
|
|
35
35
|
13. Do not look for any extra context bucket in update schema; lookup behavior stays inline on the field definitions themselves
|
|
36
36
|
14. When update context feels unstable, trust `record_update_schema_get`'s route-aware matched-view result over guessed `view_id` or remembered UI scope
|
|
37
37
|
15. If single-record detail/readback matters, prefer `record_get` after the write and read top-level `fields[]`, `media_assets.items[].local_path`, `file_assets.items[].local_path`, `file_assets.items[].extraction.text_path`, and `semantic_context`; `record_get` follows the frontend storage cookie redirect path for Qingflow attachments, so prefer local paths over remote URLs; use `record_list(..., output_profile="normalized")` only for batch row-shaped normalized readback
|
|
38
|
+
16. For batch updates, read top-level `mode`, `dry_run`, `total`, `succeeded`, `failed`, `needs_confirmation`, `updated_record_ids`, `write_executed`, `safe_to_retry`, `verification_status`, and `items[].row_number/status/record_id`
|
|
39
|
+
17. If `write_executed=true`, do not blindly retry the whole batch; use `items[]` and `updated_record_ids` to decide whether only failed rows need repair
|
|
38
40
|
|
|
39
41
|
## Do Not
|
|
40
42
|
|
|
@@ -142,10 +142,34 @@ class PublicButtonPlacement(str, Enum):
|
|
|
142
142
|
|
|
143
143
|
class PublicChartType(str, Enum):
|
|
144
144
|
target = "target"
|
|
145
|
+
indicator = "indicator"
|
|
146
|
+
summary = "summary"
|
|
145
147
|
pie = "pie"
|
|
146
148
|
bar = "bar"
|
|
149
|
+
columnar = "columnar"
|
|
147
150
|
line = "line"
|
|
148
151
|
table = "table"
|
|
152
|
+
detail = "detail"
|
|
153
|
+
area = "area"
|
|
154
|
+
stacked_area = "stacked_area"
|
|
155
|
+
pct_stack_area = "pct_stack_area"
|
|
156
|
+
funnel = "funnel"
|
|
157
|
+
waterfall = "waterfall"
|
|
158
|
+
gauge = "gauge"
|
|
159
|
+
heatmap = "heatmap"
|
|
160
|
+
histogram = "histogram"
|
|
161
|
+
treemap = "treemap"
|
|
162
|
+
radar = "radar"
|
|
163
|
+
stacked_bar = "stacked_bar"
|
|
164
|
+
pct_stack_bar = "pct_stack_bar"
|
|
165
|
+
stacked_column = "stacked_column"
|
|
166
|
+
pct_stack_col = "pct_stack_col"
|
|
167
|
+
scatter = "scatter"
|
|
168
|
+
ring = "ring"
|
|
169
|
+
rose = "rose"
|
|
170
|
+
dualaxes = "dualaxes"
|
|
171
|
+
map = "map"
|
|
172
|
+
timeline = "timeline"
|
|
149
173
|
|
|
150
174
|
|
|
151
175
|
class LayoutApplyMode(str, Enum):
|
|
@@ -1576,8 +1600,8 @@ class AssociatedResourcesApplyRequest(StrictModel):
|
|
|
1576
1600
|
app_key: str
|
|
1577
1601
|
upsert_resources: list[AssociatedResourceUpsertPatch] = Field(default_factory=list)
|
|
1578
1602
|
patch_resources: list[AssociatedResourcePartialPatch] = Field(default_factory=list)
|
|
1579
|
-
remove_associated_item_ids: list[
|
|
1580
|
-
reorder_associated_item_ids: list[
|
|
1603
|
+
remove_associated_item_ids: list[Any] = Field(default_factory=list)
|
|
1604
|
+
reorder_associated_item_ids: list[Any] = Field(default_factory=list)
|
|
1581
1605
|
view_configs: list[AssociatedResourceViewConfigPatch] = Field(default_factory=list)
|
|
1582
1606
|
|
|
1583
1607
|
@model_validator(mode="before")
|
|
@@ -1775,10 +1799,18 @@ class ChartUpsertPatch(StrictModel):
|
|
|
1775
1799
|
normalized = raw_type.strip().lower()
|
|
1776
1800
|
aliases = {
|
|
1777
1801
|
"targetchart": PublicChartType.target.value,
|
|
1802
|
+
"indicatorchart": PublicChartType.indicator.value,
|
|
1803
|
+
"summarychart": PublicChartType.summary.value,
|
|
1778
1804
|
"piechart": PublicChartType.pie.value,
|
|
1779
1805
|
"barchart": PublicChartType.bar.value,
|
|
1806
|
+
"columnchart": PublicChartType.columnar.value,
|
|
1807
|
+
"columnarchart": PublicChartType.columnar.value,
|
|
1780
1808
|
"linechart": PublicChartType.line.value,
|
|
1781
1809
|
"tablechart": PublicChartType.table.value,
|
|
1810
|
+
"detailchart": PublicChartType.detail.value,
|
|
1811
|
+
"percent_stacked_column": PublicChartType.pct_stack_col.value,
|
|
1812
|
+
"percent_stacked_bar": PublicChartType.pct_stack_bar.value,
|
|
1813
|
+
"percent_stacked_area": PublicChartType.pct_stack_area.value,
|
|
1782
1814
|
}
|
|
1783
1815
|
if normalized in aliases:
|
|
1784
1816
|
payload["chart_type"] = aliases[normalized]
|
|
@@ -2002,6 +2034,8 @@ FieldUpdatePatch.model_rebuild()
|
|
|
2002
2034
|
|
|
2003
2035
|
class AppGetResponse(StrictModel):
|
|
2004
2036
|
app_key: str
|
|
2037
|
+
app_name: str | None = None
|
|
2038
|
+
name: str | None = None
|
|
2005
2039
|
title: str | None = None
|
|
2006
2040
|
app_icon: str | None = None
|
|
2007
2041
|
visibility: dict[str, Any] = Field(default_factory=dict)
|