@josephyan/qingflow-app-user-mcp 0.2.0-beta.39 → 0.2.0-beta.40
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-crud/SKILL.md +6 -4
- package/src/qingflow_mcp/__init__.py +1 -1
- package/src/qingflow_mcp/builder_facade/models.py +19 -0
- package/src/qingflow_mcp/builder_facade/service.py +544 -49
- package/src/qingflow_mcp/server_app_builder.py +16 -4
- package/src/qingflow_mcp/tools/ai_builder_tools.py +151 -14
- package/src/qingflow_mcp/tools/record_tools.py +249 -3
package/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
Install:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install @josephyan/qingflow-app-user-mcp@0.2.0-beta.
|
|
6
|
+
npm install @josephyan/qingflow-app-user-mcp@0.2.0-beta.40
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
Run:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npx -y -p @josephyan/qingflow-app-user-mcp@0.2.0-beta.
|
|
12
|
+
npx -y -p @josephyan/qingflow-app-user-mcp@0.2.0-beta.40 qingflow-app-user-mcp
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Environment:
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
@@ -110,15 +110,17 @@ The DSL is clause-shaped like SQL, but it is **not raw SQL text**.
|
|
|
110
110
|
- Do not use free-form `WHERE` updates or deletes
|
|
111
111
|
- Do not auto-fill missing fields
|
|
112
112
|
- Do not auto-resolve relation targets without first querying them
|
|
113
|
-
- Do not assume member display names resolve automatically; `record_member_candidates` returns
|
|
114
|
-
- Do not assume department names resolve automatically; `record_department_candidates` returns
|
|
113
|
+
- Do not assume member display names resolve automatically; `record_member_candidates` returns the current field candidate scope, and write paths now reject member values outside that scope when it is supported
|
|
114
|
+
- Do not assume department names resolve automatically; `record_department_candidates` returns the current field candidate scope, and write paths now reject department values outside that scope when it is supported
|
|
115
115
|
- For default-all member or department fields, prefer the field candidate tools; do not start with `directory_*`
|
|
116
|
+
- Do not invent member or department ids/names when a candidate tool is available; choose an exact returned candidate item
|
|
117
|
+
- If member or department candidate lookup fails, stop and surface the lookup error; do not retry the write with guessed ids or names
|
|
116
118
|
- Do not assume `record_schema_get` is a builder/full-field schema.
|
|
117
119
|
|
|
118
120
|
### Complex field quick examples
|
|
119
121
|
|
|
120
|
-
- `member`: `✅ {"field_id":5,"value":{"id":7}}` /
|
|
121
|
-
- `department`: `✅ {"field_id":22,"value":{"id":336193,"value":"北斗组"}}` /
|
|
122
|
+
- `member`: `✅ {"field_id":5,"value":{"id":7,"value":"张三"}}` / `✅ {"field_id":5,"value":"张三"}` only when it exactly matches a current candidate / `❌ {"field_id":5,"value":"不存在的成员"}`
|
|
123
|
+
- `department`: `✅ {"field_id":22,"value":{"id":336193,"value":"北斗组"}}` / `✅ {"field_id":22,"value":"北斗组"}` only when it exactly matches a current candidate / `❌ {"field_id":22,"value":"不存在的部门"}`
|
|
122
124
|
- `relation`: `✅ {"field_id":25,"value":{"apply_id":5001}}` / `❌ {"field_id":25,"value":"客户A"}`
|
|
123
125
|
- `attachment`: upload first, then `✅ {"field_id":13,"value":{"value":"https://.../a.pdf","name":"a.pdf"}}` / `❌ {"field_id":13,"value":"/tmp/a.pdf"}`
|
|
124
126
|
|
|
@@ -794,6 +794,25 @@ class AppFlowReadResponse(StrictModel):
|
|
|
794
794
|
transitions: list[dict[str, Any]] = Field(default_factory=list)
|
|
795
795
|
|
|
796
796
|
|
|
797
|
+
class AppChartsReadResponse(StrictModel):
|
|
798
|
+
app_key: str
|
|
799
|
+
charts: list[dict[str, Any]] = Field(default_factory=list)
|
|
800
|
+
chart_count: int = 0
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
class PortalReadSummaryResponse(StrictModel):
|
|
804
|
+
dash_key: str
|
|
805
|
+
being_draft: bool = True
|
|
806
|
+
dash_name: str | None = None
|
|
807
|
+
package_tag_ids: list[int] = Field(default_factory=list)
|
|
808
|
+
dash_icon: str | None = None
|
|
809
|
+
hide_copyright: bool | None = None
|
|
810
|
+
config_keys: list[str] = Field(default_factory=list)
|
|
811
|
+
dash_global_config_keys: list[str] = Field(default_factory=list)
|
|
812
|
+
section_count: int = 0
|
|
813
|
+
sections: list[dict[str, Any]] = Field(default_factory=list)
|
|
814
|
+
|
|
815
|
+
|
|
797
816
|
class SchemaPlanRequest(StrictModel):
|
|
798
817
|
app_key: str = ""
|
|
799
818
|
package_tag_id: int | None = None
|