Repository navigation
feat(cli): let agents build Dify apps with difyctl and an embedded skill - #43819
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #43819 +/- ##
===========================================
+ Coverage 88.40% 94.02% +5.61%
===========================================
Files 5516 97 -5419
Lines 330372 2644 -327728
Branches 66084 573 -65511
===========================================
- Hits 292071 2486 -289585
+ Misses 33108 158 -32950
+ Partials 5193 0 -5193
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
ae3ad72 to
338bff7
Compare
CryoThrust
left a comment
There was a problem hiding this comment.
Checked the login/resume/logout paths on bf9990288b with separate difyctl processes and the shared Hono fixture, using isolated config directories and --no-keyring.
The normal pending → approved → persisted-login flow works, including a later resume without another HTTP poll. Denied/expired cleanup also works sequentially. The original CLI suite passes locally: 586 passed, 38 skipped; command-tree check passes.
Two pending-state lifetime problems are below. Seven additional local subprocess controls produce three passes and four failures: one refusal-side-effect regression and three variants of overlapping login cleanup. Moving the environment-login guard before the pending-file deletion makes that control and all five existing logout tests pass; I restored the production file afterward. The overlap case predates the store extraction, so I would track it as a follow-up if concurrent login commands are outside this PR's scope.
This is local CLI/Hono verification, not a live Dify deployment, OS-keyring, or full monorepo validation.
There was a problem hiding this comment.
🟡 Changes recommended
Installer permissions, keyring recovery guidance and app-building instructions contain unresolved defects.
5 open findings
What changed in this PR
Extends difyctl for agent-driven app development using the server operations from #43067.
Changes:
- Embeds a linked skill covering app specification, building, testing and publishing.
- Improves login persistence, command help, errors and download safety.
- Updates installers and release checks for embedded skills.
| File | Description |
|---|---|
| skills/README.md | Documents embedded skill structure and validation. |
| skills/difyctl/SKILL.md | Introduces task-specific guidance links. |
| skills/difyctl/references/setup.md | Documents agent login and environment setup. |
| skills/difyctl/references/plugins.md | Guides plugin discovery and credentials. |
| skills/difyctl/references/operations.md | Explains commands, results and errors. |
| skills/difyctl/references/build-workflow/spec.md | Defines specification and approval steps. |
| skills/difyctl/references/build-workflow/plan.md | Defines implementation planning. |
| skills/difyctl/references/build-workflow/handover.md | Guides publishing and access configuration. |
| skills/difyctl/references/build-workflow/dsl.md | Documents workflow DSL construction. |
| skills/difyctl/references/build-workflow/change.md | Guides changes to existing apps. |
| skills/difyctl/references/build-workflow/build.md | Defines incremental building and testing. |
| skills/difyctl/references/build-workflow.md | Maps phases, approval gates and limits. |
| cli/vitest.e2e.config.ts | Marks tests as noncompiled execution. |
| cli/vite.config.ts | Defines the noncompiled build flag. |
| cli/test/setup.ts | Initializes the compiled flag for tests. |
| cli/test/fixtures/kernel.ts | Stops overriding the retired cache directory. |
| cli/test/fixtures/dify-mock/server.ts | Expands authentication, workspace and run fixtures. |
| cli/test/fixtures/dify-mock/server.test.ts | Removes obsolete workspace assertions. |
| cli/test/fixtures/dify-mock/scenarios.ts | Adds forbidden responses; updates workspace fixtures. |
| cli/test/fixtures/catalog-v2.json | Updates operation examples and schemas. |
| cli/test/e2e/helpers/cli.ts | Decouples authentication fixtures from store types. |
| cli/src/version/build-info.d.ts | Declares the compiled binary flag. |
| cli/src/util/shell-word.ts | Adds shell argument quoting. |
| cli/src/util/host.ts | Removes the default login host. |
| cli/src/util/flag-name.ts | Centralizes argument and flag formatting. |
| cli/src/sys/index.ts | Exposes embedded assets; simplifies directory resolution. |
| cli/src/sys/index.test.ts | Removes retired cache-directory tests. |
| cli/src/store/token-store.ts | Uses schema-backed token files. |
| cli/src/store/token-store.test.ts | Tests tolerant token-file handling. |
| cli/src/store/store.ts | Simplifies YAML storage and adds conditional removal. |
| cli/src/store/manager.ts | Avoids nondurable Linux keyrings. |
| cli/src/store/manager.test.ts | Tests token-backend selection. |
| cli/src/store/local-file.ts | Adds tolerant schema-backed YAML access. |
| cli/src/store/local-file.test.ts | Tests malformed-field recovery. |
| cli/src/store/keyring-based-store.test.ts | Removes tests for the deleted abstraction. |
| cli/src/store/keychain-token-store.test.ts | Updates keychain naming and recovery tests. |
| cli/src/store/dir.ts | Removes separate cache-directory resolution. |
| cli/src/skills/source.ts | Loads embedded or local skill files. |
| cli/src/skills/install.ts | Installs the single skill tree. |
| cli/src/skills/install.test.ts | Tests installation and local permissions. |
| cli/src/skills/github.ts | Removes network-based skill fetching. |
| cli/src/skills/frontmatter.ts | Removes runtime frontmatter parsing. |
| cli/src/skills/collection.ts | Removes multi-skill collection handling. |
| cli/src/protocol/shape.ts | Adds union shape descriptions. |
| cli/src/protocol/shape.test.ts | Tests union classification. |
| cli/src/protocol/op-id.ts | Centralizes operation word splitting. |
| cli/src/protocol/hint.ts | Adds shared hint parsing. |
| cli/src/protocol/hint.test.ts | Tests hint filtering. |
| cli/src/protocol/fold.ts | Preserves workflow run IDs and parsed hints. |
| cli/src/plugins/token/index.ts | Integrates schema-backed token storage. |
| cli/src/plugins/session/index.ts | Adds tolerant, cached login-file reads. |
| cli/src/plugins/session/index.test.ts | Tests login defaults and malformed files. |
| cli/src/plugins/ops/tree.ts | Reuses operation word splitting. |
| cli/src/plugins/ops/command.ts | Removes redundant positional metadata. |
| cli/src/plugins/http/index.ts | Preserves permission guidance and server hints. |
| cli/src/plugins/http/index.test.ts | Tests authentication and catalog error guidance. |
| cli/src/plugins/global-flags/index.ts | Formats validation errors consistently. |
| cli/src/plugins/env/index.ts | Reports retired environment variables. |
| cli/src/plugins/env/index.test.ts | Tests the host-variable migration hint. |
| cli/src/plugins/config/index.ts | Uses tolerant schema-backed configuration. |
| cli/src/plugins/config/index.test.ts | Tests defaults and legacy-key handling. |
| cli/src/plugins/commands/text.ts | Renders prepared command examples. |
| cli/src/plugins/commands/text.test.ts | Updates help rendering expectations. |
| cli/src/plugins/commands/index.test.ts | Expands command-resolution error tests. |
| cli/src/plugins/commands/help.ts | Updates skill pointers and word splitting. |
| cli/src/plugins/commands/help.test.ts | Updates search and pointer expectations. |
| cli/src/plugins/commands/examples.ts | Generates shell-formatted command examples. |
| cli/src/plugins/commands/describe.ts | Includes executable examples in descriptors. |
| cli/src/plugins/commands/describe.test.ts | Tests enriched descriptors. |
| cli/src/plugins/commands/command.ts | Centralizes input validation and field labels. |
| cli/src/plugins/catalog/index.ts | Moves catalog storage into the config directory. |
| cli/src/plugins/catalog/index.test.ts | Tests cache migration notices and help hints. |
| cli/src/main.test.ts | Updates the invalid-command test case. |
| cli/src/errors/format.ts | Renders field labels and server next steps. |
| cli/src/errors/format.test.ts | Tests next-step formatting. |
| cli/src/errors/codes.ts | Updates storage and skill error codes. |
| cli/src/errors/codes.test.ts | Updates exit-code expectations. |
| cli/src/errors/base.ts | Extends error details and login guidance. |
| cli/src/commands/workspace/_list/index.ts | Removes obsolete workspace-list implementation. |
| cli/src/commands/workspace/_list/index.test.ts | Removes obsolete skipped tests. |
| cli/src/commands/use/workspace/index.ts | Validates membership before pinning a workspace. |
| cli/src/commands/use/workspace/index.test.ts | Tests validated workspace selection. |
| cli/src/commands/tree.generated.ts | Removes the skill-list command. |
| cli/src/commands/logout/index.ts | Clears pending interactive login state. |
| cli/src/commands/logout/index.test.ts | Tests pending-login cleanup. |
| cli/src/commands/login/index.test.ts | Expands resume and concurrent-login coverage. |
| cli/src/commands/install/skills/index.ts | Installs the embedded or local skill. |
| cli/src/commands/install/skills/index.test.ts | Tests default skill installation. |
| cli/src/commands/get/skills/index.ts | Removes the skill-list command. |
| cli/src/call/validate.ts | Names missing and unknown input fields. |
| cli/src/call/render/render.test.ts | Tests safe filenames and overwrite behavior. |
| cli/src/call/render/file.ts | Sanitizes filenames and prevents implicit overwrites. |
| cli/src/call/input.ts | Standardizes flag names in input errors. |
| cli/src/call/fold.ts | Captures run IDs from every event. |
| cli/src/call/fold.test.ts | Tests workflow run-ID preservation. |
| cli/src/call/execute.ts | Reuses centralized input validation. |
| cli/src/call/execute.test.ts | Tests suspended runs and continuation hints. |
| cli/src/auth/pending-login.ts | Adds schema-backed pending-login storage. |
| cli/scripts/run-smoke.ts | Updates environment-variable documentation. |
| cli/scripts/release-smoke.sh | Compares installed embedded skills with source. |
| cli/scripts/release-build.sh | Embeds skill assets into release binaries. |
| cli/scripts/install.ps1.test.ts | Tests installation paths and PATH guidance. |
| cli/scripts/install.ps1 | Stages replacement binaries and updates guidance. |
| cli/scripts/install-r2.test.ts | Tests paths and staged installation permissions. |
| cli/scripts/install-r2.sh | Adds explicit permissions and staged replacement. |
| cli/scripts/install-r2.ps1.test.ts | Tests paths, checksums and temporary filenames. |
| cli/scripts/install-r2.ps1 | Hardens downloads and updates installation guidance. |
| cli/scripts/install-cli.test.ts | Tests installation paths and replacement behavior. |
| cli/scripts/install-cli.sh | Stages replacement without executing the binary. |
| cli/bin/dev.js | Marks development execution as noncompiled. |
| cli/ARD.md | Updates skill architecture and example flag. |
| cli/AGENTS.md | Documents local YAML schema conventions. |
| cli/.bun-version | Updates Bun for asset embedding. |
| .github/workflows/cli-release.yml | Adds embedded-skill release smoke checks. |
| .github/workflows/cli-edge.yml | Expands edge-release smoke checks. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
daaac6c to
f071dea
Compare
- the difyctl skill (skills/difyctl) ships inside the binary; `difyctl install skills <dir>` writes it, installers and help point agents at it, and a test lints every command and flag the docs name - login needs --server, agents log in with --no-wait then --resume, not_logged_in names the config folder, and Linux without a DBus session keeps the token in a file - help prints examples as real commands with <arg> and --flag names, input errors name unknown fields, and errors print the server's next steps - CI runs the built binary and checks the skill it installs matches the tree
…hing the error view
…ssing skill its own error code
…, not a test-only option
…f a throwaway error
…ifyctl is on PATH
- Logged out, a word no local command claims is not_logged_in (exit 4); logged in, a path no command or op matches is unknown_op (exit 6). A near miss of a local command stays exit 2. - A 403 keeps the server's hint instead of telling the user to log in. - The unknown_op hint points at difyctl help, not the removed ops command. - A folded run keeps run_id from the stream's workflow_run_id. - A downloaded file keeps only the base name the server sent.
…eplace - All four accept DIFYCTL_INSTALL_DIR and DIFYCTL_PREFIX. - The PowerShell PATH hint reads only the user PATH. - install-r2.sh points Windows users to install-r2.ps1. - install-cli.sh stages the binary and renames it into place. - install-r2.ps1 stops on a missing checksum and uses a unique temp name.
- config.yml, login.yml, tokens.yml and login-pending.yml each have one schema and go through localFile. A read never fails: a bad value falls back to its default with a notice, unknown keys are ignored, and an unusable file reads as empty. A write replaces the whole file, so v1 keys (defaults, state, version) go away. No schema_version. - tokens.yml and the tokens.<host>.<email> keychain entries keep v1's names; v1 files read in place. - The catalog moves into the config folder. DIFY_CACHE_DIR is gone and prints a notice when still set. - A held file lock waits up to 5s instead of failing parallel runs. - Setting v1's DIFY_HOST without DIFY_SERVER names the rename. - config_schema_unsupported is removed.
…l files Update the difyctl skill (operations, plugins, setup) and the README for the changes above.
… a failed catalog load
…ver run the binary after
…e one set of file modes
Windows filesystems keep no executable bit, so test -x on the installed binary always failed there.
…space list `use workspace` now looks the id up with describe.workspace and saves the pin only for a workspace the account belongs to. The skill and README say the pin is difyctl's own and that `describe workspace` with no id shows it.
…own pending login logout checked for an env login after deleting the pending --no-wait login, so a refused logout still dropped it. login --resume deleted the pending file whatever it held, so an overlapping login lost the code it had just saved. The pending login is now removed only while it still holds the resumed code, read and removed under one file lock.
…int names --server - install-cli.sh stages the binary as 0755, as install-r2.sh does: under umask 077 `chmod +x` left 0700 and locked other users out. - The locked-keychain hint suggests `login --server <url> --no-keyring`; login refuses without --server. - Skill: a fail-branch node keeps its usual success handles and adds `fail-branch`; turning the Service API off waits until after the smoke test, which needs it on.
…nstall skills The released v1 binary has no install skills command, so the stable installer would point agents at a missing command until the next Dify release ships v2. The hint now asks the installed binary first and stays quiet when it fails.
543508f to
2f8aca8
Compare
* feat(agent): stream Agent V2 text output in plain runs (langgenius#43986) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * refactor(api): read provider configuration cache rows via pydantic (langgenius#44055) * refactor(web): use Select for the Studio app type filter (langgenius#44070) * refactor(web): model app settings with form primitives (langgenius#44073) * fix(dify-ui): show destructive colors on keyboard focus (langgenius#44079) * ci: require TypeBase for new models (langgenius#44087) Co-authored-by: Codex <codex@openai.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: enable Ruff E721 (langgenius#44096) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff SIM210 (langgenius#44095) Co-authored-by: Codex <codex@openai.com> * fix(web): align API key dialog lifecycle and copy behavior (langgenius#44077) * test(dify-ui): wait for time picker visibility before axe scan (langgenius#44105) * ci: enable Ruff B006 (langgenius#44099) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff FURB152 (langgenius#44091) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff E711 (langgenius#44088) Co-authored-by: Codex <codex@openai.com> * fix(knowledge): only batch-enable segments whose indexing completed (langgenius#44017) * fix(nodejs-client): preserve SSE field value whitespace (langgenius#44083) * fix(api): stage hit-testing query log with flush instead of committing caller session (langgenius#44084) * fix(dify-agent): treat a confirmed-missing Home Snapshot as a success on Enterprise delete (langgenius#44085) Co-authored-by: D41910 <d41910@users.noreply.github.com> * fix(nodejs-client): override default headers case-insensitively (langgenius#44090) * fix(nodejs-client): allow empty keyword filters in list APIs (langgenius#44097) * fix(nodejs-client): replace stale user fields in native upload forms (langgenius#44120) * fix(api): accept MCP protocol version 2025-11-25 (langgenius#44066) * fix(api): compare datasource credentials as JSON on MySQL (langgenius#44039) * fix(structured_output): skip reasoning JSON when selecting output (langgenius#44005) Co-authored-by: crazywoola <427733928@qq.com> * ci: enable Ruff E722 (langgenius#44098) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff UP032 (langgenius#44092) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff B905 (langgenius#44094) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff SIM113 (langgenius#44102) Co-authored-by: Codex <codex@openai.com> * fix(deps): upgrade Next.js to 16.4.1 for October security fixes (langgenius#44127) * docs: record overlay ownership and focus lessons (langgenius#44126) * refactor(workflow): use route identity and Console Query for webhook URLs (langgenius#44135) * refactor(workflow): own preview chat requests with Console Query (langgenius#44136) * perf(rag): reduce knowledge retrieval post-processing overhead (langgenius#43665) * fix(api): fix typos in logger warning and docstrings (langgenius#44134) * refactor(api): enable strict typing for enterprise telemetry exporter tests (langgenius#44138) * refactor(api): enable strict typing for prompt transform tests (langgenius#44139) * ci: enable Ruff TID252 (langgenius#44108) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff B026 (langgenius#44100) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff SIM103 (langgenius#44110) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff FURB113 (langgenius#44109) Co-authored-by: Codex <codex@openai.com> * refactor(tools): remove redundant nested cast in MCP tool (langgenius#44132) * refactor(api): use Pydantic to validate crawl cache key (langgenius#44131) * fix(mcp): collect all tool discovery pages (langgenius#43842) * fix(deps): override fflate to 0.7.5 for CVE-2026-45820 (langgenius#44148) * refactor(web): let layouts own viewport height instead of root h-full chain (langgenius#44143) * refactor(web): centralize AppIcon data and Avatar rendering (langgenius#44149) * fix(agent): fail closed on Landlock errors and require local tokens (langgenius#44152) * chore(deps): bump mako from 1.3.12 to 1.4.2 in /api (langgenius#43607) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump multidict from 6.7.0 to 6.9.1 in /api (langgenius#43610) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump fsspec from 2026.3.0 to 2026.6.0 in /dify-agent (langgenius#43606) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump oauthlib from 3.3.1 to 4.0.0 in /api (langgenius#43257) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump pydantic-ai-slim from 2.31.0 to 2.53.0 in /api (langgenius#43725) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ci: enable Ruff E712 (langgenius#44114) Co-authored-by: Codex <codex@openai.com> * refactor: migrate app tracing queries and harden monitoring configuration (langgenius#44150) * ci: enable Ruff SIM108 (langgenius#44113) Co-authored-by: Codex <codex@openai.com> * refactor(api): remove redundant casts in tencent trace unit tests (langgenius#44158) * fix(api): preserve timestamp ties in message pagination (langgenius#44023) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * fix(web): keep the value selector of a Code node input when regenerating code (langgenius#44075) * fix(e2e): share sandbox auth token across managed runtimes (langgenius#44164) * chore: remove KnowledgeFS and New Knowledge from main (langgenius#44163) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * ci: enable Ruff SIM105 (langgenius#44112) Co-authored-by: Codex <codex@openai.com> * refactor(web): retire the app detail store in favour of the query cache (langgenius#44166) * fix(api): let a removed active member sign in with a re-invite (langgenius#43667) Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Stream <Stream_2@qq.com> * refactor(web): clarify App modes and scope workflow editor resources (langgenius#44171) * chore: mark generated files as linguist-generated (langgenius#44180) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(api): let agents build, configure and ship Dify apps over openapi (langgenius#43067) * ci: enable Ruff B007 (langgenius#44107) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff F821 (langgenius#44101) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff UP007 (langgenius#44106) Co-authored-by: Codex <codex@openai.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: enable Ruff N806 (langgenius#44116) Co-authored-by: Codex <codex@openai.com> * fix: accumulate workflow elapsed time across resumptions (langgenius#44161) * refactor(web): migrate handwritten console API calls to the generated oRPC contract (langgenius#44169) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * chore(deps): bump unstructured from 0.24.0 to 0.24.1 in /dify-agent (langgenius#44189) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(web): normalize collapsible indicator rotation (langgenius#44193) * fix(workflow): generate template-compatible snippet node IDs (langgenius#43838) * fix(api): return protocol errors for unsupported MCP requests (langgenius#44197) * fix(api): align hosted moderation provider validation (langgenius#44200) * feat(api): add inner API for enterprise admin app list and detail (langgenius#44044) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix(dify-ui): let portal order stack overlays so nested modals block clicks (langgenius#44214) * fix(nodejs-client): collect workflow text_chunk and apply message_replace in toText (langgenius#44177) * fix(rag): preserve newlines in recursive character fallback (langgenius#44179) * refactor(web): remove unnecessary type assertions with a migration-only tsslint rule (langgenius#44219) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * refactor: remove redundant TypeScript type aliases (langgenius#44225) * refactor(web): replace straightforward explicit any types (langgenius#44228) * refactor(dify-ui): give AlertDialog a header part and design defaults (langgenius#44223) Co-authored-by: Claude <noreply@anthropic.com> * refactor(web): remove unnecessary use prefixes (langgenius#44231) * fix(web): clear Storybook and file preview lint suppressions (langgenius#44233) * refactor(web): replace explicit any in test fixtures and mocks (langgenius#44235) * refactor(dify-ui): compose dialogs from the Design Kit anatomy (langgenius#44221) * refactor(web): exercise real frontend behavior in tests (langgenius#44243) * chore(web): prefer vinext for frontend development (langgenius#44246) * chore(contracts): upgrade @hey-api/openapi-ts to 0.99.0 (langgenius#44247) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * refactor(dify-ui): scroll dialog bodies and give AlertDialog a body (langgenius#44248) Signed-off-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): align app and agent export feedback (langgenius#44251) * refactor(web): migrate Notion page preview to Console Query (langgenius#44252) * test(web): include untested sources in coverage (langgenius#44254) * test(web): replace low-value suites with behavioral coverage (langgenius#44260) * fix(api): preserve published triggers on draft sync (langgenius#44068) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * fix: don't stringify list values for union-typed MCP tool parameters (langgenius#44182) Co-authored-by: Stream <Stream_2@qq.com> * fix(cli): observe SSE read failures while consumers process events (langgenius#43943) Co-authored-by: huyengiang101086-spec <270684046+huyengiang101086-spec@users.noreply.github.com> * fix(skills): preserve PPTX presentation slide order (langgenius#43893) Co-authored-by: LimbC-C <329404569+LimbC-C@users.noreply.github.com> * fix(dify): retry failed archive deletion instead of reporting success (langgenius#44061) Co-authored-by: Stream <Stream_2@qq.com> * refactor(api): enable strict typing for tasks unit tests (langgenius#44255) * refactor(api): enable strict typing for easy UI app config manager tests (langgenius#44244) * test(web): consolidate suites around real feature behavior (langgenius#44274) * fix(web): separate app dialog group and control labels (langgenius#44261) Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> * fix(ops): bind tracing service accounts to the app workspace (langgenius#44208) * refactor(api): enable strict typing for libs unit tests (langgenius#44276) * refactor(ui): clarify dialog header close button anatomy (langgenius#44283) * fix(plugins): align provider overlays and background update feedback (langgenius#44284) * fix(web): merge parallel tool results into their own agent thoughts (langgenius#43843) Co-authored-by: Stream <Stream_2@qq.com> * test(web): exercise real workflow canvas controls and note actions (langgenius#44287) * test(web): cover node context menu clicks and drop hooks-store facade mocks (langgenius#44288) * fix(web): label the Notion page search field (langgenius#44290) * ci: enable Ruff B903 (langgenius#44117) Co-authored-by: Codex <codex@openai.com> * refactor(web): migrate Mermaid diagrams to Pele (langgenius#44293) * fix(tests): satisfy Ruff B903 for hit-test fake (langgenius#44299) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * refactor(api): enable strict typing for configs unit tests (langgenius#44294) Co-authored-by: Asuka Minato <i@asukaminato.eu.org> * refactor(api): bring vector store provider sources under type checking (langgenius#44237) Co-authored-by: Asuka Minato <i@asukaminato.eu.org> * ci: enable Ruff PT011 (langgenius#44122) Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff E402 (langgenius#44123) Co-authored-by: Codex <codex@openai.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * refactor: migrate Dataset to TypeBase (langgenius#40817) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Codex <codex@openai.com> * ci: enable Ruff F841 (langgenius#44115) Co-authored-by: Codex <codex@openai.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix: honor RTF Unicode fallback lengths in skill attachments (langgenius#43789) Co-authored-by: LimbC-C <329404569+LimbC-C@users.noreply.github.com> * chore(deps): bump patch and minor pnpm catalog dependencies (langgenius#44319) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore(deps): drop unused postcss-selector-parser overrides (langgenius#43292) * fix: preserve DOCX paragraph text in skill attachments (langgenius#43718) Co-authored-by: LimbC-C <329404569+LimbC-C@users.noreply.github.com> * feat(cli): let agents build Dify apps with difyctl and an embedded skill (langgenius#43819) * refactor(api): enable strict typing for easy UI dataset and prompt template tests (langgenius#44320) * fix(api): require a Tencent vector database name and type-check the provider (langgenius#44325) * fix(web): open command menu instantly with a lighter backdrop (langgenius#44330) * fix(cli): serialize token file updates (langgenius#44329) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * fix(web): parse destructured and multi-line main signatures in Code node (langgenius#44046) Co-authored-by: Stream <Stream_2@qq.com> * refactor(web): simplify Mermaid preview layout and interactions (langgenius#44335) * fix(web): stabilize Logs loading and conversation dialogs (langgenius#44338) * fix(web): improve app access point accessibility (langgenius#44220) Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com> * fix(vdb): restore TiDB on Qdrant full-text query filtering (langgenius#44339) * fix(web): remove redundant plugin permission success toast (langgenius#44342) * fix(web): handle default model form submission feedback (langgenius#44345) * fix(web): save the shown timezone on new schedule trigger nodes (langgenius#43532) * test(web): exercise variable assignment with real workflow stores (langgenius#44349) * fix(api): initialize default LLMs during onboarding (langgenius#44350) * fix: replace str(e) with generic messages in error responses (langgenius#43049) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: enable Ruff B904 (langgenius#44121) Co-authored-by: Codex <codex@openai.com> Co-authored-by: hjlarry <hjlarry@163.com> * refactor(api): enable strict typing for tool encryption tests (langgenius#44348) * refactor(api): enable strict typing for data source auth tests (langgenius#44347) * refactor(workflow): adopt Graphon 0.8 execution orchestration (langgenius#40277) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * test(web): verify canvas updates and debounced variable edits (langgenius#44361) * refactor(api): enable strict typing for file fetcher, common controller and app factory tests (langgenius#44379) * refactor(api): enable strict typing for unstructured extractor tests (langgenius#44380) * fix(vdb): balance multi-keyword Qdrant results (langgenius#44352) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * fix(cli): accept BOM-prefixed JSON input (langgenius#44386) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * chore(deps): bump aiohttp from 3.14.3 to 3.14.4 in /api (langgenius#44387) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> * refactor(api): enable strict typing for remaining libs unit tests (langgenius#44388) * refactor(api): enable strict typing for storage unit tests (langgenius#44389) * feat: add reusable network access group APIs (langgenius#41025) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: hjlarry <hjlarry@163.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> * feat: confirm clearing default models and refresh values on open (langgenius#44354) Co-authored-by: yyh <yuanyouhuilyz@gmail.com> * fix(cli): change local YAML files only through a locked update (langgenius#44375) * chore(i18n): sync translations with en-US (langgenius#44397) Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> * fix: retain model selector focus after clearing defaults (langgenius#44399) * fix(dataset): batch segment and document cleanup with retries (langgenius#38519) Co-authored-by: hjlarry <hjlarry@163.com> * test(web): exercise workflow actions against real stores (langgenius#44381) * fix(web): upgrade TanStack Hotkeys and isolate search commands (langgenius#44401) * fix(web): parse Python Code node parameters with commas (langgenius#44337) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * refactor(tooling): centralize lint and format maintenance (langgenius#44404) * refactor(web): unify app metadata forms and dialog ownership (langgenius#44405) * refactor(tooling): migrate remaining sources to TypeScript (langgenius#44410) * fix(web): improve app deploy accessibility (langgenius#44378) Co-authored-by: yyh <yuanyouhuilyz@gmail.com> * fix(e2e): seed workspace defaults and refresh post-merge filters (langgenius#44412) * chore: add frontend code owner backups and refresh coverage (langgenius#44413) * fix(agent): finalize run as failed when run_started cannot be appended (langgenius#43959) * refactor(web): use generated oRPC query keys (langgenius#44415) * fix: keep archive deletion loading until completion (langgenius#44203) * refactor(web): remove redundant annotation list success toasts (langgenius#44031) * fix(web): apply log annotations to the displayed branch (langgenius#43238) * feat: optimize access token ui (langgenius#44422) * fix(agent): use Redis 6.0-compatible event replay (langgenius#44420) * test(api): isolate Celery initialization app state (langgenius#44433) * refactor(web): migrate console API helpers to generated contracts (langgenius#44430) * refactor(web): query installation bootstrap status (langgenius#44382) * fix(workflow): track human input forms by execution identity (langgenius#42819) * refactor(api): enable strict typing for rate limit test fixtures (langgenius#44391) * refactor(api): enable strict typing for core helper tests (langgenius#44390) * chore(web): guard handwritten requests with native lint rules (langgenius#44436) * fix(nodejs-client): reject streamed API errors in toText (langgenius#44199) Co-authored-by: Stream <Stream_2@qq.com> * fix(cli): load PowerShell module in rate-limit test (langgenius#44439) * fix(api): write built-in document metadata in a single format (langgenius#44218) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Stream <Stream_2@qq.com> * feat(workflow): execute workflow tools as nested containers (langgenius#42820) Co-authored-by: WH-2099 <wh2099@pm.me> * feat(workflow): expose authorized nested tool traces (langgenius#42821) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * feat(workflow): add nested tool trace drilldown (langgenius#42822) * fix(tracing): exclude called tool internals from external exports (langgenius#42823) * chore(web): replace deprecated third-party APIs (langgenius#44466) * fix(plugin): pin daemon dispatches to package identifiers (langgenius#44396) * fix(web): enforce schema depth limits through nested arrays (langgenius#44295) * feat: network access group add rbac check (langgenius#44464) * fix(api): validate builtin tool credentials outside the create lock (langgenius#44371) Co-authored-by: Stream <Stream_2@qq.com> * fix(trigger): stop leaking internal exception text from webhook 500 responses (langgenius#44395) Co-authored-by: Stream <Stream_2@qq.com> * fix(web): preserve Studio list filters across navigation (langgenius#44429) Co-authored-by: Stream <Stream_2@qq.com> * test(web): wait for goto-anything focus (langgenius#44454) Co-authored-by: mac <mac@macdeMacBook-Pro.local> * test(web): exercise workflow configuration and controls with real stores (langgenius#44471) * test(web): exercise workflow controls and access points through real owners (langgenius#44423) * fix(agent): attribute nested tool activity to its source (langgenius#42824) * fix(cli): respect cancellation during device authorization retries (langgenius#44315) Co-authored-by: huyengiang101086-spec <270684046+huyengiang101086-spec@users.noreply.github.com> * feat(cli): send a folder as one part per file (langgenius#44356) Co-authored-by: yunlu.wen <yunlu.wen@dify.ai> * fix(web): handle autofilled Web App login credentials (langgenius#44474) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(api): handle non-object JSON auth error bodies (langgenius#44470) * refactor: migrate agent models to TypeBase (langgenius#40816) Co-authored-by: Codex <codex@openai.com> * refactor(api): type-check vector store provider unit tests (langgenius#44458) * refactor(api): enable strict typing for utils unit tests (langgenius#44331) * test(web): replace node action mocks with real canvas behavior (langgenius#44495) * fix(web): enforce focus style ownership and simplify invite recipients (langgenius#44504) * fix: improve customization settings accessibility (langgenius#44492) * fix(web): label workspace default model selectors (langgenius#44500) * refactor(ui): split toast stories and align app toaster naming (langgenius#44510) * chore(weaviate): bump bundled Weaviate to 1.39.13 (CVE-2026-111943) (langgenius#44508) * chore: bump Node.js runtime to 24.22.1 (langgenius#44511) * feat(tracing): export Agent app and Workflow Agent execution trees (langgenius#44144) Co-authored-by: yyh <yuanyouhuilyz@gmail.com> * feat(tracing): configure Agent tracing and link workflow runs to traces (langgenius#44186) Co-authored-by: Yansong Zhang <916125788@qq.com> * fix(web): make document metadata panel scrollable (langgenius#43621) * test: split Build exit scenarios to reduce timeout flakiness (langgenius#44519) * chore(web): improve Billing settings accessibility (langgenius#44487) Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> * fix(deps): upgrade certifi and pillow (langgenius#44524) * refactor(api): detach console app trigger management (langgenius#44457) * refactor(web): highlight markdown code blocks with @pierre/highlights (langgenius#44522) * fix(api): enforce cloud app quotas on DSL imports (langgenius#44525) * perf(api): skip saved prompts when loading chat history (langgenius#44521) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * chore: improve Members settings accessibility (langgenius#44484) * fix(web): preserve inline agent layout and clarify configure ownership (langgenius#44534) Co-authored-by: hjlarry <hjlarry@163.com> * fix: improve archived logs accessibility (langgenius#44535) Co-authored-by: yyh <yuanyouhuilyz@gmail.com> * fix: improve Preferences accessibility (langgenius#44539) * fix: improve IP Policies accessibility (langgenius#44548) * fix: preserve knowledge sidebar when adding files (langgenius#44552) * fix: improve sort control accessibility and type safety (langgenius#44564) * chore: type-check with tsrs (langgenius#44562) * fix(api): stop leaking Redis result connections from fire-and-forget groups (langgenius#44551) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(api): upgrade NLTK to 3.10.4 (langgenius#44581) * feat(agent): edit config prompts through the sandbox CLI (langgenius#44561) * chore: port Document to TypeBase (langgenius#36084) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Codex <codex@openai.com> * feat: KnowledgeFS and New Knowledge (langgenius#44165) Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: hjlarry <hjlarry@163.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: zhaohao1004 <zhaohao1004@gmail.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: FFXN <lizy@dify.ai> * refactor: migrate CustomizedSnippet to TypeBase (langgenius#40818) Co-authored-by: Codex <codex@openai.com> * fix(php-sdk): preserve custom API base URL paths (langgenius#44569) * fix(api): combine UTF-16 surrogate pairs in RTF extraction (langgenius#44565) Co-authored-by: jayachandra2003 <jayachandravennam.jc@email.com> * chore(i18n): sync translations with en-US (langgenius#44566) Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> * refactor(ui): align floating positioning with Base UI (langgenius#44588) * chore(i18n): sync translations with en-US (langgenius#44595) Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> * chore(deps): bump certifi from 2026.4.22 to 2026.10.19 in /dify-agent (langgenius#44462) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(web): avoid redundant document enable success toast (langgenius#44594) * test(web): replace workflow owner doubles with real canvas behavior (langgenius#44590) * chore(release): prepare version 1.18.0 (langgenius#44546) * Exclude generated Vercel deployment cache from source checks --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: gongfpp <1360187968@qq.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Codex <codex@openai.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: D41910 <158550716+D41910@users.noreply.github.com> Co-authored-by: D41910 <d41910@users.noreply.github.com> Co-authored-by: leilei3167 <imleilei123@gmail.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Shreyansh Jain <shreyanshjain646@gmail.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Power <26699525@qq.com> Co-authored-by: Eddy ZHANG <eddy.zhang24@gmail.com> Co-authored-by: Lokesh Chauhan <lokesh0186@gmail.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com> Co-authored-by: 盐粒 Yanli <yanli@dify.ai> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Azusa010 <m3171470760@gmail.com> Co-authored-by: mika <spacexstarship01@outlook.com> Co-authored-by: mac <mac@macdeMacBook-Pro.local> Co-authored-by: Yueliup <127648758+Yueliup@users.noreply.github.com> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Matt Van Horn <mvanhorn@users.noreply.github.com> Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Stream <Stream_2@qq.com> Co-authored-by: 林玮 (Jade Lin) <linw1995@icloud.com> Co-authored-by: xjh <87483213+xiajiahang@users.noreply.github.com> Co-authored-by: Temitope Kadri <147322025+TemitopeKadri@users.noreply.github.com> Co-authored-by: lorenzozane <w2898683706@gmail.com> Co-authored-by: Yann Roberto <165009858+shoyann@users.noreply.github.com> Co-authored-by: David Allada <davidanilallada@gmail.com> Co-authored-by: huyengiang101086-spec <huyengiang101086@gmail.com> Co-authored-by: huyengiang101086-spec <270684046+huyengiang101086-spec@users.noreply.github.com> Co-authored-by: LimbC-C <limbcc2333@gmail.com> Co-authored-by: LimbC-C <329404569+LimbC-C@users.noreply.github.com> Co-authored-by: CRYPTONIKAV <29835619+CRYPTONIKAV@users.noreply.github.com> Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Co-authored-by: Liu Ziming <liuziming.lzm@alibaba-inc.com> Co-authored-by: Metehan Biçer <metehanbicer006@gmail.com> Co-authored-by: mechmaster20 <srujan.gowni@iitgn.ac.in> Co-authored-by: Denis Ermakov <ide404@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: Juhyuk choi <246447183+JHC56@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: zyssyz123 <916125788@qq.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Alexey Shabalin <a.shabalin@gmail.com> Co-authored-by: Codada <108800975+Redestiny@users.noreply.github.com> Co-authored-by: wangxiaolei <fatelei@gmail.com> Co-authored-by: 青阳寻雪 <142769065+lulalalual@users.noreply.github.com> Co-authored-by: Tianyu Cai <cai18633758993@gmail.com> Co-authored-by: WH-2099 <wh2099@pm.me> Co-authored-by: Miyar <14232275+gakugaku@users.noreply.github.com> Co-authored-by: xhdnoah <40939515+xhdnoah@users.noreply.github.com> Co-authored-by: Duda Nogueira <dudanogueira@gmail.com> Co-authored-by: zhsama <torvalds@linux.do> Co-authored-by: Mesrop Harutyunyan <104313591+mesrop2008@users.noreply.github.com> Co-authored-by: Takuya <83127305+Takuya-ops@users.noreply.github.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: zhaohao1004 <zhaohao1004@gmail.com> Co-authored-by: FFXN <lizy@dify.ai> Co-authored-by: Winoren <158550716+Winoren@users.noreply.github.com> Co-authored-by: Jaya Chandra Vennam <149901816+jayachandra2003@users.noreply.github.com> Co-authored-by: jayachandra2003 <jayachandravennam.jc@email.com> Co-authored-by: ZengLiangliang <zll21377105@126.com> Co-authored-by: Alec Whitters <alecwhitters@Alecs-MacBook-Pro-26.local>


Summary
difyctl side of letting an agent build, test and ship a Workflow or Chatflow app. Stacked on #43067, which adds the server ops; merge after it. This branch carries #43067's merge of main.
Skill in the binary
difyctlskill (one linked tree underskills/difyctl/) ships inside the binary (Bun 1.4--asset).difyctl install skills <dir>writes it; installers and help tell agents to run it.Login for agents and sandboxes
loginneeds--server; there is no default server.--no-wait, then--resumeafter the user approves.--resumealso reports an existing login.not_logged_innames the config folder it checked.tokens.yml.Help and errors
<arg>and--flagnames and union types.next:lines.Install and local files
--outputnames it (exit 2usage_missing_arg).config.yml,tokens.yml) are read field by field against one schema: a bad or missing field falls back to its default with a notice, unknown keys are ignored. v1 leftovers are ignored in place.catalog_unavailableinstead ofunknown_op.Verified:
pnpm test, type check and lint pass. Run against an Enterprise dev server with a DeepSeek-driven agent building and testing a workflow app.Release note
v2 doesn't read v1's login. After upgrading, run
difyctl login --server <url>again. Old v1 sessions expire on the server by themselves.v1's
use workspaceno longer works on this server: the server switch it calls is removed. Upgrade to v2, which pins the workspace on the device.Screenshots
N/A (CLI)
Checklist
make lint && make type-check(backend) andvp staged(frontend) to appease the lint gods