@agimon-ai/doompi-skill 0.0.1-alpha.6 → 0.0.1-alpha.7
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 +15 -9
- package/dist/adapters/pi/extension.cjs +1 -1
- package/dist/adapters/pi/extension.cjs.map +1 -1
- package/dist/adapters/pi/extension.d.cts.map +1 -1
- package/dist/adapters/pi/extension.d.mts.map +1 -1
- package/dist/adapters/pi/extension.mjs +1 -1
- package/dist/adapters/pi/extension.mjs.map +1 -1
- package/llms.txt +10 -2
- package/package.json +9 -8
- package/src/prompts/doompi-author-skill/SKILL.md +33 -0
- package/src/prompts/doompi-use-skill/SKILL.md +18 -0
package/README.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
# @agimon-ai/doompi-skill
|
|
2
2
|
|
|
3
|
-
The session skill
|
|
3
|
+
The session skill catalog for [DoomPi](https://www.npmjs.com/package/@agimon-ai/doompi).
|
|
4
4
|
|
|
5
5
|
Pi loads skills from the directories it is given at startup. DoomPi adds two things on top: skills
|
|
6
|
-
that are discovered lazily rather than loaded eagerly, and a registry other extensions
|
|
7
|
-
own skill directories
|
|
6
|
+
that are discovered lazily rather than loaded eagerly, and a registry where other extensions
|
|
7
|
+
publish their own skill directories.
|
|
8
8
|
|
|
9
9
|
## What it registers
|
|
10
10
|
|
|
11
|
-
| Surface |
|
|
12
|
-
| -------------------- |
|
|
13
|
-
| `/skills` | a fullscreen browser over everything this session loaded and everything
|
|
14
|
-
| `SPC e s` | the leader binding for the same browser
|
|
15
|
-
| `input` hook | expands `/skill:<name>` for a skill that was discovered but not loaded
|
|
16
|
-
| `before_agent_start` | appends discovered skills to the system prompt, and surfaces discovery diagnostics once
|
|
11
|
+
| Surface | Behavior |
|
|
12
|
+
| -------------------- | -------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `/skills` | a fullscreen browser over everything this session loaded and everything any other domain would add |
|
|
14
|
+
| `SPC e s` | the leader binding for the same browser |
|
|
15
|
+
| `input` hook | expands `/skill:<name>` for a skill that was discovered but not loaded |
|
|
16
|
+
| `before_agent_start` | appends discovered skills to the system prompt, and surfaces discovery diagnostics once |
|
|
17
17
|
|
|
18
18
|
## Deferred discovery
|
|
19
19
|
|
|
@@ -31,6 +31,12 @@ The package provides the session-owned `doom/skill-sources` Cordis service from
|
|
|
31
31
|
either the contributor or provider unloads. Contributions are keyed by source, so a replacement
|
|
32
32
|
generation takes the previous package slot without doubling it.
|
|
33
33
|
|
|
34
|
+
## Help guidance
|
|
35
|
+
|
|
36
|
+
While the Help minor mode is active, this package contributes `doompi-author-skill` for creating
|
|
37
|
+
and distributing skills and `doompi-use-skill` for browsing, invoking, and diagnosing them. Both
|
|
38
|
+
prompts are published under `src/prompts` and routed through this package's [`llms.txt`](./llms.txt).
|
|
39
|
+
|
|
34
40
|
## Installation
|
|
35
41
|
|
|
36
42
|
DoomPi depends on this package and activates it as fixed host core, so a DoomPi install already has
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../types/skills.cjs"),t=require("../../commands/skillsCommand.cjs"),n=require("../helpSkills.cjs"),r=require("./skillReadiness.cjs");let i=require("@agimon-ai/doompi-config/harnessStore"),a=require("@agimon-ai/doompi-config"),o=require("@agimon-ai/doompi-extension-contracts/config"),s=require("@agimon-ai/doompi-extension-contracts/cordis-host"),c=require("@agimon-ai/doompi-extension-contracts/help"),l=require("@agimon-ai/doompi-extension-contracts/skills"),u=require("@agimon-ai/doompi-extension-contracts/ui-hub");function d(){let e,t,n;return{catalog:()=>e??=Promise.resolve().then(()=>require("../skillCatalog.cjs")),deferred:()=>t??=Promise.resolve().then(()=>require("../deferredSkills.cjs")),overlay:()=>n??=Promise.resolve().then(()=>require("../../tui/skillsOverlay.cjs"))}}function f(f,{pi:p}){let m=d(),h,g;f.inject([o.DOOM_CONFIG_SERVICE],e=>(h=e,()=>{h===e&&(h=void 0)}));let _=()=>{if(!h)throw Error(`Doom skill runtime is waiting for the session config service.`);return h},v=()=>{if(!g)throw Error(`Doom skill sources are waiting for the active session service.`);return g};f.inject([s.DOOM_CORDIS_SESSION_SERVICE],e=>{let t=e.get(s.DOOM_CORDIS_SESSION_SERVICE),n=(0,l.createDoomSkillSourcesService)(`${t.generation}:skill-sources`);return e.provide(l.DOOM_SKILL_SOURCES_SERVICE,n),g=n,()=>{g===n&&(g=void 0),n.dispose()}});let y=n.createActiveHelpSkillView();f.effect(()=>()=>y.dispose(),`${e.LEADER_SOURCE}/help`),f.inject([c.DOOM_HELP_SERVICE],
|
|
1
|
+
const e=require("../../types/skills.cjs"),t=require("../../commands/skillsCommand.cjs"),n=require("../helpSkills.cjs"),r=require("./skillReadiness.cjs");let i=require("@agimon-ai/doompi-config/harnessStore"),a=require("@agimon-ai/doompi-config"),o=require("@agimon-ai/doompi-extension-contracts/config"),s=require("@agimon-ai/doompi-extension-contracts/cordis-host"),c=require("@agimon-ai/doompi-extension-contracts/help"),l=require("@agimon-ai/doompi-extension-contracts/skills"),u=require("@agimon-ai/doompi-extension-contracts/ui-hub");function d(){let e,t,n;return{catalog:()=>e??=Promise.resolve().then(()=>require("../skillCatalog.cjs")),deferred:()=>t??=Promise.resolve().then(()=>require("../deferredSkills.cjs")),overlay:()=>n??=Promise.resolve().then(()=>require("../../tui/skillsOverlay.cjs"))}}function f(f,{pi:p}){let m=d(),h,g;f.inject([o.DOOM_CONFIG_SERVICE],e=>(h=e,()=>{h===e&&(h=void 0)}));let _=()=>{if(!h)throw Error(`Doom skill runtime is waiting for the session config service.`);return h},v=()=>{if(!g)throw Error(`Doom skill sources are waiting for the active session service.`);return g};f.inject([s.DOOM_CORDIS_SESSION_SERVICE],e=>{let t=e.get(s.DOOM_CORDIS_SESSION_SERVICE),n=(0,l.createDoomSkillSourcesService)(`${t.generation}:skill-sources`);return e.provide(l.DOOM_SKILL_SOURCES_SERVICE,n),g=n,()=>{g===n&&(g=void 0),n.dispose()}});let y=n.createActiveHelpSkillView();f.effect(()=>()=>y.dispose(),`${e.LEADER_SOURCE}/help`),f.inject([c.DOOM_HELP_SERVICE],t=>{let n=(0,c.requireDoomHelpService)(t),r=n.register({source:e.LEADER_SOURCE,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-author-skill`,description:`Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.`},{name:`doompi-use-skill`,description:`Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.`}]}),i=y.bind(n);return()=>{i(),r.dispose()}});let b=r.registerSkillReadiness(p,y,m.deferred,_);t.registerSkillsCommand(p,{cordisContext:_,extensionSources:()=>v().list(),inventory:r.skillInventory(y,b),repositoryRoot:async e=>(0,i.requireHarnessRoot)((0,a.requireDoomConfigContext)(_()).harness),buildCatalog:async e=>(await m.catalog()).buildSkillCatalog(e),openOverlay:async(e,t)=>(await m.overlay()).openSkillsOverlay(e,t)}),f.inject([u.DOOM_UI_HUB_SERVICE],t=>{let n=(0,u.requireDoomUiHub)(t).registerLeader(e.SKILLS_LEADER_CONTRIBUTION);return()=>n.dispose()})}async function p(t){let n=await(0,s.connectDoomCordisHost)(t,e.LEADER_SOURCE),r=n.root.plugin(f,{pi:t});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;t.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}exports.default=p,exports.skillsExtension=p;
|
|
2
2
|
//# sourceMappingURL=extension.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.cjs","names":["DOOM_CONFIG_SERVICE","DOOM_CORDIS_SESSION_SERVICE","createDoomSkillSourcesService","DOOM_SKILL_SOURCES_SERVICE","createActiveHelpSkillView","LEADER_SOURCE","DOOM_HELP_SERVICE","requireDoomHelpService","registerSkillReadiness","skillInventory","requireHarnessRoot","requireDoomConfigContext","DOOM_UI_HUB_SERVICE","requireDoomUiHub","SKILLS_LEADER_CONTRIBUTION","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerSkillsCommand } from '../../commands/skillsCommand.ts';\nimport { LEADER_SOURCE, SKILLS_LEADER_CONTRIBUTION } from '../../types/skills.ts';\nimport { createActiveHelpSkillView } from '../helpSkills.ts';\nimport { registerSkillReadiness, skillInventory } from './skillReadiness.ts';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../skillCatalog.ts')> | undefined;\n let deferred: Promise<typeof import('../deferredSkills.ts')> | undefined;\n let overlay: Promise<typeof import('../../tui/skillsOverlay.ts')> | undefined;\n return {\n catalog: () => (catalog ??= import('../skillCatalog.ts')),\n deferred: () => (deferred ??= import('../deferredSkills.ts')),\n overlay: () => (overlay ??= import('../../tui/skillsOverlay.ts')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction skillPlugin(cordis: Context, { pi }: SkillPluginConfig): void {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n\n const helpSkillView = createActiveHelpSkillView();\n cordis.effect(() => () => helpSkillView.dispose(), `${LEADER_SOURCE}/help`);\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => helpSkillView.bind(
|
|
1
|
+
{"version":3,"file":"extension.cjs","names":["DOOM_CONFIG_SERVICE","DOOM_CORDIS_SESSION_SERVICE","createDoomSkillSourcesService","DOOM_SKILL_SOURCES_SERVICE","createActiveHelpSkillView","LEADER_SOURCE","DOOM_HELP_SERVICE","requireDoomHelpService","registerSkillReadiness","skillInventory","requireHarnessRoot","requireDoomConfigContext","DOOM_UI_HUB_SERVICE","requireDoomUiHub","SKILLS_LEADER_CONTRIBUTION","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerSkillsCommand } from '../../commands/skillsCommand.ts';\nimport { LEADER_SOURCE, SKILLS_LEADER_CONTRIBUTION } from '../../types/skills.ts';\nimport { createActiveHelpSkillView } from '../helpSkills.ts';\nimport { registerSkillReadiness, skillInventory } from './skillReadiness.ts';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../skillCatalog.ts')> | undefined;\n let deferred: Promise<typeof import('../deferredSkills.ts')> | undefined;\n let overlay: Promise<typeof import('../../tui/skillsOverlay.ts')> | undefined;\n return {\n catalog: () => (catalog ??= import('../skillCatalog.ts')),\n deferred: () => (deferred ??= import('../deferredSkills.ts')),\n overlay: () => (overlay ??= import('../../tui/skillsOverlay.ts')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction skillPlugin(cordis: Context, { pi }: SkillPluginConfig): void {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n\n const helpSkillView = createActiveHelpSkillView();\n cordis.effect(() => () => helpSkillView.dispose(), `${LEADER_SOURCE}/help`);\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const help = requireDoomHelpService(helpContext);\n const contribution = help.register({\n source: LEADER_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-skill',\n description:\n 'Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.',\n },\n {\n name: 'doompi-use-skill',\n description:\n \"Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.\",\n },\n ],\n });\n const unbind = helpSkillView.bind(help);\n return () => {\n unbind();\n contribution.dispose();\n };\n });\n const readiness = registerSkillReadiness(pi, helpSkillView, load.deferred, requireRuntimeContext);\n registerSkillsCommand(pi, {\n cordisContext: requireRuntimeContext,\n extensionSources: () => requireSkillSources().list(),\n inventory: skillInventory(helpSkillView, readiness),\n repositoryRoot: async (_ctx: ExtensionContext) =>\n requireHarnessRoot(requireDoomConfigContext(requireRuntimeContext()).harness),\n buildCatalog: async (request) => (await load.catalog()).buildSkillCatalog(request),\n openOverlay: async (ctx, options) => (await load.overlay()).openSkillsOverlay(ctx, options),\n });\n\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(SKILLS_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n\n/** The package's single standard Pi factory. */\nexport async function skillsExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, LEADER_SOURCE);\n const fiber = connection.root.plugin(skillPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default skillsExtension;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;iBAoHsB,gBAAgB,IAAI,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;iBAoHsB,gBAAgB,IAAI,eAAe"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{LEADER_SOURCE as e,SKILLS_LEADER_CONTRIBUTION as t}from"../../types/skills.mjs";import{registerSkillsCommand as n}from"../../commands/skillsCommand.mjs";import{createActiveHelpSkillView as r}from"../helpSkills.mjs";import{registerSkillReadiness as i,skillInventory as a}from"./skillReadiness.mjs";import{requireHarnessRoot as o}from"@agimon-ai/doompi-config/harnessStore";import{requireDoomConfigContext as s}from"@agimon-ai/doompi-config";import{DOOM_CONFIG_SERVICE as c}from"@agimon-ai/doompi-extension-contracts/config";import{DOOM_CORDIS_SESSION_SERVICE as l,connectDoomCordisHost as u}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_HELP_SERVICE as d,requireDoomHelpService as f}from"@agimon-ai/doompi-extension-contracts/help";import{DOOM_SKILL_SOURCES_SERVICE as p,createDoomSkillSourcesService as m}from"@agimon-ai/doompi-extension-contracts/skills";import{DOOM_UI_HUB_SERVICE as h,requireDoomUiHub as g}from"@agimon-ai/doompi-extension-contracts/ui-hub";function _(){let e,t,n;return{catalog:()=>e??=import(`../skillCatalog.mjs`),deferred:()=>t??=import(`../deferredSkills.mjs`),overlay:()=>n??=import(`../../tui/skillsOverlay.mjs`)}}function v(u,{pi:v}){let y=_(),b,x;u.inject([c],e=>(b=e,()=>{b===e&&(b=void 0)}));let S=()=>{if(!b)throw Error(`Doom skill runtime is waiting for the session config service.`);return b},C=()=>{if(!x)throw Error(`Doom skill sources are waiting for the active session service.`);return x};u.inject([l],e=>{let t=e.get(l),n=m(`${t.generation}:skill-sources`);return e.provide(p,n),x=n,()=>{x===n&&(x=void 0),n.dispose()}});let w=r();u.effect(()=>()=>w.dispose(),`${e}/help`),u.inject([d],e
|
|
1
|
+
import{LEADER_SOURCE as e,SKILLS_LEADER_CONTRIBUTION as t}from"../../types/skills.mjs";import{registerSkillsCommand as n}from"../../commands/skillsCommand.mjs";import{createActiveHelpSkillView as r}from"../helpSkills.mjs";import{registerSkillReadiness as i,skillInventory as a}from"./skillReadiness.mjs";import{requireHarnessRoot as o}from"@agimon-ai/doompi-config/harnessStore";import{requireDoomConfigContext as s}from"@agimon-ai/doompi-config";import{DOOM_CONFIG_SERVICE as c}from"@agimon-ai/doompi-extension-contracts/config";import{DOOM_CORDIS_SESSION_SERVICE as l,connectDoomCordisHost as u}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_HELP_SERVICE as d,requireDoomHelpService as f}from"@agimon-ai/doompi-extension-contracts/help";import{DOOM_SKILL_SOURCES_SERVICE as p,createDoomSkillSourcesService as m}from"@agimon-ai/doompi-extension-contracts/skills";import{DOOM_UI_HUB_SERVICE as h,requireDoomUiHub as g}from"@agimon-ai/doompi-extension-contracts/ui-hub";function _(){let e,t,n;return{catalog:()=>e??=import(`../skillCatalog.mjs`),deferred:()=>t??=import(`../deferredSkills.mjs`),overlay:()=>n??=import(`../../tui/skillsOverlay.mjs`)}}function v(u,{pi:v}){let y=_(),b,x;u.inject([c],e=>(b=e,()=>{b===e&&(b=void 0)}));let S=()=>{if(!b)throw Error(`Doom skill runtime is waiting for the session config service.`);return b},C=()=>{if(!x)throw Error(`Doom skill sources are waiting for the active session service.`);return x};u.inject([l],e=>{let t=e.get(l),n=m(`${t.generation}:skill-sources`);return e.provide(p,n),x=n,()=>{x===n&&(x=void 0),n.dispose()}});let w=r();u.effect(()=>()=>w.dispose(),`${e}/help`),u.inject([d],t=>{let n=f(t),r=n.register({source:e,moduleUrl:import.meta.url,skills:[{name:`doompi-author-skill`,description:`Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.`},{name:`doompi-use-skill`,description:`Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.`}]}),i=w.bind(n);return()=>{i(),r.dispose()}});let T=i(v,w,y.deferred,S);n(v,{cordisContext:S,extensionSources:()=>C().list(),inventory:a(w,T),repositoryRoot:async e=>o(s(S()).harness),buildCatalog:async e=>(await y.catalog()).buildSkillCatalog(e),openOverlay:async(e,t)=>(await y.overlay()).openSkillsOverlay(e,t)}),u.inject([h],e=>{let n=g(e).registerLeader(t);return()=>n.dispose()})}async function y(t){let n=await u(t,e),r=n.root.plugin(v,{pi:t});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let i;t.on(`session_shutdown`,()=>i??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}export{y as default,y as skillsExtension};
|
|
2
2
|
//# sourceMappingURL=extension.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerSkillsCommand } from '../../commands/skillsCommand.ts';\nimport { LEADER_SOURCE, SKILLS_LEADER_CONTRIBUTION } from '../../types/skills.ts';\nimport { createActiveHelpSkillView } from '../helpSkills.ts';\nimport { registerSkillReadiness, skillInventory } from './skillReadiness.ts';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../skillCatalog.ts')> | undefined;\n let deferred: Promise<typeof import('../deferredSkills.ts')> | undefined;\n let overlay: Promise<typeof import('../../tui/skillsOverlay.ts')> | undefined;\n return {\n catalog: () => (catalog ??= import('../skillCatalog.ts')),\n deferred: () => (deferred ??= import('../deferredSkills.ts')),\n overlay: () => (overlay ??= import('../../tui/skillsOverlay.ts')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction skillPlugin(cordis: Context, { pi }: SkillPluginConfig): void {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n\n const helpSkillView = createActiveHelpSkillView();\n cordis.effect(() => () => helpSkillView.dispose(), `${LEADER_SOURCE}/help`);\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => helpSkillView.bind(
|
|
1
|
+
{"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n connectDoomCordisHost,\n DOOM_CORDIS_SESSION_SERVICE,\n type DoomCordisSessionService,\n} from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-extension-contracts/help';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-extension-contracts/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-extension-contracts/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerSkillsCommand } from '../../commands/skillsCommand.ts';\nimport { LEADER_SOURCE, SKILLS_LEADER_CONTRIBUTION } from '../../types/skills.ts';\nimport { createActiveHelpSkillView } from '../helpSkills.ts';\nimport { registerSkillReadiness, skillInventory } from './skillReadiness.ts';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../skillCatalog.ts')> | undefined;\n let deferred: Promise<typeof import('../deferredSkills.ts')> | undefined;\n let overlay: Promise<typeof import('../../tui/skillsOverlay.ts')> | undefined;\n return {\n catalog: () => (catalog ??= import('../skillCatalog.ts')),\n deferred: () => (deferred ??= import('../deferredSkills.ts')),\n overlay: () => (overlay ??= import('../../tui/skillsOverlay.ts')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n}\n\nfunction skillPlugin(cordis: Context, { pi }: SkillPluginConfig): void {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n\n const helpSkillView = createActiveHelpSkillView();\n cordis.effect(() => () => helpSkillView.dispose(), `${LEADER_SOURCE}/help`);\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const help = requireDoomHelpService(helpContext);\n const contribution = help.register({\n source: LEADER_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\n name: 'doompi-author-skill',\n description:\n 'Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.',\n },\n {\n name: 'doompi-use-skill',\n description:\n \"Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.\",\n },\n ],\n });\n const unbind = helpSkillView.bind(help);\n return () => {\n unbind();\n contribution.dispose();\n };\n });\n const readiness = registerSkillReadiness(pi, helpSkillView, load.deferred, requireRuntimeContext);\n registerSkillsCommand(pi, {\n cordisContext: requireRuntimeContext,\n extensionSources: () => requireSkillSources().list(),\n inventory: skillInventory(helpSkillView, readiness),\n repositoryRoot: async (_ctx: ExtensionContext) =>\n requireHarnessRoot(requireDoomConfigContext(requireRuntimeContext()).harness),\n buildCatalog: async (request) => (await load.catalog()).buildSkillCatalog(request),\n openOverlay: async (ctx, options) => (await load.overlay()).openSkillsOverlay(ctx, options),\n });\n\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(SKILLS_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n}\n\n/** The package's single standard Pi factory. */\nexport async function skillsExtension(pi: ExtensionAPI): Promise<void> {\n const connection = await connectDoomCordisHost(pi, LEADER_SOURCE);\n const fiber = connection.root.plugin(skillPlugin, { pi });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default skillsExtension;\n"],"mappings":"89BA4BA,SAAS,GAAc,CACrB,IAAI,EACA,EACA,EACJ,MAAO,CACL,YAAgB,IAAY,OAAO,uBACnC,aAAiB,IAAa,OAAO,yBACrC,YAAgB,IAAY,OAAO,8BACrC,CACF,CAMA,SAAS,EAAY,EAAiB,CAAE,MAA+B,CACrE,IAAM,EAAO,EAAY,EACrB,EACA,EACJ,EAAO,OAAO,CAAC,CAAmB,EAAI,IACpC,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,GACjD,EACD,EACD,IAAM,MAAuC,CAC3C,GAAI,CAAC,EAAe,MAAU,MAAM,+DAA+D,EACnG,OAAO,CACT,EACM,MAAqD,CACzD,GAAI,CAAC,EAAe,MAAU,MAAM,gEAAgE,EACpG,OAAO,CACT,EACA,EAAO,OAAO,CAAC,CAA2B,EAAI,GAAmB,CAC/D,IAAM,EAAU,EAAe,IAAI,CAA2B,EACxD,EAAU,EAA8B,GAAG,EAAQ,WAAW,eAAe,EAGnF,OAFA,EAAe,QAAQ,EAA4B,CAAO,EAC1D,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,IAC/C,EAAQ,QAAQ,CAClB,CACF,CAAC,EAED,IAAM,EAAgB,EAA0B,EAChD,EAAO,eAAmB,EAAc,QAAQ,EAAG,GAAG,EAAc,MAAM,EAC1E,EAAO,OAAO,CAAC,CAAiB,EAAI,GAAgB,CAClD,IAAM,EAAO,EAAuB,CAAW,EACzC,EAAe,EAAK,SAAS,CACjC,OAAQ,EACR,UAAW,YAAY,IACvB,OAAQ,CACN,CACE,KAAM,sBACN,YACE,6OACJ,EACA,CACE,KAAM,mBACN,YACE,oNACJ,CACF,CACF,CAAC,EACK,EAAS,EAAc,KAAK,CAAI,EACtC,UAAa,CACX,EAAO,EACP,EAAa,QAAQ,CACvB,CACF,CAAC,EACD,IAAM,EAAY,EAAuB,EAAI,EAAe,EAAK,SAAU,CAAqB,EAChG,EAAsB,EAAI,CACxB,cAAe,EACf,qBAAwB,EAAoB,CAAC,CAAC,KAAK,EACnD,UAAW,EAAe,EAAe,CAAS,EAClD,eAAgB,KAAO,IACrB,EAAmB,EAAyB,EAAsB,CAAC,CAAC,CAAC,OAAO,EAC9E,aAAc,KAAO,KAAa,MAAM,EAAK,QAAQ,EAAA,CAAG,kBAAkB,CAAO,EACjF,YAAa,MAAO,EAAK,KAAa,MAAM,EAAK,QAAQ,EAAA,CAAG,kBAAkB,EAAK,CAAO,CAC5F,CAAC,EAED,EAAO,OAAO,CAAC,CAAmB,EAAI,GAAc,CAClD,IAAM,EAAe,EAAiB,CAAS,CAAC,CAAC,eAAe,CAA0B,EAC1F,UAAa,EAAa,QAAQ,CACpC,CAAC,CACH,CAGA,eAAsB,EAAgB,EAAiC,CACrE,IAAM,EAAa,MAAM,EAAsB,EAAI,CAAa,EAC1D,EAAQ,EAAW,KAAK,OAAO,EAAa,CAAE,IAAG,CAAC,EACxD,GAAI,CACF,MAAM,CACR,OAAS,EAAO,CACd,GAAI,CACF,MAAM,EAAM,QAAQ,CACtB,QAAU,CACR,MAAM,EAAW,QAAQ,CAC3B,CACA,MAAM,CACR,CACA,IAAI,EACJ,EAAG,GACD,uBAEG,KAAc,SAAY,CACzB,GAAI,CACF,MAAM,EAAM,QAAQ,CACtB,QAAU,CACR,MAAM,EAAW,QAAQ,CAC3B,CACF,EAAA,CAAG,CACP,CACF"}
|
package/llms.txt
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
The session skill catalogue, deferred skill discovery, and the `SPC e s` browser.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## How to author
|
|
6
6
|
|
|
7
|
-
- [
|
|
7
|
+
- [Author DoomPi skills](./src/prompts/doompi-author-skill/SKILL.md): Create, distribute, and register runtime skills or activation-gated Help prompts.
|
|
8
|
+
|
|
9
|
+
## How to use
|
|
10
|
+
|
|
11
|
+
- [Use DoomPi skills](./src/prompts/doompi-use-skill/SKILL.md): Browse the catalog, invoke deferred skills, and diagnose missing or shadowed skills.
|
|
12
|
+
|
|
13
|
+
## Package reference
|
|
14
|
+
|
|
15
|
+
- [Package README](./README.md): The `/skills` command, deferred discovery, and extension-contributed skill directories.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-skill",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.7",
|
|
4
4
|
"description": "Session skill catalogue, deferred skill discovery, and the skill browser for DoomPi.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skills",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"dist",
|
|
22
22
|
"llms.txt",
|
|
23
23
|
"README.md",
|
|
24
|
+
"src/prompts",
|
|
24
25
|
"LICENSE",
|
|
25
26
|
"package.json"
|
|
26
27
|
],
|
|
@@ -52,14 +53,13 @@
|
|
|
52
53
|
"dependencies": {
|
|
53
54
|
"@deepseek-ai/cordis": "4.0.1",
|
|
54
55
|
"gpt-tokenizer": "4.0.0",
|
|
55
|
-
"@agimon-ai/doompi-
|
|
56
|
-
"@agimon-ai/doompi-
|
|
57
|
-
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.
|
|
58
|
-
"@agimon-ai/doompi-
|
|
59
|
-
"@agimon-ai/doompi-domain": "0.0.1-alpha.
|
|
56
|
+
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.29",
|
|
57
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.29",
|
|
58
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.29",
|
|
59
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.29",
|
|
60
|
+
"@agimon-ai/doompi-domain": "0.0.1-alpha.7"
|
|
60
61
|
},
|
|
61
62
|
"devDependencies": {
|
|
62
|
-
"@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.26",
|
|
63
63
|
"@deepseek-ai/cordis": "4.0.1",
|
|
64
64
|
"@earendil-works/pi-coding-agent": "0.84.2",
|
|
65
65
|
"@earendil-works/pi-tui": "0.84.2",
|
|
@@ -67,7 +67,8 @@
|
|
|
67
67
|
"@vitest/coverage-v8": "4.1.11",
|
|
68
68
|
"tsdown": "0.22.14",
|
|
69
69
|
"typescript": "7.0.2",
|
|
70
|
-
"vitest": "4.1.11"
|
|
70
|
+
"vitest": "4.1.11",
|
|
71
|
+
"@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.27"
|
|
71
72
|
},
|
|
72
73
|
"peerDependencies": {
|
|
73
74
|
"@earendil-works/pi-coding-agent": "0.84.2",
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doompi-author-skill
|
|
3
|
+
description: Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Author DoomPi skills
|
|
7
|
+
|
|
8
|
+
Create one focused skill per directory. Name the directory with lowercase letters, digits, and hyphens, and give it a required `SKILL.md`:
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
---
|
|
12
|
+
name: repository-review
|
|
13
|
+
description: Review repository changes when the user asks for implementation-risk and regression analysis.
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Repository review
|
|
17
|
+
|
|
18
|
+
Put the essential workflow and non-obvious constraints here.
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The frontmatter `name` must match the directory. Make the description specific enough for automatic routing. Keep the entrypoint concise, and put substantial conditional details in linked `references/`. Add `scripts/`, `assets/`, or `agents/` only when the skill actually uses them.
|
|
22
|
+
|
|
23
|
+
## Choose the distribution path
|
|
24
|
+
|
|
25
|
+
- For a normal Pi skill that should be discoverable whenever its owning extension is active, ship the skill under a package-owned runtime directory such as `skills/<name>/SKILL.md`. Register that directory through `DOOM_SKILL_SOURCES_SERVICE` inside an owning `cordis.inject(...)`, and return the contribution disposer.
|
|
26
|
+
- For guidance that should appear only while DoomPi Help is active, put it at `src/prompts/<name>/SKILL.md`, publish `src/prompts`, link it from the package's H1-led `llms.txt`, and register a Help descriptor through `DOOM_HELP_SERVICE`.
|
|
27
|
+
- For repository content selected by domains, place the skill in the plugin or shared skill source configured by `domains.yaml`; do not hard-code that directory into the Skill package.
|
|
28
|
+
|
|
29
|
+
Help descriptors carry only `name` and `description`. The Help service resolves the owning package from the contribution's exact package `source` and `moduleUrl`, then wraps its `llms.txt`. Keep every index link inside the published package.
|
|
30
|
+
|
|
31
|
+
## Verification
|
|
32
|
+
|
|
33
|
+
Validate the skill frontmatter, ensure every relative reference resolves, and test the packed package rather than relying on checkout-only files. For Cordis contributions, cover late provider arrival, provider replacement, withdrawal, and package shutdown. Use `/skills` or `SPC e s` in an interactive session to confirm the expected owner and invocation name.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doompi-use-skill
|
|
3
|
+
description: Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Use DoomPi skills
|
|
7
|
+
|
|
8
|
+
Open the skill browser with `/skills` or `SPC e s`. The catalog groups normal session skills, package Help skills, plugin skills, and extension-contributed directories by owner.
|
|
9
|
+
|
|
10
|
+
Invoke a skill with `/skill:<name>`. DoomPi expands deferred skills before Pi handles the input, so a skill can be invokable even when its full body was not placed in the initial prompt. Help skills appear only while Help mode is active.
|
|
11
|
+
|
|
12
|
+
When a skill is missing:
|
|
13
|
+
|
|
14
|
+
1. Confirm its owning package, plugin, domain, or Help mode is active.
|
|
15
|
+
2. Wait for deferred discovery to finish by opening `/skills` or invoking the exact skill.
|
|
16
|
+
3. Check the browser diagnostics for unreadable `SKILL.md` files, invalid frontmatter, duplicate names, or unavailable Help resources.
|
|
17
|
+
4. If two sources use the same name, remember that normal loaded and deferred skills take precedence over Help skills.
|
|
18
|
+
5. After changing domains or package composition, reload or relaunch as requested so the session receives the new skill directories.
|