@piagent/platform 1.1.9 → 1.2.1

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.
Files changed (81) hide show
  1. package/CHANGELOG.md +175 -1
  2. package/README.md +2 -2
  3. package/docs/command-reference-vietnamese.md +19 -5
  4. package/docs/distribution-standard.md +7 -7
  5. package/docs/mcp-and-tools.md +154 -2
  6. package/docs/model-options.md +10 -8
  7. package/docs/operator-manual-vietnamese.md +25 -13
  8. package/docs/publishing-for-teams.md +2 -0
  9. package/docs/quickstart-vietnamese.md +2 -2
  10. package/docs/release-install-policy.md +6 -6
  11. package/docs/security-threat-model.md +4 -3
  12. package/docs/team-onboarding.md +4 -4
  13. package/docs/usage-observability.md +29 -0
  14. package/docs/vercel-docs-site.md +34 -4
  15. package/docs-site/architecture.html +152 -0
  16. package/docs-site/assets/docs.css +1001 -0
  17. package/docs-site/assets/docs.js +84 -0
  18. package/docs-site/commands.html +203 -0
  19. package/docs-site/content/architecture.html +29 -0
  20. package/docs-site/content/commands.html +80 -0
  21. package/docs-site/content/index.html +80 -0
  22. package/docs-site/content/mcp-approval.html +133 -0
  23. package/docs-site/content/mcp-auth.html +76 -0
  24. package/docs-site/content/mcp-servers.html +111 -0
  25. package/docs-site/content/mcp.html +120 -0
  26. package/docs-site/content/permissions.html +54 -0
  27. package/docs-site/content/profiles.html +68 -0
  28. package/docs-site/content/quickstart.html +144 -0
  29. package/docs-site/content/runtime.html +45 -0
  30. package/docs-site/content/scope.html +71 -0
  31. package/docs-site/content/security.html +51 -0
  32. package/docs-site/content/team.html +23 -0
  33. package/docs-site/content/workflows.html +47 -0
  34. package/docs-site/index.html +131 -1534
  35. package/docs-site/mcp-approval.html +256 -0
  36. package/docs-site/mcp-auth.html +199 -0
  37. package/docs-site/mcp-servers.html +234 -0
  38. package/docs-site/mcp.html +243 -0
  39. package/docs-site/permissions.html +177 -0
  40. package/docs-site/profiles.html +191 -0
  41. package/docs-site/quickstart.html +267 -0
  42. package/docs-site/runtime.html +168 -0
  43. package/docs-site/scope.html +194 -0
  44. package/docs-site/security.html +174 -0
  45. package/docs-site/team.html +142 -0
  46. package/docs-site/workflows.html +170 -0
  47. package/package.json +4 -2
  48. package/packages/piagent-core/capabilities/capability-core.js +58 -5
  49. package/packages/piagent-core/capabilities/capability-sources.js +73 -12
  50. package/packages/piagent-core/extensions/document-intake.ts +5 -5
  51. package/packages/piagent-core/extensions/piagent-guard.ts +432 -2
  52. package/packages/piagent-core/extensions/policy-core.js +1586 -98
  53. package/packages/piagent-core/mcp/mcp-approval-store.js +216 -0
  54. package/packages/piagent-core/mcp/mcp-auth-readiness.js +225 -0
  55. package/packages/piagent-core/mcp/mcp-command-actions.js +400 -0
  56. package/packages/piagent-core/mcp/mcp-config-layers.js +466 -0
  57. package/packages/piagent-core/mcp/mcp-import-kinds.js +240 -0
  58. package/packages/piagent-core/mcp/mcp-server-catalog.js +150 -0
  59. package/packages/piagent-core/mcp/mcp-server-entry.js +293 -0
  60. package/packages/piagent-core/mcp/mcp-session-view.js +236 -0
  61. package/packages/piagent-core/mcp/mcp-tool-naming.js +90 -0
  62. package/packages/piagent-core/package.json +7 -3
  63. package/packages/piagent-core/prompts/model-options.md +8 -8
  64. package/scripts/build-docs-site.mjs +421 -0
  65. package/scripts/configure-model-scope.sh +21 -5
  66. package/scripts/configure-subagents.sh +18 -5
  67. package/scripts/init-project.sh +15 -8
  68. package/scripts/install-global.sh +5 -5
  69. package/scripts/mcp-manage.mjs +656 -0
  70. package/scripts/pi-model-catalog.sh +11 -1
  71. package/scripts/pi-session-stats.sh +27 -1
  72. package/scripts/pi-usage-history.mjs +567 -0
  73. package/scripts/piagent-cli.mjs +1 -1
  74. package/scripts/preview-docs-site.mjs +88 -0
  75. package/scripts/quality-benchmark.sh +37 -9
  76. package/scripts/setup.sh +23 -15
  77. package/scripts/team-doctor.sh +18 -2
  78. package/scripts/uninstall-global.sh +10 -4
  79. package/scripts/verify-local.sh +65 -19
  80. package/scripts/verify-release-identity.mjs +37 -2
  81. package/scripts/configure-mcp.sh +0 -349
@@ -0,0 +1,76 @@
1
+ <section class="section">
2
+ <h2 id="khong-giu-token">Platform không giữ token</h2>
3
+ <p>Token MCP đã có chỗ ở: luồng OAuth thuộc về <span class="inline-code">pi-mcp-adapter</span> — chính nó đăng ký <span class="inline-code">/mcp</span> và <span class="inline-code">/mcp-auth</span>, và chính nó lưu, refresh, thu hồi. Dựng thêm một kho credential nữa để giữ credential của bên thứ ba chỉ tạo thêm một chỗ để token rò ra. Việc của platform vì vậy là <strong>phát hiện và chỉ đường</strong>.</p>
4
+
5
+ <pre><code>/mcp-auth figma</code></pre>
6
+
7
+ <div class="callout ok-callout">
8
+ <strong>Ranh giới</strong>
9
+ <p>Platform không chạy OAuth, không lưu token, không refresh. Nó biết một server <em>cần</em> đăng nhập, nhưng không biết phiên đăng nhập còn hạn hay không — và nó nói đúng như vậy thay vì đoán.</p>
10
+ </div>
11
+ </section>
12
+
13
+ <section class="section">
14
+ <h2 id="tu-choi-secret">Secret bị từ chối ngay khi ghi config</h2>
15
+ <p>MCP config được nhiều client đọc, nằm trong home hoặc trong repo, và ở scope <span class="inline-code">project</span> thì được commit. Một token gõ vào <span class="inline-code">--env</span> sẽ đi tới tất cả những chỗ đó. Nên <span class="inline-code">add</span> từ chối, và nói luôn dạng cần dùng:</p>
16
+
17
+ <pre><code>$ piagent-mcp add gh --env GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx -- npx -y @acme/gh-mcp
18
+ FAIL: GITHUB_PERSONAL_ACCESS_TOKEN names a credential, so its value cannot be
19
+ written into MCP config. Export it in your shell and reference it instead:
20
+ --env 'GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_PERSONAL_ACCESS_TOKEN}'</code></pre>
21
+
22
+ <div class="split">
23
+ <div class="card">
24
+ <h3 id="theo-ten">Theo tên field</h3>
25
+ <p>Tên chứa <span class="inline-code">token</span>, <span class="inline-code">secret</span>, <span class="inline-code">password</span>, <span class="inline-code">api_key</span>, <span class="inline-code">authorization</span>… thì giá trị bắt buộc phải là tham chiếu biến môi trường.</p>
26
+ </div>
27
+ <div class="card">
28
+ <h3 id="theo-gia-tri">Theo giá trị</h3>
29
+ <p>Tên không nói gì thì giá trị vẫn được đọc riêng, nên <span class="inline-code">--env CONFIG=ghp_...</span> cũng bị bắt.</p>
30
+ </div>
31
+ </div>
32
+
33
+ <p>Áp dụng cho cả <span class="inline-code">--header</span>. <span class="inline-code">--url</span> chỉ nhận <span class="inline-code">https</span>, hoặc <span class="inline-code">http</span> khi host là loopback — Figma desktop MCP đúng là trường hợp đó. <span class="inline-code">list</span> và <span class="inline-code">get</span> mask giá trị nhưng in nguyên <span class="inline-code">${VAR}</span>, vì đó là tên biến chứ không phải nội dung.</p>
34
+ </section>
35
+
36
+ <section class="section">
37
+ <h2 id="trang-thai">Trạng thái sẵn sàng</h2>
38
+ <p>Đếm số server không nói được server nào trả lời được. <span class="inline-code">/piagent-mcp doctor</span> phân loại từng cái:</p>
39
+
40
+ <div class="table-wrap">
41
+ <table>
42
+ <thead>
43
+ <tr><th>State</th><th>Nghĩa</th><th>Cách xử lý</th></tr>
44
+ </thead>
45
+ <tbody>
46
+ <tr><td><span class="inline-code">ready</span></td><td>Đủ điều kiện, gọi được</td><td>—</td></tr>
47
+ <tr><td><span class="inline-code">needs-env</span></td><td>Config tham chiếu <span class="inline-code">${VAR}</span> mà biến chưa export</td><td>Export biến trong shell profile</td></tr>
48
+ <tr><td><span class="inline-code">needs-command</span></td><td>Executable không có trên PATH</td><td>Cài, hoặc sửa lại server</td></tr>
49
+ <tr><td><span class="inline-code">pending-approval</span></td><td>Repo khai server này, chưa ai duyệt trên máy này</td><td><span class="inline-code">/piagent-mcp approve &lt;name&gt;</span></td></tr>
50
+ <tr><td><span class="inline-code">approval-changed</span></td><td>Đã duyệt nhưng định nghĩa đã đổi</td><td>Đọc lại rồi duyệt lại</td></tr>
51
+ <tr><td><span class="inline-code">rejected</span></td><td>Đã từ chối cho project này</td><td><span class="inline-code">reset</span> nếu đổi ý</td></tr>
52
+ <tr><td><span class="inline-code">disabled</span></td><td>Tắt bằng <span class="inline-code">disable</span></td><td><span class="inline-code">/piagent-mcp enable &lt;name&gt;</span></td></tr>
53
+ <tr><td><span class="inline-code">oauth</span></td><td>Đăng nhập do Pi giữ</td><td><span class="inline-code">/mcp-auth &lt;name&gt;</span> nếu chưa login</td></tr>
54
+ </tbody>
55
+ </table>
56
+ </div>
57
+
58
+ <p>Chỉ báo cái biết chắc. <span class="inline-code">needs-env</span> in ra <strong>tên biến</strong>, không bao giờ in giá trị.</p>
59
+
60
+ <p>Trong session là <span class="inline-code">/piagent-mcp doctor</span> — cùng báo cáo, và remedy in ra dạng slash command vì đó là thứ chạy được ngay tại chỗ. Ngoài terminal:</p>
61
+
62
+ <pre><code>$ piagent-mcp doctor
63
+ OK context7 (global): ready
64
+ OK chrome-devtools (global): ready
65
+ NEED github (global): GITHUB_PERSONAL_ACCESS_TOKEN is referenced but not set
66
+ -> export GITHUB_PERSONAL_ACCESS_TOKEN=... in your shell profile
67
+ NEED docker: installed but the daemon is not responding
68
+ -> start Docker Desktop, then re-run piagent-mcp doctor</code></pre>
69
+
70
+ <div class="callout">
71
+ <strong>Vì sao <span class="inline-code">oauth</span> không phải lỗi</strong>
72
+ <p>Nó không xuất hiện trong notice đầu session. Platform không phân biệt được đã login hay chưa, nên báo mỗi session sẽ thành nhiễu và hết được đọc. Notice chỉ nêu những state chặn chắc chắn; tắt bằng <span class="inline-code">PIAGENT_NO_MCP_NOTICE=1</span>.</p>
73
+ </div>
74
+
75
+ <p><span class="inline-code">doctor</span> chạy thêm <span class="inline-code">docker info</span> — chậm, nên chỉ có ở doctor chứ không ở session start. <span class="inline-code">piagent-doctor</span> cũng đưa các state chặn vào <span class="inline-code">warnings</span>.</p>
76
+ </section>
@@ -0,0 +1,111 @@
1
+ <section class="section">
2
+ <h2 id="hai-be-mat">Hai bề mặt, chọn theo chỗ đang đứng</h2>
3
+ <p>Trong session Pi thì gõ <strong>slash command</strong>. Ngoài terminal thì gõ <strong>CLI</strong>. Cùng một dữ liệu, cùng một cách đọc trạng thái — khác nhau ở chỗ ai chạy.</p>
4
+
5
+ <div class="table-wrap">
6
+ <table>
7
+ <thead>
8
+ <tr><th>Việc</th><th>Trong session</th><th>Trong terminal</th></tr>
9
+ </thead>
10
+ <tbody>
11
+ <tr><td>Mở menu</td><td><span class="inline-code">/piagent-mcp</span></td><td>—</td></tr>
12
+ <tr><td>Xem toàn bộ server + state</td><td><span class="inline-code">/piagent-mcp status</span></td><td><span class="inline-code">piagent-mcp list</span></td></tr>
13
+ <tr><td>Chi tiết một server</td><td><span class="inline-code">/piagent-mcp get &lt;name&gt;</span></td><td><span class="inline-code">piagent-mcp get &lt;name&gt;</span></td></tr>
14
+ <tr><td>Thiếu gì để chạy được</td><td><span class="inline-code">/piagent-mcp doctor</span></td><td><span class="inline-code">piagent-mcp doctor</span></td></tr>
15
+ <tr><td>Duyệt server của repo</td><td><span class="inline-code">/piagent-mcp approve &lt;name&gt;</span></td><td><span class="inline-code">piagent-mcp approve &lt;name&gt;</span></td></tr>
16
+ <tr><td>Bật / tắt</td><td><span class="inline-code">/piagent-mcp enable|disable &lt;name&gt;</span></td><td><span class="inline-code">piagent-mcp enable|disable &lt;name&gt;</span></td></tr>
17
+ <tr><td>Thêm, xoá, preset</td><td>—</td><td><span class="inline-code">piagent-mcp add|remove|--preset</span></td></tr>
18
+ <tr><td>Trạng thái kết nối, OAuth</td><td><span class="inline-code">/mcp</span>, <span class="inline-code">/mcp-auth</span></td><td>—</td></tr>
19
+ </tbody>
20
+ </table>
21
+ </div>
22
+
23
+ <div class="callout ok-callout">
24
+ <strong>Vì sao slash command chứ không phải gõ CLI trong session</strong>
25
+ <p>Gõ <span class="inline-code">piagent-mcp list</span> giữa session là nhờ model chạy bash, đọc output rồi thuật lại — ba lượt model cho một câu hỏi mà chính process này trả lời được từ file nó đã đọc. Slash command do Pi dispatch thẳng tới handler, <strong>không đi qua model</strong>: không tốn token, không diễn giải lại, và cùng một câu hỏi luôn ra cùng một câu trả lời.</p>
26
+ </div>
27
+
28
+ <div class="callout">
29
+ <strong>Thêm server vẫn ở terminal</strong>
30
+ <p><span class="inline-code">add</span> mang theo shell quoting, tham chiếu <span class="inline-code">${VAR}</span> và một command line sau <span class="inline-code">--</span>. Ba thứ đó đã có một bộ parse đúng là chính shell; viết lại nó bên trong slash command chỉ tạo ra bộ parse thứ hai, tệ hơn. Vì vậy ranh giới là: đọc trạng thái thì ở trong session, ghi định nghĩa server thì ở terminal. Gọi <span class="inline-code">/piagent-mcp add</span> sẽ in ra đúng lệnh terminal cần chạy chứ không đoán.</p>
31
+ </div>
32
+ </section>
33
+
34
+ <section class="section">
35
+ <h2 id="lenh">Lệnh</h2>
36
+
37
+ <div class="command-grid">
38
+ <article class="command-card">
39
+ <h3 id="trong-session">Trong session</h3>
40
+ <p>Không tham số là menu. Biết rồi thì gõ thẳng — Tab auto-complete cả subcommand lẫn tên server.</p>
41
+ <pre><code>/piagent-mcp menu
42
+ /piagent-mcp status bảng đầy đủ
43
+ /piagent-mcp get sentry
44
+ /piagent-mcp doctor
45
+ /piagent-mcp approve internal</code></pre>
46
+ </article>
47
+
48
+ <article class="command-card">
49
+ <h3 id="them-server">Thêm server</h3>
50
+ <p><span class="inline-code">--url</span> cho server remote, <span class="inline-code">--</span> rồi command cho server chạy local. Chạy ở terminal.</p>
51
+ <pre><code>piagent-mcp add sentry --url https://mcp.sentry.dev/mcp --scope global
52
+ piagent-mcp add internal --scope project -- npx -y @acme/internal-mcp</code></pre>
53
+ </article>
54
+
55
+ <article class="command-card">
56
+ <h3 id="xem">Xem</h3>
57
+ <p><span class="inline-code">list</span> cho toàn bộ server nhìn thấy được từ project hiện tại, kèm state. <span class="inline-code">get</span> cho chi tiết một server.</p>
58
+ <pre><code>piagent-mcp list
59
+ piagent-mcp get sentry</code></pre>
60
+ </article>
61
+
62
+ <article class="command-card">
63
+ <h3 id="tat-xoa">Tắt và xoá</h3>
64
+ <p><span class="inline-code">disable</span> giữ nguyên định nghĩa, chỉ ngừng dùng. <span class="inline-code">remove</span> xoá hẳn khỏi scope.</p>
65
+ <pre><code>piagent-mcp disable sentry
66
+ piagent-mcp enable sentry
67
+ piagent-mcp remove sentry --scope global</code></pre>
68
+ </article>
69
+
70
+ <article class="command-card">
71
+ <h3 id="preset-lenh">Preset</h3>
72
+ <p>Seed một nhóm server đã pin sẵn. <span class="inline-code">--replace</span> đưa các server thuộc preset về baseline.</p>
73
+ <pre><code>piagent-mcp --preset core --scope global --replace
74
+ piagent-mcp --list</code></pre>
75
+ </article>
76
+ </div>
77
+ </section>
78
+
79
+ <section class="section">
80
+ <h2 id="output">Output nói rõ đã sửa file nào</h2>
81
+ <p>Bốn layer config cùng được đọc, nên câu hỏi đầu tiên khi có gì đó không đúng luôn là "file nào đang có hiệu lực". <span class="inline-code">add</span> trả lời sẵn:</p>
82
+
83
+ <pre><code>$ piagent-mcp add internal --scope project -- npx -y @acme/internal-mcp
84
+ Added local MCP server internal with command: npx -y @acme/internal-mcp in project scope
85
+ File modified: /Users/you/repo/.mcp.json
86
+ This scope is part of the repository, so the server is not usable until approved: piagent-mcp approve internal</code></pre>
87
+
88
+ <p><span class="inline-code">list</span> hiển thị dạng bảng, cột <span class="inline-code">STATE</span> cho biết server nào dùng được ngay:</p>
89
+
90
+ <pre><code>NAME SCOPE TRANSPORT TARGET STATE
91
+ context7 global stdio npx -y @upstash/context7-mcp@3.2.4 ready
92
+ chrome-devtools global stdio npx -y chrome-devtools-mcp@1.6.0 ... ready
93
+ github global stdio docker run -i --rm -e GITHUB_PERSON... needs-env
94
+ internal project stdio npx -y @acme/internal-mcp pending-approval</code></pre>
95
+ </section>
96
+
97
+ <section class="section">
98
+ <h2 id="update">Server tự thêm và luồng update</h2>
99
+ <p>Mỗi lần <span class="inline-code">piagent-update</span> chạy, preset được apply lại với <span class="inline-code">--replace</span>. Vòng merge chỉ đi qua đúng những server ID mà preset sở hữu:</p>
100
+
101
+ <div class="split">
102
+ <div class="card">
103
+ <h3 id="giu-nguyen">Giữ nguyên</h3>
104
+ <p>Server có ID riêng — <span class="inline-code">my-internal</span>, <span class="inline-code">sentry</span>, bất cứ tên nào không thuộc preset — sống qua mọi lần update.</p>
105
+ </div>
106
+ <div class="card">
107
+ <h3 id="bi-ghi-de">Bị ghi đè</h3>
108
+ <p>Sửa tay một server thuộc preset (<span class="inline-code">github</span>, <span class="inline-code">context7</span>…) sẽ bị đưa về baseline ở lần update kế tiếp. Muốn giữ bản riêng thì đặt tên khác.</p>
109
+ </div>
110
+ </div>
111
+ </section>
@@ -0,0 +1,120 @@
1
+ <section class="section">
2
+ <h2 id="bat-dau">Bắt đầu ở đâu</h2>
3
+ <p>Gõ <span class="inline-code">/piagent-mcp</span> là ra menu — không cần nhớ subcommand nào:</p>
4
+
5
+ <pre><code>MCP
6
+ Servers — 2/3 ready
7
+ Doctor — 1 need attention (recommended)
8
+ Inspect a server
9
+ Approve a repository server — 1 waiting
10
+ Turn a server off
11
+ Add a server
12
+ All subcommands</code></pre>
13
+
14
+ <p>Menu dựng theo đúng thứ project đang có: chưa server nào bị tắt thì không hiện "turn back on", không server nào chờ duyệt thì không hiện "approve". Chọn việc cần server thì nó hỏi tiếp server nào — trừ khi chỉ có đúng một lựa chọn.</p>
15
+
16
+ <p>Mọi mục trong menu đều gõ thẳng được:</p>
17
+
18
+ <pre><code>/piagent-mcp doctor cái nào chưa chạy được và còn thiếu gì
19
+ /piagent-mcp status bảng đầy đủ
20
+ /mcp trạng thái kết nối live, do adapter giữ
21
+ /mcp-auth &lt;name&gt; đăng nhập OAuth cho một server</code></pre>
22
+
23
+ <p>Ngoài terminal thì cùng bộ lệnh đó bỏ dấu <span class="inline-code">/</span>: <span class="inline-code">piagent-mcp list</span>, <span class="inline-code">piagent-mcp doctor</span>. Thêm và xoá server chỉ có ở terminal. Chi tiết ở <a href="/mcp-servers">Quản lý server</a>.</p>
24
+ </section>
25
+
26
+ <section class="section">
27
+ <h2 id="ba-thu-trung-ten">Ba thứ trùng tên, không nối với nhau</h2>
28
+ <p>Đây là chỗ gây nhầm nhiều nhất. Không có dòng code nào map capability name sang MCP server id — khai <span class="inline-code">"github"</span> trong <span class="inline-code">mcpCapabilities</span> <strong>không</strong> bật server MCP tên <span class="inline-code">github</span>, và ngược lại.</p>
29
+
30
+ <div class="table-wrap">
31
+ <table>
32
+ <thead>
33
+ <tr><th>Thứ</th><th>Ở đâu</th><th>Là gì</th></tr>
34
+ </thead>
35
+ <tbody>
36
+ <tr>
37
+ <td><span class="inline-code">mcpCapabilities: ["github"]</span></td>
38
+ <td><span class="inline-code">.pi/piagent-profile.json</span></td>
39
+ <td>Nhãn capability cho tool registry</td>
40
+ </tr>
41
+ <tr>
42
+ <td><span class="inline-code">toolCapabilities</span></td>
43
+ <td><span class="inline-code">base-policy.json</span></td>
44
+ <td>Map một tool <strong>tên là</strong> <span class="inline-code">github</span> sang capability</td>
45
+ </tr>
46
+ <tr>
47
+ <td>server <span class="inline-code">github</span></td>
48
+ <td><span class="inline-code">~/.config/mcp/mcp.json</span></td>
49
+ <td>Server MCP thật, chạy qua Docker</td>
50
+ </tr>
51
+ </tbody>
52
+ </table>
53
+ </div>
54
+ </section>
55
+
56
+ <section class="section">
57
+ <h2 id="bon-layer-config">Bốn layer config</h2>
58
+ <p>Cả bốn file đều được đọc. <span class="inline-code">--scope</span> của <span class="inline-code">piagent-mcp</span> chính là bốn tên này.</p>
59
+
60
+ <div class="table-wrap">
61
+ <table>
62
+ <thead>
63
+ <tr><th>Scope</th><th>File</th><th>Dùng khi nào</th></tr>
64
+ </thead>
65
+ <tbody>
66
+ <tr><td><span class="inline-code">global</span></td><td><span class="inline-code">~/.config/mcp/mcp.json</span></td><td>Mặc định. Dùng chung cho nhiều agent và nhiều project</td></tr>
67
+ <tr><td><span class="inline-code">pi-global</span></td><td><span class="inline-code">~/.pi/agent/mcp.json</span></td><td>Chỉ khi cần override riêng cho Pi</td></tr>
68
+ <tr><td><span class="inline-code">project</span></td><td><span class="inline-code">.mcp.json</span></td><td>Server đặc thù repo, commit được</td></tr>
69
+ <tr><td><span class="inline-code">pi-project</span></td><td><span class="inline-code">.pi/mcp.json</span></td><td>Override riêng Pi trong một repo</td></tr>
70
+ </tbody>
71
+ </table>
72
+ </div>
73
+
74
+ <div class="callout">
75
+ <strong>Hai layer cuối đi theo repo</strong>
76
+ <p>Clone một repo về là mang theo cả <span class="inline-code">.mcp.json</span> của nó. Vì vậy server ở hai scope đó phải qua <a href="/mcp-approval">approval gate</a> trước khi dùng được.</p>
77
+ </div>
78
+ </section>
79
+
80
+ <section class="section">
81
+ <h2 id="preset">Preset seed sẵn</h2>
82
+ <p><span class="inline-code">piagent-setup</span> và <span class="inline-code">piagent-install</span> đều cài <span class="inline-code">pi-mcp-adapter</span> và seed preset <span class="inline-code">core</span> mặc định. Bỏ qua bằng <span class="inline-code">--no-mcp</span>.</p>
83
+
84
+ <div class="table-wrap">
85
+ <table>
86
+ <thead>
87
+ <tr><th>Preset</th><th>Server</th><th>Mục đích</th></tr>
88
+ </thead>
89
+ <tbody>
90
+ <tr><td><span class="inline-code">minimal</span></td><td>—</td><td>Chỉ seed settings an toàn</td></tr>
91
+ <tr><td><span class="inline-code">docs</span></td><td>Context7</td><td>Docs mới của framework/library</td></tr>
92
+ <tr><td><span class="inline-code">browser</span></td><td>Chrome DevTools, Playwright</td><td>Inspect UI/runtime, browser automation</td></tr>
93
+ <tr><td><span class="inline-code">github</span></td><td>GitHub MCP</td><td>Issue/PR/repo/release workflow</td></tr>
94
+ <tr><td><span class="inline-code">design</span></td><td>Figma remote</td><td>Design-to-code qua Figma OAuth</td></tr>
95
+ <tr><td><span class="inline-code">design-local</span></td><td>Figma desktop</td><td>Dev Mode MCP chạy local</td></tr>
96
+ <tr><td><span class="inline-code">web</span></td><td>Context7, Chrome DevTools, Playwright</td><td>FE/web workflow</td></tr>
97
+ <tr><td><span class="inline-code">core</span></td><td>Context7, Chrome DevTools, GitHub</td><td>Baseline mặc định của team</td></tr>
98
+ <tr><td><span class="inline-code">popular</span></td><td>core + Playwright + Figma</td><td>Baseline nhiều team dev dùng</td></tr>
99
+ <tr><td><span class="inline-code">all</span></td><td>popular + Figma desktop</td><td>Đầy đủ</td></tr>
100
+ </tbody>
101
+ </table>
102
+ </div>
103
+
104
+ <p>Mọi server đều pin theo version hoặc digest. MCP server là code chạy trên máy operator với credential của operator, nên tag trôi nổi sẽ biến mỗi session thành một quyết định supply-chain không ai có mặt để duyệt.</p>
105
+
106
+ <div class="callout">
107
+ <strong>Ghi config không bằng dùng được</strong>
108
+ <p>Server connect lazy — không có gì được kiểm tra cho tới lần gọi đầu tiên. <a href="/mcp-auth">Trạng thái auth</a> cho biết server nào thật sự sẵn sàng.</p>
109
+ </div>
110
+ </section>
111
+
112
+ <section class="section">
113
+ <h2 id="token">Token efficiency</h2>
114
+ <p><span class="inline-code">pi-mcp-adapter</span> đưa mọi server qua một proxy tool duy nhất tên <span class="inline-code">mcp</span>, thay vì nạp toàn bộ tool schema vào context lúc start. Mặc định <span class="inline-code">directTools: false</span>, cộng với <span class="inline-code">outputGuard</span> và <span class="inline-code">idleTimeout</span>.</p>
115
+
116
+ <div class="callout">
117
+ <strong>Bẫy khi bật <span class="inline-code">toolRegistry: enforce</span></strong>
118
+ <p>Proxy tool tên <span class="inline-code">mcp</span> không nằm trong <span class="inline-code">alwaysAllowedTools</span> và không có trong <span class="inline-code">toolCapabilities</span>, nên <span class="inline-code">enforce</span> sẽ chặn <strong>toàn bộ</strong> MCP. Khai thêm <span class="inline-code">mcpCapabilities</span> không cứu được vì block xảy ra trước khi capability được đọc. Ngoại lệ duy nhất là permission profile <span class="inline-code">trusted-full-access</span>.</p>
119
+ </div>
120
+ </section>
@@ -0,0 +1,54 @@
1
+ <section class="section">
2
+
3
+ <div class="table-wrap">
4
+ <table>
5
+ <thead>
6
+ <tr>
7
+ <th>Mode</th>
8
+ <th>Dùng khi nào</th>
9
+ <th>Ranh giới</th>
10
+ <th>Command</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <tr>
15
+ <td><span class="inline-code">read-only</span></td>
16
+ <td>Scout, audit, mapping, review không chỉnh source.</td>
17
+ <td>Cho read, grep, find, ls và piagent tools; chặn shell/write/unknown tools.</td>
18
+ <td><span class="inline-code">/read-only</span></td>
19
+ </tr>
20
+ <tr>
21
+ <td><span class="inline-code">workspace-write</span></td>
22
+ <td>Implementation bình thường trong repo.</td>
23
+ <td>Default guarded mode; giữ protected path, shell policy, capability và verify gate.</td>
24
+ <td><span class="inline-code">/workspace-write</span></td>
25
+ </tr>
26
+ <tr>
27
+ <td><span class="inline-code">trusted-full-access</span></td>
28
+ <td>Automation trên repo đã tin và task đã rõ.</td>
29
+ <td>Nới autonomy trong guard, nhưng vẫn giữ protected path, redaction, lock và confirmation.</td>
30
+ <td><span class="inline-code">/full-access</span></td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ </div>
35
+
36
+ <div class="command-grid">
37
+ <article class="command-card">
38
+ <header><span>Xem permission</span><button class="clip-btn" data-clip="/permission-status">Lấy lệnh</button></header>
39
+ <pre><code>/permission-status</code></pre>
40
+ </article>
41
+ <article class="command-card">
42
+ <header><span>Read-only session</span><button class="clip-btn" data-clip="/read-only">Lấy lệnh</button></header>
43
+ <pre><code>/read-only</code></pre>
44
+ </article>
45
+ <article class="command-card">
46
+ <header><span>Workspace write</span><button class="clip-btn" data-clip="/workspace-write">Lấy lệnh</button></header>
47
+ <pre><code>/workspace-write</code></pre>
48
+ </article>
49
+ <article class="command-card">
50
+ <header><span>Full-access + task</span><button class="clip-btn" data-clip="/full-access Run the trusted local verification suite.">Lấy lệnh</button></header>
51
+ <pre><code>/full-access Run the trusted local verification suite.</code></pre>
52
+ </article>
53
+ </div>
54
+ </section>
@@ -0,0 +1,68 @@
1
+ <section class="section">
2
+
3
+ <div class="command-grid">
4
+ <article class="command-card">
5
+ <header><span>Xem status ngắn</span><button class="clip-btn" data-clip="/profile">Lấy lệnh</button></header>
6
+ <pre><code>/profile</code></pre>
7
+ </article>
8
+ <article class="command-card">
9
+ <header><span>Liệt kê options</span><button class="clip-btn" data-clip="/profile list">Lấy lệnh</button></header>
10
+ <pre><code>/profile list</code></pre>
11
+ </article>
12
+ <article class="command-card">
13
+ <header><span>Áp profile detect</span><button class="clip-btn" data-clip="/profile auto">Lấy lệnh</button></header>
14
+ <pre><code>/profile auto</code></pre>
15
+ </article>
16
+ <article class="command-card">
17
+ <header><span>Setup bằng select</span><button class="clip-btn" data-clip="/profile setup&#10;/profile tech setup fullstack">Lấy lệnh</button></header>
18
+ <pre><code>/profile setup
19
+ /profile tech setup fullstack</code></pre>
20
+ </article>
21
+ <article class="command-card">
22
+ <header><span>Apply tech deterministic</span><button class="clip-btn" data-clip="/profile tech apply fullstack frontend=nextjs backend=nestjs database=prisma">Lấy lệnh</button></header>
23
+ <pre><code>/profile tech apply fullstack frontend=nextjs backend=nestjs database=prisma</code></pre>
24
+ </article>
25
+ <article class="command-card">
26
+ <header><span>Frontend</span><button class="clip-btn" data-clip="/profile web-frontend">Lấy lệnh</button></header>
27
+ <pre><code>/profile web-frontend
28
+ /profile fe</code></pre>
29
+ </article>
30
+ <article class="command-card">
31
+ <header><span>Backend/API</span><button class="clip-btn" data-clip="/profile backend-api">Lấy lệnh</button></header>
32
+ <pre><code>/profile backend-api</code></pre>
33
+ </article>
34
+ <article class="command-card">
35
+ <header><span>Backend read-only, frontend write</span><button class="clip-btn" data-clip="/profile be-readonly-fe">Lấy lệnh</button></header>
36
+ <pre><code>/profile be-readonly-fe
37
+ /profile be-fe</code></pre>
38
+ </article>
39
+ <article class="command-card">
40
+ <header><span>Fullstack</span><button class="clip-btn" data-clip="/profile fullstack">Lấy lệnh</button></header>
41
+ <pre><code>/profile fullstack
42
+ /profile full</code></pre>
43
+ </article>
44
+ <article class="command-card">
45
+ <header><span>Docs-only</span><button class="clip-btn" data-clip="/profile docs">Lấy lệnh</button></header>
46
+ <pre><code>/profile docs</code></pre>
47
+ </article>
48
+ </div>
49
+
50
+ <div class="tag-list">
51
+ <span class="tag">generic</span>
52
+ <span class="tag">node-typescript</span>
53
+ <span class="tag">python</span>
54
+ <span class="tag">web-frontend</span>
55
+ <span class="tag">backend-api</span>
56
+ <span class="tag">fullstack</span>
57
+ <span class="tag">be-readonly-fe</span>
58
+ <span class="tag">data</span>
59
+ <span class="tag">devops</span>
60
+ <span class="tag">mobile</span>
61
+ <span class="tag">docs</span>
62
+ </div>
63
+
64
+ <div class="callout">
65
+ <strong>Tech stack theo role</strong>
66
+ <p>Frontend profile chọn FE + database optional; backend profile chọn BE + database optional; fullstack chọn đủ FE, BE và database. Sau đó platform tạo <span class="inline-code">.pi/tech-stack.json</span> và snapshot Context7 ngắn trong <span class="inline-code">.pi/tech-context/*</span>.</p>
67
+ </div>
68
+ </section>
@@ -0,0 +1,144 @@
1
+ <section class="section">
2
+
3
+ <div class="steps">
4
+ <article class="step">
5
+ <div>
6
+ <h3 id="cai-hai-lenh">Cài — hai lệnh</h3>
7
+ <p>Cần Node.js 22.19.0 trở lên. Không cần cài Pi Coding Agent trước: <span class="inline-code">piagent-setup</span> tự cài đúng bản <span class="inline-code">0.82.0</span> mà release <span class="inline-code">v1.2.1</span> đang pin. Chạy nó ngay trong thư mục project — nó cài Pi package, khởi tạo <span class="inline-code">.pi/</span>, cài MCP baseline cùng subagents, rồi chạy doctor. Thêm <span class="inline-code">--no-mcp</span>, <span class="inline-code">--no-subagents</span>, <span class="inline-code">--no-herdr</span> hoặc <span class="inline-code">--global-only</span> để bỏ bớt.</p>
8
+ <div class="table-wrap compact-table">
9
+ <table>
10
+ <thead>
11
+ <tr>
12
+ <th>Runtime</th>
13
+ <th>Trạng thái rollout</th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td>macOS Apple Silicon + Bash</td>
19
+ <td>Đã verify cho release này.</td>
20
+ </tr>
21
+ <tr>
22
+ <td>Linux x64 + Bash</td>
23
+ <td>Đã verify trong CI.</td>
24
+ </tr>
25
+ <tr>
26
+ <td>macOS Intel / Linux ARM64 + Bash</td>
27
+ <td>Supported target; chạy doctor + smoke test trước khi rollout rộng.</td>
28
+ </tr>
29
+ <tr>
30
+ <td>Native Windows / WSL2</td>
31
+ <td>Chưa là target rollout team; WSL2 chỉ experimental.</td>
32
+ </tr>
33
+ </tbody>
34
+ </table>
35
+ </div>
36
+ <div class="command-card">
37
+ <header><span>Hai lệnh</span><button class="clip-btn" data-clip="npm install -g @piagent/platform&#10;piagent-setup">Lấy lệnh</button></header>
38
+ <pre><code>npm install -g @piagent/platform
39
+ piagent-setup</code></pre>
40
+ </div>
41
+ <p>Vì chạy từ package đã cài, source ghi vào <span class="inline-code">.pi/settings.json</span> là <span class="inline-code">npm:@piagent/platform@&lt;version&gt;</span> — giá trị này có nghĩa như nhau trên máy đồng đội, nên commit được cho cả team.</p>
42
+ <p>Dùng <a href="https://herdr.dev/docs/install/">Herdr</a> thì cài Herdr <strong>trước</strong>: <span class="inline-code">piagent-setup</span> tự cài luôn Herdr Pi integration khi thấy <span class="inline-code">herdr</span> trên <span class="inline-code">PATH</span>, còn không thì bỏ qua kèm cảnh báo — cài Herdr sau phải chạy lại <span class="inline-code">piagent-setup --global-only</span>.</p>
43
+ <div class="command-card">
44
+ <header><span>Herdr (tuỳ chọn, cài trước)</span><button class="clip-btn" data-clip="brew install herdr">Lấy lệnh</button></header>
45
+ <pre><code>brew install herdr # macOS
46
+ curl -fsSL https://herdr.dev/install.sh | sh # macOS hoặc Linux</code></pre>
47
+ </div>
48
+ <p>Bản <span class="inline-code">curl</span> chạy script tải về lúc cài; muốn kiểm tra được thì dùng <span class="inline-code">brew</span> hoặc tải từ <a href="https://github.com/ogulcancelik/herdr/releases">GitHub releases</a>. Herdr stable hỗ trợ macOS và Linux, Windows mới ở mức preview.</p>
49
+ <p>Rollout pin từng bước, update, rollback, và channel latest cho máy cá nhân nằm trong <a href="https://github.com/Vt-mmm/piagent/blob/main/docs/release-install-policy.md">release &amp; install policy</a>.</p>
50
+ </div>
51
+ </article>
52
+
53
+ <article class="step">
54
+ <div>
55
+ <h3 id="mo-repo-du-an">Mở repo dự án</h3>
56
+ <p>Chạy Pi từ thư mục repo. Với repo đã tin cậy, dùng wrapper trusted-run khi cần tự động hoá có kiểm soát.</p>
57
+ <div class="command-card">
58
+ <header><span>Start</span><button class="clip-btn" data-clip="cd /path/to/project && pi">Lấy lệnh</button></header>
59
+ <pre><code>cd /path/to/project
60
+ pi</code></pre>
61
+ </div>
62
+ <p>Cần nhiều agent chạy song song thì gõ <span class="inline-code">herdr</span> thay cho <span class="inline-code">pi</span>, mỗi pane một vai: implement, review read-only, verify, notes. Herdr chỉ điều phối terminal và session — nó không phải security boundary, gate vẫn nằm ở Pi extension và OAuth vẫn login trong Pi. Cách dựng pane: <a href="https://github.com/Vt-mmm/piagent/blob/main/docs/herdr-workflow.md">Herdr workflow</a>.</p>
63
+ </div>
64
+ </article>
65
+
66
+ <article class="step">
67
+ <div>
68
+ <h3 id="onboard-context">Onboard context</h3>
69
+ <p>Chạy một lần ở repo mới để ghi context, verify matrix và protected areas vào <span class="inline-code">.pi/</span>.</p>
70
+ <div class="command-card">
71
+ <header><span>Onboard</span><button class="clip-btn" data-clip="/onboard-project">Lấy lệnh</button></header>
72
+ <pre><code>/onboard-project</code></pre>
73
+ </div>
74
+ </div>
75
+ </article>
76
+
77
+ <article class="step">
78
+ <div>
79
+ <h3 id="chon-profile-tech">Chọn profile + tech</h3>
80
+ <p>Dùng <span class="inline-code">/profile setup</span> để mở select option: chọn profile trước, rồi chọn tech theo role. Fullstack sẽ chọn frontend, backend và database.</p>
81
+ <div class="command-card">
82
+ <header><span>Profile tech setup</span><button class="clip-btn" data-clip="/profile setup&#10;/profile tech setup fullstack">Lấy lệnh</button></header>
83
+ <pre><code>/profile setup
84
+ /profile tech setup fullstack</code></pre>
85
+ </div>
86
+ </div>
87
+ </article>
88
+
89
+ <article class="step">
90
+ <div>
91
+ <h3 id="chon-permission">Chọn permission</h3>
92
+ <p>Scout thì read-only, code bình thường thì workspace-write, automation tin cậy thì full-access có guard.</p>
93
+ <div class="command-card">
94
+ <header><span>Permission</span><button class="clip-btn" data-clip="/workspace-write">Lấy lệnh</button></header>
95
+ <pre><code>/permission-status
96
+ /workspace-write</code></pre>
97
+ </div>
98
+ </div>
99
+ </article>
100
+
101
+ <article class="step">
102
+ <div>
103
+ <h3 id="chay-workflow">Chạy workflow</h3>
104
+ <p>Dùng command đúng mục tiêu để agent không phải diễn giải quá dài. Task nào nặng context thì dùng fresh session.</p>
105
+ <div class="command-card">
106
+ <header><span>Workflow</span><button class="clip-btn" data-clip="/task Implement the requested bounded change.">Lấy lệnh</button></header>
107
+ <pre><code>/task Implement the requested bounded change.
108
+ /review
109
+ /fresh-task Implement the requested bounded change.</code></pre>
110
+ </div>
111
+ </div>
112
+ </article>
113
+
114
+ <article class="step">
115
+ <div>
116
+ <h3 id="verify-truoc-khi-handoff">Verify trước khi handoff</h3>
117
+ <p>Final gate chỉ tin kết quả command đã chạy thật, exit 0, và khớp verify plan. Sau khi pin hoặc nâng version, chạy doctor trên project:</p>
118
+ <div class="command-card">
119
+ <header><span>Doctor</span><button class="clip-btn" data-clip="piagent-doctor">Lấy lệnh</button></header>
120
+ <pre><code>piagent-doctor</code></pre>
121
+ </div>
122
+ <p>Người phát triển chính platform còn có <span class="inline-code">npm run verify</span> trong source repo; chi tiết ở <a href="https://github.com/Vt-mmm/piagent/blob/main/CONTRIBUTING.md">CONTRIBUTING</a>.</p>
123
+ </div>
124
+ </article>
125
+
126
+ <article class="step">
127
+ <div>
128
+ <h3 id="go-cai-dat-khi-khong-dung-nua">Gỡ cài đặt khi không dùng nữa</h3>
129
+ <p><span class="inline-code">piagent-uninstall</span> mặc định chỉ in ra sẽ gỡ những gì rồi thoát; phải thêm <span class="inline-code">--apply</span> nó mới thực hiện, vì nó sửa Pi settings mà công cụ khác cũng ghi vào. Mặc định chỉ gỡ Pi package của platform; add-on, Pi host và state trong project đều là opt-in.</p>
130
+ <div class="command-card">
131
+ <header><span>Gỡ — hai lệnh</span><button class="clip-btn" data-clip="piagent-uninstall&#10;piagent-uninstall --apply">Lấy lệnh</button></header>
132
+ <pre><code>piagent-uninstall
133
+ piagent-uninstall --apply</code></pre>
134
+ </div>
135
+ <p>Add-on, Pi host, state trong project và helper npm-global đều tách riêng và là opt-in — <span class="inline-code">piagent-uninstall --help</span> liệt kê đủ. Nó gỡ theo những gì đang đăng ký trong Pi settings chứ không theo những gì bản hiện tại cài, nên package do release cũ đăng ký vẫn ra được.</p>
136
+ <div class="callout ok-callout">
137
+ <strong>Không bao giờ bị xoá</strong>
138
+ <p>Credential, trust, session, todo và <span class="inline-code">.pi/memory/</span> được giữ nguyên ở mọi tổ hợp cờ — đó là dữ liệu của người dùng, không phải state của platform. Các file sinh từ template rồi sửa tiếp như <span class="inline-code">AGENTS.md</span>, <span class="inline-code">.pi/settings.json</span>, <span class="inline-code">project-context.md</span> chỉ được liệt kê để tự quyết. Với <span class="inline-code">.pi/settings.json</span>, chỉ đúng entry trỏ tới platform bị bỏ khỏi <span class="inline-code">packages</span>.</p>
139
+ </div>
140
+ </div>
141
+ </article>
142
+
143
+ </div>
144
+ </section>