@aexol/opencode-wizard 0.3.4 → 0.3.5

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 (38) hide show
  1. package/README.md +9 -7
  2. package/dist/graphql-operations.d.ts +5 -2
  3. package/dist/graphql-operations.js +161 -156
  4. package/dist/graphql-operations.js.map +1 -1
  5. package/dist/plugin-tools.d.ts +26 -0
  6. package/dist/plugin-tools.js +43 -7
  7. package/dist/plugin-tools.js.map +1 -1
  8. package/dist/published-skills-system-note.js +3 -7
  9. package/dist/published-skills-system-note.js.map +1 -1
  10. package/dist/published-skills-terminology.d.ts +21 -0
  11. package/dist/published-skills-terminology.js +38 -0
  12. package/dist/published-skills-terminology.js.map +1 -0
  13. package/dist/published-skills-transform.d.ts +99 -2
  14. package/dist/published-skills-transform.js +91 -19
  15. package/dist/published-skills-transform.js.map +1 -1
  16. package/dist/server/auth-bootstrap.d.ts +7 -0
  17. package/dist/server/auth-bootstrap.js +89 -0
  18. package/dist/server/auth-bootstrap.js.map +1 -0
  19. package/dist/server/client.d.ts +30 -1
  20. package/dist/server/client.js +81 -1
  21. package/dist/server/client.js.map +1 -1
  22. package/dist/server/preferences.d.ts +22 -0
  23. package/dist/server/preferences.js +121 -0
  24. package/dist/server/preferences.js.map +1 -0
  25. package/dist/server/runtime.d.ts +3 -22
  26. package/dist/server/runtime.js +447 -242
  27. package/dist/server/runtime.js.map +1 -1
  28. package/dist/server/types.d.ts +75 -0
  29. package/dist/server/types.js.map +1 -1
  30. package/dist/smoke-published-skills.js +4 -4
  31. package/dist/smoke-published-skills.js.map +1 -1
  32. package/dist/tui/components/skill-catalog-row.js +45 -44
  33. package/dist/tui/components/skill-catalog-row.js.map +1 -1
  34. package/dist/tui/components/wizard-skills-dialog-content.js +73 -63
  35. package/dist/tui/components/wizard-skills-dialog-content.js.map +1 -1
  36. package/dist/tui/skill-helpers.js +7 -6
  37. package/dist/tui/skill-helpers.js.map +1 -1
  38. package/package.json +1 -1
@@ -0,0 +1,121 @@
1
+ import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';
2
+ import { readGlobalAuthState, toStoredUserKey } from './auth-store.js';
3
+ import { fetchPublishedSkillsGraphQl } from './client.js';
4
+ import { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';
5
+ import { resolveConfig } from './config.js';
6
+ import { resolveWorkspace, toDeliveryInput } from './workspace.js';
7
+ let publishedSkillPreferenceCacheVersion = 0;
8
+ export const toIgnoredSkillSlug = value => {
9
+ const normalized = value.trim().toLowerCase();
10
+ if (!normalized) return null;
11
+ return normalized;
12
+ };
13
+ export const toPublishedSkillPreferenceAction = value => {
14
+ const normalized = value.trim().toLowerCase();
15
+ if (normalized === 'install' || normalized === 'uninstall' || normalized === 'ignore' || normalized === 'unignore') {
16
+ return normalized;
17
+ }
18
+ throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');
19
+ };
20
+ export const toPublishedSkillPreferenceScope = (value, defaultScope) => {
21
+ if (!value) return defaultScope;
22
+ const normalized = value.trim().toLowerCase();
23
+ if (normalized === 'global' || normalized === 'project') return normalized;
24
+ throw new Error('Published skill preferenceScope must be either global or project.');
25
+ };
26
+ export const resolvePublishedSkillPreferenceCacheContext = async config => {
27
+ const authState = await readGlobalAuthState(config.authStatePath);
28
+ return {
29
+ userKey: toStoredUserKey(authState),
30
+ preferenceVersion: publishedSkillPreferenceCacheVersion
31
+ };
32
+ };
33
+ export const getCatalogCacheKey = (workspaceResolution, preferenceContext) => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);
34
+ const toBackendPreferenceScope = preferenceScope => {
35
+ if (preferenceScope === 'global') return 'GLOBAL';
36
+ return 'WORKSPACE';
37
+ };
38
+ const setPublishedSkillPreference = async ({
39
+ worktree,
40
+ directory,
41
+ config,
42
+ skillSlug,
43
+ preferenceScope,
44
+ installed,
45
+ ignored
46
+ }) => {
47
+ const workspaceResolution = await resolveWorkspace({
48
+ config,
49
+ directory
50
+ });
51
+ const response = await fetchPublishedSkillsGraphQl({
52
+ worktree,
53
+ config,
54
+ query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,
55
+ variables: {
56
+ input: {
57
+ ...toDeliveryInput(workspaceResolution),
58
+ skillSlug,
59
+ preferenceScope: toBackendPreferenceScope(preferenceScope),
60
+ installed,
61
+ ignored
62
+ }
63
+ },
64
+ signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS)
65
+ });
66
+ if (!response.ok) {
67
+ throw new Error(response.result.message);
68
+ }
69
+ const preferences = response.data.setPublishedSkillPreference;
70
+ publishedSkillPreferenceCacheVersion += 1;
71
+ return {
72
+ scopeKey: preferences.scopeKey,
73
+ userKey: preferences.userKey,
74
+ ignoredSkillSlugs: preferences.ignoredSkills.map(item => item.skill.slug),
75
+ installedGlobalSkillSlugs: [],
76
+ installedWorkspaceSkillSlugs: []
77
+ };
78
+ };
79
+ export const setPublishedSkillIgnored = async ({
80
+ worktree,
81
+ directory,
82
+ skillSlug,
83
+ ignored,
84
+ preferenceScope
85
+ }) => {
86
+ const config = await resolveConfig(worktree);
87
+ const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
88
+ if (!normalizedSkillSlug) {
89
+ throw new Error('Cannot toggle an empty published skill slug.');
90
+ }
91
+ return setPublishedSkillPreference({
92
+ worktree,
93
+ directory,
94
+ config,
95
+ skillSlug: normalizedSkillSlug,
96
+ preferenceScope: preferenceScope ?? 'project',
97
+ ignored
98
+ });
99
+ };
100
+ export const setPublishedSkillInstalled = async ({
101
+ worktree,
102
+ directory,
103
+ skillSlug,
104
+ installed,
105
+ preferenceScope
106
+ }) => {
107
+ const config = await resolveConfig(worktree);
108
+ const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);
109
+ if (!normalizedSkillSlug) {
110
+ throw new Error('Cannot toggle an empty published skill slug.');
111
+ }
112
+ return setPublishedSkillPreference({
113
+ worktree,
114
+ directory,
115
+ config,
116
+ skillSlug: normalizedSkillSlug,
117
+ preferenceScope,
118
+ installed
119
+ });
120
+ };
121
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SET_PUBLISHED_SKILL_PREFERENCE_MUTATION","readGlobalAuthState","toStoredUserKey","fetchPublishedSkillsGraphQl","PRESENCE_EVENT_TIMEOUT_MS","resolveConfig","resolveWorkspace","toDeliveryInput","publishedSkillPreferenceCacheVersion","toIgnoredSkillSlug","value","normalized","trim","toLowerCase","toPublishedSkillPreferenceAction","Error","toPublishedSkillPreferenceScope","defaultScope","resolvePublishedSkillPreferenceCacheContext","config","authState","authStatePath","userKey","preferenceVersion","getCatalogCacheKey","workspaceResolution","preferenceContext","JSON","stringify","cacheKey","toBackendPreferenceScope","preferenceScope","setPublishedSkillPreference","worktree","directory","skillSlug","installed","ignored","response","query","variables","input","signal","AbortSignal","timeout","ok","result","message","preferences","data","scopeKey","ignoredSkillSlugs","ignoredSkills","map","item","skill","slug","installedGlobalSkillSlugs","installedWorkspaceSkillSlugs","setPublishedSkillIgnored","normalizedSkillSlug","setPublishedSkillInstalled"],"sources":["../../src/server/preferences.ts"],"sourcesContent":["import { SET_PUBLISHED_SKILL_PREFERENCE_MUTATION } from '../graphql-operations.js';\nimport { readGlobalAuthState, toStoredUserKey } from './auth-store.js';\nimport { fetchPublishedSkillsGraphQl } from './client.js';\nimport { PRESENCE_EVENT_TIMEOUT_MS } from './constants.js';\nimport { resolveConfig } from './config.js';\nimport { resolveWorkspace, toDeliveryInput } from './workspace.js';\nimport type {\n PublishedSkillPreferenceAction,\n PublishedSkillPreferenceCacheContext,\n PublishedSkillPreferenceScope,\n PublishedSkillsIgnoreState,\n ResolvedConfig,\n SetPublishedSkillPreferenceResponse,\n WorkspaceResolution,\n} from './types.js';\n\nlet publishedSkillPreferenceCacheVersion = 0;\n\nexport const toIgnoredSkillSlug = (value: string): string | null => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n return normalized;\n};\n\nexport const toPublishedSkillPreferenceAction = (value: string): PublishedSkillPreferenceAction => {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === 'install' ||\n normalized === 'uninstall' ||\n normalized === 'ignore' ||\n normalized === 'unignore'\n ) {\n return normalized;\n }\n\n throw new Error('Published skill preference action must be one of: install, uninstall, ignore, unignore.');\n};\n\nexport const toPublishedSkillPreferenceScope = (\n value: string | undefined,\n defaultScope: 'global' | 'project',\n): 'global' | 'project' => {\n if (!value) return defaultScope;\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'global' || normalized === 'project') return normalized;\n\n throw new Error('Published skill preferenceScope must be either global or project.');\n};\n\nexport const resolvePublishedSkillPreferenceCacheContext = async (\n config: ResolvedConfig,\n): Promise<PublishedSkillPreferenceCacheContext> => {\n const authState = await readGlobalAuthState(config.authStatePath);\n\n return {\n userKey: toStoredUserKey(authState),\n preferenceVersion: publishedSkillPreferenceCacheVersion,\n };\n};\n\nexport const getCatalogCacheKey = (\n workspaceResolution: WorkspaceResolution,\n preferenceContext: PublishedSkillPreferenceCacheContext,\n): string => JSON.stringify([workspaceResolution.cacheKey, preferenceContext.userKey, preferenceContext.preferenceVersion]);\n\nconst toBackendPreferenceScope = (preferenceScope: 'global' | 'project'): PublishedSkillPreferenceScope => {\n if (preferenceScope === 'global') return 'GLOBAL';\n return 'WORKSPACE';\n};\n\nconst setPublishedSkillPreference = async ({\n worktree,\n directory,\n config,\n skillSlug,\n preferenceScope,\n installed,\n ignored,\n}: {\n worktree: string;\n directory: string;\n config: ResolvedConfig;\n skillSlug: string;\n preferenceScope: 'global' | 'project';\n installed?: boolean;\n ignored?: boolean;\n}): Promise<PublishedSkillsIgnoreState> => {\n const workspaceResolution = await resolveWorkspace({ config, directory });\n const response = await fetchPublishedSkillsGraphQl<SetPublishedSkillPreferenceResponse>({\n worktree,\n config,\n query: SET_PUBLISHED_SKILL_PREFERENCE_MUTATION,\n variables: {\n input: {\n ...toDeliveryInput(workspaceResolution),\n skillSlug,\n preferenceScope: toBackendPreferenceScope(preferenceScope),\n installed,\n ignored,\n },\n },\n signal: AbortSignal.timeout(PRESENCE_EVENT_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(response.result.message);\n }\n\n const preferences = response.data.setPublishedSkillPreference;\n publishedSkillPreferenceCacheVersion += 1;\n\n return {\n scopeKey: preferences.scopeKey,\n userKey: preferences.userKey,\n ignoredSkillSlugs: preferences.ignoredSkills.map((item) => item.skill.slug),\n installedGlobalSkillSlugs: [],\n installedWorkspaceSkillSlugs: [],\n };\n};\n\nexport const setPublishedSkillIgnored = async ({\n worktree,\n directory,\n skillSlug,\n ignored,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n ignored: boolean;\n preferenceScope?: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope: preferenceScope ?? 'project',\n ignored,\n });\n};\n\nexport const setPublishedSkillInstalled = async ({\n worktree,\n directory,\n skillSlug,\n installed,\n preferenceScope,\n}: {\n worktree: string;\n directory: string;\n scopeKey?: string;\n skillSlug: string;\n installed: boolean;\n preferenceScope: 'global' | 'project';\n}): Promise<PublishedSkillsIgnoreState> => {\n const config = await resolveConfig(worktree);\n const normalizedSkillSlug = toIgnoredSkillSlug(skillSlug);\n\n if (!normalizedSkillSlug) {\n throw new Error('Cannot toggle an empty published skill slug.');\n }\n\n return setPublishedSkillPreference({\n worktree,\n directory,\n config,\n skillSlug: normalizedSkillSlug,\n preferenceScope,\n installed,\n });\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,29 +1,10 @@
1
1
  export { resolveConfig } from './config.js';
2
2
  export { PLUGIN_ID, NATIVE_SKILLS_URL_COMPATIBILITY, type NativeSkillsUrlCompatibility } from './constants.js';
3
3
  export { buildSystemNote, resolvePluginStatusSnapshot, toPluginAuthStateSummary, toPublishedSkillCatalog, } from './status.js';
4
- import type { OpencodePluginServer, PluginStatusSnapshot, PublishedSkillsIgnoreState } from './types.js';
4
+ import type { OpencodePluginServer } from './types.js';
5
5
  export type { PluginAuthStateSummary, PluginStatusSnapshot, PublishedSkillCatalogItem, PublishedSkillCatalogPayload, PublishedSkillDetailItem, PublishedSkillInstallableCatalogItem, } from './types.js';
6
- export declare const resolvePluginStatusSnapshotWithAuthBootstrap: ({ worktree, directory, signal, }: {
7
- worktree: string;
8
- directory: string;
9
- signal: AbortSignal;
10
- }) => Promise<PluginStatusSnapshot>;
11
- export declare const setPublishedSkillIgnored: ({ worktree, directory, skillSlug, ignored, preferenceScope, }: {
12
- worktree: string;
13
- directory: string;
14
- scopeKey?: string;
15
- skillSlug: string;
16
- ignored: boolean;
17
- preferenceScope?: "global" | "project";
18
- }) => Promise<PublishedSkillsIgnoreState>;
19
- export declare const setPublishedSkillInstalled: ({ worktree, directory, skillSlug, installed, preferenceScope, }: {
20
- worktree: string;
21
- directory: string;
22
- scopeKey?: string;
23
- skillSlug: string;
24
- installed: boolean;
25
- preferenceScope: "global" | "project";
26
- }) => Promise<PublishedSkillsIgnoreState>;
6
+ export { resolvePluginStatusSnapshotWithAuthBootstrap } from './auth-bootstrap.js';
7
+ export { setPublishedSkillIgnored, setPublishedSkillInstalled } from './preferences.js';
27
8
  export declare const OpencodeWizardSkillsPlugin: OpencodePluginServer;
28
9
  declare const _default: {
29
10
  id: string;