@xihe-lab/tapd-core 2.0.0-rc.1
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/LICENSE +190 -0
- package/dist/advisor/advisor.test.d.ts +2 -0
- package/dist/advisor/advisor.test.d.ts.map +1 -0
- package/dist/advisor/advisor.test.js +102 -0
- package/dist/advisor/advisor.test.js.map +1 -0
- package/dist/advisor/index.d.ts +19 -0
- package/dist/advisor/index.d.ts.map +1 -0
- package/dist/advisor/index.js +240 -0
- package/dist/advisor/index.js.map +1 -0
- package/dist/config/config.d.ts +43 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +221 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/config.test.d.ts +2 -0
- package/dist/config/config.test.d.ts.map +1 -0
- package/dist/config/config.test.js +229 -0
- package/dist/config/config.test.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/cli-meta.d.ts +4 -0
- package/dist/registry/cli-meta.d.ts.map +1 -0
- package/dist/registry/cli-meta.js +104 -0
- package/dist/registry/cli-meta.js.map +1 -0
- package/dist/registry/debug-commands.d.ts +2 -0
- package/dist/registry/debug-commands.d.ts.map +1 -0
- package/dist/registry/debug-commands.js +47 -0
- package/dist/registry/debug-commands.js.map +1 -0
- package/dist/registry/derive-command.d.ts +6 -0
- package/dist/registry/derive-command.d.ts.map +1 -0
- package/dist/registry/derive-command.js +69 -0
- package/dist/registry/derive-command.js.map +1 -0
- package/dist/registry/long-id-guard.d.ts +3 -0
- package/dist/registry/long-id-guard.d.ts.map +1 -0
- package/dist/registry/long-id-guard.js +39 -0
- package/dist/registry/long-id-guard.js.map +1 -0
- package/dist/registry/long-id-guard.test.d.ts +2 -0
- package/dist/registry/long-id-guard.test.d.ts.map +1 -0
- package/dist/registry/long-id-guard.test.js +224 -0
- package/dist/registry/long-id-guard.test.js.map +1 -0
- package/dist/registry/registry.d.ts +43 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +131 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/registry.test.d.ts +2 -0
- package/dist/registry/registry.test.d.ts.map +1 -0
- package/dist/registry/registry.test.js +220 -0
- package/dist/registry/registry.test.js.map +1 -0
- package/dist/registry/richtext-manifests.generated.d.ts +3 -0
- package/dist/registry/richtext-manifests.generated.d.ts.map +1 -0
- package/dist/registry/richtext-manifests.generated.js +98 -0
- package/dist/registry/richtext-manifests.generated.js.map +1 -0
- package/dist/registry/richtext.d.ts +6 -0
- package/dist/registry/richtext.d.ts.map +1 -0
- package/dist/registry/richtext.js +64 -0
- package/dist/registry/richtext.js.map +1 -0
- package/dist/registry/richtext.test.d.ts +2 -0
- package/dist/registry/richtext.test.d.ts.map +1 -0
- package/dist/registry/richtext.test.js +210 -0
- package/dist/registry/richtext.test.js.map +1 -0
- package/dist/registry/write-policy.d.ts +3 -0
- package/dist/registry/write-policy.d.ts.map +1 -0
- package/dist/registry/write-policy.js +5 -0
- package/dist/registry/write-policy.js.map +1 -0
- package/dist/schema/export.d.ts +12 -0
- package/dist/schema/export.d.ts.map +1 -0
- package/dist/schema/export.js +39 -0
- package/dist/schema/export.js.map +1 -0
- package/dist/schema/export.test.d.ts +2 -0
- package/dist/schema/export.test.d.ts.map +1 -0
- package/dist/schema/export.test.js +68 -0
- package/dist/schema/export.test.js.map +1 -0
- package/dist/sdk-routes.d.ts +9 -0
- package/dist/sdk-routes.d.ts.map +1 -0
- package/dist/sdk-routes.js +148 -0
- package/dist/sdk-routes.js.map +1 -0
- package/dist/tapd-client.d.ts +99 -0
- package/dist/tapd-client.d.ts.map +1 -0
- package/dist/tapd-client.js +252 -0
- package/dist/tapd-client.js.map +1 -0
- package/dist/tools/attachment.d.ts +3 -0
- package/dist/tools/attachment.d.ts.map +1 -0
- package/dist/tools/attachment.js +99 -0
- package/dist/tools/attachment.js.map +1 -0
- package/dist/tools/board.d.ts +3 -0
- package/dist/tools/board.d.ts.map +1 -0
- package/dist/tools/board.js +98 -0
- package/dist/tools/board.js.map +1 -0
- package/dist/tools/bug.d.ts +3 -0
- package/dist/tools/bug.d.ts.map +1 -0
- package/dist/tools/bug.js +619 -0
- package/dist/tools/bug.js.map +1 -0
- package/dist/tools/changes.d.ts +3 -0
- package/dist/tools/changes.d.ts.map +1 -0
- package/dist/tools/changes.js +73 -0
- package/dist/tools/changes.js.map +1 -0
- package/dist/tools/comment.d.ts +3 -0
- package/dist/tools/comment.d.ts.map +1 -0
- package/dist/tools/comment.js +93 -0
- package/dist/tools/comment.js.map +1 -0
- package/dist/tools/custom-fields.d.ts +3 -0
- package/dist/tools/custom-fields.d.ts.map +1 -0
- package/dist/tools/custom-fields.js +105 -0
- package/dist/tools/custom-fields.js.map +1 -0
- package/dist/tools/image.d.ts +3 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +23 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +55 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/iteration.d.ts +3 -0
- package/dist/tools/iteration.d.ts.map +1 -0
- package/dist/tools/iteration.js +190 -0
- package/dist/tools/iteration.js.map +1 -0
- package/dist/tools/md-to-html.test.d.ts +2 -0
- package/dist/tools/md-to-html.test.d.ts.map +1 -0
- package/dist/tools/md-to-html.test.js +125 -0
- package/dist/tools/md-to-html.test.js.map +1 -0
- package/dist/tools/mini-comment.d.ts +3 -0
- package/dist/tools/mini-comment.d.ts.map +1 -0
- package/dist/tools/mini-comment.js +74 -0
- package/dist/tools/mini-comment.js.map +1 -0
- package/dist/tools/mini-item.d.ts +3 -0
- package/dist/tools/mini-item.d.ts.map +1 -0
- package/dist/tools/mini-item.js +166 -0
- package/dist/tools/mini-item.js.map +1 -0
- package/dist/tools/mini-workspace.d.ts +3 -0
- package/dist/tools/mini-workspace.d.ts.map +1 -0
- package/dist/tools/mini-workspace.js +43 -0
- package/dist/tools/mini-workspace.js.map +1 -0
- package/dist/tools/program.d.ts +3 -0
- package/dist/tools/program.d.ts.map +1 -0
- package/dist/tools/program.js +27 -0
- package/dist/tools/program.js.map +1 -0
- package/dist/tools/relations.d.ts +3 -0
- package/dist/tools/relations.d.ts.map +1 -0
- package/dist/tools/relations.js +68 -0
- package/dist/tools/relations.js.map +1 -0
- package/dist/tools/release.d.ts +3 -0
- package/dist/tools/release.d.ts.map +1 -0
- package/dist/tools/release.js +250 -0
- package/dist/tools/release.js.map +1 -0
- package/dist/tools/report.d.ts +3 -0
- package/dist/tools/report.d.ts.map +1 -0
- package/dist/tools/report.js +38 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/settings.d.ts +3 -0
- package/dist/tools/settings.d.ts.map +1 -0
- package/dist/tools/settings.js +409 -0
- package/dist/tools/settings.js.map +1 -0
- package/dist/tools/source.d.ts +3 -0
- package/dist/tools/source.d.ts.map +1 -0
- package/dist/tools/source.js +69 -0
- package/dist/tools/source.js.map +1 -0
- package/dist/tools/story.d.ts +3 -0
- package/dist/tools/story.d.ts.map +1 -0
- package/dist/tools/story.js +680 -0
- package/dist/tools/story.js.map +1 -0
- package/dist/tools/task.d.ts +3 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +267 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/test.d.ts +3 -0
- package/dist/tools/test.d.ts.map +1 -0
- package/dist/tools/test.js +564 -0
- package/dist/tools/test.js.map +1 -0
- package/dist/tools/timesheet.d.ts +3 -0
- package/dist/tools/timesheet.d.ts.map +1 -0
- package/dist/tools/timesheet.js +118 -0
- package/dist/tools/timesheet.js.map +1 -0
- package/dist/tools/user.d.ts +3 -0
- package/dist/tools/user.d.ts.map +1 -0
- package/dist/tools/user.js +57 -0
- package/dist/tools/user.js.map +1 -0
- package/dist/tools/utility.d.ts +3 -0
- package/dist/tools/utility.d.ts.map +1 -0
- package/dist/tools/utility.js +165 -0
- package/dist/tools/utility.js.map +1 -0
- package/dist/tools/wiki.d.ts +3 -0
- package/dist/tools/wiki.d.ts.map +1 -0
- package/dist/tools/wiki.js +227 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/tools/workflow.d.ts +3 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +116 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/tools/workspace.d.ts +3 -0
- package/dist/tools/workspace.d.ts.map +1 -0
- package/dist/tools/workspace.js +137 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/tools/zz-acceptance-echo.d.ts +3 -0
- package/dist/tools/zz-acceptance-echo.d.ts.map +1 -0
- package/dist/tools/zz-acceptance-echo.js +9 -0
- package/dist/tools/zz-acceptance-echo.js.map +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export declare class TapdClient {
|
|
2
|
+
private authHeader;
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private authType;
|
|
5
|
+
private apiUser?;
|
|
6
|
+
private apiPassword?;
|
|
7
|
+
private accessToken?;
|
|
8
|
+
private sdk?;
|
|
9
|
+
private readonly sdkEnabled;
|
|
10
|
+
private readonly verbose;
|
|
11
|
+
private constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Create client from OAuth access token
|
|
14
|
+
*/
|
|
15
|
+
static fromAccessToken(accessToken: string, baseUrl?: string): TapdClient;
|
|
16
|
+
/**
|
|
17
|
+
* Create client from Basic Auth credentials
|
|
18
|
+
*/
|
|
19
|
+
static fromBasicAuth(apiUser: string, apiPassword: string, baseUrl?: string): TapdClient;
|
|
20
|
+
/**
|
|
21
|
+
* Create client from environment variables
|
|
22
|
+
* Priority: TAPD_ACCESS_TOKEN > (TAPD_API_USER + TAPD_API_PASSWORD)
|
|
23
|
+
*/
|
|
24
|
+
static fromEnv(): TapdClient;
|
|
25
|
+
/**
|
|
26
|
+
* Get user nickname from environment variable TAPD_NICK_NAME
|
|
27
|
+
*/
|
|
28
|
+
static getNickName(): string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Get default workspace ID from environment variable TAPD_DEFAULT_WORKSPACE_ID
|
|
31
|
+
*/
|
|
32
|
+
static getDefaultWorkspaceId(): number | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Get default STORY workitem type ID from environment variable
|
|
35
|
+
*/
|
|
36
|
+
static getDefaultStoryWorkitemTypeId(): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get default TASK workitem type ID from environment variable
|
|
39
|
+
*/
|
|
40
|
+
static getDefaultTaskWorkitemTypeId(): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Convert short ID to long ID
|
|
43
|
+
*
|
|
44
|
+
* Rules:
|
|
45
|
+
* - Pure numeric ID with ≤9 digits is treated as short ID
|
|
46
|
+
* - For cloud environment (is_cloud=true), prefix is '11'
|
|
47
|
+
* - Pad short ID to 9 digits and concatenate with workspace_id
|
|
48
|
+
* - Non-short IDs are returned unchanged
|
|
49
|
+
*
|
|
50
|
+
* @param id - Story/bug/task ID (short or long format)
|
|
51
|
+
* @param workspaceId - Workspace ID for constructing long ID
|
|
52
|
+
* @param isCloud - Whether it's cloud environment (default: true)
|
|
53
|
+
*/
|
|
54
|
+
static toLongId(id: string | number, workspaceId: string | number, isCloud?: boolean): string;
|
|
55
|
+
/**
|
|
56
|
+
* Make HTTP request to TAPD API with retry support
|
|
57
|
+
*
|
|
58
|
+
* Retry policy:
|
|
59
|
+
* - Retry on 429/500/502/503 status codes
|
|
60
|
+
* - Max 3 retries with exponential backoff (1s, 2s, 4s)
|
|
61
|
+
* - POST requests do NOT retry (avoid duplicate creation)
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* Encode request params shared by the fetch path and the SDK path.
|
|
65
|
+
* - undefined values are dropped
|
|
66
|
+
* - POST restores literal "\n" to real newlines (unchanged v1 behavior)
|
|
67
|
+
*/
|
|
68
|
+
private static encodeParams;
|
|
69
|
+
private unwrap;
|
|
70
|
+
/**
|
|
71
|
+
* Lazily create the SDK instance matching the current auth mode.
|
|
72
|
+
* - oauth: reuses the existing access token (no authenticate() round-trip)
|
|
73
|
+
* - basic: SDK builds the Basic header from client/secret
|
|
74
|
+
*/
|
|
75
|
+
private getSdk;
|
|
76
|
+
/**
|
|
77
|
+
* Route a request through the SDK when the method+path is mapped,
|
|
78
|
+
* otherwise (and on read-only SDK failure) through the fetch client.
|
|
79
|
+
*/
|
|
80
|
+
private route;
|
|
81
|
+
request<T>(method: 'GET' | 'POST', path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
82
|
+
/**
|
|
83
|
+
* GET request to TAPD API
|
|
84
|
+
*/
|
|
85
|
+
get<T>(path: string, params?: Record<string, string | number | boolean>): Promise<T>;
|
|
86
|
+
/**
|
|
87
|
+
* POST request to TAPD API
|
|
88
|
+
*/
|
|
89
|
+
post<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* TAPD API response structure
|
|
93
|
+
*/
|
|
94
|
+
export interface TapdResponse<T> {
|
|
95
|
+
status: number;
|
|
96
|
+
data: T;
|
|
97
|
+
info: string;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tapd-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tapd-client.d.ts","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAgBA,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,GAAG,CAAC,CAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE,OAAO;IAgBP;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAIzE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAWxF;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,UAAU;IAmB5B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAKlD;;OAEG;IACH,MAAM,CAAC,6BAA6B,IAAI,MAAM,GAAG,SAAS;IAI1D;;OAEG;IACH,MAAM,CAAC,4BAA4B,IAAI,MAAM,GAAG,SAAS;IAIzD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,UAAO,GAAG,MAAM;IAc1F;;;;;;;KAOC;IACD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B,OAAO,CAAC,MAAM;IAQd;;;;OAIG;IACH,OAAO,CAAC,MAAM;IAOd;;;OAGG;YACW,KAAK;IAyBb,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC,CAAC,CAAC;IAwEb;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1F;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxG;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAPD API Client
|
|
3
|
+
*
|
|
4
|
+
* Supports dual authentication modes:
|
|
5
|
+
* - Basic Auth: using api_user + api_password
|
|
6
|
+
* - OAuth/Bearer Token: using access_token
|
|
7
|
+
*
|
|
8
|
+
* Routes requests through @opentapd/tapd-node-sdk when the method+path is
|
|
9
|
+
* listed in SDK_ROUTES, otherwise falls back to the custom fetch client.
|
|
10
|
+
* - GET SDK failures fall back to fetch (read-only, idempotent)
|
|
11
|
+
* - POST SDK failures throw directly (never fallback, avoid duplicate writes)
|
|
12
|
+
* - Set TAPD_SDK_DISABLED=1 to bypass the SDK entirely (rollback switch)
|
|
13
|
+
*/
|
|
14
|
+
import TapdSdk from '@opentapd/tapd-node-sdk';
|
|
15
|
+
import { SDK_ROUTES } from './sdk-routes.js';
|
|
16
|
+
export class TapdClient {
|
|
17
|
+
authHeader;
|
|
18
|
+
baseUrl;
|
|
19
|
+
authType;
|
|
20
|
+
apiUser;
|
|
21
|
+
apiPassword;
|
|
22
|
+
accessToken;
|
|
23
|
+
sdk;
|
|
24
|
+
sdkEnabled = process.env.TAPD_SDK_DISABLED !== '1';
|
|
25
|
+
verbose = process.env.TAPD_LOG_VERBOSE === '1';
|
|
26
|
+
constructor(authHeader, baseUrl, authType, apiUser, apiPassword, accessToken) {
|
|
27
|
+
this.authHeader = authHeader;
|
|
28
|
+
this.baseUrl = baseUrl ?? process.env.TAPD_API_BASE_URL ?? 'https://api.tapd.cn';
|
|
29
|
+
this.authType = authType ?? 'basic';
|
|
30
|
+
this.apiUser = apiUser;
|
|
31
|
+
this.apiPassword = apiPassword;
|
|
32
|
+
this.accessToken = accessToken;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create client from OAuth access token
|
|
36
|
+
*/
|
|
37
|
+
static fromAccessToken(accessToken, baseUrl) {
|
|
38
|
+
return new TapdClient(`Bearer ${accessToken}`, baseUrl, 'oauth', undefined, undefined, accessToken);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create client from Basic Auth credentials
|
|
42
|
+
*/
|
|
43
|
+
static fromBasicAuth(apiUser, apiPassword, baseUrl) {
|
|
44
|
+
const credentials = `${apiUser}:${apiPassword}`;
|
|
45
|
+
return new TapdClient(`Basic ${Buffer.from(credentials).toString('base64')}`, baseUrl, 'basic', apiUser, apiPassword);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create client from environment variables
|
|
49
|
+
* Priority: TAPD_ACCESS_TOKEN > (TAPD_API_USER + TAPD_API_PASSWORD)
|
|
50
|
+
*/
|
|
51
|
+
static fromEnv() {
|
|
52
|
+
const apiUser = process.env.TAPD_API_USER;
|
|
53
|
+
const apiPassword = process.env.TAPD_API_PASSWORD;
|
|
54
|
+
const accessToken = process.env.TAPD_ACCESS_TOKEN;
|
|
55
|
+
const baseUrl = process.env.TAPD_API_BASE_URL;
|
|
56
|
+
if (accessToken) {
|
|
57
|
+
return TapdClient.fromAccessToken(accessToken, baseUrl);
|
|
58
|
+
}
|
|
59
|
+
if (apiUser && apiPassword) {
|
|
60
|
+
return TapdClient.fromBasicAuth(apiUser, apiPassword, baseUrl);
|
|
61
|
+
}
|
|
62
|
+
throw new Error('Authentication required. Set TAPD_ACCESS_TOKEN or (TAPD_API_USER + TAPD_API_PASSWORD) environment variables.');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get user nickname from environment variable TAPD_NICK_NAME
|
|
66
|
+
*/
|
|
67
|
+
static getNickName() {
|
|
68
|
+
return process.env.TAPD_NICK_NAME;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get default workspace ID from environment variable TAPD_DEFAULT_WORKSPACE_ID
|
|
72
|
+
*/
|
|
73
|
+
static getDefaultWorkspaceId() {
|
|
74
|
+
const id = process.env.TAPD_DEFAULT_WORKSPACE_ID;
|
|
75
|
+
return id ? parseInt(id, 10) : undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get default STORY workitem type ID from environment variable
|
|
79
|
+
*/
|
|
80
|
+
static getDefaultStoryWorkitemTypeId() {
|
|
81
|
+
return process.env.TAPD_DEFAULT_STORY_WORKITEM_TYPE_ID;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get default TASK workitem type ID from environment variable
|
|
85
|
+
*/
|
|
86
|
+
static getDefaultTaskWorkitemTypeId() {
|
|
87
|
+
return process.env.TAPD_DEFAULT_TASK_WORKITEM_TYPE_ID;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Convert short ID to long ID
|
|
91
|
+
*
|
|
92
|
+
* Rules:
|
|
93
|
+
* - Pure numeric ID with ≤9 digits is treated as short ID
|
|
94
|
+
* - For cloud environment (is_cloud=true), prefix is '11'
|
|
95
|
+
* - Pad short ID to 9 digits and concatenate with workspace_id
|
|
96
|
+
* - Non-short IDs are returned unchanged
|
|
97
|
+
*
|
|
98
|
+
* @param id - Story/bug/task ID (short or long format)
|
|
99
|
+
* @param workspaceId - Workspace ID for constructing long ID
|
|
100
|
+
* @param isCloud - Whether it's cloud environment (default: true)
|
|
101
|
+
*/
|
|
102
|
+
static toLongId(id, workspaceId, isCloud = true) {
|
|
103
|
+
const idStr = String(id).trim();
|
|
104
|
+
const workspaceIdStr = String(workspaceId);
|
|
105
|
+
// Check if it's a pure numeric short ID (≤9 digits)
|
|
106
|
+
if (/^\d+$/.test(idStr) && idStr.length <= 9) {
|
|
107
|
+
const prefix = isCloud ? '11' : '10';
|
|
108
|
+
const paddedId = idStr.padStart(9, '0');
|
|
109
|
+
return `${prefix}${workspaceIdStr}${paddedId}`;
|
|
110
|
+
}
|
|
111
|
+
return idStr;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Make HTTP request to TAPD API with retry support
|
|
115
|
+
*
|
|
116
|
+
* Retry policy:
|
|
117
|
+
* - Retry on 429/500/502/503 status codes
|
|
118
|
+
* - Max 3 retries with exponential backoff (1s, 2s, 4s)
|
|
119
|
+
* - POST requests do NOT retry (avoid duplicate creation)
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* Encode request params shared by the fetch path and the SDK path.
|
|
123
|
+
* - undefined values are dropped
|
|
124
|
+
* - POST restores literal "\n" to real newlines (unchanged v1 behavior)
|
|
125
|
+
*/
|
|
126
|
+
static encodeParams(method, params) {
|
|
127
|
+
const restoreNewline = method === 'POST';
|
|
128
|
+
return new URLSearchParams(Object.entries(params ?? {})
|
|
129
|
+
.filter(([, value]) => value !== undefined)
|
|
130
|
+
.map(([key, value]) => [
|
|
131
|
+
key,
|
|
132
|
+
restoreNewline ? String(value).replace(/\\n/g, '\n') : String(value),
|
|
133
|
+
]));
|
|
134
|
+
}
|
|
135
|
+
unwrap(response) {
|
|
136
|
+
const result = response;
|
|
137
|
+
if (result.status !== 1) {
|
|
138
|
+
throw new Error(`TAPD API error: ${result.info ?? 'Unknown error'}`);
|
|
139
|
+
}
|
|
140
|
+
return result.data;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Lazily create the SDK instance matching the current auth mode.
|
|
144
|
+
* - oauth: reuses the existing access token (no authenticate() round-trip)
|
|
145
|
+
* - basic: SDK builds the Basic header from client/secret
|
|
146
|
+
*/
|
|
147
|
+
getSdk() {
|
|
148
|
+
this.sdk ??= this.authType === 'oauth'
|
|
149
|
+
? new TapdSdk({ accessToken: this.accessToken, address: this.baseUrl })
|
|
150
|
+
: new TapdSdk({ client: this.apiUser, secret: this.apiPassword, address: this.baseUrl });
|
|
151
|
+
return this.sdk;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Route a request through the SDK when the method+path is mapped,
|
|
155
|
+
* otherwise (and on read-only SDK failure) through the fetch client.
|
|
156
|
+
*/
|
|
157
|
+
async route(method, path, params) {
|
|
158
|
+
const sdkMethod = this.sdkEnabled ? SDK_ROUTES[`${method} ${path}`] : undefined;
|
|
159
|
+
if (sdkMethod) {
|
|
160
|
+
try {
|
|
161
|
+
const encoded = TapdClient.encodeParams(method, params);
|
|
162
|
+
const sdk = this.getSdk();
|
|
163
|
+
const response = await sdk[sdkMethod](encoded);
|
|
164
|
+
return this.unwrap(response);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (method === 'POST') {
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
if (this.verbose) {
|
|
171
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
172
|
+
console.error(`[tapd-client] SDK ${sdkMethod} failed for ${method} ${path}, falling back to fetch: ${message}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return this.request(method, path, params);
|
|
177
|
+
}
|
|
178
|
+
async request(method, path, params) {
|
|
179
|
+
const url = new URL(path, this.baseUrl);
|
|
180
|
+
const headers = {
|
|
181
|
+
'Authorization': this.authHeader,
|
|
182
|
+
};
|
|
183
|
+
let body;
|
|
184
|
+
const encoded = TapdClient.encodeParams(method, params);
|
|
185
|
+
if (method === 'GET') {
|
|
186
|
+
for (const [key, value] of encoded) {
|
|
187
|
+
url.searchParams.append(key, value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
192
|
+
body = encoded.toString();
|
|
193
|
+
}
|
|
194
|
+
// Retry configuration
|
|
195
|
+
const maxRetries = 3;
|
|
196
|
+
const retryableStatusCodes = [429, 500, 502, 503];
|
|
197
|
+
const shouldRetry = method === 'GET'; // Only retry GET requests
|
|
198
|
+
let lastError;
|
|
199
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
200
|
+
try {
|
|
201
|
+
const response = await fetch(url.toString(), {
|
|
202
|
+
method,
|
|
203
|
+
headers,
|
|
204
|
+
body,
|
|
205
|
+
});
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
const errorText = await response.text();
|
|
208
|
+
const error = new Error(`TAPD API error: ${response.status} ${response.statusText} - ${errorText.slice(0, 200)}`);
|
|
209
|
+
// Check if we should retry
|
|
210
|
+
if (shouldRetry && retryableStatusCodes.includes(response.status) && attempt < maxRetries) {
|
|
211
|
+
lastError = error;
|
|
212
|
+
const delayMs = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
|
|
213
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
const contentType = response.headers.get('content-type');
|
|
219
|
+
if (!contentType?.includes('application/json')) {
|
|
220
|
+
const text = await response.text();
|
|
221
|
+
throw new Error(`TAPD API returned non-JSON response: ${text.slice(0, 100)}`);
|
|
222
|
+
}
|
|
223
|
+
return this.unwrap(await response.json());
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
// For non-retryable errors or final attempt, throw immediately
|
|
227
|
+
if (!shouldRetry || attempt >= maxRetries) {
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
// For network errors, retry
|
|
231
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
232
|
+
const delayMs = Math.pow(2, attempt) * 1000;
|
|
233
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// All retries exhausted
|
|
237
|
+
throw lastError ?? new Error('Request failed after all retries');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* GET request to TAPD API
|
|
241
|
+
*/
|
|
242
|
+
async get(path, params) {
|
|
243
|
+
return this.route('GET', path, params);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* POST request to TAPD API
|
|
247
|
+
*/
|
|
248
|
+
async post(path, params) {
|
|
249
|
+
return this.route('POST', path, params);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=tapd-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,eAAe,EAAE,OAAO,EA+FpC,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { TapdClient } from '../tapd-client.js';
|
|
3
|
+
export const attachmentTools = [
|
|
4
|
+
// Standard TAPD API attachment tools
|
|
5
|
+
{
|
|
6
|
+
name: 'tapd_get_attachments',
|
|
7
|
+
description: 'Get attachment list from TAPD',
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
10
|
+
id: z.string().optional().describe('Attachment ID, supports multiple IDs;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
11
|
+
entity_id: z.string().optional().describe('Related entity ID (story/task/bug/wiki ID);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
12
|
+
entity_type: z.string().optional().describe('Entity type (story, task, bug, wiki)'),
|
|
13
|
+
filename: z.string().optional().describe('Filename'),
|
|
14
|
+
owner: z.string().optional().describe('Uploader'),
|
|
15
|
+
created: z.string().optional().describe('Creation time, supports time query'),
|
|
16
|
+
modified: z.string().optional().describe('Last modification time, supports time query'),
|
|
17
|
+
fields: z.string().optional().describe('Comma-separated list of fields to return'),
|
|
18
|
+
limit: z.number().optional().describe('Number of results to return, max 200'),
|
|
19
|
+
page: z.number().optional().describe('Page number, default 1'),
|
|
20
|
+
order: z.string().optional().describe('Sort order, e.g., "created desc"'),
|
|
21
|
+
}),
|
|
22
|
+
handler: async (client, params) => {
|
|
23
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
24
|
+
if (!workspaceId) {
|
|
25
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
26
|
+
}
|
|
27
|
+
return client.get('/attachments', { ...params, workspace_id: workspaceId });
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'tapd_get_attachment',
|
|
32
|
+
description: 'Get a single attachment from TAPD',
|
|
33
|
+
inputSchema: z.object({
|
|
34
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
35
|
+
id: z.string().describe('Attachment ID (required);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
36
|
+
fields: z.string().optional().describe('Comma-separated list of fields to return'),
|
|
37
|
+
}),
|
|
38
|
+
handler: async (client, params) => {
|
|
39
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
40
|
+
if (!workspaceId) {
|
|
41
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
42
|
+
}
|
|
43
|
+
return client.get('/attachments/get_one', { ...params, workspace_id: workspaceId });
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'tapd_get_attachment_download_url',
|
|
48
|
+
description: 'Get download URL for a single attachment (valid for 300s)',
|
|
49
|
+
inputSchema: z.object({
|
|
50
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
51
|
+
id: z.string().describe('Attachment ID (required);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
52
|
+
filename: z.string().optional().describe('Filename for download'),
|
|
53
|
+
}),
|
|
54
|
+
handler: async (client, params) => {
|
|
55
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
56
|
+
if (!workspaceId) {
|
|
57
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
58
|
+
}
|
|
59
|
+
return client.get('/attachments/documents_down', { ...params, workspace_id: workspaceId });
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
// Mini (轻协作) API attachment tools
|
|
63
|
+
{
|
|
64
|
+
name: 'tapd_mini_get_attachments',
|
|
65
|
+
description: 'Get attachments from mini workspace',
|
|
66
|
+
inputSchema: z.object({
|
|
67
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
68
|
+
id: z.string().optional().describe('Attachment ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
69
|
+
entry_id: z.string().optional().describe('Item ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
70
|
+
filename: z.string().optional().describe('Filename'),
|
|
71
|
+
owner: z.string().optional().describe('Uploader'),
|
|
72
|
+
limit: z.number().optional().describe('Return count, default 30, max 200'),
|
|
73
|
+
page: z.number().optional().describe('Page number, default 1'),
|
|
74
|
+
}),
|
|
75
|
+
handler: async (client, params) => {
|
|
76
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
77
|
+
if (!workspaceId) {
|
|
78
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
79
|
+
}
|
|
80
|
+
return client.get('/attachments', { ...params, workspace_id: workspaceId });
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'tapd_mini_get_attachment_download_url',
|
|
85
|
+
description: 'Get download URL for a single mini workspace attachment (valid for 300s)',
|
|
86
|
+
inputSchema: z.object({
|
|
87
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
88
|
+
id: z.string().describe('Attachment ID (required);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
89
|
+
}),
|
|
90
|
+
handler: async (client, params) => {
|
|
91
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
92
|
+
if (!workspaceId) {
|
|
93
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
94
|
+
}
|
|
95
|
+
return client.get('/attachments/down', { ...params, workspace_id: workspaceId });
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
//# sourceMappingURL=attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/tools/board.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,UAAU,EAAE,OAAO,EA8F/B,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { TapdClient } from '../tapd-client.js';
|
|
3
|
+
export const boardTools = [
|
|
4
|
+
{
|
|
5
|
+
name: "tapd_add_board_card",
|
|
6
|
+
description: "新建看板工作项",
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
9
|
+
board_id: z.string().describe("看板ID (必填);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
10
|
+
column_id: z.string().describe("看板列ID (必填);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
11
|
+
name: z.string().describe("工作项标题 (必填)"),
|
|
12
|
+
description: z.string().optional().describe("详细描述"),
|
|
13
|
+
owner: z.string().optional().describe("负责人,默认当前用户"),
|
|
14
|
+
creator: z.string().optional().describe("创建人,默认当前用户"),
|
|
15
|
+
priority: z.string().optional().describe("优先级"),
|
|
16
|
+
category_id: z.string().optional().describe("分类ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
17
|
+
due: z.string().optional().describe("预计完成日期,格式: YYYY-MM-DD"),
|
|
18
|
+
}),
|
|
19
|
+
handler: async (client, params) => {
|
|
20
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
21
|
+
if (!workspaceId) {
|
|
22
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
23
|
+
}
|
|
24
|
+
return client.post("/board_cards/add", { ...params, workspace_id: workspaceId });
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "tapd_get_board_cards",
|
|
29
|
+
description: "获取看板工作项列表",
|
|
30
|
+
inputSchema: z.object({
|
|
31
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
32
|
+
board_id: z.string().optional().describe("看板ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
33
|
+
column_id: z.string().optional().describe("看板列ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
34
|
+
id: z.string().optional().describe('工作项ID,支持多ID查询;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
35
|
+
name: z.string().optional().describe("工作项标题,支持模糊匹配"),
|
|
36
|
+
owner: z.string().optional().describe("负责人"),
|
|
37
|
+
creator: z.string().optional().describe("创建人"),
|
|
38
|
+
status: z.string().optional().describe("状态"),
|
|
39
|
+
priority: z.string().optional().describe("优先级"),
|
|
40
|
+
category_id: z.string().optional().describe("分类ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
41
|
+
created: z.string().optional().describe("创建时间,支持时间查询"),
|
|
42
|
+
modified: z.string().optional().describe("修改时间,支持时间查询"),
|
|
43
|
+
due: z.string().optional().describe("预计完成日期,支持时间查询"),
|
|
44
|
+
limit: z.number().optional().describe("返回数量限制,默认30,最大200"),
|
|
45
|
+
page: z.number().optional().describe("页码,默认1"),
|
|
46
|
+
order: z.string().optional().describe("排序规则,如 created desc"),
|
|
47
|
+
fields: z.string().optional().describe("指定返回字段,多个字段以逗号分隔"),
|
|
48
|
+
}),
|
|
49
|
+
handler: async (client, params) => {
|
|
50
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
51
|
+
if (!workspaceId) {
|
|
52
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
53
|
+
}
|
|
54
|
+
return client.get("/board_cards", { ...params, workspace_id: workspaceId });
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "tapd_update_board_card",
|
|
59
|
+
description: "更新看板工作项",
|
|
60
|
+
inputSchema: z.object({
|
|
61
|
+
id: z.string().describe('工作项ID (必填);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
62
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
63
|
+
board_id: z.string().optional().describe("看板ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
64
|
+
column_id: z.string().optional().describe("看板列ID(用于移动卡片);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
65
|
+
name: z.string().optional().describe("工作项标题"),
|
|
66
|
+
description: z.string().optional().describe("详细描述"),
|
|
67
|
+
owner: z.string().optional().describe("负责人"),
|
|
68
|
+
status: z.string().optional().describe("状态"),
|
|
69
|
+
priority: z.string().optional().describe("优先级"),
|
|
70
|
+
due: z.string().optional().describe("预计完成日期,格式: YYYY-MM-DD"),
|
|
71
|
+
}),
|
|
72
|
+
handler: async (client, params) => {
|
|
73
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
74
|
+
if (!workspaceId) {
|
|
75
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
76
|
+
}
|
|
77
|
+
return client.post("/board_cards/update", { ...params, workspace_id: workspaceId });
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "tapd_get_board_columns",
|
|
82
|
+
description: "获取看板板块",
|
|
83
|
+
inputSchema: z.object({
|
|
84
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
85
|
+
board_id: z.string().describe("看板ID (必填);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
86
|
+
id: z.string().optional().describe("看板列ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度"),
|
|
87
|
+
fields: z.string().optional().describe("指定返回字段"),
|
|
88
|
+
}),
|
|
89
|
+
handler: async (client, params) => {
|
|
90
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
91
|
+
if (!workspaceId) {
|
|
92
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
93
|
+
}
|
|
94
|
+
return client.get("/board_columns", { ...params, workspace_id: workspaceId });
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/tools/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug.d.ts","sourceRoot":"","sources":["../../src/tools/bug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,QAAQ,EAAE,OAAO,EAumB7B,CAAC"}
|