@bragduck/mcp 1.5.4 → 1.6.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.
- package/dist/index.js +22 -4
- package/dist/index.js.map +1 -1
- package/dist/tools/{link-brag-to-goal.d.ts → link-brag-to-key-result.d.ts} +4 -4
- package/dist/tools/{link-brag-to-goal.js → link-brag-to-key-result.js} +18 -18
- package/dist/tools/link-brag-to-key-result.js.map +1 -0
- package/dist/tools/list-brags.js +4 -4
- package/dist/tools/list-brags.js.map +1 -1
- package/dist/tools/list-objectives.js +4 -4
- package/dist/tools/list-objectives.js.map +1 -1
- package/dist/tools/log-brag.d.ts +6 -0
- package/dist/tools/log-brag.js +22 -2
- package/dist/tools/log-brag.js.map +1 -1
- package/dist/tools/log-story.d.ts +76 -0
- package/dist/tools/log-story.js +116 -0
- package/dist/tools/log-story.js.map +1 -0
- package/dist/tools/quick-brag.d.ts +38 -0
- package/dist/tools/quick-brag.js +143 -0
- package/dist/tools/quick-brag.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/link-brag-to-goal.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -4,12 +4,14 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
4
4
|
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { loginTool, handleLogin } from './tools/login.js';
|
|
6
6
|
import { logBragTool, handleLogBrag } from './tools/log-brag.js';
|
|
7
|
+
import { quickBragTool, handleQuickBrag } from './tools/quick-brag.js';
|
|
7
8
|
import { handlePreviewBrag } from './tools/preview-brag.js';
|
|
8
9
|
import { listBragsTool, handleListBrags } from './tools/list-brags.js';
|
|
9
10
|
import { listObjectivesTool, handleListObjectives } from './tools/list-objectives.js';
|
|
10
|
-
import {
|
|
11
|
+
import { linkBragToKeyResultTool, handleLinkBragToKeyResult } from './tools/link-brag-to-key-result.js';
|
|
11
12
|
import { listOrganisationsTool, handleListOrganisations } from './tools/list-organisations.js';
|
|
12
13
|
import { saveOrgPreferenceTool, handleSaveOrgPreference } from './tools/save-org-preference.js';
|
|
14
|
+
import { logStoryTool, handleLogStory } from './tools/log-story.js';
|
|
13
15
|
const server = new Server({
|
|
14
16
|
name: 'bragduck',
|
|
15
17
|
version: '1.0.0',
|
|
@@ -70,6 +72,18 @@ const server = new Server({
|
|
|
70
72
|
'STEP 4 — DONE\n' +
|
|
71
73
|
'Once log_brag is allowed and succeeds, confirm with one short sentence.\n' +
|
|
72
74
|
'\n' +
|
|
75
|
+
'QUICK BRAG (via /brag or raw text)\n' +
|
|
76
|
+
'When the user says "/brag" followed by text, or pastes a long block of text and asks to log it, ' +
|
|
77
|
+
'use the quick_brag tool instead of the interview flow. ' +
|
|
78
|
+
'quick_brag accepts raw text and uses AI to extract and structure it into a proper brag automatically. ' +
|
|
79
|
+
'Skip the interview, skip the preview table — just call quick_brag with the text.\n' +
|
|
80
|
+
'\n' +
|
|
81
|
+
'INTERVIEW STORIES (log_story)\n' +
|
|
82
|
+
'When the user discusses interview prep, behavioral questions, or asks to save a STAR story, ' +
|
|
83
|
+
'use log_story instead of log_brag. Stories are structured with Situation/Task/Action/Result fields ' +
|
|
84
|
+
'and competency tags. Follow the same org-selection flow (list_organisations → saved preference or ask). ' +
|
|
85
|
+
'Preview the story as a markdown table (Field | Value) before calling log_story in the same response.\n' +
|
|
86
|
+
'\n' +
|
|
73
87
|
'GENERAL RULES\n' +
|
|
74
88
|
'- Never fabricate details, metrics, or links. If unsure, ask.\n' +
|
|
75
89
|
'- "Is this bragable?" deserves a direct honest answer — not a tool call.\n' +
|
|
@@ -77,7 +91,7 @@ const server = new Server({
|
|
|
77
91
|
});
|
|
78
92
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
79
93
|
return {
|
|
80
|
-
tools: [loginTool, logBragTool, listBragsTool, listObjectivesTool,
|
|
94
|
+
tools: [loginTool, logBragTool, quickBragTool, listBragsTool, listObjectivesTool, linkBragToKeyResultTool, listOrganisationsTool, saveOrgPreferenceTool, logStoryTool],
|
|
81
95
|
};
|
|
82
96
|
});
|
|
83
97
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -89,16 +103,20 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
89
103
|
return handlePreviewBrag(args);
|
|
90
104
|
case 'log_brag':
|
|
91
105
|
return handleLogBrag(args);
|
|
106
|
+
case 'quick_brag':
|
|
107
|
+
return handleQuickBrag(args);
|
|
92
108
|
case 'list_brags':
|
|
93
109
|
return handleListBrags(args);
|
|
94
110
|
case 'list_objectives':
|
|
95
111
|
return handleListObjectives();
|
|
96
|
-
case '
|
|
97
|
-
return
|
|
112
|
+
case 'link_brag_to_key_result':
|
|
113
|
+
return handleLinkBragToKeyResult(args);
|
|
98
114
|
case 'list_organisations':
|
|
99
115
|
return handleListOrganisations();
|
|
100
116
|
case 'save_org_preference':
|
|
101
117
|
return handleSaveOrgPreference(args);
|
|
118
|
+
case 'log_story':
|
|
119
|
+
return handleLogStory(args);
|
|
102
120
|
default:
|
|
103
121
|
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
104
122
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,sBAAsB,EACtB,QAAQ,GACT,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAmB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const linkBragToKeyResultTool: {
|
|
2
2
|
name: string;
|
|
3
3
|
description: string;
|
|
4
4
|
inputSchema: {
|
|
@@ -8,7 +8,7 @@ export declare const linkBragToGoalTool: {
|
|
|
8
8
|
type: string;
|
|
9
9
|
description: string;
|
|
10
10
|
};
|
|
11
|
-
|
|
11
|
+
keyResultId: {
|
|
12
12
|
type: string;
|
|
13
13
|
description: string;
|
|
14
14
|
};
|
|
@@ -18,9 +18,9 @@ export declare const linkBragToGoalTool: {
|
|
|
18
18
|
};
|
|
19
19
|
interface LinkBragInput {
|
|
20
20
|
bragId: string;
|
|
21
|
-
|
|
21
|
+
keyResultId: string;
|
|
22
22
|
}
|
|
23
|
-
export declare function
|
|
23
|
+
export declare function handleLinkBragToKeyResult(input: LinkBragInput): Promise<{
|
|
24
24
|
content: Array<{
|
|
25
25
|
type: string;
|
|
26
26
|
text: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { apiRequest, requirePaidPlan } from '../api-client.js';
|
|
2
2
|
import { getUserInfo } from '../credentials.js';
|
|
3
|
-
export const
|
|
4
|
-
name: '
|
|
5
|
-
description: 'Add a
|
|
6
|
-
'Use list_objectives to find
|
|
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
7
|
inputSchema: {
|
|
8
8
|
type: 'object',
|
|
9
9
|
properties: {
|
|
@@ -11,15 +11,15 @@ export const linkBragToGoalTool = {
|
|
|
11
11
|
type: 'string',
|
|
12
12
|
description: 'The ID of the brag to update',
|
|
13
13
|
},
|
|
14
|
-
|
|
14
|
+
keyResultId: {
|
|
15
15
|
type: 'string',
|
|
16
|
-
description: 'The ID of the
|
|
16
|
+
description: 'The ID of the keyResult to link the brag to',
|
|
17
17
|
},
|
|
18
18
|
},
|
|
19
|
-
required: ['bragId', '
|
|
19
|
+
required: ['bragId', 'keyResultId'],
|
|
20
20
|
},
|
|
21
21
|
};
|
|
22
|
-
export async function
|
|
22
|
+
export async function handleLinkBragToKeyResult(input) {
|
|
23
23
|
const planError = await requirePaidPlan();
|
|
24
24
|
if (planError)
|
|
25
25
|
return planError;
|
|
@@ -34,28 +34,28 @@ export async function handleLinkBragToGoal(input) {
|
|
|
34
34
|
isError: true,
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
// Fetch current brag to read existing
|
|
37
|
+
// Fetch current brag to read existing keyResultIds
|
|
38
38
|
const currentBrag = await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`);
|
|
39
|
-
const
|
|
39
|
+
const existingKeyResultIds = currentBrag.keyResultIds || [];
|
|
40
40
|
// Skip if already linked
|
|
41
|
-
if (
|
|
41
|
+
if (existingKeyResultIds.includes(input.keyResultId)) {
|
|
42
42
|
return {
|
|
43
43
|
content: [{
|
|
44
44
|
type: 'text',
|
|
45
|
-
text: `Brag ${input.bragId} is already linked to
|
|
45
|
+
text: `Brag ${input.bragId} is already linked to keyResult ${input.keyResultId}.`,
|
|
46
46
|
}],
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
-
// Append new
|
|
50
|
-
const
|
|
49
|
+
// Append new keyResult (deduplicated via the check above)
|
|
50
|
+
const updatedKeyResultIds = [...existingKeyResultIds, input.keyResultId];
|
|
51
51
|
await apiRequest(`/v1/users/${userInfo.id}/brags/${input.bragId}`, {
|
|
52
52
|
method: 'PATCH',
|
|
53
|
-
body: {
|
|
53
|
+
body: { keyResultIds: updatedKeyResultIds },
|
|
54
54
|
});
|
|
55
55
|
return {
|
|
56
56
|
content: [{
|
|
57
57
|
type: 'text',
|
|
58
|
-
text: `
|
|
58
|
+
text: `KeyResult ${input.keyResultId} added to brag ${input.bragId} (now linked to ${updatedKeyResultIds.length} keyResult${updatedKeyResultIds.length === 1 ? '' : 's'}).`,
|
|
59
59
|
}],
|
|
60
60
|
};
|
|
61
61
|
}
|
|
@@ -72,10 +72,10 @@ export async function handleLinkBragToGoal(input) {
|
|
|
72
72
|
return {
|
|
73
73
|
content: [{
|
|
74
74
|
type: 'text',
|
|
75
|
-
text: `Failed to link brag to
|
|
75
|
+
text: `Failed to link brag to keyResult: ${error instanceof Error ? error.message : String(error)}`,
|
|
76
76
|
}],
|
|
77
77
|
isError: true,
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
//# sourceMappingURL=link-brag-to-
|
|
81
|
+
//# sourceMappingURL=link-brag-to-key-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
package/dist/tools/list-brags.js
CHANGED
|
@@ -2,7 +2,7 @@ import { apiRequest, requirePaidPlan } from '../api-client.js';
|
|
|
2
2
|
export const listBragsTool = {
|
|
3
3
|
name: 'list_brags',
|
|
4
4
|
description: 'List recent brags (career achievements) from BragDuck. ' +
|
|
5
|
-
'Use this to review past accomplishments, find brags to link to
|
|
5
|
+
'Use this to review past accomplishments, find brags to link to keyResults, or check recent entries.',
|
|
6
6
|
inputSchema: {
|
|
7
7
|
type: 'object',
|
|
8
8
|
properties: {
|
|
@@ -71,14 +71,14 @@ export async function handleListBrags(input) {
|
|
|
71
71
|
const date = new Date(brag.date).toLocaleDateString();
|
|
72
72
|
const impact = `Impact: ${IMPACT_LABELS[brag.impactLevel ?? 0] ?? (brag.impactLevel ?? 0)}`;
|
|
73
73
|
const type = brag.type ? ` | Type: ${brag.type}` : '';
|
|
74
|
-
const
|
|
75
|
-
? `\n Linked to key result: ${brag.
|
|
74
|
+
const keyResultNote = brag.keyResultIds?.length > 0
|
|
75
|
+
? `\n Linked to key result: ${brag.keyResultIds[0]}`
|
|
76
76
|
: '';
|
|
77
77
|
const impactDesc = brag.impactDescription ? `\n Impact: ${brag.impactDescription}` : '';
|
|
78
78
|
return (`- **${brag.title}** (ID: ${brag.id}, ${date})${tags}\n` +
|
|
79
79
|
` ${impact}${type}` +
|
|
80
80
|
impactDesc +
|
|
81
|
-
|
|
81
|
+
keyResultNote +
|
|
82
82
|
`\n ${brag.description.slice(0, 150)}${brag.description.length > 150 ? '...' : ''}` +
|
|
83
83
|
`\n View: ${brag.url}`);
|
|
84
84
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-brags.js","sourceRoot":"","sources":["../../src/tools/list-brags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,yDAAyD;QACzD,
|
|
1
|
+
{"version":3,"file":"list-brags.js","sourceRoot":"","sources":["../../src/tools/list-brags.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { getUserInfo } from '../credentials.js';
|
|
|
3
3
|
export const listObjectivesTool = {
|
|
4
4
|
name: 'list_objectives',
|
|
5
5
|
description: 'List OKRs (Objectives and Key Results) from BragDuck. ' +
|
|
6
|
-
'Use this to see current
|
|
6
|
+
'Use this to see current keyResults and their IDs, which can be used to link brags to specific keyResults.',
|
|
7
7
|
inputSchema: {
|
|
8
8
|
type: 'object',
|
|
9
9
|
properties: {},
|
|
@@ -31,11 +31,11 @@ export async function handleListObjectives() {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
const lines = response.items.map((obj) => {
|
|
34
|
-
const
|
|
35
|
-
.map((g) => ` - ${g.label} (
|
|
34
|
+
const keyResults = obj.keyResults
|
|
35
|
+
.map((g) => ` - ${g.label} (KeyResult ID: ${g.id}, status: ${g.status})`)
|
|
36
36
|
.join('\n');
|
|
37
37
|
const category = obj.category ? ` [${obj.category}]` : '';
|
|
38
|
-
return `- **${obj.title}** (ID: ${obj.id}, status: ${obj.status})${category}\n${
|
|
38
|
+
return `- **${obj.title}** (ID: ${obj.id}, status: ${obj.status})${category}\n${keyResults || ' (no keyResults)'}`;
|
|
39
39
|
});
|
|
40
40
|
return {
|
|
41
41
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
package/dist/tools/log-brag.d.ts
CHANGED
|
@@ -57,6 +57,11 @@ export declare const logBragTool: {
|
|
|
57
57
|
type: string;
|
|
58
58
|
description: string;
|
|
59
59
|
};
|
|
60
|
+
agent: {
|
|
61
|
+
type: string;
|
|
62
|
+
maxLength: number;
|
|
63
|
+
description: string;
|
|
64
|
+
};
|
|
60
65
|
};
|
|
61
66
|
required: string[];
|
|
62
67
|
};
|
|
@@ -71,6 +76,7 @@ interface LogBragInput {
|
|
|
71
76
|
date?: string;
|
|
72
77
|
references?: string[];
|
|
73
78
|
orgId?: string;
|
|
79
|
+
agent?: string;
|
|
74
80
|
}
|
|
75
81
|
export declare function handleLogBrag(input: LogBragInput): Promise<{
|
|
76
82
|
content: Array<{
|
package/dist/tools/log-brag.js
CHANGED
|
@@ -77,10 +77,27 @@ export const logBragTool = {
|
|
|
77
77
|
type: 'string',
|
|
78
78
|
description: 'Organisation ID to associate the brag with',
|
|
79
79
|
},
|
|
80
|
+
agent: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
maxLength: 50,
|
|
83
|
+
description: 'Optional AI agent/client name for MCP-origin brags, e.g. "claude", "codex", "cursor", or "copilot".',
|
|
84
|
+
},
|
|
80
85
|
},
|
|
81
86
|
required: ['title', 'description', 'type', 'impact_level', 'impact_description', 'references'],
|
|
82
87
|
},
|
|
83
88
|
};
|
|
89
|
+
function toAgentExternalType(agent) {
|
|
90
|
+
if (!agent)
|
|
91
|
+
return undefined;
|
|
92
|
+
const normalized = agent
|
|
93
|
+
.trim()
|
|
94
|
+
.toLowerCase()
|
|
95
|
+
.replace(/\s+/g, '-')
|
|
96
|
+
.replace(/[^a-z0-9_-]/g, '');
|
|
97
|
+
if (normalized.length === 0)
|
|
98
|
+
return undefined;
|
|
99
|
+
return `agent:${normalized.slice(0, 50)}`;
|
|
100
|
+
}
|
|
84
101
|
export async function handleLogBrag(input) {
|
|
85
102
|
const planError = await requirePaidPlan();
|
|
86
103
|
if (planError)
|
|
@@ -104,6 +121,9 @@ export async function handleLogBrag(input) {
|
|
|
104
121
|
brag.attachments = input.references;
|
|
105
122
|
if (input.orgId)
|
|
106
123
|
brag.orgId = input.orgId;
|
|
124
|
+
const agentExternalType = toAgentExternalType(input.agent);
|
|
125
|
+
if (agentExternalType)
|
|
126
|
+
brag.externalType = agentExternalType;
|
|
107
127
|
const response = await apiRequest('/v1/brags', {
|
|
108
128
|
method: 'POST',
|
|
109
129
|
body: { brags: [brag], source: 'mcp' },
|
|
@@ -111,8 +131,8 @@ export async function handleLogBrag(input) {
|
|
|
111
131
|
if (response.brags && response.brags.length > 0) {
|
|
112
132
|
const created = response.brags[0];
|
|
113
133
|
const lines = [`Brag logged: "${created.title}"\nView it at: ${created.url}`];
|
|
114
|
-
if (created.
|
|
115
|
-
lines.push(`Automatically linked to key result: ${created.
|
|
134
|
+
if (created.keyResultIds && created.keyResultIds.length > 0) {
|
|
135
|
+
lines.push(`Automatically linked to key result: ${created.keyResultIds[0]}`);
|
|
116
136
|
}
|
|
117
137
|
return {
|
|
118
138
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-brag.js","sourceRoot":"","sources":["../../src/tools/log-brag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,mDAAmD;QACnD,gGAAgG;QAChG,qFAAqF;IACvF,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,4DAA4D;aAC1E;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,2FAA2F;aACzG;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;gBACtD,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,gIAAgI;aAC9I;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;aAC5E;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClB,WAAW,EACT,mCAAmC;oBACnC,+CAA+C;oBAC/C,4DAA4D;oBAC5D,sEAAsE;oBACtE,4EAA4E;aAC/E;YACD,kBAAkB,EAAE;gBAClB,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,uCAAuC;oBACvC,gEAAgE;oBAChE,wCAAwC;oBACxC,4EAA4E;aAC/E;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,UAAU;oBACV,aAAa;oBACb,aAAa;oBACb,SAAS;oBACT,MAAM;oBACN,YAAY;oBACZ,UAAU;oBACV,eAAe;oBACf,WAAW;oBACX,YAAY;oBACZ,SAAS;oBACT,KAAK;oBACL,QAAQ;iBACT;gBACD,WAAW,EAAE,0EAA0E;aACxF;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;gBACxC,QAAQ,EAAE,EAAE;gBACZ,WAAW,EACT,oDAAoD;oBACpD,4DAA4D;oBAC5D,uFAAuF;oBACvF,+FAA+F;aAClG;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,CAAC;KAC/F;CACF,CAAC;
|
|
1
|
+
{"version":3,"file":"log-brag.js","sourceRoot":"","sources":["../../src/tools/log-brag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const logStoryTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
title: {
|
|
8
|
+
type: string;
|
|
9
|
+
minLength: number;
|
|
10
|
+
maxLength: number;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
situation: {
|
|
14
|
+
type: string;
|
|
15
|
+
minLength: number;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
task: {
|
|
19
|
+
type: string;
|
|
20
|
+
minLength: number;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
action: {
|
|
24
|
+
type: string;
|
|
25
|
+
minLength: number;
|
|
26
|
+
description: string;
|
|
27
|
+
};
|
|
28
|
+
result: {
|
|
29
|
+
type: string;
|
|
30
|
+
minLength: number;
|
|
31
|
+
description: string;
|
|
32
|
+
};
|
|
33
|
+
competencies: {
|
|
34
|
+
type: string;
|
|
35
|
+
items: {
|
|
36
|
+
type: string;
|
|
37
|
+
minLength: number;
|
|
38
|
+
maxLength: number;
|
|
39
|
+
};
|
|
40
|
+
maxItems: number;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
bragIds: {
|
|
44
|
+
type: string;
|
|
45
|
+
items: {
|
|
46
|
+
type: string;
|
|
47
|
+
};
|
|
48
|
+
maxItems: number;
|
|
49
|
+
description: string;
|
|
50
|
+
};
|
|
51
|
+
orgId: {
|
|
52
|
+
type: string;
|
|
53
|
+
description: string;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
required: string[];
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
interface LogStoryInput {
|
|
60
|
+
title: string;
|
|
61
|
+
situation: string;
|
|
62
|
+
task: string;
|
|
63
|
+
action: string;
|
|
64
|
+
result: string;
|
|
65
|
+
competencies?: string[];
|
|
66
|
+
bragIds?: string[];
|
|
67
|
+
orgId?: string;
|
|
68
|
+
}
|
|
69
|
+
export declare function handleLogStory(input: LogStoryInput): Promise<{
|
|
70
|
+
content: Array<{
|
|
71
|
+
type: string;
|
|
72
|
+
text: string;
|
|
73
|
+
}>;
|
|
74
|
+
isError?: boolean;
|
|
75
|
+
}>;
|
|
76
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { apiRequest, requirePaidPlan } from '../api-client.js';
|
|
2
|
+
import { getUserInfo } from '../credentials.js';
|
|
3
|
+
export const logStoryTool = {
|
|
4
|
+
name: 'log_story',
|
|
5
|
+
description: 'Save a STAR-formatted interview story to BragDuck. ' +
|
|
6
|
+
'Use this when the user discusses interview prep, behavioral questions, or asks to save a story. ' +
|
|
7
|
+
'Each story has Situation, Task, Action, Result fields plus competency tags. ' +
|
|
8
|
+
'Call this in the same response as a preview — the tool permission prompt (Allow/Deny) ' +
|
|
9
|
+
'that appears to the user IS the confirmation.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
title: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
minLength: 5,
|
|
16
|
+
maxLength: 200,
|
|
17
|
+
description: 'Short title for the story (e.g., "Led migration to microservices")',
|
|
18
|
+
},
|
|
19
|
+
situation: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
minLength: 10,
|
|
22
|
+
description: 'The context and background — what was happening, what was the environment',
|
|
23
|
+
},
|
|
24
|
+
task: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
minLength: 10,
|
|
27
|
+
description: 'What was your specific responsibility or challenge',
|
|
28
|
+
},
|
|
29
|
+
action: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
minLength: 10,
|
|
32
|
+
description: 'What you specifically did — the steps you took',
|
|
33
|
+
},
|
|
34
|
+
result: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
minLength: 10,
|
|
37
|
+
description: 'The outcome — measurable impact, what changed, what you learned',
|
|
38
|
+
},
|
|
39
|
+
competencies: {
|
|
40
|
+
type: 'array',
|
|
41
|
+
items: { type: 'string', minLength: 2, maxLength: 50 },
|
|
42
|
+
maxItems: 20,
|
|
43
|
+
description: 'Skills or competencies this story demonstrates (e.g., "leadership", "system design", "conflict resolution")',
|
|
44
|
+
},
|
|
45
|
+
bragIds: {
|
|
46
|
+
type: 'array',
|
|
47
|
+
items: { type: 'string' },
|
|
48
|
+
maxItems: 20,
|
|
49
|
+
description: 'IDs of BragDuck brags that back this story',
|
|
50
|
+
},
|
|
51
|
+
orgId: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'Organisation ID to associate the story with',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ['title', 'situation', 'task', 'action', 'result'],
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
export async function handleLogStory(input) {
|
|
60
|
+
const planError = await requirePaidPlan();
|
|
61
|
+
if (planError)
|
|
62
|
+
return planError;
|
|
63
|
+
try {
|
|
64
|
+
const userInfo = getUserInfo();
|
|
65
|
+
if (!userInfo) {
|
|
66
|
+
return {
|
|
67
|
+
content: [{
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
|
|
70
|
+
}],
|
|
71
|
+
isError: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const body = {
|
|
75
|
+
title: input.title,
|
|
76
|
+
situation: input.situation,
|
|
77
|
+
task: input.task,
|
|
78
|
+
action: input.action,
|
|
79
|
+
result: input.result,
|
|
80
|
+
competencies: input.competencies || [],
|
|
81
|
+
bragIds: input.bragIds || [],
|
|
82
|
+
source: 'mcp',
|
|
83
|
+
};
|
|
84
|
+
if (input.orgId)
|
|
85
|
+
body.orgId = input.orgId;
|
|
86
|
+
const story = await apiRequest(`/v1/users/${userInfo.id}/stories`, { method: 'POST', body });
|
|
87
|
+
const competencyLine = story.competencies.length > 0
|
|
88
|
+
? `\nCompetencies: ${story.competencies.join(', ')}`
|
|
89
|
+
: '';
|
|
90
|
+
return {
|
|
91
|
+
content: [{
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: `Story saved: "${story.title}"${competencyLine}`,
|
|
94
|
+
}],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
|
|
99
|
+
return {
|
|
100
|
+
content: [{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
|
|
103
|
+
}],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: `Failed to save story: ${error instanceof Error ? error.message : String(error)}`,
|
|
111
|
+
}],
|
|
112
|
+
isError: true,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=log-story.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-story.js","sourceRoot":"","sources":["../../src/tools/log-story.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const quickBragTool: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
text: {
|
|
8
|
+
type: string;
|
|
9
|
+
minLength: number;
|
|
10
|
+
maxLength: number;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
orgId: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
agent: {
|
|
18
|
+
type: string;
|
|
19
|
+
maxLength: number;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
required: string[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
interface QuickBragInput {
|
|
27
|
+
text: string;
|
|
28
|
+
orgId?: string;
|
|
29
|
+
agent?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function handleQuickBrag(input: QuickBragInput): Promise<{
|
|
32
|
+
content: Array<{
|
|
33
|
+
type: string;
|
|
34
|
+
text: string;
|
|
35
|
+
}>;
|
|
36
|
+
isError?: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { apiRequest, requirePaidPlan } from '../api-client.js';
|
|
2
|
+
export const quickBragTool = {
|
|
3
|
+
name: 'quick_brag',
|
|
4
|
+
description: 'Log a brag from raw text. Accepts free-form text (a sentence, paragraph, or paste from a message/PR/doc) ' +
|
|
5
|
+
'and uses AI to extract and structure it into a proper brag. The AI will parse the text into a title, ' +
|
|
6
|
+
'description, type, impact, and tags, then log it. Use this when the user says "/brag" followed by text, ' +
|
|
7
|
+
'or pastes something and asks to log it as a brag.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: 'object',
|
|
10
|
+
properties: {
|
|
11
|
+
text: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
minLength: 10,
|
|
14
|
+
maxLength: 5000,
|
|
15
|
+
description: 'Raw text describing the achievement. Can be a sentence, paragraph, paste from a PR description, ' +
|
|
16
|
+
'Slack message, commit message, or any free-form text. The AI will extract brag fields from it.',
|
|
17
|
+
},
|
|
18
|
+
orgId: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Organisation ID to associate the brag with (optional)',
|
|
21
|
+
},
|
|
22
|
+
agent: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
maxLength: 50,
|
|
25
|
+
description: 'Optional AI agent/client name, e.g. "claude", "cursor", "copilot".',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ['text'],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
function toAgentExternalType(agent) {
|
|
32
|
+
if (!agent)
|
|
33
|
+
return undefined;
|
|
34
|
+
const normalized = agent
|
|
35
|
+
.trim()
|
|
36
|
+
.toLowerCase()
|
|
37
|
+
.replace(/\s+/g, '-')
|
|
38
|
+
.replace(/[^a-z0-9_-]/g, '');
|
|
39
|
+
if (normalized.length === 0)
|
|
40
|
+
return undefined;
|
|
41
|
+
return `agent:${normalized.slice(0, 50)}`;
|
|
42
|
+
}
|
|
43
|
+
export async function handleQuickBrag(input) {
|
|
44
|
+
const planError = await requirePaidPlan();
|
|
45
|
+
if (planError)
|
|
46
|
+
return planError;
|
|
47
|
+
try {
|
|
48
|
+
// Step 1: Refine raw text into structured brag via AI
|
|
49
|
+
const refined = await apiRequest('/v1/brags/refine', {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
body: { brags: [{ text: input.text }] },
|
|
52
|
+
});
|
|
53
|
+
if (!refined.refined_brags || refined.refined_brags.length === 0) {
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: 'Could not extract a brag from the provided text. Try adding more detail about what was accomplished and its impact.',
|
|
58
|
+
}],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Step 2: Log the refined brag
|
|
63
|
+
const extracted = refined.refined_brags[0];
|
|
64
|
+
const brag = {
|
|
65
|
+
title: extracted.refined_title,
|
|
66
|
+
description: extracted.refined_description,
|
|
67
|
+
tags: extracted.suggested_tags || [],
|
|
68
|
+
date: new Date().toISOString(),
|
|
69
|
+
visibility: 'private',
|
|
70
|
+
impactLevel: extracted.suggested_impactLevel,
|
|
71
|
+
impact_description: extracted.impact_description || '',
|
|
72
|
+
typeKey: extracted.suggested_type_key,
|
|
73
|
+
};
|
|
74
|
+
const allLinks = [
|
|
75
|
+
...(extracted.extracted_links || []),
|
|
76
|
+
...(extracted.attachments || []),
|
|
77
|
+
].filter(Boolean);
|
|
78
|
+
if (allLinks.length > 0)
|
|
79
|
+
brag.attachments = allLinks;
|
|
80
|
+
if (input.orgId)
|
|
81
|
+
brag.orgId = input.orgId;
|
|
82
|
+
const agentExternalType = toAgentExternalType(input.agent);
|
|
83
|
+
if (agentExternalType)
|
|
84
|
+
brag.externalType = agentExternalType;
|
|
85
|
+
const response = await apiRequest('/v1/brags', {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
body: { brags: [brag], source: 'mcp' },
|
|
88
|
+
});
|
|
89
|
+
// Check for validation errors first
|
|
90
|
+
if (response.errors && response.errors.length > 0) {
|
|
91
|
+
const errorMessages = response.errors.map((e) => e.message).join('; ');
|
|
92
|
+
return {
|
|
93
|
+
content: [{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: `Failed to create brag: ${errorMessages}`,
|
|
96
|
+
}],
|
|
97
|
+
isError: true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (response.brags && response.brags.length > 0) {
|
|
101
|
+
const created = response.brags[0];
|
|
102
|
+
const lines = [
|
|
103
|
+
`Brag logged: "${created.title}"`,
|
|
104
|
+
`${created.url}`,
|
|
105
|
+
];
|
|
106
|
+
if (created.keyResultIds && created.keyResultIds.length > 0) {
|
|
107
|
+
lines.push(`Automatically linked to key result: ${created.keyResultIds[0]}`);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
content: [{
|
|
111
|
+
type: 'text',
|
|
112
|
+
text: lines.join('\n'),
|
|
113
|
+
}],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
content: [{
|
|
118
|
+
type: 'text',
|
|
119
|
+
text: 'Server returned no brag and no error detail',
|
|
120
|
+
}],
|
|
121
|
+
isError: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof Error && (error.message === 'NOT_AUTHENTICATED' || error.message === 'TOKEN_EXPIRED')) {
|
|
126
|
+
return {
|
|
127
|
+
content: [{
|
|
128
|
+
type: 'text',
|
|
129
|
+
text: 'Not authenticated with BragDuck. Please call the "login" tool first.',
|
|
130
|
+
}],
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
content: [{
|
|
136
|
+
type: 'text',
|
|
137
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
138
|
+
}],
|
|
139
|
+
isError: true,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=quick-brag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-brag.js","sourceRoot":"","sources":["../../src/tools/quick-brag.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link-brag-to-goal.js","sourceRoot":"","sources":["../../src/tools/link-brag-to-goal.ts"],"names":[],"mappings":"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"}
|