kiki-agent-lite 0.3.1 → 0.3.2
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 +13 -10
- package/dist/docs/en/configuration/config-files.md +63 -20
- package/dist/docs/en/configuration/data-locations.md +12 -4
- package/dist/docs/en/configuration/env-vars.md +4 -6
- package/dist/docs/en/configuration/overrides.md +13 -14
- package/dist/docs/en/configuration/providers.md +8 -6
- package/dist/docs/en/customization/agent-profiles.md +33 -38
- package/dist/docs/en/customization/agents.md +129 -107
- package/dist/docs/en/customization/hooks.md +41 -48
- package/dist/docs/en/customization/personas.md +19 -21
- package/dist/docs/en/customization/plugins.md +180 -156
- package/dist/docs/en/customization/prompt-fields.md +10 -6
- package/dist/docs/en/customization/skills.md +11 -13
- package/dist/docs/en/customization/skins.md +23 -27
- package/dist/docs/en/customization/themes.md +15 -15
- package/dist/docs/en/features/agents.md +85 -0
- package/dist/docs/en/features/daily.md +37 -7
- package/dist/docs/en/features/ecosystem.md +3 -1
- package/dist/docs/en/features/extend.md +7 -1
- package/dist/docs/en/features/freedom.md +4 -0
- package/dist/docs/en/features/index.md +6 -5
- package/dist/docs/en/features/long-work.md +23 -5
- package/dist/docs/en/features/look.md +1 -1
- package/dist/docs/en/features/people.md +10 -2
- package/dist/docs/en/features/spaces.md +16 -4
- package/dist/docs/en/features/workbench.md +11 -3
- package/dist/docs/en/getting-started/desktop-app.md +44 -29
- package/dist/docs/en/getting-started/first-launch.md +32 -21
- package/dist/docs/en/getting-started/installation.md +27 -12
- package/dist/docs/en/getting-started/use-cases.md +35 -35
- package/dist/docs/en/guides/goals.md +9 -7
- package/dist/docs/en/guides/interaction.md +26 -26
- package/dist/docs/en/guides/interface.md +18 -14
- package/dist/docs/en/guides/memory.md +43 -14
- package/dist/docs/en/guides/sessions.md +32 -26
- package/dist/docs/en/guides/settings.md +60 -29
- package/dist/docs/en/index.md +8 -2
- package/dist/docs/en/reference/command.md +8 -4
- package/dist/docs/en/reference/keyboard.md +18 -4
- package/dist/docs/en/reference/model-vocabulary.md +6 -8
- package/dist/docs/en/reference/slash-commands.md +4 -4
- package/dist/docs/en/reference/tools.md +92 -15
- package/dist/docs/en/release-notes/changelog.md +1 -9
- package/dist/docs/en/server/acp.md +1 -1
- package/dist/docs/en/server/ide.md +1 -1
- package/dist/docs/en/server/local-server.md +5 -5
- package/dist/docs/en/server/mcp.md +2 -2
- package/dist/docs/en/server/rest-api.md +79 -5
- package/dist/docs/en/server/sdk.md +2 -2
- package/dist/docs/zh/configuration/config-files.md +56 -15
- package/dist/docs/zh/configuration/data-locations.md +12 -4
- package/dist/docs/zh/configuration/env-vars.md +4 -6
- package/dist/docs/zh/configuration/overrides.md +13 -14
- package/dist/docs/zh/configuration/providers.md +7 -5
- package/dist/docs/zh/customization/agent-profiles.md +31 -36
- package/dist/docs/zh/customization/agents.md +120 -98
- package/dist/docs/zh/customization/hooks.md +35 -42
- package/dist/docs/zh/customization/personas.md +16 -18
- package/dist/docs/zh/customization/plugins.md +167 -142
- package/dist/docs/zh/customization/prompt-fields.md +9 -5
- package/dist/docs/zh/customization/skills.md +10 -12
- package/dist/docs/zh/customization/skins.md +19 -23
- package/dist/docs/zh/customization/themes.md +12 -12
- package/dist/docs/zh/features/agents.md +85 -0
- package/dist/docs/zh/features/daily.md +37 -7
- package/dist/docs/zh/features/ecosystem.md +3 -1
- package/dist/docs/zh/features/extend.md +7 -1
- package/dist/docs/zh/features/freedom.md +4 -0
- package/dist/docs/zh/features/index.md +6 -5
- package/dist/docs/zh/features/long-work.md +22 -4
- package/dist/docs/zh/features/look.md +1 -1
- package/dist/docs/zh/features/people.md +10 -2
- package/dist/docs/zh/features/spaces.md +15 -3
- package/dist/docs/zh/features/workbench.md +11 -3
- package/dist/docs/zh/getting-started/desktop-app.md +43 -28
- package/dist/docs/zh/getting-started/first-launch.md +32 -21
- package/dist/docs/zh/getting-started/installation.md +26 -11
- package/dist/docs/zh/getting-started/use-cases.md +35 -37
- package/dist/docs/zh/guides/goals.md +8 -8
- package/dist/docs/zh/guides/interaction.md +25 -25
- package/dist/docs/zh/guides/interface.md +18 -14
- package/dist/docs/zh/guides/memory.md +43 -14
- package/dist/docs/zh/guides/sessions.md +30 -24
- package/dist/docs/zh/guides/settings.md +54 -23
- package/dist/docs/zh/index.md +7 -1
- package/dist/docs/zh/reference/command.md +7 -3
- package/dist/docs/zh/reference/keyboard.md +18 -4
- package/dist/docs/zh/reference/model-vocabulary.md +6 -8
- package/dist/docs/zh/reference/slash-commands.md +3 -3
- package/dist/docs/zh/reference/tools.md +74 -9
- package/dist/docs/zh/release-notes/changelog.md +1 -9
- package/dist/docs/zh/server/acp.md +1 -1
- package/dist/docs/zh/server/ide.md +1 -1
- package/dist/docs/zh/server/local-server.md +5 -5
- package/dist/docs/zh/server/mcp.md +2 -2
- package/dist/docs/zh/server/rest-api.md +69 -1
- package/dist/docs/zh/server/sdk.md +2 -2
- package/dist/main.mjs +12545 -3456
- package/dist/web/assets/AppErrorBoundary-RFIAb-Uf.js +1 -0
- package/dist/web/assets/NavScopeBoundary-DY_ET7A-.js +1 -0
- package/dist/web/assets/{arc-y2SkSoyr.js → arc-CMgTB1m7.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-uCwLz53m.js → architectureDiagram-3BPJPVTR-BU79ou2C.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-BZyWv36G.js → blockDiagram-GPEHLZMM-Bkuldod2.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-DKGx9i50.js → c4Diagram-AAUBKEIU-C3WMeqyu.js} +1 -1
- package/dist/web/assets/channel-DpDZUJRn.js +1 -0
- package/dist/web/assets/{chunk-2J33WTMH-CSkrhrsp.js → chunk-2J33WTMH-CesyWmwo.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-CtxMoJ68.js → chunk-4BX2VUAB-C7rghYTf.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-Dos3ftEy.js → chunk-55IACEB6-BqRHhwtz.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-wbzEYK9z.js → chunk-727SXJPM-BhSqCRBc.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-B9GKvCD6.js → chunk-AQP2D5EJ-DdYE2ZVZ.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-u5Y2P6IX.js → chunk-FMBD7UC4-BCRPUxDF.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-B8rFKkTV.js → chunk-ND2GUHAM-CuvyDjTR.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-EQsKtuD-.js → chunk-QZHKN3VN-BU5vAS78.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-Bju1GfNu.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-Bju1GfNu.js +1 -0
- package/dist/web/assets/client-C0oH7-8r.js +2 -0
- package/dist/web/assets/connection-BhO2nh7P.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-D6dr5mIW.js → cose-bilkent-S5V4N54A-CXrvsA1a.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-Dnyhc4Hn.js → dagre-BM42HDAG-TaAea3Rt.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CYXkWdne.js → diagram-2AECGRRQ-CdEH4jGt.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-DPwBf5Ag.js → diagram-5GNKFQAL-A0jZ_p-T.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-DNeLYZ8X.js → diagram-KO2AKTUF-miHWORz3.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-zU8RsQTX.js → diagram-LMA3HP47-BlUIwEIg.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-Cf9Mm94H.js → diagram-OG6HWLK6-DwDzMhEg.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-Ch4CeiUI.js → erDiagram-TEJ5UH35-BJr5w62i.js} +1 -1
- package/dist/web/assets/export-BlxaZKEe.js +2 -0
- package/dist/web/assets/{flowDiagram-I6XJVG4X-Csn6WqEH.js → flowDiagram-I6XJVG4X-BP7KSFjx.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-DsuBgEyu.js → ganttDiagram-6RSMTGT7-BstLBBof.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-CPA7jCxU.js → gitGraphDiagram-PVQCEYII-C57s7nZ-.js} +1 -1
- package/dist/web/assets/highlighted-body-OFNGDK62-BVb-7KsA.js +1 -0
- package/dist/web/assets/index-69qhvTvD.js +1 -0
- package/dist/web/assets/{index-BYUHmd8w.js → index-BDNM6yJI.js} +2 -2
- package/dist/web/assets/{index-BGgZxlEQ.js → index-BJF_gEDs.js} +2 -2
- package/dist/web/assets/index-BOwMP6BP.js +1 -0
- package/dist/web/assets/{index-C69a5Mcz.js → index-BZsyXCqm.js} +1 -1
- package/dist/web/assets/{index-C7EA7a_g.js → index-Bfl4JiNq.js} +2 -2
- package/dist/web/assets/index-BlD3AKX-.js +1 -0
- package/dist/web/assets/{index-CIymCfcP.js → index-BnvW0EvQ.js} +1 -1
- package/dist/web/assets/index-C4rmWyOm.js +1 -0
- package/dist/web/assets/index-CGLcb3HY.js +1 -0
- package/dist/web/assets/{index-kWBxPqIX.js → index-CPvOeQPX.js} +1 -1
- package/dist/web/assets/index-Cjbe0JKM.js +1 -0
- package/dist/web/assets/index-CmYoJWUm.js +1 -0
- package/dist/web/assets/index-CtUFrjKe.js +1 -0
- package/dist/web/assets/index-DDvDRMTK.js +1 -0
- package/dist/web/assets/index-DSpndwAR.css +1 -0
- package/dist/web/assets/index-D_JjTHxi.js +1 -0
- package/dist/web/assets/index-DbuwcnbT.js +1 -0
- package/dist/web/assets/index-DcXyS0nN.js +1 -0
- package/dist/web/assets/index-Dcl9ruKA.js +1 -0
- package/dist/web/assets/index-DgwALPNA.js +121 -0
- package/dist/web/assets/{index-DoN1FTEe.js → index-DkE8hRT1.js} +2 -2
- package/dist/web/assets/index-DsyRBZ4h.js +1 -0
- package/dist/web/assets/{index-29zav3JI.js → index-DuudNhLL.js} +4 -4
- package/dist/web/assets/index-Gc4F0b2f.js +1 -0
- package/dist/web/assets/index-HGqqwKoV.js +13 -0
- package/dist/web/assets/index-KchrJnno.js +3 -0
- package/dist/web/assets/{index-B0KNSyji.js → index-Tmi2BPYU.js} +1 -1
- package/dist/web/assets/index-Ya4GuDs0.js +1 -0
- package/dist/web/assets/index-_aDaKqLB.js +1 -0
- package/dist/web/assets/index-_qwOAotB.js +1 -0
- package/dist/web/assets/index-hnIkczza.js +7 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-D3Q__m62.js → infoDiagram-5YYISTIA-CifuVY6C.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-CcvCBuZ5.js → ishikawaDiagram-YF4QCWOH-Cd60vQUi.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-COZU4LNt.js → journeyDiagram-JHISSGLW-Cb3Xl_wl.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-BrXjBoAU.js → kanban-definition-UN3LZRKU-Ei6ThuZt.js} +1 -1
- package/dist/web/assets/{linear-BgP1STFi.js → linear-CDZJx-o2.js} +1 -1
- package/dist/web/assets/mermaid-GHXKKRXX-DFxyxD7G.js +331 -0
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CgjSrE5r.js → mindmap-definition-RKZ34NQL-B0ygxzkx.js} +1 -1
- package/dist/web/assets/navViewState-Ck_HK-TK.js +1 -0
- package/dist/web/assets/{pieDiagram-4H26LBE5-DTfe1sKA.js → pieDiagram-4H26LBE5-B2FdrvDv.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-D95hfh0q.js → quadrantDiagram-W4KKPZXB-CwpOTy3d.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-DtSLi7Mh.js → requirementDiagram-4Y6WPE33-ExdZNzLQ.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-gi_dJpcU.js → sankeyDiagram-5OEKKPKP-u0EZKD7D.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DKQ9a72t.js → sequenceDiagram-3UESZ5HK-BXHMy5DY.js} +1 -1
- package/dist/web/assets/{spaces-B2Ccyh_T.js → spaces-C8n7xQPx.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-Bz7tmSqa.js → stateDiagram-AJRCARHV-DMXx7ell.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Bydq1_By.js +1 -0
- package/dist/web/assets/theme-BBnHttAf.js +1 -0
- package/dist/web/assets/{timeline-definition-PNZ67QCA-BfMXPwhV.js → timeline-definition-PNZ67QCA-DtqVG_4u.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-WLxW2KT5.js → vennDiagram-CIIHVFJN-Dom0ex8r.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-DiiqwIdq.js → wardley-L42UT6IY-C-RstmuQ.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DmCukWuw.js → wardleyDiagram-YWT4CUSO-C8CzNfdf.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-Cfq1W2tT.js → xychartDiagram-2RQKCTM6-1AxVTyB6.js} +1 -1
- package/dist/web/index.html +2 -2
- package/native/auth-native/prebuilds/linux-arm64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/linux-x64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/win32-arm64/auth-native.node +0 -0
- package/native/auth-native/prebuilds/win32-x64/auth-native.node +0 -0
- package/package.json +1 -1
- package/dist/web/assets/AppErrorBoundary-DWpgwxFV.js +0 -1
- package/dist/web/assets/NavScopeBoundary-D8Lf1G0U.js +0 -1
- package/dist/web/assets/channel-BGdXootG.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CPcnLy_H.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CPcnLy_H.js +0 -1
- package/dist/web/assets/client-DSIbyfoz.js +0 -2
- package/dist/web/assets/connection-DYZn9oPZ.js +0 -1
- package/dist/web/assets/export-Bq8ZECqX.js +0 -2
- package/dist/web/assets/highlighted-body-OFNGDK62-CDPBxM_E.js +0 -1
- package/dist/web/assets/index-AksnytJj.js +0 -1
- package/dist/web/assets/index-B8xhhYDh.css +0 -1
- package/dist/web/assets/index-BUrlrKap.js +0 -1
- package/dist/web/assets/index-B_5-HLed.js +0 -62
- package/dist/web/assets/index-BfmoxdpP.js +0 -1
- package/dist/web/assets/index-Bo3e-ohM.js +0 -3
- package/dist/web/assets/index-BrYV9gV_.js +0 -1
- package/dist/web/assets/index-C8XUtAvK.js +0 -1
- package/dist/web/assets/index-C9uil5my.js +0 -13
- package/dist/web/assets/index-CKpWHSp9.js +0 -1
- package/dist/web/assets/index-CLKBgQxV.js +0 -1
- package/dist/web/assets/index-CTyyUNWj.js +0 -7
- package/dist/web/assets/index-D7cg9qYZ.js +0 -1
- package/dist/web/assets/index-D7dg8R_q.js +0 -1
- package/dist/web/assets/index-DCSpedV_.js +0 -1
- package/dist/web/assets/index-DLbD0Nx5.js +0 -1
- package/dist/web/assets/index-DaEzbvvu.js +0 -1
- package/dist/web/assets/index-DhbcjMZF.js +0 -1
- package/dist/web/assets/index-Dw2h88mF.js +0 -1
- package/dist/web/assets/index-FcMtfmKv.js +0 -1
- package/dist/web/assets/index-XFq9Kgg0.js +0 -1
- package/dist/web/assets/index-iI2mM43w.js +0 -1
- package/dist/web/assets/index-oXOF7lko.js +0 -1
- package/dist/web/assets/locale-CANfezJ4.js +0 -17
- package/dist/web/assets/mermaid-GHXKKRXX-_JLagMll.js +0 -321
- package/dist/web/assets/navViewState-DS5LnMYc.js +0 -1
- package/dist/web/assets/settings-CcwMWXbp.js +0 -42
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-D6-wdUbw.js +0 -1
- package/dist/web/assets/theme-DlDhDxeD.js +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Plugins
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A plugin packages reusable Kiki capabilities into one installable unit. A plugin can add [Agent Skills](./skills.md), custom [agents](./agents.md), a Skill loaded automatically at session start, system-prompt instructions, MCP servers that provide real tool capabilities, and another tool's conversation history — as a [Kiki session you can keep working in](#session-history-import) or as a read-only archive. That makes plugins the way to share a workflow with a team, connect to an external service, or install from the [official list](#official-plugins).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install and manage
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`/plugins` opens the plugin manager in the TUI: one panel with four tabs, switched with `Tab` / `Shift-Tab`:
|
|
8
8
|
|
|
9
9
|
- **Installed**: Manage installed plugins
|
|
10
|
-
- **Official**: Kimi
|
|
10
|
+
- **Official**: Marketplace plugins Kiki and Kimi maintain
|
|
11
11
|
- **Curated**: Third-party plugins from Kimi partners in the default marketplace
|
|
12
12
|
- **Custom**: Install from a URL
|
|
13
13
|
|
|
@@ -53,37 +53,36 @@ Network requests only go through `github.com` redirects and `codeload.github.com
|
|
|
53
53
|
|
|
54
54
|
### Installing a plugin that runs code
|
|
55
55
|
|
|
56
|
-
Most of a plugin is declarative: Skills, agents, prompt text, themes, MCP server declarations. A plugin that needs more ships an entry file, and Kiki runs that file as Node.js code with your account's permissions — that is how a plugin reads a folder you point it at or imports a history file.
|
|
56
|
+
Most of a plugin is declarative: Skills, agents, prompt text, themes, MCP server declarations. A plugin that needs more ships an entry file, and Kiki runs that file as Node.js code with your account's permissions — that is how a plugin reads a folder you point it at or imports a history file. That code is not sandboxed; it has the same access you do.
|
|
57
57
|
|
|
58
|
-
Kiki therefore asks
|
|
58
|
+
Kiki therefore asks once per source before installing such a plugin. `/plugins install <source>` reports that it runs trusted code and stops; add `--trust` to consent:
|
|
59
59
|
|
|
60
60
|
```sh
|
|
61
61
|
/plugins install --trust ./my-plugin
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
In the GUI
|
|
64
|
+
In the GUI the install sheet lists what the plugin would add and be able to do, and its button reads **Allow and install** while this consent is needed.
|
|
65
65
|
|
|
66
|
-
The consent is remembered
|
|
66
|
+
The consent is remembered per source, not per file, page or call. Reinstalling or updating from the same source does not ask again, even if its contributions, description or declared permissions changed since you approved; a different source that reuses the same plugin id asks again; and for a GitHub URL the source is `owner/repo`, so switching branch, tag or commit inside that repository does not ask. The one change that does ask is a plugin that starts shipping an entry file it did not have.
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
- A different source that reuses the same plugin id is a new source and asks again.
|
|
70
|
-
- For a GitHub URL, the source is the `owner/repo`, so switching branches, tags, or commits inside that repository does not ask again.
|
|
71
|
-
- One change does ask again: a plugin that had no entry file starts shipping one.
|
|
68
|
+
You are approving the source, not the exact bytes: Kiki fingerprints the plugin folder at the preview and refuses an install whose files changed afterwards. That protects the preview, not later actions — the tool calls a trusted plugin makes still follow your current permission mode and tool rules.
|
|
72
69
|
|
|
73
|
-
|
|
70
|
+
### Things worth knowing
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
- Removing a plugin only deletes the installation record; the managed copy and original source files remain on disk.
|
|
82
|
-
- Plugins are currently installed per-user and apply to all projects; project-level installation scope is not yet supported.
|
|
72
|
+
- **Local edits take effect in the conversation you are already in.** Install once with `/plugins install --trust <path>`, enable with `/plugins enable <id>` (a new plugin starts disabled), then after editing your source run `/plugins install <path>` again with the same path: the managed copy is replaced, the plugin stays enabled, and the tool is available to that conversation as soon as the command returns. No `/plugins reload`, `/reload` or `/new` is needed, and the consented source does not ask for `--trust` again.
|
|
73
|
+
- **An update waits for that plugin's in-flight work.** Running calls finish on the old version and calls arriving during the switch wait and run on the new one. Other plugins keep running untouched, and a call already resolved against an older tool definition asks for a retry instead of running against changed rules.
|
|
74
|
+
- **`/plugins reload` is the global re-read**, of `installed.json` and every managed copy. It never copies from your source directories, so it is not how you pick up a source edit; system-prompt sections and plugin Skills rebuild on their own documented timing (see [System-prompt instructions](#system-prompt-instructions) and [Plugin agents](#plugin-agents)).
|
|
75
|
+
- **Local installs are copied** to `$KIKI_HOME/plugins/managed/<id>/`, and the CLI always runs from that copy. Edit the source and reinstall — editing the managed copy by hand has no update path and a later reinstall overwrites it.
|
|
76
|
+
- **Removing a plugin deletes only the installation record.** The managed copy and your source files stay on disk.
|
|
77
|
+
- **Plugins are installed per user** and apply to every project.
|
|
83
78
|
|
|
84
79
|
### Custom marketplace JSON
|
|
85
80
|
|
|
86
|
-
Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KIKI_PLUGIN_MARKETPLACE_URL`](../configuration/env-vars.md), or configure `[plugins] marketplace_url` in `config.toml
|
|
81
|
+
Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KIKI_PLUGIN_MARKETPLACE_URL`](../configuration/env-vars.md), or configure `[plugins] marketplace_url` in `config.toml`; the command wins over the environment variable, which wins over the config. With no custom source, Kiki uses the official [Kiki Plugins catalog](https://x-t-e-r.github.io/kiki-plugins/marketplace.json). If the catalog cannot be reached, the bundled metadata still lets you browse it; installing a package still needs access to its download URL.
|
|
82
|
+
|
|
83
|
+
Kiki's own plugins — writing, document extraction, media sources, Notion and the rest — are built in a separate [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins), not in the Kiki source tree. That is where their source lives, where you send a change, and what a development checkout points at. Installing from the official catalog is the ordinary route: Kiki downloads the published package and checks it against the SHA256 digest recorded in the catalog, so what runs is the artifact that was released, not whatever a directory happens to contain. A checkout of that repository is only for working on the plugins themselves.
|
|
84
|
+
|
|
85
|
+
Each entry in the `plugins` array needs an `id` and a `source` (local path, zip URL or GitHub URL):
|
|
87
86
|
|
|
88
87
|
```json
|
|
89
88
|
{
|
|
@@ -100,7 +99,7 @@ Pass a marketplace JSON path or URL to `/plugins marketplace <source>`, set [`KI
|
|
|
100
99
|
|
|
101
100
|
## Local document extraction
|
|
102
101
|
|
|
103
|
-
`kiki-documents` converts a local PDF, Office, HTML or text file into Markdown that `Read` and `Grep` can use. Install and enable
|
|
102
|
+
**Kiki Extract** (`kiki-extract`, formerly `kiki-documents`) converts a local PDF, Office, HTML or text file into Markdown that `Read` and `Grep` can use. Install and enable it from the plugin manager, then ask Kiki to extract a file into a new folder and read the result. Everything it needs is bundled — no runtime npm install, no skill checkout. Installing the renamed package replaces an existing `kiki-documents` install rather than sitting beside it, so your existing settings carry over.
|
|
104
103
|
|
|
105
104
|
HTML (`.html`/`.htm`), Markdown and plain text work immediately. Local PDF, DOCX, XLSX/XLS and PPTX need Python 3.10+ with MarkItDown's matching format dependencies on the machine running Kiki. Prepare a virtual environment once:
|
|
106
105
|
|
|
@@ -114,21 +113,21 @@ On Windows, install the formats you need with:
|
|
|
114
113
|
.venv-documents/Scripts/python.exe -m pip install "markitdown[pdf,docx,xlsx,xls,pptx]"
|
|
115
114
|
```
|
|
116
115
|
|
|
117
|
-
On macOS/Linux, use `.venv-documents/bin/python` instead. For PDF only, use `markitdown[pdf]`.
|
|
116
|
+
On macOS/Linux, use `.venv-documents/bin/python` instead. For PDF only, use `markitdown[pdf]`. Point the plugin at that interpreter in **Capabilities → Plugins → Kiki Extract → Settings → Python with MarkItDown** (`pythonPath`); it installs neither Python nor the pip dependencies for you.
|
|
118
117
|
|
|
119
|
-
Each extraction
|
|
118
|
+
Each extraction writes a new output directory with `document.md`, an `extraction.json` recording source, engine and warnings, and whatever assets the engine actually returned. The source is untouched and existing output is never overwritten. The response preview may be shortened and marked `previewTruncated` — read the saved Markdown for the full text. MarkItDown does not export images, and Defuddle does not download linked ones.
|
|
120
119
|
|
|
121
|
-
Auto processing stays local
|
|
120
|
+
Auto processing stays local: nothing is uploaded and no OCR runs. An empty or image-only scan fails rather than being reported as readable, and a partly scanned document can still omit its image-only pages. For cloud OCR, authorize uploading the file to MinerU, set its token in the plugin settings, and select `engine=mineru` with `allowUpload=true`; the service's terms and charges apply, and stopping local waiting does not cancel the remote task. A missing dependency, an unsupported format or a file over the limit returns an error rather than a partial extraction. Input is capped at 50 MiB with a 600-second deadline.
|
|
122
121
|
|
|
123
122
|
## Media Sources
|
|
124
123
|
|
|
125
|
-
A media plugin contributes one or more *sources* — a named provider for images, video
|
|
124
|
+
A media plugin contributes one or more *sources* — a named provider for images, video or speech. Once installed, its sources appear together under **Capabilities → Plugins → Media sources** as one searchable list.
|
|
126
125
|
|
|
127
126
|
### Turning generation on
|
|
128
127
|
|
|
129
|
-
|
|
128
|
+
Starting a new generation is experimental and **off by default**. Everything else here — installing sources, filling in settings, choosing defaults, reading past generations — works either way.
|
|
130
129
|
|
|
131
|
-
Three ways to
|
|
130
|
+
Three ways to enable it, in the order Kiki reads them:
|
|
132
131
|
|
|
133
132
|
- Set `KIKI_EXPERIMENTAL_MEDIA_GENERATION=1` in the environment.
|
|
134
133
|
- Put `media_generation = true` under `[experimental]` in `config.toml`.
|
|
@@ -136,70 +135,97 @@ Three ways to turn it on, in the order Kiki reads them:
|
|
|
136
135
|
|
|
137
136
|
### The list
|
|
138
137
|
|
|
139
|
-
|
|
138
|
+
Each row says which provider it is, which package it came from, and whether it can be used now. The status on the right is one of:
|
|
140
139
|
|
|
141
|
-
- **Ready** — installed, enabled, and
|
|
142
|
-
- **Needs setup** —
|
|
143
|
-
- **Not checked** —
|
|
144
|
-
- **Unavailable** — the package did not load, or you switched it off. Nothing
|
|
140
|
+
- **Ready** — installed, enabled, and its configuration checks out.
|
|
141
|
+
- **Needs setup** — a required setting is missing. Open the row to fill it in.
|
|
142
|
+
- **Not checked** — installed and enabled, but its settings have not been read. Kiki does not read every source just to draw the list, so this is neither a green light nor a warning; open the row to see its settings.
|
|
143
|
+
- **Unavailable** — the package did not load, or you switched it off. Nothing in this row generates until that is fixed.
|
|
145
144
|
- **Blocked** — a job for this provider could not proceed because the package is not loaded. The job is kept, not discarded.
|
|
146
145
|
|
|
147
|
-
Filter by modality (image, video, speech) or
|
|
146
|
+
Filter by modality (image, video, speech) or status, or type to search. The count beside each band is the whole list, not the filtered one, so a filter never hides how much sits behind it.
|
|
148
147
|
|
|
149
148
|
### Configuring a source
|
|
150
149
|
|
|
151
|
-
Open a row
|
|
150
|
+
Open a row for its settings form, which is the package's own settings page: same fields, same secret handling, same save path. A provider's key is a plugin's key.
|
|
152
151
|
|
|
153
152
|
Secrets are write-only. Kiki shows whether a key is stored and never shows the value again; replacing or clearing one is an ordinary edit.
|
|
154
153
|
|
|
155
|
-
A source
|
|
154
|
+
A source is configured one of three ways, and the form says which applies:
|
|
156
155
|
|
|
157
|
-
- **Its own settings.** You supply an API key and, if the provider needs one, a base URL. These
|
|
158
|
-
- **An existing Kiki connection.** If the package declares a connection setting, the form offers the connections you already have. Selecting one is enough — the package's own key and endpoint
|
|
159
|
-
- **Self-managed.** A script
|
|
156
|
+
- **Its own settings.** You supply an API key and, if the provider needs one, a base URL. These are required only while no connection is selected.
|
|
157
|
+
- **An existing Kiki connection.** If the package declares a connection setting, the form offers the connections you already have. Selecting one is enough — the package's own key and endpoint are then neither required nor used. The connection you select has to resolve; Kiki does not fall back to a previously stored key if it cannot.
|
|
158
|
+
- **Self-managed.** A script manages its own credentials through its settings, environment variables or an external file. That is a supported arrangement, and the absence of a key is not a broken provider. Nothing Kiki stores is shown back to you in logs, previews or reports.
|
|
160
159
|
|
|
161
|
-
|
|
160
|
+
An existing connection does not promise that the account behind it can do media work. Kiki shows what the provider reports and keeps no allowlist of which connections support which modality.
|
|
162
161
|
|
|
163
162
|
### Per-modality defaults
|
|
164
163
|
|
|
165
|
-
Three settings on the media entry package pick the default source for images, video and speech. They are ordinary plugin settings
|
|
164
|
+
Three settings on the media entry package pick the default source for images, video and speech. They are ordinary plugin settings stored with the rest of that package's configuration, and a default source says so on its row.
|
|
166
165
|
|
|
167
|
-
|
|
166
|
+
When a modality has no default and exactly one source could serve it, Kiki uses that one. If several could, Kiki asks you to choose rather than picking one and charging you for it.
|
|
168
167
|
|
|
169
168
|
### Recent generations
|
|
170
169
|
|
|
171
|
-
The same page lists
|
|
170
|
+
The same page lists this session's recent media jobs and keeps listing them when generation is off. Each shows its state, and each file that landed has a preview, a download or an in-page player. Two states are worth reading carefully:
|
|
172
171
|
|
|
173
|
-
- **Outcome unknown** — Kiki cannot confirm whether the vendor accepted the submission, so it may still be generating and charging. Nothing is regenerated
|
|
174
|
-
- **Stopped** — Kiki stopped waiting locally. Whether the vendor also stopped, and whether it is still charging, is what the vendor reports
|
|
172
|
+
- **Outcome unknown** — Kiki cannot confirm whether the vendor accepted the submission, so it may still be generating and charging. Nothing is regenerated and no retry is offered, because a retry is a second charge.
|
|
173
|
+
- **Stopped** — Kiki stopped waiting locally. Whether the vendor also stopped, and whether it is still charging, is what the vendor reports, and the row says which.
|
|
175
174
|
|
|
176
|
-
A job that partly finished keeps the files that landed. **Keep fetching** continues
|
|
175
|
+
A job that partly finished keeps the files that landed. **Keep fetching** continues that same job through the session and agent that owns it, and **Stop waiting** does the same; both act only on the session that produced the job.
|
|
177
176
|
|
|
178
177
|
### Discovery sources
|
|
179
178
|
|
|
180
|
-
Where new providers can be discovered from is a different question from which
|
|
179
|
+
Where new providers can be discovered from is a different question from which ones are installed, so it has its own folded section at the bottom. Adding, pausing or removing a discovery source changes nothing about already-installed packages, keys or past jobs.
|
|
181
180
|
|
|
182
181
|
## Official Plugins
|
|
183
182
|
|
|
184
|
-
Official
|
|
183
|
+
The **Official** tab holds seventeen entries. Fifteen are Kiki's own, built in the [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins) and documented on this page:
|
|
184
|
+
|
|
185
|
+
- **[Kiki Writing](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-writing)**, **[Kiki Extract](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-extract)** and **[Kiki Office Suite](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-office)** — the document and writing tools described in [Local document extraction](#local-document-extraction) and below
|
|
186
|
+
- **[Kiki Notion](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-notion)** — connect to Notion's hosted MCP service (see [Notion material and write-back](#notion-material-and-write-back))
|
|
187
|
+
- **[Kiki Media](#media-sources)** and its ten provider plugins — one per image, video and speech provider
|
|
188
|
+
|
|
189
|
+
The two Kimi entries are maintained by Kimi and published on Kimi's own CDN rather than the plugin repository:
|
|
185
190
|
|
|
186
|
-
- **[Kimi Datasource](#kimi-datasource)
|
|
187
|
-
- **[Kimi Browser Extension](#kimi-browser-extension)
|
|
188
|
-
- **[Kimi Computer Use](#kimi-computer-use)**: Let AI operate your desktop apps (macOS and Windows)
|
|
191
|
+
- **[Kimi Datasource](#kimi-datasource)** — query market data, macro indicators, company records, academic literature and Chinese law in natural language
|
|
192
|
+
- **[Kimi Browser Extension](#kimi-browser-extension)** — let AI drive the browser you already use
|
|
189
193
|
|
|
190
|
-
|
|
194
|
+
**[Kimi Computer Use](#kimi-computer-use)** is not in the tab at all; it installs from a direct URL, in its own section below.
|
|
191
195
|
|
|
192
|
-
|
|
196
|
+
**Curated** is separate: three third-party plugins from Kimi partners, each pinned to a specific commit.
|
|
197
|
+
|
|
198
|
+
### Installing and upgrading
|
|
193
199
|
|
|
194
200
|
1. Run `/plugins` and press `Tab` to select **Official**
|
|
195
|
-
2. Find the plugin
|
|
196
|
-
3.
|
|
201
|
+
2. Find the plugin and press `Enter` to install
|
|
202
|
+
3. Run `/reload` or `/new` to activate it
|
|
203
|
+
|
|
204
|
+
Installing downloads the published package and verifies it against the SHA256 digest in the catalog, so a package whose bytes do not match the released artifact is refused rather than installed.
|
|
197
205
|
|
|
198
206
|
::: info Note
|
|
199
|
-
Kimi Browser Extension
|
|
207
|
+
Kimi Browser Extension needs a second step: after the plugin is installed, [install the browser extension](#install-the-browser-extension) too.
|
|
200
208
|
:::
|
|
201
209
|
|
|
202
|
-
Official plugins do not update
|
|
210
|
+
Official plugins do not update on their own. You are prompted the next time you use an out-of-date version, and upgrading means repeating the three steps above.
|
|
211
|
+
|
|
212
|
+
### Working on an official plugin
|
|
213
|
+
|
|
214
|
+
The source for Kiki's own plugins is the [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins), one directory per package under `plugins/official/`. To try a change locally, clone it and install that directory from the repository root:
|
|
215
|
+
|
|
216
|
+
```sh
|
|
217
|
+
git clone https://github.com/X-T-E-R/kiki-plugins
|
|
218
|
+
cd kiki-plugins
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Then, from that root, in Kiki:
|
|
222
|
+
|
|
223
|
+
```sh
|
|
224
|
+
/plugins install --trust ./plugins/official/kiki-notion
|
|
225
|
+
/plugins enable kiki-notion
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
That is an ordinary local install: the package is copied into `$KIKI_HOME/plugins/managed/`, and from then on you edit the checkout and run `/plugins install <same path>` again to push a change in. It is a different thing from installing from the **Official** tab, which downloads the published release. To go back to the released version, install it from the tab again.
|
|
203
229
|
|
|
204
230
|
### Kimi Datasource <Badge type="tip" text="v3.3.0" />
|
|
205
231
|
|
|
@@ -248,7 +274,7 @@ You must first complete OAuth login with a Kimi Code account via `/login`; data
|
|
|
248
274
|
|
|
249
275
|
### Kimi Browser Extension <Badge type="tip" text="v1.11.4" />
|
|
250
276
|
|
|
251
|
-
Kimi Browser Extension lets AI drive
|
|
277
|
+
Kimi Browser Extension lets AI drive the browser you already use, with your own logins and cookies — not an emulator and not a crawler. It can open pages, read content, click, fill in forms and take screenshots, which takes repetitive web work off your hands. The [Kimi Browser Extension site](https://www.kimi.com/features/webbridge) has the product overview.
|
|
252
278
|
|
|
253
279
|
#### Install the browser extension
|
|
254
280
|
|
|
@@ -285,7 +311,7 @@ Use this when you can't reach the stores:
|
|
|
285
311
|
|
|
286
312
|
### Kimi Computer Use <Badge type="tip" text="v0.5.4" />
|
|
287
313
|
|
|
288
|
-
Kimi Computer Use lets AI operate your desktop apps directly
|
|
314
|
+
Kimi Computer Use lets AI operate your desktop apps directly — clicking, dragging, scrolling and typing. On macOS it works in the background without taking over your mouse (a few popup actions may still bring an app forward); [the Windows version](#the-windows-version) behaves differently.
|
|
289
315
|
|
|
290
316
|
#### Authorization (macOS)
|
|
291
317
|
|
|
@@ -300,14 +326,14 @@ Kimi Computer Use authorization window
|
|
|
300
326
|
|
|
301
327
|
</div>
|
|
302
328
|
|
|
303
|
-
####
|
|
329
|
+
#### The Windows version
|
|
304
330
|
|
|
305
|
-
The Windows
|
|
331
|
+
The Windows build (WinCU) installs differently: run `/plugins install https://cdn.kimi.com/kimi-computer-use-windows/latest/kimi-cu-win-plugin.zip` in Kiki and restart afterwards.
|
|
306
332
|
|
|
307
|
-
- **It may briefly take over your mouse and keyboard
|
|
308
|
-
- **
|
|
309
|
-
- **No extra permissions
|
|
310
|
-
- **Matching privilege level
|
|
333
|
+
- **It may briefly take over your mouse and keyboard.** Windows cannot reliably inject input in the background, so it may activate the target window and use your real input while acting.
|
|
334
|
+
- **Requirements:** Windows 10 version 1903 (build 18362) or later, or Windows 11, x64. It needs a real interactive desktop session, so Windows Server requires Desktop Experience.
|
|
335
|
+
- **No extra permissions.** Windows does not need the Accessibility and Screen Recording grants macOS asks for.
|
|
336
|
+
- **Matching privilege level.** If the target app runs as administrator, KimiCU must run at the same level.
|
|
311
337
|
|
|
312
338
|
#### What you can do
|
|
313
339
|
|
|
@@ -318,19 +344,19 @@ The Windows version (WinCU) installs differently from the macOS one: run `/plugi
|
|
|
318
344
|
- **Handle software that has no API**: Plenty of professional tools and internal systems have no CLI or API at all; what used to require your own clicking can now be handed to AI, like trimming the first three seconds off a clip in Final Cut Pro and exporting it
|
|
319
345
|
|
|
320
346
|
::: warning Note
|
|
321
|
-
|
|
347
|
+
Keep payments and transfers, deleting important files, changing passwords and posting content to yourself. A task suits this tool when you can check the result, undo it if it goes wrong, and the cost of a mistake is low.
|
|
322
348
|
:::
|
|
323
349
|
|
|
324
|
-
## Plugin
|
|
350
|
+
## Plugin manifest
|
|
325
351
|
|
|
326
|
-
A plugin is a directory or zip file containing a manifest
|
|
352
|
+
A plugin is a directory or zip file containing a manifest, at either of these locations:
|
|
327
353
|
|
|
328
354
|
```text
|
|
329
355
|
<plugin_root>/kimi.plugin.json
|
|
330
356
|
<plugin_root>/.kimi-plugin/plugin.json
|
|
331
357
|
```
|
|
332
358
|
|
|
333
|
-
|
|
359
|
+
With both present, `kimi.plugin.json` wins.
|
|
334
360
|
|
|
335
361
|
Example:
|
|
336
362
|
|
|
@@ -373,7 +399,7 @@ Unsupported runtime fields such as `tools`, `apps`, `inject`, and `configFile` a
|
|
|
373
399
|
|
|
374
400
|
### System-prompt instructions
|
|
375
401
|
|
|
376
|
-
|
|
402
|
+
`systemPrompt` holds a short inline instruction; `systemPromptPath` keeps longer text in a file inside the plugin root. With both, the inline text comes first and the file follows. The file is read at install or reload, so edits need a `/plugins reload` to apply. For example:
|
|
377
403
|
|
|
378
404
|
```json
|
|
379
405
|
{
|
|
@@ -382,19 +408,17 @@ Use `systemPrompt` for a short inline instruction, or `systemPromptPath` to keep
|
|
|
382
408
|
}
|
|
383
409
|
```
|
|
384
410
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
Each field — the inline `systemPrompt` and the `systemPromptPath` file — is limited to 32 KB (UTF-8 bytes): oversized content is ignored and reported in the plugin diagnostics. Across all enabled plugins, one prompt build injects at most 64 KB of instructions; contributions beyond the budget are skipped with a warning, including a single plugin whose inline text and file together exceed that budget.
|
|
411
|
+
Contributions apply on every surface: the interactive TUI, `kiki -p` and `kiki web`.
|
|
388
412
|
|
|
389
|
-
|
|
413
|
+
Each source is capped at 32 KB (UTF-8 bytes); larger content is ignored and reported in the plugin diagnostics. One prompt build takes at most 64 KB of instructions from all enabled plugins combined, and anything past that is skipped with a warning — including a single plugin whose inline text and file together exceed it.
|
|
390
414
|
|
|
391
|
-
|
|
415
|
+
A new session or agent reads the contributions of the plugins enabled at that moment, while a request already in flight keeps the system prompt it started with. `/plugins reload` refreshes the skill list and asks live agents to rebuild their prompts; installing, enabling, disabling or removing a plugin updates the catalog at once, and a later rebuild — after compaction or a tool-policy change, say — picks up the new sections. A resumed session starts from its persisted prompt and uses the current catalog on later rebuilds. Toggling a plugin's MCP server does not change prompt sections.
|
|
392
416
|
|
|
393
|
-
|
|
417
|
+
The built-in agent prompt includes enabled plugins' instructions automatically. A custom `SYSTEM.md` or agent file owns its own template, so put `${plugin_sections}` where those instructions belong — and if it already includes `${base_prompt}`, which expands to a prompt containing that block, do not add `${plugin_sections}` again. [Custom agents and SYSTEM.md](./agents.md#overriding-the-main-agent-s-system-prompt-with-system-md) has the full variable table.
|
|
394
418
|
|
|
395
|
-
|
|
419
|
+
## Plugin slash commands
|
|
396
420
|
|
|
397
|
-
|
|
421
|
+
A slash command is a prompt you use often, saved so you can trigger it by name. This is a complete example. The plugin directory:
|
|
398
422
|
|
|
399
423
|
```text
|
|
400
424
|
kimi-finance/
|
|
@@ -413,7 +437,7 @@ In the manifest (`kimi.plugin.json`), the `commands` field points to where the c
|
|
|
413
437
|
}
|
|
414
438
|
```
|
|
415
439
|
|
|
416
|
-
|
|
440
|
+
In `commands/report.md`, the block between the two `---` lines is frontmatter (metadata about the command) and everything below is the prompt sent to the agent:
|
|
417
441
|
|
|
418
442
|
```markdown
|
|
419
443
|
---
|
|
@@ -429,32 +453,32 @@ After installing and enabling the plugin, type this in the chat:
|
|
|
429
453
|
/kimi-finance:report TSLA
|
|
430
454
|
```
|
|
431
455
|
|
|
432
|
-
|
|
456
|
+
Kiki replaces `$ARGUMENTS` in the body with `TSLA` and runs the prompt.
|
|
433
457
|
|
|
434
|
-
### Declaring
|
|
458
|
+
### Declaring commands (the `commands` field)
|
|
435
459
|
|
|
436
|
-
`commands` takes
|
|
460
|
+
`commands` takes one `./` path or an array of them, each pointing at a directory or `.md` file inside the plugin root:
|
|
437
461
|
|
|
438
|
-
-
|
|
439
|
-
-
|
|
440
|
-
-
|
|
462
|
+
- A **directory** contributes every `.md` file under it, recursively, one command each.
|
|
463
|
+
- A **single `.md` file** registers just that one.
|
|
464
|
+
- Anything else — a non-`.md` file or a missing path — is reported as a diagnostic in the `/plugins` panel and ignored.
|
|
441
465
|
|
|
442
|
-
### Writing a
|
|
466
|
+
### Writing a command file
|
|
443
467
|
|
|
444
|
-
A command file has
|
|
468
|
+
A command file has an optional **frontmatter** (the metadata between the two `---` lines, where you set `name` and `description`) and the **body** after it. Omitted fields fall back as follows:
|
|
445
469
|
|
|
446
|
-
- `name`
|
|
447
|
-
- `description`
|
|
470
|
+
- `name` comes from the file's path relative to the declared `commands` path, without `.md` and with `/` separators — `commands/frontend/component.md` → `frontend/component`. A `name` in the frontmatter wins.
|
|
471
|
+
- `description` is the first non-empty body line, truncated past 240 characters, or `No description provided.` when the body is empty too.
|
|
448
472
|
|
|
449
|
-
### Running
|
|
473
|
+
### Running commands and passing arguments
|
|
450
474
|
|
|
451
|
-
Commands are
|
|
475
|
+
Commands are namespaced by plugin id and registered as `<plugin>:<command>`, so the example above is really `/kimi-finance:report` — two plugins can ship the same command name without colliding.
|
|
452
476
|
|
|
453
|
-
Whatever you type after the command replaces `$ARGUMENTS
|
|
477
|
+
Whatever you type after the command replaces `$ARGUMENTS`. If the body has no `$ARGUMENTS` and you pass arguments anyway, they are appended to the end of the body as `ARGUMENTS: <what you typed>` rather than dropped.
|
|
454
478
|
|
|
455
479
|
## Skills and Session Start
|
|
456
480
|
|
|
457
|
-
Plugin Skills use the same `SKILL.md` format as ordinary [Agent Skills](./skills.md)
|
|
481
|
+
Plugin Skills use the same `SKILL.md` format as ordinary [Agent Skills](./skills.md):
|
|
458
482
|
|
|
459
483
|
```text
|
|
460
484
|
my-plugin/
|
|
@@ -466,13 +490,13 @@ my-plugin/
|
|
|
466
490
|
SKILL.md
|
|
467
491
|
```
|
|
468
492
|
|
|
469
|
-
`sessionStart.skill` loads a plugin Skill into the main
|
|
493
|
+
`sessionStart.skill` loads a plugin Skill into the main agent when a session starts, which suits initialization instructions, workflow rules or terminology mapping from another tool to Kiki. It injects text only and runs no code.
|
|
470
494
|
|
|
471
|
-
|
|
495
|
+
However the Skill is loaded — `sessionStart.skill`, `/skill:<name>`, or automatic model invocation — `skillInstructions` appears alongside it.
|
|
472
496
|
|
|
473
|
-
## Plugin
|
|
497
|
+
## Plugin agents
|
|
474
498
|
|
|
475
|
-
A plugin can ship
|
|
499
|
+
A plugin can ship agents: declare one or more `./` directories in the manifest's `agents` field, or simply have an `agents/` directory under the plugin root. The files use the same format as [custom agents](./agents.md#custom-agents) and, while the plugin is enabled, are discovered automatically and can be dispatched as sub-agents.
|
|
476
500
|
|
|
477
501
|
```text
|
|
478
502
|
my-plugin/
|
|
@@ -481,13 +505,13 @@ my-plugin/
|
|
|
481
505
|
reviewer.md
|
|
482
506
|
```
|
|
483
507
|
|
|
484
|
-
Plugin agents rank below every other file source: on a name collision, user-level, extra, project-level
|
|
508
|
+
Plugin agents rank below every other file source: on a name collision, user-level, extra, project-level and `--agent-file` definitions all win, and replacing a built-in agent still needs an explicit `override: true` in the frontmatter. Installing, enabling, disabling or removing a plugin refreshes the agent list in a new session (or on `/reload`); `/plugins reload` also refreshes the live session.
|
|
485
509
|
|
|
486
|
-
## MCP
|
|
510
|
+
## MCP servers in plugins
|
|
487
511
|
|
|
488
|
-
|
|
512
|
+
A plugin that needs real tool capabilities declares `mcpServers` in its manifest, reusing the [MCP](../server/mcp.md) schema.
|
|
489
513
|
|
|
490
|
-
Stdio server (local command):
|
|
514
|
+
Stdio server (a local command):
|
|
491
515
|
|
|
492
516
|
```json
|
|
493
517
|
{
|
|
@@ -526,15 +550,15 @@ Plugin MCP servers start after `/reload` or in new sessions. To enable or disabl
|
|
|
526
550
|
|
|
527
551
|
### Notion material and write-back
|
|
528
552
|
|
|
529
|
-
`kiki-notion` is a Kiki-maintained configuration and workflow for [Notion's hosted MCP service](https://developers.notion.com/guides/mcp/get-started-with-mcp), not a Notion-endorsed integration.
|
|
553
|
+
`kiki-notion` is a Kiki-maintained configuration and workflow for [Notion's hosted MCP service](https://developers.notion.com/guides/mcp/get-started-with-mcp), not a Notion-endorsed integration. Install **Kiki Notion** from the **Official** tab and enable it after reviewing the preview; its source lives in the independent [Kiki Plugins repository](https://github.com/X-T-E-R/kiki-plugins/tree/main/plugins/official/kiki-notion), not the Kiki source tree, and [Working on an official plugin](#working-on-an-official-plugin) covers installing that checkout for local work. For an extracted package, use the directory containing `kimi.plugin.json`. In **Capabilities → MCP**, authorize `plugin-kiki-notion:notion` through the normal browser OAuth flow; there is no token field to fill. If an open conversation has not picked up the new MCP connection, `/reload` or start a new one.
|
|
530
554
|
|
|
531
|
-
Ask `/skill:notion-workspace` to search a
|
|
555
|
+
Ask `/skill:notion-workspace` to search a page, teamspace or workspace, read the key originals, and save a brief with source links to a local path. Name the destination page URL or ID, and whether to add or update, when you want it written back — a summary alone changes nothing in Notion. A write request adds no plugin-specific confirmation, and the normal Kiki tool approvals still apply. Plan and tool restrictions, dropped filters, missing subtrees and pending async writes are reported as such rather than presented as complete coverage or a successful write. Access also depends on your workspace permissions and administrator policy; installing the plugin authorizes no upgrades or paid actions.
|
|
532
556
|
|
|
533
|
-
Notion content can reach your
|
|
557
|
+
Notion content can reach your model provider, Kiki session history and any local file you asked it to write. The plugin keeps no separate index or credential store, and disabling or removing it deletes none of that or revokes the OAuth grant — disconnect it in MCP management and revoke access in Notion **Settings → Connections** if you need to. The package is MIT licensed; the remote service and workspace content follow the applicable [Notion agreements](https://www.notion.so/terms).
|
|
534
558
|
|
|
535
|
-
## Hooks in
|
|
559
|
+
## Hooks in plugins
|
|
536
560
|
|
|
537
|
-
A plugin can declare hook rules in its manifest that run on lifecycle events while the plugin is enabled. Each entry uses the same fields as a [`[[hooks]]` rule in `config.toml`](./hooks.md#
|
|
561
|
+
A plugin can declare hook rules in its manifest that run on lifecycle events while the plugin is enabled. Each entry uses the same fields as a [`[[hooks]]` rule in `config.toml`](./hooks.md#legacy-rule-fields) (`event`, `matcher`, `command`, `timeout`):
|
|
538
562
|
|
|
539
563
|
```json
|
|
540
564
|
{
|
|
@@ -549,63 +573,63 @@ A plugin can declare hook rules in its manifest that run on lifecycle events whi
|
|
|
549
573
|
}
|
|
550
574
|
```
|
|
551
575
|
|
|
552
|
-
Plugin hooks
|
|
576
|
+
Plugin hooks work like global ones — [Hooks](./hooks.md) has the event list, the stdin JSON payload, and how exit codes affect the main flow. Three differences:
|
|
553
577
|
|
|
554
|
-
-
|
|
555
|
-
- Each hook
|
|
556
|
-
- The
|
|
578
|
+
- They run only while the plugin is **enabled**.
|
|
579
|
+
- Each hook's working directory is the plugin root, so `command` can use `./` paths inside the plugin.
|
|
580
|
+
- The process gets two extra environment variables: `KIKI_HOME` and `KIKI_PLUGIN_ROOT`.
|
|
557
581
|
|
|
558
|
-
Installing a plugin
|
|
582
|
+
Installing a plugin does not run its hooks; they fire when a matching event occurs while it is enabled.
|
|
559
583
|
|
|
560
584
|
## Session history import
|
|
561
585
|
|
|
562
|
-
Kiki
|
|
586
|
+
Kiki can import another tool's text conversation as a **Kiki session you keep working in**, or as a read-only archive. Claude Code, Codex, Pi, Grok Build, OpenCode exports and your own JSON or script need no plugin, no trust and no activation. The import runs on the Kiki server without a model and never modifies the source files.
|
|
563
587
|
|
|
564
|
-
|
|
588
|
+
Import is on by default but scans nothing at startup. To turn it off, start Kiki with `KIKI_EXPERIMENTAL_PLUGIN_IMPORT=false`, or set `plugin_import = false` under [`[experimental]`](../configuration/config-files.md#experimental) in `config.toml`.
|
|
565
589
|
|
|
566
590
|
### Importing a conversation
|
|
567
591
|
|
|
568
|
-
|
|
592
|
+
Open **New session** and choose **Import history** beside the starters, or go to **Capabilities** → **Plugins** → **Import history**:
|
|
569
593
|
|
|
570
|
-
1.
|
|
571
|
-
2.
|
|
572
|
-
3.
|
|
573
|
-
4.
|
|
574
|
-
5.
|
|
575
|
-
6.
|
|
576
|
-
7.
|
|
594
|
+
1. **What it becomes.** **Kiki session** (the default) turns the conversation into a session in this Kiki, its earlier turns as context, so you open it and carry on where the other tool stopped. **Read-only archive** keeps it as a record you can read but not continue.
|
|
595
|
+
2. **Working directory** (for a session). Your workspaces are one click away, and you can type or browse for any folder — a session in a folder you have not opened before works the same. Browsing registers nothing; the folder is used only if an import actually lands there.
|
|
596
|
+
3. **Format.** Claude Code, Codex, Pi, Grok and OpenCode are built in, as is a custom script of your own. A third-party plugin's source appears here once it is installed and enabled.
|
|
597
|
+
4. **Source home** — the folder where the other tool keeps its history, on the machine running the server. Kiki reads only that folder.
|
|
598
|
+
5. **Conversation.** A folder with many histories is listed one page at a time.
|
|
599
|
+
6. **Preview.** It says whether the source could read the conversation at all, what is kept, what is not carried over, and where the result lands. **Complete read** means the whole conversation was read; **Sample** means part of it.
|
|
600
|
+
7. **Import as session** or **Start import** — the one confirmation this flow asks for; the import runs under the preview you just read.
|
|
577
601
|
|
|
578
|
-
An archive is written into the home of the Kiki server this window is connected to — **Imports into** names it
|
|
602
|
+
An archive is written into the home of the Kiki server this window is connected to — **Imports into** names it — and a session is created in the working directory you chose on that same server. Neither ever lands in the source folder. A preview belongs to the server that produced it, so preview again after connecting to a different Kiki.
|
|
579
603
|
|
|
580
|
-
Progress
|
|
604
|
+
Progress shows bytes read from the source; a source not yet measured shows an indeterminate line instead of a percentage. **Stop import** ends a running one, and an import that was stopped, failed or interrupted by a restart keeps its place and offers **Continue import**. A finished import offers **Open session** or **Open archive**, depending on what it became.
|
|
581
605
|
|
|
582
|
-
### What a session keeps
|
|
606
|
+
### What a session keeps
|
|
583
607
|
|
|
584
|
-
A session import turns the conversation into context Kiki can continue from
|
|
608
|
+
A session import turns the conversation into context Kiki can continue from. User and assistant text becomes the session's earlier turns. A tool call from the old conversation arrives as text saying it already happened — it is never re-run and grants no permission here. The other tool's system instructions, metadata, usage counts, approvals and running tasks are not installed as this Kiki's state, and the preview lists each as a loss.
|
|
585
609
|
|
|
586
|
-
Importing the same
|
|
610
|
+
Importing the same conversation and revision into the same working directory reuses the existing session without replacing anything you have added in Kiki, and the preview says so before you start. A changed revision imports as a new session, leaving the old one alone.
|
|
587
611
|
|
|
588
|
-
|
|
612
|
+
A migrated session needs a model like any other: importing and reading do not, sending your next message does.
|
|
589
613
|
|
|
590
|
-
### What an archive keeps
|
|
614
|
+
### What an archive keeps
|
|
591
615
|
|
|
592
|
-
An archive is history, not a live conversation
|
|
616
|
+
An archive is history, not a live conversation. It cannot be continued, opening it does not add its content to this session, and it is not a session of its own — it has no place in the session list and is read from the import page's archive list, without a model. Records keep the roles they had in the other tool — user, assistant, system, tool call, metadata — but nothing is replayed: a tool call stays a record, and text that was a system instruction to that other tool is not executed here. Token counts the other tool recorded stay in the metadata and are not counted as usage on this machine.
|
|
593
617
|
|
|
594
|
-
The preview's loss list
|
|
618
|
+
The preview's loss list tells you what you are not getting, so read it before importing:
|
|
595
619
|
|
|
596
|
-
- **Attachments are not copied.** An image, document
|
|
597
|
-
- **Unknown or omitted content is reported.** Claude Code and Codex can preserve unknown rows as metadata; the other rules report unsupported records or parts as counted losses.
|
|
598
|
-
- **Malformed input is not hidden.** Claude Code and Codex report unparseable rows in their losses
|
|
620
|
+
- **Attachments are not copied.** An image, document or other embedded file leaves a placeholder in the text and a counted loss entry; the conversation around it stays readable.
|
|
621
|
+
- **Unknown or omitted content is reported.** Claude Code and Codex can preserve unknown rows as metadata; the other rules report unsupported records or parts as counted losses. Nothing is ever reported as preserved when it was omitted.
|
|
622
|
+
- **Malformed input is not hidden.** Claude Code and Codex report unparseable rows in their losses, while Pi, Grok, OpenCode and the bundled custom JSON reader reject malformed JSON or invalid required relationships instead of skipping them silently. A preview distinguishes a sample from a complete read.
|
|
599
623
|
|
|
600
|
-
Claude Code and Codex reject a source folder deeper than 20 levels and a single input line over 128 MiB. Pi, Grok, OpenCode and the bundled custom JSON reader
|
|
624
|
+
Claude Code and Codex reject a source folder deeper than 20 levels and a single input line over 128 MiB. Pi, Grok, OpenCode and the bundled custom JSON reader cap each input file at 64 MiB, and Grok's summary and update files have that limit each. A custom script sets its own limits and has to report them honestly.
|
|
601
625
|
|
|
602
|
-
Kiki identifies a conversation by its source, source home
|
|
626
|
+
Kiki identifies a conversation by its source, source home and the other tool's own id, and treats the previewed revision as its content version. Importing the same revision again reuses the existing archive; a changed conversation becomes a new revision of it. If the file changes between preview and import, the import fails and the existing archive is kept. Archives are found by title or source id — a lookup over what you imported, not a full-text search.
|
|
603
627
|
|
|
604
|
-
When
|
|
628
|
+
When this window is connected to a Kiki on another machine, that server's sources, imports and archives are readable here, but starting, stopping and continuing an import belongs to the machine that owns the home.
|
|
605
629
|
|
|
606
630
|
### Built-in formats and custom scripts
|
|
607
631
|
|
|
608
|
-
Choose a folder
|
|
632
|
+
Choose a folder holding the format below — it need not be the other tool's whole home. For OpenCode, export the session to a local JSON file first.
|
|
609
633
|
|
|
610
634
|
| Source | Supported input |
|
|
611
635
|
| --- | --- |
|
|
@@ -623,13 +647,13 @@ For another format, select **Custom JSON / script** and set **Custom import scri
|
|
|
623
647
|
customScript = "C:/imports/my-format.mjs"
|
|
624
648
|
```
|
|
625
649
|
|
|
626
|
-
Leave the setting empty to use the bundled JSON reader. A script exports `discover(input, context)`, `probe(input, context)` and `parse(input, context)`
|
|
650
|
+
Leave the setting empty to use the bundled JSON reader. A script exports `discover(input, context)`, `probe(input, context)` and `parse(input, context)` in the [shapes below](#writing-an-import-source); it needs no plugin manifest, `register(api)` or SDK dependency, and `context` supplies `signal` and `settings`. The standalone [custom JSON example](https://github.com/X-T-E-R/kiki/blob/main/packages/agent-core-v2/src/app/pluginImport/builtin/examples/custom-json.mjs) can be copied and adapted.
|
|
627
651
|
|
|
628
|
-
Choose
|
|
652
|
+
Choose code you trust: the script runs as Node.js with your account's permissions, not in a sandbox, and selecting it is the decision to run it — there is no further installation or per-call approval. Changing its code or settings changes the preview revision, so preview again before importing. Kiki still checks the records and pages it returns against the shared source contract.
|
|
629
653
|
|
|
630
654
|
### Writing an import source
|
|
631
655
|
|
|
632
|
-
|
|
656
|
+
A plugin declares an import source in its own manifest: list `x-kiki.sessionSources`, point `x-kiki.entry` at an ES module, and export `register(api)` from that module. The manifest declares what the plugin offers, the entry does the reading.
|
|
633
657
|
|
|
634
658
|
```json
|
|
635
659
|
{
|
|
@@ -652,19 +676,19 @@ An import source is one of the contributions a plugin can declare, so it lives i
|
|
|
652
676
|
}
|
|
653
677
|
```
|
|
654
678
|
|
|
655
|
-
- `sessionSources` lists the
|
|
656
|
-
- `entry` is required for a plugin with session sources and must resolve inside the plugin root. Kiki loads it as an ES module in its own Node.js process, so build your TypeScript down to the file you name
|
|
657
|
-
- `permissions.fs: "outside"` is
|
|
679
|
+
- `sessionSources` lists what the plugin registers. Each `id` matches `[a-z0-9][a-z0-9-]{0,63}` and is unique within the plugin, `label` is what the source picker shows, and `formatVersion` names the format you read. A declared source the entry never registers fails when used, rather than quietly doing nothing.
|
|
680
|
+
- `entry` is required for a plugin with session sources and must resolve inside the plugin root. Kiki loads it as an ES module in its own Node.js process, so build your TypeScript down to the file you name.
|
|
681
|
+
- `permissions.fs: "outside"` is how an importer declares that it reads a folder outside the workspace, which is what a source home is. `engines.kiki` is required as soon as a plugin declares Kiki contributions.
|
|
658
682
|
|
|
659
|
-
|
|
683
|
+
Register a definition that matches the manifest, and implement three methods:
|
|
660
684
|
|
|
661
685
|
- `discover` lists the conversations a folder holds for one source home, paging with the `cursor` it is given.
|
|
662
|
-
- `probe` reports one conversation:
|
|
663
|
-
- `parse` returns records in pages
|
|
686
|
+
- `probe` reports one conversation: content `revision`, title, `status` (`preserved`, `partial` or `unsupported`), losses, total size, and canonical `sourceHome`. Archive identity includes that home, so return one spelling of the folder rather than a path a user could write two ways.
|
|
687
|
+
- `parse` returns records in pages with the `cursor` that continues the read. `context.signal` aborts when the reader stops the import, the plugin unloads, or a page runs past its timeout, and `context.settings` carries the plugin's own settings.
|
|
664
688
|
|
|
665
|
-
|
|
689
|
+
Report every loss with a `code`, a `count` and a `detail` rather than importing only the part you can read, and never treat history text as instructions to run. Each record holds at most 49,152 UTF-16 code units, so a longer message becomes several records sharing an `id` and carrying `part`, `textOffset` and `textTotal`.
|
|
666
690
|
|
|
667
|
-
The example below is a working source for a folder holding one `history.json`; the record, page
|
|
691
|
+
The example below is a working source for a folder holding one `history.json`; the record, page and probe shapes come from the public `@kiki/plugin-sdk` package's `session-import` entry point.
|
|
668
692
|
|
|
669
693
|
```ts
|
|
670
694
|
import { createHash } from 'node:crypto';
|
|
@@ -748,14 +772,14 @@ export function register(api: PluginRegistrationApi): void {
|
|
|
748
772
|
}
|
|
749
773
|
```
|
|
750
774
|
|
|
751
|
-
##
|
|
775
|
+
## What installing a plugin does and does not do
|
|
752
776
|
|
|
753
|
-
|
|
777
|
+
Installing a plugin copies its files and reads its manifest. None of these happens at install or session startup:
|
|
754
778
|
|
|
755
|
-
- Unsupported runtime fields such as `tools`, `apps`, `inject
|
|
756
|
-
-
|
|
757
|
-
- MCP servers
|
|
758
|
-
-
|
|
759
|
-
-
|
|
779
|
+
- Unsupported runtime fields such as `tools`, `apps`, `inject` and `configFile` are ignored rather than executed
|
|
780
|
+
- Every path stays inside the plugin root after symbolic links are resolved
|
|
781
|
+
- MCP servers start only after a `/reload` or in a new session, and can be disabled at any time from `/plugins`
|
|
782
|
+
- The entry file does not run at install; plugin code starts when you use the contribution, in a Node.js process holding your account's permissions ([not a sandbox](#installing-a-plugin-that-runs-code))
|
|
783
|
+
- A broken manifest or unsafe path shows up in `/plugins info <id>` diagnostics and affects no other session
|
|
760
784
|
|
|
761
785
|
[Online version with images](https://x-t-e-r.github.io/kiki/en/customization/plugins.html)
|