@bragduck/mcp 1.7.0 → 1.8.0

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 (50) hide show
  1. package/README.md +29 -0
  2. package/dist/index.js +2006 -122
  3. package/dist/index.js.map +1 -1
  4. package/package.json +8 -4
  5. package/dist/api-client.d.ts +0 -29
  6. package/dist/api-client.js +0 -146
  7. package/dist/api-client.js.map +0 -1
  8. package/dist/auth.d.ts +0 -8
  9. package/dist/auth.js +0 -202
  10. package/dist/auth.js.map +0 -1
  11. package/dist/credentials.d.ts +0 -31
  12. package/dist/credentials.js +0 -150
  13. package/dist/credentials.js.map +0 -1
  14. package/dist/index.d.ts +0 -2
  15. package/dist/org-preference.d.ts +0 -7
  16. package/dist/org-preference.js +0 -22
  17. package/dist/org-preference.js.map +0 -1
  18. package/dist/tools/link-brag-to-key-result.d.ts +0 -30
  19. package/dist/tools/link-brag-to-key-result.js +0 -81
  20. package/dist/tools/link-brag-to-key-result.js.map +0 -1
  21. package/dist/tools/list-brags.d.ts +0 -53
  22. package/dist/tools/list-brags.js +0 -110
  23. package/dist/tools/list-brags.js.map +0 -1
  24. package/dist/tools/list-objectives.d.ts +0 -15
  25. package/dist/tools/list-objectives.js +0 -66
  26. package/dist/tools/list-objectives.js.map +0 -1
  27. package/dist/tools/list-organisations.d.ts +0 -15
  28. package/dist/tools/list-organisations.js +0 -73
  29. package/dist/tools/list-organisations.js.map +0 -1
  30. package/dist/tools/list-stories.d.ts +0 -41
  31. package/dist/tools/list-stories.js +0 -103
  32. package/dist/tools/list-stories.js.map +0 -1
  33. package/dist/tools/log-brag.d.ts +0 -88
  34. package/dist/tools/log-brag.js +0 -175
  35. package/dist/tools/log-brag.js.map +0 -1
  36. package/dist/tools/log-story.d.ts +0 -81
  37. package/dist/tools/log-story.js +0 -122
  38. package/dist/tools/log-story.js.map +0 -1
  39. package/dist/tools/login.d.ts +0 -24
  40. package/dist/tools/login.js +0 -46
  41. package/dist/tools/login.js.map +0 -1
  42. package/dist/tools/preview-brag.d.ts +0 -71
  43. package/dist/tools/preview-brag.js +0 -103
  44. package/dist/tools/preview-brag.js.map +0 -1
  45. package/dist/tools/quick-brag.d.ts +0 -38
  46. package/dist/tools/quick-brag.js +0 -143
  47. package/dist/tools/quick-brag.js.map +0 -1
  48. package/dist/tools/save-org-preference.d.ts +0 -30
  49. package/dist/tools/save-org-preference.js +0 -47
  50. package/dist/tools/save-org-preference.js.map +0 -1
@@ -1,81 +0,0 @@
1
- import { apiRequest, requirePaidPlan } from '../api-client.js';
2
- import { getUserInfo } from '../credentials.js';
3
- export const linkBragToKeyResultTool = {
4
- name: 'link_brag_to_key_result',
5
- description: 'Add a keyResult/key-result to a brag (supports multiple keyResults per brag). ' +
6
- 'Use list_objectives to find keyResult IDs and list_brags to find brag IDs.',
7
- inputSchema: {
8
- type: 'object',
9
- properties: {
10
- bragId: {
11
- type: 'string',
12
- description: 'The ID of the brag to update',
13
- },
14
- keyResultId: {
15
- type: 'string',
16
- description: 'The ID of the keyResult to link the brag to',
17
- },
18
- },
19
- required: ['bragId', 'keyResultId'],
20
- },
21
- };
22
- export async function handleLinkBragToKeyResult(input) {
23
- const planError = await requirePaidPlan();
24
- if (planError)
25
- return planError;
26
- try {
27
- const userInfo = getUserInfo();
28
- if (!userInfo) {
29
- return {
30
- content: [{
31
- type: 'text',
32
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
33
- }],
34
- isError: true,
35
- };
36
- }
37
- // Fetch current brag to read existing keyResultIds
38
- const currentBrag = await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`);
39
- const existingKeyResultIds = currentBrag.keyResultIds || [];
40
- // Skip if already linked
41
- if (existingKeyResultIds.includes(input.keyResultId)) {
42
- return {
43
- content: [{
44
- type: 'text',
45
- text: `Brag ${input.bragId} is already linked to keyResult ${input.keyResultId}.`,
46
- }],
47
- };
48
- }
49
- // Append new keyResult (deduplicated via the check above)
50
- const updatedKeyResultIds = [...existingKeyResultIds, input.keyResultId];
51
- await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`, {
52
- method: 'PATCH',
53
- body: { keyResultIds: updatedKeyResultIds },
54
- });
55
- return {
56
- content: [{
57
- type: 'text',
58
- text: `KeyResult ${input.keyResultId} added to brag ${input.bragId} (now linked to ${updatedKeyResultIds.length} keyResult${updatedKeyResultIds.length === 1 ? '' : 's'}).`,
59
- }],
60
- };
61
- }
62
- catch (error) {
63
- if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
64
- return {
65
- content: [{
66
- type: 'text',
67
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
68
- }],
69
- isError: true,
70
- };
71
- }
72
- return {
73
- content: [{
74
- type: 'text',
75
- text: `Failed to link brag to keyResult: ${error instanceof Error ? error.message : String(error)}`,
76
- }],
77
- isError: true,
78
- };
79
- }
80
- }
81
- //# sourceMappingURL=link-brag-to-key-result.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-brag-to-key-result.js","sourceRoot":"","sources":["../../src/tools/link-brag-to-key-result.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- export declare const listBragsTool: {
2
- name: string;
3
- description: string;
4
- inputSchema: {
5
- type: "object";
6
- properties: {
7
- limit: {
8
- type: string;
9
- description: string;
10
- };
11
- search: {
12
- type: string;
13
- description: string;
14
- };
15
- tags: {
16
- type: string;
17
- items: {
18
- type: string;
19
- };
20
- description: string;
21
- };
22
- date_from: {
23
- type: string;
24
- description: string;
25
- };
26
- date_to: {
27
- type: string;
28
- description: string;
29
- };
30
- sort: {
31
- type: string;
32
- enum: string[];
33
- description: string;
34
- };
35
- };
36
- };
37
- };
38
- interface ListBragsInput {
39
- limit?: number;
40
- search?: string;
41
- tags?: string[];
42
- date_from?: string;
43
- date_to?: string;
44
- sort?: string;
45
- }
46
- export declare function handleListBrags(input: ListBragsInput): Promise<{
47
- content: Array<{
48
- type: string;
49
- text: string;
50
- }>;
51
- isError?: boolean;
52
- }>;
53
- export {};
@@ -1,110 +0,0 @@
1
- import { apiRequest, requirePaidPlan } from '../api-client.js';
2
- export const listBragsTool = {
3
- name: 'list_brags',
4
- description: 'List recent brags (career achievements) from BragDuck. ' +
5
- 'Use this to review past accomplishments, find brags to link to keyResults, or check recent entries.',
6
- inputSchema: {
7
- type: 'object',
8
- properties: {
9
- limit: {
10
- type: 'number',
11
- description: 'Number of brags to return (default: 10, max: 100)',
12
- },
13
- search: {
14
- type: 'string',
15
- description: 'Search term to filter brags by title or description',
16
- },
17
- tags: {
18
- type: 'array',
19
- items: { type: 'string' },
20
- description: 'Filter brags by tags',
21
- },
22
- date_from: {
23
- type: 'string',
24
- description: 'Filter brags from this date (YYYY-MM-DD)',
25
- },
26
- date_to: {
27
- type: 'string',
28
- description: 'Filter brags up to this date (YYYY-MM-DD)',
29
- },
30
- sort: {
31
- type: 'string',
32
- enum: ['date_asc', 'date_desc', 'title_asc', 'title_desc', 'created_asc', 'created_desc'],
33
- description: 'Sort order (default: date_desc)',
34
- },
35
- },
36
- },
37
- };
38
- const IMPACT_LABELS = {
39
- 0: 'None',
40
- 1: 'Low',
41
- 2: 'Medium',
42
- 3: 'High',
43
- };
44
- export async function handleListBrags(input) {
45
- const planError = await requirePaidPlan();
46
- if (planError)
47
- return planError;
48
- try {
49
- const params = {
50
- limit: String(input.limit || 10),
51
- offset: '0',
52
- };
53
- if (input.search)
54
- params.search = input.search;
55
- if (input.tags && input.tags.length > 0)
56
- params['tags[]'] = input.tags;
57
- if (input.date_from)
58
- params.date_from = input.date_from;
59
- if (input.date_to)
60
- params.date_to = input.date_to;
61
- if (input.sort)
62
- params.sort = input.sort;
63
- const response = await apiRequest('/v1/brags', { params });
64
- if (response.brags.length === 0) {
65
- return {
66
- content: [{ type: 'text', text: 'No brags found.' }],
67
- };
68
- }
69
- const lines = response.brags.map((brag) => {
70
- const tags = brag.tags.length > 0 ? ` [${brag.tags.join(', ')}]` : '';
71
- const date = new Date(brag.date).toLocaleDateString();
72
- const impact = `Impact: ${IMPACT_LABELS[brag.impactLevel ?? 0] ?? (brag.impactLevel ?? 0)}`;
73
- const type = brag.type ? ` | Type: ${brag.type}` : '';
74
- const keyResultNote = brag.keyResultIds?.length > 0
75
- ? `\n Linked to key result: ${brag.keyResultIds[0]}`
76
- : '';
77
- const impactDesc = brag.impactDescription ? `\n Impact: ${brag.impactDescription}` : '';
78
- return (`- **${brag.title}** (ID: ${brag.id}, ${date})${tags}\n` +
79
- ` ${impact}${type}` +
80
- impactDesc +
81
- keyResultNote +
82
- `\n ${brag.description.slice(0, 150)}${brag.description.length > 150 ? '...' : ''}` +
83
- `\n View: ${brag.url}`);
84
- });
85
- const { total, has_more } = response.pagination;
86
- const summary = `Found ${total} brags (showing ${response.brags.length}${has_more ? ', more available' : ''}):`;
87
- return {
88
- content: [{ type: 'text', text: `${summary}\n\n${lines.join('\n\n')}` }],
89
- };
90
- }
91
- catch (error) {
92
- if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
93
- return {
94
- content: [{
95
- type: 'text',
96
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
97
- }],
98
- isError: true,
99
- };
100
- }
101
- return {
102
- content: [{
103
- type: 'text',
104
- text: `Failed to list brags: ${error instanceof Error ? error.message : String(error)}`,
105
- }],
106
- isError: true,
107
- };
108
- }
109
- }
110
- //# sourceMappingURL=list-brags.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-brags.js","sourceRoot":"","sources":["../../src/tools/list-brags.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export declare const listObjectivesTool: {
2
- name: string;
3
- description: string;
4
- inputSchema: {
5
- type: "object";
6
- properties: {};
7
- };
8
- };
9
- export declare function handleListObjectives(): Promise<{
10
- content: Array<{
11
- type: string;
12
- text: string;
13
- }>;
14
- isError?: boolean;
15
- }>;
@@ -1,66 +0,0 @@
1
- import { apiRequest, requirePaidPlan } from '../api-client.js';
2
- import { getUserInfo } from '../credentials.js';
3
- export const listObjectivesTool = {
4
- name: 'list_objectives',
5
- description: 'List OKRs (Objectives and Key Results) from BragDuck. ' +
6
- 'Use this to see current keyResults and their IDs, which can be used to link brags to specific keyResults.',
7
- inputSchema: {
8
- type: 'object',
9
- properties: {},
10
- },
11
- };
12
- export async function handleListObjectives() {
13
- const planError = await requirePaidPlan();
14
- if (planError)
15
- return planError;
16
- try {
17
- const userInfo = getUserInfo();
18
- if (!userInfo) {
19
- return {
20
- content: [{
21
- type: 'text',
22
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
23
- }],
24
- isError: true,
25
- };
26
- }
27
- const response = await apiRequest(`/v1/users/${userInfo.id}/objectives`);
28
- if (response.items.length === 0) {
29
- return {
30
- content: [{ type: 'text', text: 'No objectives found.' }],
31
- };
32
- }
33
- const lines = response.items.map((obj) => {
34
- const keyResults = obj.keyResults
35
- .map((g) => ` - ${g.label} (KeyResult ID: ${g.id}, status: ${g.status})`)
36
- .join('\n');
37
- const category = obj.category ? ` [${obj.category}]` : '';
38
- return `- **${obj.title}** (ID: ${obj.id}, status: ${obj.status})${category}\n${keyResults || ' (no keyResults)'}`;
39
- });
40
- return {
41
- content: [{
42
- type: 'text',
43
- text: `Found ${response.total} objectives:\n\n${lines.join('\n\n')}`,
44
- }],
45
- };
46
- }
47
- catch (error) {
48
- if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
49
- return {
50
- content: [{
51
- type: 'text',
52
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
53
- }],
54
- isError: true,
55
- };
56
- }
57
- return {
58
- content: [{
59
- type: 'text',
60
- text: `Failed to list objectives: ${error instanceof Error ? error.message : String(error)}`,
61
- }],
62
- isError: true,
63
- };
64
- }
65
- }
66
- //# sourceMappingURL=list-objectives.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-objectives.js","sourceRoot":"","sources":["../../src/tools/list-objectives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,wDAAwD;QACxD,2GAA2G;IAC7G,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAIxC,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,aAAa,QAAQ,CAAC,EAAE,aAAa,CACtC,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aAC1D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;iBAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,OAAO,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,IAAI,QAAQ,KAAK,UAAU,IAAI,qBAAqB,EAAE,CAAC;QACxH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,QAAQ,CAAC,KAAK,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;iBACrE,CAAC;SACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EAAE,CAAC;YAC3G,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sEAAsE;qBAC7E,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC7F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,15 +0,0 @@
1
- export declare const listOrganisationsTool: {
2
- name: string;
3
- description: string;
4
- inputSchema: {
5
- type: "object";
6
- properties: {};
7
- };
8
- };
9
- export declare function handleListOrganisations(): Promise<{
10
- content: Array<{
11
- type: string;
12
- text: string;
13
- }>;
14
- isError?: boolean;
15
- }>;
@@ -1,73 +0,0 @@
1
- import { apiRequest, requirePaidPlan } from '../api-client.js';
2
- import { getUserInfo } from '../credentials.js';
3
- import { getOrgPreference } from '../org-preference.js';
4
- export const listOrganisationsTool = {
5
- name: 'list_organisations',
6
- description: 'List the user\'s organisations (companies) from BragDuck. ' +
7
- 'Also returns the saved organisation preference for the current working directory, if any. ' +
8
- 'Use this before logging a brag to determine which company to associate it with.',
9
- inputSchema: {
10
- type: 'object',
11
- properties: {},
12
- },
13
- };
14
- export async function handleListOrganisations() {
15
- const planError = await requirePaidPlan();
16
- if (planError)
17
- return planError;
18
- try {
19
- const userInfo = getUserInfo();
20
- if (!userInfo) {
21
- return {
22
- content: [{
23
- type: 'text',
24
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
25
- }],
26
- isError: true,
27
- };
28
- }
29
- const response = await apiRequest(`/v1/users/${userInfo.id}/organisations`);
30
- if (response.items.length === 0) {
31
- return {
32
- content: [{
33
- type: 'text',
34
- text: 'No organisations found. You can add companies in the BragDuck web app.',
35
- }],
36
- };
37
- }
38
- const cwd = process.cwd();
39
- const saved = getOrgPreference(cwd);
40
- const lines = response.items.map((org) => {
41
- const status = org.current ? 'current' : 'former';
42
- return `- **${org.name}** (ID: ${org.id}, role: ${org.role}, ${status})`;
43
- });
44
- const savedLine = saved
45
- ? `\nSaved preference for this directory: **${saved.orgName}** (ID: ${saved.orgId})`
46
- : '\nNo saved preference for this directory.';
47
- return {
48
- content: [{
49
- type: 'text',
50
- text: `Found ${response.items.length} organisation(s):\n\n${lines.join('\n')}${savedLine}`,
51
- }],
52
- };
53
- }
54
- catch (error) {
55
- if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
56
- return {
57
- content: [{
58
- type: 'text',
59
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
60
- }],
61
- isError: true,
62
- };
63
- }
64
- return {
65
- content: [{
66
- type: 'text',
67
- text: `Failed to list organisations: ${error instanceof Error ? error.message : String(error)}`,
68
- }],
69
- isError: true,
70
- };
71
- }
72
- }
73
- //# sourceMappingURL=list-organisations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-organisations.js","sourceRoot":"","sources":["../../src/tools/list-organisations.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- export declare const listStoriesTool: {
2
- name: string;
3
- description: string;
4
- inputSchema: {
5
- type: "object";
6
- properties: {
7
- limit: {
8
- type: string;
9
- minimum: number;
10
- maximum: number;
11
- description: string;
12
- };
13
- category: {
14
- type: string;
15
- description: string;
16
- };
17
- orgId: {
18
- type: string;
19
- description: string;
20
- };
21
- search: {
22
- type: string;
23
- description: string;
24
- };
25
- };
26
- };
27
- };
28
- interface ListStoriesInput {
29
- limit?: number;
30
- category?: string;
31
- orgId?: string;
32
- search?: string;
33
- }
34
- export declare function handleListStories(input: ListStoriesInput): Promise<{
35
- content: Array<{
36
- type: string;
37
- text: string;
38
- }>;
39
- isError?: boolean;
40
- }>;
41
- export {};
@@ -1,103 +0,0 @@
1
- import { apiRequest, requirePaidPlan } from '../api-client.js';
2
- import { getUserInfo } from '../credentials.js';
3
- import { STORY_CATEGORY_LABELS } from '@bragduck/types';
4
- export const listStoriesTool = {
5
- name: 'list_stories',
6
- description: 'List STAR interview stories from BragDuck. ' +
7
- 'Use when the user wants to review their interview stories or search for stories by category.',
8
- inputSchema: {
9
- type: 'object',
10
- properties: {
11
- limit: {
12
- type: 'number',
13
- minimum: 1,
14
- maximum: 100,
15
- description: 'Max stories to return (default 10)',
16
- },
17
- category: {
18
- type: 'string',
19
- description: 'Filter by category (e.g. leadership, technical_excellence, problem_solving)',
20
- },
21
- orgId: {
22
- type: 'string',
23
- description: 'Filter by organisation ID',
24
- },
25
- search: {
26
- type: 'string',
27
- description: 'Search stories by keyword',
28
- },
29
- },
30
- },
31
- };
32
- export async function handleListStories(input) {
33
- const planError = await requirePaidPlan();
34
- if (planError)
35
- return planError;
36
- try {
37
- const userInfo = getUserInfo();
38
- if (!userInfo) {
39
- return {
40
- content: [{
41
- type: 'text',
42
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
43
- }],
44
- isError: true,
45
- };
46
- }
47
- const params = {
48
- page: '1',
49
- perPage: String(input.limit || 10),
50
- };
51
- if (input.category)
52
- params.category = input.category;
53
- if (input.orgId)
54
- params.orgId = input.orgId;
55
- if (input.search)
56
- params.search = input.search;
57
- const response = await apiRequest(`/v1/users/${userInfo.id}/stories`, { params });
58
- if (response.items.length === 0) {
59
- return {
60
- content: [{ type: 'text', text: 'No stories found.' }],
61
- };
62
- }
63
- const lines = response.items.map((story) => {
64
- const categoryLabel = story.category
65
- ? STORY_CATEGORY_LABELS[story.category]
66
- : null;
67
- const categoryPart = categoryLabel ? `Category: ${categoryLabel} | ` : '';
68
- const strengthPart = `Strength: ${story.strengthScore ?? '-'}/10`;
69
- const impactPart = `Impact: ${story.impactScore ?? '-'}/10`;
70
- const summary = story.aiSummary || 'No AI summary yet';
71
- const competencies = story.competencies.length > 0
72
- ? story.competencies.join(', ')
73
- : 'None';
74
- return (`**${story.title}** (ID: ${story.id})\n` +
75
- `${categoryPart}${strengthPart} | ${impactPart}\n` +
76
- `${summary}\n` +
77
- `Competencies: ${competencies}`);
78
- });
79
- const summary = `Found ${response.total} stories (showing ${response.items.length}):`;
80
- return {
81
- content: [{ type: 'text', text: `${summary}\n\n${lines.join('\n\n')}` }],
82
- };
83
- }
84
- catch (error) {
85
- if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
86
- return {
87
- content: [{
88
- type: 'text',
89
- text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
90
- }],
91
- isError: true,
92
- };
93
- }
94
- return {
95
- content: [{
96
- type: 'text',
97
- text: `Failed to list stories: ${error instanceof Error ? error.message : String(error)}`,
98
- }],
99
- isError: true,
100
- };
101
- }
102
- }
103
- //# sourceMappingURL=list-stories.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-stories.js","sourceRoot":"","sources":["../../src/tools/list-stories.ts"],"names":[],"mappings":"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"}