@selesai/code 0.5.21 → 0.5.23
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 +1 -1
- package/dist/core/agent-session-skill-block.test.d.ts +2 -0
- package/dist/core/agent-session-skill-block.test.d.ts.map +1 -0
- package/dist/core/agent-session-skill-block.test.js +20 -0
- package/dist/core/agent-session-skill-block.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +7 -4
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +22 -12
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/data/capabilities.d.ts +48 -0
- package/dist/data/capabilities.d.ts.map +1 -0
- package/dist/data/capabilities.js +282 -0
- package/dist/data/capabilities.js.map +1 -0
- package/dist/data/navigation.d.ts +3 -0
- package/dist/data/navigation.d.ts.map +1 -0
- package/dist/data/navigation.js +90 -0
- package/dist/data/navigation.js.map +1 -0
- package/dist/extensions/inline-skills.test.ts +96 -0
- package/dist/extensions/inline-skills.ts +92 -0
- package/dist/extensions/package.json +1 -0
- package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -0
- package/dist/extensions/pi-powerline-footer/tps.ts +172 -113
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +0 -4
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +1 -1
- package/dist/extensions/question/batch.ts +89 -25
- package/dist/extensions/question/constants.ts +1 -1
- package/dist/extensions/question/helpers.ts +34 -78
- package/dist/extensions/question/index.ts +327 -564
- package/dist/extensions/question/package.json +2 -1
- package/dist/extensions/question/question-list.ts +21 -14
- package/dist/extensions/question/row-layout.ts +2 -2
- package/dist/extensions/question/schemas.ts +33 -47
- package/dist/extensions/question/selection-mode.ts +5 -7
- package/dist/extensions/question/tests/batch.test.ts +65 -16
- package/dist/extensions/question/tests/helpers.test.ts +31 -156
- package/dist/extensions/question/tests/question-list.test.ts +17 -3
- package/dist/extensions/question/tests/row-layout.test.ts +4 -4
- package/dist/extensions/question/tests/schemas.test.ts +30 -0
- package/dist/extensions/question/tests/wizard.test.ts +99 -0
- package/dist/extensions/question/types.ts +65 -66
- package/dist/extensions/workflow/adapter.ts +20 -77
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +10 -10
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/skills/workflow-creation/SKILL.md +2 -2
- package/docs/skills.md +8 -0
- package/docs/workflows.md +4 -4
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/data/capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["export type Category =\n | \"delegation-and-workflows\"\n | \"research-and-interaction\"\n | \"continuity-and-recovery\"\n | \"terminal-workspace\"\n | \"skills-and-productivity\";\n\nexport interface Capability {\n slug: string;\n category: Category;\n en: { displayName: string; benefit: string };\n id: { displayName: string; benefit: string };\n sourcePaths: string[];\n sourceLinks: { text: string; url: string }[];\n guideRoute: string;\n piComparison: \"core-differentiator\" | \"bundled\" | \"ergonomic\" | \"reference\";\n}\n\nconst repo = \"https://github.com/SelesaiInTech/selesai-code/blob/main\";\n\nconst srcPath = (paths: string[]) => paths;\nconst links = (label: string, path: string) => ({\n text: label,\n url: `${repo}/${path}`,\n});\n\nexport const categories: { id: Category; en: string; id: string }[] = [\n { id: \"delegation-and-workflows\", en: \"Delegation and workflows\", id: \"Delegasi dan alur kerja\" },\n { id: \"research-and-interaction\", en: \"Research and interaction\", id: \"Riset dan interaksi\" },\n { id: \"continuity-and-recovery\", en: \"Continuity and recovery\", id: \"Kontinuitas dan pemulihan\" },\n { id: \"terminal-workspace\", en: \"Terminal workspace\", id: \"Ruang kerja terminal\" },\n { id: \"skills-and-productivity\", en: \"Skills and productivity\", id: \"Skill dan produktivitas\" },\n];\n\nexport const capabilities: Capability[] = [\n {\n slug: \"pi-subagents\",\n category: \"delegation-and-workflows\",\n en: { displayName: \"Subagent delegation\", benefit: \"Run focused in-tree agent roles in foreground, background, parallel, or chained modes with tooling and model controls.\" },\n id: { displayName: \"Delegasi subagent\", benefit: \"Jalankan peran agent yang fokus secara in-tree dalam mode foreground, background, paralel, atau berantai dengan kontrol tooling dan model.\" },\n sourcePaths: [\"src/extensions/pi-subagents/\", \"README.md\"],\n sourceLinks: [\n links(\"Extension source\", \"src/extensions/pi-subagents/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/delegation/pi-subagents\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"workflow\",\n category: \"delegation-and-workflows\",\n en: { displayName: \"Durable workflows\", benefit: \"Resumeable, stateful project workflows across prototype, quick, and task modes with explicit lifecycle management.\" },\n id: { displayName: \"Workflow tahan lama\", benefit: \"Alur kerja proyek yang stateful dan dapat dilanjutkan kembali dengan mode prototype, quick, dan task serta manajemen siklus hidup eksplisit.\" },\n sourcePaths: [\"src/extensions/workflow/\", \"README.md\"],\n sourceLinks: [\n links(\"Workflow source\", \"src/extensions/workflow/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/delegation/workflow\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"pi-web-agent\",\n category: \"research-and-interaction\",\n en: { displayName: \"Web research\", benefit: \"Single `web_explore` research tool with bounded search, fetch, source ranking, and headless-browser escalation.\" },\n id: { displayName: \"Riset web\", benefit: \"Satu peralatan `web_explore` untuk riset dengan pencarian terbatas, fetch, peringkat sumber, dan eskalasi headless browser.\" },\n sourcePaths: [\"src/extensions/pi-web-agent/\", \"README.md\"],\n sourceLinks: [\n links(\"Web agent source\", \"src/extensions/pi-web-agent/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/web-agent\",\n piComparison: \"bundled\",\n },\n {\n slug: \"question\",\n category: \"research-and-interaction\",\n en: { displayName: \"Interactive questions\", benefit: \"TUI for single, multi-select, freeform, and image/info questions with keyboard navigation and filtering.\" },\n id: { displayName: \"Pertanyaan interaktif\", benefit: \"TUI untuk pertanyaan single/multi-select, freeform, dan image/info dengan navigasi keyboard dan filtering.\" },\n sourcePaths: [\"src/extensions/question/\", \"README.md\"],\n sourceLinks: [\n links(\"Question source\", \"src/extensions/question/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/question\",\n piComparison: \"bundled\",\n },\n {\n slug: \"grep-app\",\n category: \"research-and-interaction\",\n en: { displayName: \"Public code search\", benefit: \"Search GitHub code through grep.app and fetch matching source without leaving the agent.\" },\n id: { displayName: \"Pencarian kode publik\", benefit: \"Cari kode GitHub melalui grep.app dan ambil source yang cocok tanpa meninggalkan agent.\" },\n sourcePaths: [\"src/extensions/grep-app/\", \"README.md\"],\n sourceLinks: [\n links(\"grep.app source\", \"src/extensions/grep-app/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/grep-app\",\n piComparison: \"bundled\",\n },\n {\n slug: \"pi-intercom\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Session coordination\", benefit: \"Local 1:1 session messaging, ask/reply, and attachments between named Selesai sessions.\" },\n id: { displayName: \"Koordinasi sesi\", benefit: \"Pesan lokal 1:1 antar sesi Selesai yang diberi nama, ask/reply, dan lampiran.\" },\n sourcePaths: [\"src/extensions/pi-intercom/\", \"README.md\"],\n sourceLinks: [\n links(\"Intercom source\", \"src/extensions/pi-intercom/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/intercom\",\n piComparison: \"bundled\",\n },\n {\n slug: \"undo\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Turn-level undo\", benefit: \"Undo tracked edits, writes, and detected mutating shell commands one turn at a time.\" },\n id: { displayName: \"Undo per turn\", benefit: \"Batalkan edit, write, dan shell command bermutasi yang terdeteksi satu turn demi satu turn.\" },\n sourcePaths: [\"src/extensions/undo.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Undo source\", \"src/extensions/undo.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/undo\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"copy-turn\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Copy turn\", benefit: \"Copy a user or assistant result from the session by hash using `/cp <hash>`.\" },\n id: { displayName: \"Salin turn\", benefit: \"Salin hasil user atau assistant dari sesi menggunakan hash dengan `/cp <hash>`.\" },\n sourcePaths: [\"src/extensions/copy-turn.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Copy turn source\", \"src/extensions/copy-turn.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/copy-turn\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"context-compaction-reminder\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Context reminder\", benefit: \"Warn when a conversation grows large and suggest `/handoff-new` to reduce context and cost.\" },\n id: { displayName: \"Pengingat konteks\", benefit: \"Peringatkan saat percakapan membesar dan sarankan `/handoff-new` untuk mengurangi konteks dan biaya.\" },\n sourcePaths: [\"src/extensions/context-compaction-reminder.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Reminder source\", \"src/extensions/context-compaction-reminder.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/context-reminder\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"handoff-new\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Session handoff\", benefit: \"Create an editable continuation prompt in a clean session to reset context and cut token spend.\" },\n id: { displayName: \"Handoff sesi\", benefit: \"Buat prompt kelanjutan yang dapat diedit dalam sesi bersih untuk mereset konteks dan menghemat token.\" },\n sourcePaths: [\"src/extensions/handoff-new.ts\", \"README.md\", \"src/skills/handoff/\", \"src/skills/selesai-handoff/\"],\n sourceLinks: [\n links(\"Handoff source\", \"src/extensions/handoff-new.ts\"),\n links(\"Handoff skill\", \"src/skills/handoff/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/handoff-new\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"pi-rewind-hook\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Rewind checkpoints\", benefit: \"Exact git-backed file checkpoints across `/fork`, `/tree`, resumed sessions, and session lineage.\" },\n id: { displayName: \"Checkpoint rewind\", benefit: \"Checkpoint file yang didukung git secara tepat di `/fork`, `/tree`, sesi yang dilanjutkan, dan silsilah sesi.\" },\n sourcePaths: [\"src/extensions/pi-rewind-hook/\", \"README.md\"],\n sourceLinks: [\n links(\"Rewind source\", \"src/extensions/pi-rewind-hook/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/rewind\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"pi-powerline-footer\",\n category: \"terminal-workspace\",\n en: { displayName: \"Powerline footer\", benefit: \"Status bar, fixed-editor layout, recurring guide tour, persistent bash, stashes, themes, and Nerd Font detection.\" },\n id: { displayName: \"Footer powerline\", benefit: \"Status bar, tata letak editor tetap, tur panduan berulang, bash persisten, stash, tema, dan deteksi Nerd Font.\" },\n sourcePaths: [\"src/extensions/pi-powerline-footer/\", \"README.md\", \"src/core/footer-data-provider.ts\"],\n sourceLinks: [\n links(\"Footer source\", \"src/extensions/pi-powerline-footer/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/powerline-footer\",\n piComparison: \"bundled\",\n },\n {\n slug: \"web-agent-onboarding\",\n category: \"terminal-workspace\",\n en: { displayName: \"Web agent onboarding\", benefit: \"First-run Brave Search onboarding for the web agent, with DuckDuckGo fallback.\" },\n id: { displayName: \"Onboarding web agent\", benefit: \"Onboarding Brave Search pertama kali untuk web agent, dengan fallback DuckDuckGo.\" },\n sourcePaths: [\"src/extensions/web-agent-onboarding.ts\", \"src/extensions/pi-web-agent/\", \"README.md\"],\n sourceLinks: [\n links(\"Onboarding source\", \"src/extensions/web-agent-onboarding.ts\"),\n links(\"Web agent source\", \"src/extensions/pi-web-agent/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/web-agent-onboarding\",\n piComparison: \"bundled\",\n },\n {\n slug: \"tokenin-onboarding\",\n category: \"terminal-workspace\",\n en: { displayName: \"Token onboarding\", benefit: \"First-run onboarding path for provider credentials and API tokens.\" },\n id: { displayName: \"Onboarding token\", benefit: \"Jalur onboarding pertama kali untuk kredensial provider dan token API.\" },\n sourcePaths: [\"src/extensions/tokenin-onboarding.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Token onboarding source\", \"src/extensions/tokenin-onboarding.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/tokenin-onboarding\",\n piComparison: \"bundled\",\n },\n {\n slug: \"inline-skills\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Inline skills\", benefit: \"Lightweight inline skill invitations without separate skill files.\" },\n id: { displayName: \"Skill inline\", benefit: \"Ajakan skill inline ringan tanpa file skill terpisah.\" },\n sourcePaths: [\"src/extensions/inline-skills.ts\", \"README.md\", \"src/core/skills.ts\"],\n sourceLinks: [\n links(\"Inline skills source\", \"src/extensions/inline-skills.ts\"),\n links(\"Skills loader\", \"src/core/skills.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/inline-skills\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"ponytail\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Ponytail communication\", benefit: \"Minimal, compressed communication mode and review helpers invoked via `/skill:ponytail*`.\" },\n id: { displayName: \"Komunikasi Ponytail\", benefit: \"Mode komunikasi minimal dan terkompresi serta helper review, dipanggil via `/skill:ponytail*`.\" },\n sourcePaths: [\"src/extensions/ponytail/\", \"src/skills/ponytail*/\", \"README.md\"],\n sourceLinks: [\n links(\"Ponytail extension\", \"src/extensions/ponytail/\"),\n links(\"Ponytail skills\", \"src/skills/ponytail/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/ponytail\",\n piComparison: \"bundled\",\n },\n {\n slug: \"caveman\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Caveman communication\", benefit: \"Abbreviated, focused response style invoked via `/skill:caveman`.\" },\n id: { displayName: \"Komunikasi Caveman\", benefit: \"Gaya responsi yang dipersingkat dan fokus, dipanggil via `/skill:caveman`.\" },\n sourcePaths: [\"src/extensions/caveman/\", \"src/skills/caveman/\", \"README.md\"],\n sourceLinks: [\n links(\"Caveman extension\", \"src/extensions/caveman/\"),\n links(\"Caveman skill\", \"src/skills/caveman/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/caveman\",\n piComparison: \"bundled\",\n },\n {\n slug: \"rtk\",\n category: \"skills-and-productivity\",\n en: { displayName: \"RTK integration\", benefit: \"Rewrite compatible shell commands to reduce noisy output and token burn when `rtk` is installed.\" },\n id: { displayName: \"Integrasi RTK\", benefit: \"Tulis ulang shell command yang kompatibel untuk mengurangi output berisik dan penggunaan token saat `rtk` terpasang.\" },\n sourcePaths: [\"src/extensions/rtk.ts\", \"README.md\"],\n sourceLinks: [\n links(\"RTK source\", \"src/extensions/rtk.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/rtk\",\n piComparison: \"ergonomic\",\n },\n];\n\nexport function capabilitiesByCategory(cat: Category) {\n return capabilities.filter((c) => c.category === cat);\n}\n\nexport function getCapability(slug: string) {\n return capabilities.find((c) => c.slug === slug);\n}\n\nexport function categoryLabel(cat: Category, locale: \"en\" | \"id\") {\n return categories.find((c) => c.id === cat)?.[locale] ?? cat;\n}\n\nexport const EN_LABELS = {\n install: \"Install\",\n getStarted: \"Get started\",\n whySelesai: \"Why Selesai\",\n capabilities: \"Capabilities\",\n evidence: \"Evidence\",\n changelog: \"Changelog\",\n accessibility: \"Accessibility & privacy\",\n};\n\nexport const ID_LABELS = {\n install: \"Instal\",\n getStarted: \"Mulai\",\n whySelesai: \"Mengapa Selesai\",\n capabilities: \"Kemampuan\",\n evidence: \"Bukti dan metodologi\",\n changelog: \"Changelog\",\n accessibility: \"Aksesibilitas & privasi\",\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/data/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAyBxE,eAAO,MAAM,UAAU,EAAE,aAmExB,CAAC","sourcesContent":["import type { SidebarConfig } from \"@astrojs/starlight/schemas/sidebar\";\nimport { capabilities, categories } from \"./capabilities.ts\";\n\nconst en = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));\n return {\n label: cat.en,\n collapsed: true,\n items,\n };\n});\n\nconst id = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));\n return {\n label: cat.id,\n collapsed: true,\n items,\n };\n});\n\nexport const navigation: SidebarConfig = [\n {\n label: \"Home\",\n link: \"/\",\n },\n {\n label: \"Get started\",\n link: \"/get-started/\",\n },\n {\n label: \"Why Selesai\",\n link: \"/why-selesai/\",\n },\n {\n label: \"Capabilities\",\n link: \"/capabilities/\",\n },\n {\n label: \"Evidence\",\n link: \"/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/changelog/\",\n },\n {\n label: \"Accessibility\",\n link: \"/accessibility/\",\n },\n {\n label: \"Guides\",\n collapsed: true,\n items: en,\n },\n {\n label: \"Beranda\",\n link: \"/id/\",\n },\n {\n label: \"Mulai\",\n link: \"/id/get-started/\",\n },\n {\n label: \"Mengapa Selesai\",\n link: \"/id/why-selesai/\",\n },\n {\n label: \"Kemampuan\",\n link: \"/id/capabilities/\",\n },\n {\n label: \"Bukti dan metodologi\",\n link: \"/id/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/id/changelog/\",\n },\n {\n label: \"Aksesibilitas\",\n link: \"/id/accessibility/\",\n },\n {\n label: \"Panduan\",\n collapsed: true,\n items: id,\n },\n];\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { capabilities, categories } from "./capabilities.js";
|
|
2
|
+
const en = categories.map((cat) => {
|
|
3
|
+
const items = capabilities
|
|
4
|
+
.filter((c) => c.category === cat.id)
|
|
5
|
+
.map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));
|
|
6
|
+
return {
|
|
7
|
+
label: cat.en,
|
|
8
|
+
collapsed: true,
|
|
9
|
+
items,
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
const id = categories.map((cat) => {
|
|
13
|
+
const items = capabilities
|
|
14
|
+
.filter((c) => c.category === cat.id)
|
|
15
|
+
.map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));
|
|
16
|
+
return {
|
|
17
|
+
label: cat.id,
|
|
18
|
+
collapsed: true,
|
|
19
|
+
items,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
export const navigation = [
|
|
23
|
+
{
|
|
24
|
+
label: "Home",
|
|
25
|
+
link: "/",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: "Get started",
|
|
29
|
+
link: "/get-started/",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
label: "Why Selesai",
|
|
33
|
+
link: "/why-selesai/",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: "Capabilities",
|
|
37
|
+
link: "/capabilities/",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: "Evidence",
|
|
41
|
+
link: "/evidence/",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
label: "Changelog",
|
|
45
|
+
link: "/changelog/",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
label: "Accessibility",
|
|
49
|
+
link: "/accessibility/",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: "Guides",
|
|
53
|
+
collapsed: true,
|
|
54
|
+
items: en,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: "Beranda",
|
|
58
|
+
link: "/id/",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: "Mulai",
|
|
62
|
+
link: "/id/get-started/",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
label: "Mengapa Selesai",
|
|
66
|
+
link: "/id/why-selesai/",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
label: "Kemampuan",
|
|
70
|
+
link: "/id/capabilities/",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
label: "Bukti dan metodologi",
|
|
74
|
+
link: "/id/evidence/",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
label: "Changelog",
|
|
78
|
+
link: "/id/changelog/",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: "Aksesibilitas",
|
|
82
|
+
link: "/id/accessibility/",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
label: "Panduan",
|
|
86
|
+
collapsed: true,
|
|
87
|
+
items: id,
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
//# sourceMappingURL=navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/data/navigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IACxE,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,SAAS,EAAE,IAAI;QACf,KAAK;KACN,CAAC;AAAA,CACH,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,SAAS,EAAE,IAAI;QACf,KAAK;KACN,CAAC;AAAA,CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC;QACE,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;KACV;IACD;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,gBAAgB;KACvB;IACD;QACE,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,YAAY;KACnB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,aAAa;KACpB;IACD;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,iBAAiB;KACxB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE;KACV;IACD;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,MAAM;KACb;IACD;QACE,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,mBAAmB;KAC1B;IACD;QACE,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,gBAAgB;KACvB;IACD;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,oBAAoB;KAC3B;IACD;QACE,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE;KACV;CACF,CAAC","sourcesContent":["import type { SidebarConfig } from \"@astrojs/starlight/schemas/sidebar\";\nimport { capabilities, categories } from \"./capabilities.ts\";\n\nconst en = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));\n return {\n label: cat.en,\n collapsed: true,\n items,\n };\n});\n\nconst id = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));\n return {\n label: cat.id,\n collapsed: true,\n items,\n };\n});\n\nexport const navigation: SidebarConfig = [\n {\n label: \"Home\",\n link: \"/\",\n },\n {\n label: \"Get started\",\n link: \"/get-started/\",\n },\n {\n label: \"Why Selesai\",\n link: \"/why-selesai/\",\n },\n {\n label: \"Capabilities\",\n link: \"/capabilities/\",\n },\n {\n label: \"Evidence\",\n link: \"/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/changelog/\",\n },\n {\n label: \"Accessibility\",\n link: \"/accessibility/\",\n },\n {\n label: \"Guides\",\n collapsed: true,\n items: en,\n },\n {\n label: \"Beranda\",\n link: \"/id/\",\n },\n {\n label: \"Mulai\",\n link: \"/id/get-started/\",\n },\n {\n label: \"Mengapa Selesai\",\n link: \"/id/why-selesai/\",\n },\n {\n label: \"Kemampuan\",\n link: \"/id/capabilities/\",\n },\n {\n label: \"Bukti dan metodologi\",\n link: \"/id/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/id/changelog/\",\n },\n {\n label: \"Aksesibilitas\",\n link: \"/id/accessibility/\",\n },\n {\n label: \"Panduan\",\n collapsed: true,\n items: id,\n },\n];\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import type { ExtensionAPI, ExtensionContext } from "@selesai/code";
|
|
6
|
+
import inlineSkillsExtension, { createInlineSkillAutocompleteProvider, expandInlineSkills } from "./inline-skills.ts";
|
|
7
|
+
|
|
8
|
+
const skill = (name: string, path: string, description = `${name} description`) => ({
|
|
9
|
+
name: `skill:${name}`,
|
|
10
|
+
description,
|
|
11
|
+
source: "skill" as const,
|
|
12
|
+
sourceInfo: { path },
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
function createPi(commands: ReturnType<typeof skill>[]) {
|
|
16
|
+
return { getCommands: vi.fn(() => commands), on: vi.fn() } as unknown as ExtensionAPI;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("inline-skills", () => {
|
|
20
|
+
const tempDirs: string[] = [];
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
for (const dir of tempDirs.splice(0)) rmSync(dir, { recursive: true, force: true });
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("suggests skills after # anywhere in a line", async () => {
|
|
26
|
+
const pi = createPi([skill("research", "/skills/research/SKILL.md"), skill("review", "/skills/review/SKILL.md")]);
|
|
27
|
+
const base = { getSuggestions: vi.fn(async () => null), applyCompletion: vi.fn() } as any;
|
|
28
|
+
const provider = createInlineSkillAutocompleteProvider(pi, base);
|
|
29
|
+
|
|
30
|
+
expect(await provider.getSuggestions(["Draft #res"], 0, 10, {} as any)).toEqual({
|
|
31
|
+
prefix: "#res",
|
|
32
|
+
items: [{ value: "#research", label: "#research", description: "research description" }],
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("suggests skills matching a later hyphenated segment", async () => {
|
|
37
|
+
const pi = createPi([skill("batch-grill-me", "/skills/batch-grill-me/SKILL.md")]);
|
|
38
|
+
const base = { getSuggestions: vi.fn(async () => null), applyCompletion: vi.fn() } as any;
|
|
39
|
+
const provider = createInlineSkillAutocompleteProvider(pi, base);
|
|
40
|
+
|
|
41
|
+
expect(await provider.getSuggestions(["#grill"], 0, 6, {} as any)).toEqual({
|
|
42
|
+
prefix: "#grill",
|
|
43
|
+
items: [{ value: "#batch-grill-me", label: "#batch-grill-me", description: "batch-grill-me description" }],
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("prepends every referenced skill and preserves the original prompt", () => {
|
|
48
|
+
const dir = mkdtempSync(join(tmpdir(), "inline-skills-"));
|
|
49
|
+
tempDirs.push(dir);
|
|
50
|
+
const research = join(dir, "research.md");
|
|
51
|
+
const grill = join(dir, "grill.md");
|
|
52
|
+
writeFileSync(research, "---\nname: research\ndescription: Research\n---\nResearch instructions.\n");
|
|
53
|
+
writeFileSync(grill, "---\nname: batch-grill-me\ndescription: Grill\n---\nGrill instructions.\n");
|
|
54
|
+
const pi = createPi([skill("research", research), skill("batch-grill-me", grill)]);
|
|
55
|
+
const prompt = "Plan with #research and #batch-grill-me; keep #unknown.";
|
|
56
|
+
|
|
57
|
+
const text = expandInlineSkills(prompt, pi);
|
|
58
|
+
|
|
59
|
+
expect(text.match(/<skill name=/g)).toHaveLength(2);
|
|
60
|
+
expect(text).toContain("Research instructions.");
|
|
61
|
+
expect(text).toContain("Grill instructions.");
|
|
62
|
+
expect(text.endsWith(prompt)).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("deduplicates repeated skill references", () => {
|
|
66
|
+
const dir = mkdtempSync(join(tmpdir(), "inline-skills-"));
|
|
67
|
+
tempDirs.push(dir);
|
|
68
|
+
const file = join(dir, "research.md");
|
|
69
|
+
writeFileSync(file, "---\ndescription: Research\n---\nResearch instructions.\n");
|
|
70
|
+
const text = expandInlineSkills("Use #research, then #research again", createPi([skill("research", file)]));
|
|
71
|
+
|
|
72
|
+
expect(text.match(/<skill name=/g)).toHaveLength(1);
|
|
73
|
+
expect(text.endsWith("Use #research, then #research again")).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("registers autocomplete and transforms interactive input", () => {
|
|
77
|
+
const dir = mkdtempSync(join(tmpdir(), "inline-skills-"));
|
|
78
|
+
tempDirs.push(dir);
|
|
79
|
+
const file = join(dir, "research.md");
|
|
80
|
+
writeFileSync(file, "---\ndescription: Research\n---\nResearch instructions.\n");
|
|
81
|
+
const handlers = new Map<string, Function>();
|
|
82
|
+
const pi = {
|
|
83
|
+
getCommands: vi.fn(() => [skill("research", file)]),
|
|
84
|
+
on: vi.fn((event: string, handler: Function) => handlers.set(event, handler)),
|
|
85
|
+
} as unknown as ExtensionAPI;
|
|
86
|
+
const addAutocompleteProvider = vi.fn();
|
|
87
|
+
|
|
88
|
+
inlineSkillsExtension(pi);
|
|
89
|
+
handlers.get("session_start")!({}, { ui: { addAutocompleteProvider } } as unknown as ExtensionContext);
|
|
90
|
+
const result = handlers.get("input")!({ text: "Use #research now", source: "interactive" });
|
|
91
|
+
|
|
92
|
+
expect(addAutocompleteProvider).toHaveBeenCalledOnce();
|
|
93
|
+
expect(result).toMatchObject({ action: "transform", text: expect.stringMatching(/<skill[\s\S]*Use #research now$/) });
|
|
94
|
+
expect(handlers.get("input")!({ text: "#research", source: "extension" })).toEqual({ action: "continue" });
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { stripFrontmatter, type ExtensionAPI, type SlashCommandInfo } from "@selesai/code";
|
|
4
|
+
import type { AutocompleteItem, AutocompleteProvider } from "@earendil-works/pi-tui";
|
|
5
|
+
|
|
6
|
+
type SkillCommand = SlashCommandInfo & { source: "skill" };
|
|
7
|
+
|
|
8
|
+
const INLINE_SKILL_TOKEN = /(^|[^a-z0-9_-])#([a-z0-9]+(?:-[a-z0-9]+)*)(?![a-z0-9_-])/gi;
|
|
9
|
+
|
|
10
|
+
function getSkillCommands(pi: ExtensionAPI): SkillCommand[] {
|
|
11
|
+
return pi
|
|
12
|
+
.getCommands()
|
|
13
|
+
.filter(
|
|
14
|
+
(command): command is SkillCommand =>
|
|
15
|
+
command.source === "skill" && command.name.startsWith("skill:"),
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getSkillName(command: SkillCommand): string {
|
|
20
|
+
return command.name.slice("skill:".length);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getInlineSkillToken(textBeforeCursor: string): string | undefined {
|
|
24
|
+
const match = textBeforeCursor.match(/(?:^|[^a-z0-9_-])#([a-z0-9-]*)$/i);
|
|
25
|
+
return match ? match[1] ?? "" : undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function createInlineSkillAutocompleteProvider(pi: ExtensionAPI, current: AutocompleteProvider): AutocompleteProvider {
|
|
29
|
+
return {
|
|
30
|
+
triggerCharacters: ["#"],
|
|
31
|
+
async getSuggestions(lines, cursorLine, cursorCol, options) {
|
|
32
|
+
const token = getInlineSkillToken((lines[cursorLine] ?? "").slice(0, cursorCol));
|
|
33
|
+
if (token === undefined) {
|
|
34
|
+
return current.getSuggestions(lines, cursorLine, cursorCol, options);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const items: AutocompleteItem[] = getSkillCommands(pi)
|
|
38
|
+
.filter((command) => getSkillName(command).includes(token.toLowerCase()))
|
|
39
|
+
.map((command) => ({
|
|
40
|
+
value: `#${getSkillName(command)}`,
|
|
41
|
+
label: `#${getSkillName(command)}`,
|
|
42
|
+
description: command.description,
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
return items.length > 0 ? { prefix: `#${token}`, items } : current.getSuggestions(lines, cursorLine, cursorCol, options);
|
|
46
|
+
},
|
|
47
|
+
applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
|
|
48
|
+
return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
|
|
49
|
+
},
|
|
50
|
+
shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
|
|
51
|
+
return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function expandInlineSkills(text: string, pi: ExtensionAPI): string {
|
|
57
|
+
const skills = new Map(getSkillCommands(pi).map((command) => [getSkillName(command), command]));
|
|
58
|
+
const selected: SkillCommand[] = [];
|
|
59
|
+
const seen = new Set<string>();
|
|
60
|
+
|
|
61
|
+
for (const match of text.matchAll(INLINE_SKILL_TOKEN)) {
|
|
62
|
+
const command = skills.get(match[2].toLowerCase());
|
|
63
|
+
if (!command || seen.has(command.name)) continue;
|
|
64
|
+
seen.add(command.name);
|
|
65
|
+
selected.push(command);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const blocks = selected.flatMap((command) => {
|
|
69
|
+
try {
|
|
70
|
+
const body = stripFrontmatter(readFileSync(command.sourceInfo.path, "utf-8")).trim();
|
|
71
|
+
const location = command.sourceInfo.path;
|
|
72
|
+
return [`<skill name="${getSkillName(command)}" location="${location}">\nReferences are relative to ${dirname(location)}.\n\n${body}\n</skill>`];
|
|
73
|
+
} catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return blocks.length > 0 ? `${blocks.join("\n\n")}\n\n${text}` : text;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default function inlineSkillsExtension(pi: ExtensionAPI): void {
|
|
82
|
+
pi.on("session_start", (_event, ctx) => {
|
|
83
|
+
ctx.ui.addAutocompleteProvider((current) => createInlineSkillAutocompleteProvider(pi, current));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
pi.on("input", (event) => {
|
|
87
|
+
if (event.source === "extension") return { action: "continue" };
|
|
88
|
+
|
|
89
|
+
const text = expandInlineSkills(event.text, pi);
|
|
90
|
+
return text === event.text ? { action: "continue" } : { action: "transform", text };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { calculateReliableTps, type TpsTiming } from "../tps.ts";
|
|
4
|
+
|
|
5
|
+
function timing(overrides: Partial<TpsTiming> = {}): TpsTiming {
|
|
6
|
+
return {
|
|
7
|
+
messageStartMs: 0,
|
|
8
|
+
lastUpdateMs: 350,
|
|
9
|
+
firstTokenMs: 100,
|
|
10
|
+
updateCount: 5,
|
|
11
|
+
firstStreamUpdateMs: 150,
|
|
12
|
+
lastStreamUpdateMs: 350,
|
|
13
|
+
stallMs: 0,
|
|
14
|
+
generationMs: 400,
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
test("calculateReliableTps uses active stream time for sufficiently sampled output", () => {
|
|
20
|
+
assert.deepEqual(calculateReliableTps(100, timing()), {
|
|
21
|
+
tps: 500,
|
|
22
|
+
effectiveMs: 200,
|
|
23
|
+
isPrimary: true,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("calculateReliableTps falls back around stalls and rejects implausible samples", () => {
|
|
28
|
+
assert.deepEqual(calculateReliableTps(100, timing({ updateCount: 2, firstStreamUpdateMs: 150, lastStreamUpdateMs: 250, generationMs: 500 })), {
|
|
29
|
+
tps: 200,
|
|
30
|
+
effectiveMs: 500,
|
|
31
|
+
isPrimary: false,
|
|
32
|
+
});
|
|
33
|
+
assert.deepEqual(calculateReliableTps(100, timing({ stallMs: 100 })), {
|
|
34
|
+
tps: 333.3,
|
|
35
|
+
effectiveMs: 300,
|
|
36
|
+
isPrimary: false,
|
|
37
|
+
});
|
|
38
|
+
assert.equal(calculateReliableTps(10_001, timing()), null);
|
|
39
|
+
});
|