@agllama/mcp 0.6.24 → 0.6.27

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.
@@ -0,0 +1,152 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { executeInstallGettingStartedPack } from '../gettingStartedPack.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Mock api-client module
5
+ // ---------------------------------------------------------------------------
6
+ vi.mock('../../api-client.js', () => {
7
+ return {
8
+ getApiClient: vi.fn(),
9
+ LlamaApiError: class LlamaApiError extends Error {
10
+ statusCode;
11
+ constructor(statusCode, message) {
12
+ super(message);
13
+ this.statusCode = statusCode;
14
+ this.name = 'LlamaApiError';
15
+ }
16
+ },
17
+ };
18
+ });
19
+ // ---------------------------------------------------------------------------
20
+ // Shared fixture helpers
21
+ // ---------------------------------------------------------------------------
22
+ const BUNDLED_SKILL_SLUGS = [
23
+ 'sprint-planning',
24
+ 'grill-production-readiness-review',
25
+ 'run-sprint',
26
+ 'getting-started-walkthrough',
27
+ ];
28
+ function makePreviewResponse() {
29
+ return {
30
+ requiresConfirmation: true,
31
+ preview: {
32
+ skills: BUNDLED_SKILL_SLUGS.map((slug) => ({ slug })),
33
+ boardConfig: { columns: ['To Do', 'In Progress', 'In Review', 'Unit Test', 'Done'] },
34
+ },
35
+ };
36
+ }
37
+ function makeInstallResponse() {
38
+ return {
39
+ skills: BUNDLED_SKILL_SLUGS.map((slug) => ({
40
+ slug,
41
+ files: [
42
+ {
43
+ path: `.claude/skills/${slug}/SKILL.md`,
44
+ content: `# ${slug}\nSkill content for ${slug}.`,
45
+ },
46
+ ],
47
+ })),
48
+ summary: { skillCount: 4, columnCount: 5 },
49
+ };
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Test 1: No confirm (or confirm: false) → preview with requiresConfirmation
53
+ // ---------------------------------------------------------------------------
54
+ describe('executeInstallGettingStartedPack — Test 1: preview (no confirm)', () => {
55
+ beforeEach(() => {
56
+ vi.clearAllMocks();
57
+ });
58
+ it('returns requiresConfirmation: true when confirm is omitted', async () => {
59
+ const { getApiClient } = await import('../../api-client.js');
60
+ vi.mocked(getApiClient).mockReturnValue({
61
+ installGettingStartedPack: vi.fn().mockResolvedValue(makePreviewResponse()),
62
+ });
63
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', projectKey: 'LLAMA', confirm: false }));
64
+ expect(result.success).toBe(true);
65
+ expect(result.requiresConfirmation).toBe(true);
66
+ });
67
+ it('returns requiresConfirmation: true when confirm is explicitly false', async () => {
68
+ const { getApiClient } = await import('../../api-client.js');
69
+ vi.mocked(getApiClient).mockReturnValue({
70
+ installGettingStartedPack: vi.fn().mockResolvedValue(makePreviewResponse()),
71
+ });
72
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', projectKey: 'LLAMA', confirm: false }));
73
+ expect(result.success).toBe(true);
74
+ expect(result.requiresConfirmation).toBe(true);
75
+ expect(result.preview).toBeDefined();
76
+ });
77
+ });
78
+ // ---------------------------------------------------------------------------
79
+ // Test 2: confirm: true → install result with 4-skill manifest + nextStep
80
+ // ---------------------------------------------------------------------------
81
+ describe('executeInstallGettingStartedPack — Test 2: install (confirm: true)', () => {
82
+ beforeEach(() => {
83
+ vi.clearAllMocks();
84
+ });
85
+ it('returns all 4 bundled skills in the manifest', async () => {
86
+ const { getApiClient } = await import('../../api-client.js');
87
+ vi.mocked(getApiClient).mockReturnValue({
88
+ installGettingStartedPack: vi.fn().mockResolvedValue(makeInstallResponse()),
89
+ });
90
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', projectKey: 'LLAMA', confirm: true }));
91
+ expect(result.success).toBe(true);
92
+ // Regression check: all 4 bundled skills must be present
93
+ const installedSlugs = result.installResult.skills.map((s) => s.slug);
94
+ expect(installedSlugs).toContain('sprint-planning');
95
+ expect(installedSlugs).toContain('grill-production-readiness-review');
96
+ expect(installedSlugs).toContain('run-sprint');
97
+ expect(installedSlugs).toContain('getting-started-walkthrough');
98
+ expect(installedSlugs).toHaveLength(4);
99
+ });
100
+ it('includes nextStep instructing Claude to write local SKILL.md files', async () => {
101
+ const { getApiClient } = await import('../../api-client.js');
102
+ vi.mocked(getApiClient).mockReturnValue({
103
+ installGettingStartedPack: vi.fn().mockResolvedValue(makeInstallResponse()),
104
+ });
105
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', projectKey: 'LLAMA', confirm: true }));
106
+ expect(result.nextStep).toBeDefined();
107
+ // Must instruct Claude to write the skill files to the local filesystem
108
+ expect(result.nextStep).toMatch(/write/i);
109
+ expect(result.nextStep).toMatch(/files\[0\]\.content|SKILL\.md|files\[0\]\.path/i);
110
+ });
111
+ it('includes skillsInstalled count matching the 4-skill manifest', async () => {
112
+ const { getApiClient } = await import('../../api-client.js');
113
+ vi.mocked(getApiClient).mockReturnValue({
114
+ installGettingStartedPack: vi.fn().mockResolvedValue(makeInstallResponse()),
115
+ });
116
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', projectKey: 'LLAMA', confirm: true }));
117
+ expect(result.skillsInstalled).toBe(4);
118
+ });
119
+ });
120
+ // ---------------------------------------------------------------------------
121
+ // Test 3: Missing orgSlug / projectKey → falls back to session-default error
122
+ // ---------------------------------------------------------------------------
123
+ describe('executeInstallGettingStartedPack — Test 3: session default fallback', () => {
124
+ beforeEach(() => {
125
+ vi.clearAllMocks();
126
+ });
127
+ it('returns an error with session context hint when orgSlug is omitted', async () => {
128
+ const { getApiClient } = await import('../../api-client.js');
129
+ const mockInstall = vi.fn();
130
+ vi.mocked(getApiClient).mockReturnValue({
131
+ installGettingStartedPack: mockInstall,
132
+ });
133
+ const result = JSON.parse(await executeInstallGettingStartedPack({ projectKey: 'LLAMA', confirm: false }));
134
+ // Tool requires explicit orgSlug; API client should NOT be called
135
+ expect(mockInstall).not.toHaveBeenCalled();
136
+ expect(result.success).toBe(false);
137
+ expect(result.error).toMatch(/orgSlug|llama_set_context/i);
138
+ });
139
+ it('returns an error with session context hint when projectKey is omitted', async () => {
140
+ const { getApiClient } = await import('../../api-client.js');
141
+ const mockInstall = vi.fn();
142
+ vi.mocked(getApiClient).mockReturnValue({
143
+ installGettingStartedPack: mockInstall,
144
+ });
145
+ const result = JSON.parse(await executeInstallGettingStartedPack({ orgSlug: 'ag-llama', confirm: false }));
146
+ // Tool requires explicit projectKey; API client should NOT be called
147
+ expect(mockInstall).not.toHaveBeenCalled();
148
+ expect(result.success).toBe(false);
149
+ expect(result.error).toMatch(/projectKey|llama_set_context/i);
150
+ });
151
+ });
152
+ //# sourceMappingURL=gettingStartedPack.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gettingStartedPack.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/gettingStartedPack.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/tools/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,+CACW,CAAC;AAE/C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAmDtD"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/tools/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,+CACW,CAAC;AAE/C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAuEtD"}
@@ -21,6 +21,26 @@ export async function executeConnect() {
21
21
  try {
22
22
  const client = getApiClient();
23
23
  const user = await client.testConnection();
24
+ let firstTimeHint;
25
+ let projectCount = 0;
26
+ try {
27
+ const orgs = await client.listOrganizations();
28
+ if (orgs.length > 0) {
29
+ for (const org of orgs.slice(0, 3)) {
30
+ const projects = await client.listProjects(org.slug);
31
+ projectCount += projects.length;
32
+ if (projectCount > 0)
33
+ break;
34
+ }
35
+ }
36
+ if (projectCount === 0) {
37
+ firstTimeHint =
38
+ 'This account has no projects yet. The fastest way to get started is the Getting Started Pack — it installs 4 core skills and a configured board in one step. Ask the user if they want to: (1) create a project first, then (2) call llama_install_getting_started_pack to preview, then confirm.';
39
+ }
40
+ }
41
+ catch {
42
+ // Detection is best-effort; never block the connection response on it.
43
+ }
24
44
  return JSON.stringify({
25
45
  success: true,
26
46
  message: 'Successfully connected to Llama API',
@@ -29,6 +49,7 @@ export async function executeConnect() {
29
49
  email: user.email,
30
50
  name: user.name,
31
51
  },
52
+ ...(firstTimeHint ? { firstTimeHint } : {}),
32
53
  });
33
54
  }
34
55
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/tools/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GACjC,4CAA4C,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7C,yEAAyE;IACzE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B;YACtC,KAAK,EAAE;gBACL,aAAa,EAAE,MAAM,IAAI,SAAS;gBAClC,aAAa,EAAE,SAAS;aACzB;SACF,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE3C,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB,KAAK,CAAC,OAAO,EAAE;gBAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;QACP,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,KAAK,EACH,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,uCAAuC;SAC9C,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/tools/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GACjC,4CAA4C,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7C,yEAAyE;IACzE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B;YACtC,KAAK,EAAE;gBACL,aAAa,EAAE,MAAM,IAAI,SAAS;gBAClC,aAAa,EAAE,SAAS;aACzB;SACF,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE3C,IAAI,aAAiC,CAAC;QACtC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACnC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACrD,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC;oBAChC,IAAI,YAAY,GAAG,CAAC;wBAAE,MAAM;gBAC9B,CAAC;YACH,CAAC;YACD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,aAAa;oBACX,mSAAmS,CAAC;YACxS,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;YACD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB,KAAK,CAAC,OAAO,EAAE;gBAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;QACP,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,KAAK;YACd,KAAK,EACH,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,uCAAuC;SAC9C,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ export declare const installGettingStartedPackToolName = "llama_install_getting_started_pack";
3
+ export declare const installGettingStartedPackToolDescription = "Install the Getting Started Pack for a project. Two-step UX:\n\n1. Call without confirm (or confirm=false) \u2192 returns a preview of what will be installed and a WARNING. You MUST ask the user to confirm before proceeding.\n2. Call with confirm=true \u2192 performs the install and returns the skill manifest. Write the 4 SKILL.md files to .claude/skills/<id>/SKILL.md, then tell the user to run /getting-started-walkthrough.\n\nWARNING: Installing overwrites the project board configuration. Always preview first.";
4
+ export declare const installGettingStartedPackToolSchema: z.ZodObject<{
5
+ orgSlug: z.ZodOptional<z.ZodString>;
6
+ projectKey: z.ZodOptional<z.ZodString>;
7
+ confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ confirm: boolean;
10
+ orgSlug?: string | undefined;
11
+ projectKey?: string | undefined;
12
+ }, {
13
+ orgSlug?: string | undefined;
14
+ projectKey?: string | undefined;
15
+ confirm?: boolean | undefined;
16
+ }>;
17
+ export type InstallGettingStartedPackToolInput = z.infer<typeof installGettingStartedPackToolSchema>;
18
+ export declare function executeInstallGettingStartedPack(input: InstallGettingStartedPackToolInput): Promise<string>;
19
+ //# sourceMappingURL=gettingStartedPack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gettingStartedPack.d.ts","sourceRoot":"","sources":["../../src/tools/gettingStartedPack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,iCAAiC,uCAAuC,CAAC;AAEtF,eAAO,MAAM,wCAAwC,ygBAKiC,CAAC;AAEvF,eAAO,MAAM,mCAAmC;;;;;;;;;;;;EAI9C,CAAC;AAEH,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAC;AAErG,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,MAAM,CAAC,CAmFjB"}
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ import { getApiClient, LlamaApiError } from '../api-client.js';
3
+ // ============================================
4
+ // Install Getting Started Pack
5
+ // ============================================
6
+ export const installGettingStartedPackToolName = 'llama_install_getting_started_pack';
7
+ export const installGettingStartedPackToolDescription = `Install the Getting Started Pack for a project. Two-step UX:
8
+
9
+ 1. Call without confirm (or confirm=false) → returns a preview of what will be installed and a WARNING. You MUST ask the user to confirm before proceeding.
10
+ 2. Call with confirm=true → performs the install and returns the skill manifest. Write the 4 SKILL.md files to .claude/skills/<id>/SKILL.md, then tell the user to run /getting-started-walkthrough.
11
+
12
+ WARNING: Installing overwrites the project board configuration. Always preview first.`;
13
+ export const installGettingStartedPackToolSchema = z.object({
14
+ orgSlug: z.string().optional().describe('Organization slug (uses session default if omitted)'),
15
+ projectKey: z.string().optional().describe('Project key (uses session default if omitted)'),
16
+ confirm: z.boolean().optional().default(false).describe('Set to true to confirm the install after reviewing the preview. Default: false (preview only).'),
17
+ });
18
+ export async function executeInstallGettingStartedPack(input) {
19
+ try {
20
+ const client = getApiClient();
21
+ if (!input.orgSlug) {
22
+ return JSON.stringify({
23
+ success: false,
24
+ error: 'orgSlug is required. Set it via llama_set_context or pass it explicitly.',
25
+ });
26
+ }
27
+ if (!input.projectKey) {
28
+ return JSON.stringify({
29
+ success: false,
30
+ error: 'projectKey is required. Set it via llama_set_context or pass it explicitly.',
31
+ });
32
+ }
33
+ const confirm = input.confirm ?? false;
34
+ const result = await client.installGettingStartedPack(input.orgSlug, input.projectKey, { confirm });
35
+ if (!confirm || result.requiresConfirmation) {
36
+ // Step 1 — preview response
37
+ return JSON.stringify({
38
+ success: true,
39
+ requiresConfirmation: true,
40
+ warning: 'WARNING: This will install 4 skills and overwrite the project board configuration. Ask the user to confirm before proceeding.',
41
+ preview: result.preview ?? result,
42
+ instruction: 'Show the user the preview above and ask: "Do you want to install the Getting Started Pack? This will overwrite your current board configuration." Only call llama_install_getting_started_pack with confirm=true if they say yes.',
43
+ });
44
+ }
45
+ const installResult = result;
46
+ const skills = installResult.skills ?? [];
47
+ const summary = installResult.summary ?? { skillCount: skills.length, columnCount: 0 };
48
+ const fileInstructions = skills.map((s) => ({
49
+ writeTo: s.files[0].path,
50
+ slug: s.slug,
51
+ }));
52
+ return JSON.stringify({
53
+ success: true,
54
+ message: `Getting Started Pack installed. ${summary.skillCount} skill(s) written, ${summary.columnCount} board column(s) configured.`,
55
+ skillsInstalled: summary.skillCount,
56
+ files: fileInstructions,
57
+ installResult,
58
+ nextStep: `For each entry in \`skills\`, write \`files[0].content\` to \`files[0].path\` on the local filesystem. Then tell the user to run /getting-started-walkthrough to begin the onboarding walkthrough.`,
59
+ });
60
+ }
61
+ catch (error) {
62
+ if (error instanceof LlamaApiError) {
63
+ return JSON.stringify({
64
+ success: false,
65
+ error: `Failed to install Getting Started Pack: ${error.message}`,
66
+ statusCode: error.statusCode,
67
+ });
68
+ }
69
+ return JSON.stringify({
70
+ success: false,
71
+ error: error instanceof Error ? error.message : 'Unknown error',
72
+ });
73
+ }
74
+ }
75
+ //# sourceMappingURL=gettingStartedPack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gettingStartedPack.js","sourceRoot":"","sources":["../../src/tools/gettingStartedPack.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,eAAe,CAAC;AAEzC,eAAO,MAAM,mBAAmB,iIACgG,CAAC;AAEjI,eAAO,MAAM,cAAc;;;;;;EAOzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAghB3D,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8EvE"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY,eAAe,CAAC;AAEzC,eAAO,MAAM,mBAAmB,iIACgG,CAAC;AAEjI,eAAO,MAAM,cAAc;;;;;;EAOzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AA03B3D,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEvE"}