harvask-cli 0.1.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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/dist/api-base.js +8 -0
  4. package/dist/api-base.js.map +1 -0
  5. package/dist/api-client.js +221 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/cli.js +154 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/_exec.js +63 -0
  10. package/dist/commands/_exec.js.map +1 -0
  11. package/dist/commands/api/index.js +88 -0
  12. package/dist/commands/api/index.js.map +1 -0
  13. package/dist/commands/attachment/index.js +54 -0
  14. package/dist/commands/attachment/index.js.map +1 -0
  15. package/dist/commands/auth/index.js +238 -0
  16. package/dist/commands/auth/index.js.map +1 -0
  17. package/dist/commands/calendar/index.js +167 -0
  18. package/dist/commands/calendar/index.js.map +1 -0
  19. package/dist/commands/chat/index.js +97 -0
  20. package/dist/commands/chat/index.js.map +1 -0
  21. package/dist/commands/file/index.js +42 -0
  22. package/dist/commands/file/index.js.map +1 -0
  23. package/dist/commands/global-wiki/index.js +196 -0
  24. package/dist/commands/global-wiki/index.js.map +1 -0
  25. package/dist/commands/issue/builds.js +160 -0
  26. package/dist/commands/issue/builds.js.map +1 -0
  27. package/dist/commands/issue/index.js +169 -0
  28. package/dist/commands/issue/index.js.map +1 -0
  29. package/dist/commands/issue/sub.js +149 -0
  30. package/dist/commands/issue/sub.js.map +1 -0
  31. package/dist/commands/issue/subbuilds.js +174 -0
  32. package/dist/commands/issue/subbuilds.js.map +1 -0
  33. package/dist/commands/milestone/index.js +104 -0
  34. package/dist/commands/milestone/index.js.map +1 -0
  35. package/dist/commands/note/builds.js +68 -0
  36. package/dist/commands/note/builds.js.map +1 -0
  37. package/dist/commands/note/index.js +122 -0
  38. package/dist/commands/note/index.js.map +1 -0
  39. package/dist/commands/preview-config/index.js +87 -0
  40. package/dist/commands/preview-config/index.js.map +1 -0
  41. package/dist/commands/project/builds.js +78 -0
  42. package/dist/commands/project/builds.js.map +1 -0
  43. package/dist/commands/project/index.js +103 -0
  44. package/dist/commands/project/index.js.map +1 -0
  45. package/dist/commands/scheduled-task/index.js +196 -0
  46. package/dist/commands/scheduled-task/index.js.map +1 -0
  47. package/dist/commands/site-credential/index.js +23 -0
  48. package/dist/commands/site-credential/index.js.map +1 -0
  49. package/dist/commands/skill/index.js +121 -0
  50. package/dist/commands/skill/index.js.map +1 -0
  51. package/dist/commands/storage/index.js +103 -0
  52. package/dist/commands/storage/index.js.map +1 -0
  53. package/dist/commands/user/index.js +55 -0
  54. package/dist/commands/user/index.js.map +1 -0
  55. package/dist/commands/wiki/builds.js +135 -0
  56. package/dist/commands/wiki/builds.js.map +1 -0
  57. package/dist/commands/wiki/index.js +177 -0
  58. package/dist/commands/wiki/index.js.map +1 -0
  59. package/dist/commands/workflow/index.js +111 -0
  60. package/dist/commands/workflow/index.js.map +1 -0
  61. package/dist/config.js +123 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/context.js +61 -0
  64. package/dist/context.js.map +1 -0
  65. package/dist/errors/hint-map.js +81 -0
  66. package/dist/errors/hint-map.js.map +1 -0
  67. package/dist/errors/index.js +132 -0
  68. package/dist/errors/index.js.map +1 -0
  69. package/dist/index.js +17 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/output/format.js +108 -0
  72. package/dist/output/format.js.map +1 -0
  73. package/dist/output/index.js +3 -0
  74. package/dist/output/index.js.map +1 -0
  75. package/dist/output/tty.js +22 -0
  76. package/dist/output/tty.js.map +1 -0
  77. package/dist/registry.js +47 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/token-store.js +92 -0
  80. package/dist/token-store.js.map +1 -0
  81. package/dist/types/api.js +8 -0
  82. package/dist/types/api.js.map +1 -0
  83. package/dist/utils/bulk.js +29 -0
  84. package/dist/utils/bulk.js.map +1 -0
  85. package/dist/utils/download.js +36 -0
  86. package/dist/utils/download.js.map +1 -0
  87. package/dist/utils/file-utils.js +58 -0
  88. package/dist/utils/file-utils.js.map +1 -0
  89. package/dist/utils/input.js +66 -0
  90. package/dist/utils/input.js.map +1 -0
  91. package/dist/utils/issue-resolver.js +20 -0
  92. package/dist/utils/issue-resolver.js.map +1 -0
  93. package/dist/utils/loopback.js +86 -0
  94. package/dist/utils/loopback.js.map +1 -0
  95. package/dist/utils/pkce.js +20 -0
  96. package/dist/utils/pkce.js.map +1 -0
  97. package/dist/utils/project-resolver.js +63 -0
  98. package/dist/utils/project-resolver.js.map +1 -0
  99. package/dist/utils/prompt.js +17 -0
  100. package/dist/utils/prompt.js.map +1 -0
  101. package/dist/utils/upload.js +32 -0
  102. package/dist/utils/upload.js.map +1 -0
  103. package/package.json +44 -0
  104. package/skills/harvask/AGENTS.md +131 -0
  105. package/skills/harvask/GEMINI.md +131 -0
  106. package/skills/harvask/SKILL.md +134 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/milestone/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * note コマンドの buildXxxCall(純粋関数)
3
+ *
4
+ * 個人メモ (/v1/notes、旧 /ai-worker/notes)。人間ユーザーのみ(AI ユーザートークンは 403)。
5
+ */
6
+ import { ValidationError } from '../../errors/index.js';
7
+ import { API_NS } from '../../api-base.js';
8
+ const BASE = `${API_NS}/notes`;
9
+ const MAX_CONTENT = 500000;
10
+ export function buildNoteListCall(a) {
11
+ const q = {};
12
+ if (a.page !== undefined) {
13
+ q.page = String(Math.max(a.page, 1));
14
+ }
15
+ if (a.perPage !== undefined) {
16
+ q.per_page = String(Math.min(Math.max(a.perPage, 1), 50));
17
+ }
18
+ return { method: 'GET', path: BASE, query: q };
19
+ }
20
+ export function buildNoteShowCall(noteId) {
21
+ return { method: 'GET', path: `${BASE}/${noteId}` };
22
+ }
23
+ export function buildNoteSearchCall(query, opts = {}) {
24
+ if (!query || query.trim() === '') {
25
+ throw new ValidationError('search query is required');
26
+ }
27
+ if (query.length > 200) {
28
+ throw new ValidationError('search query must be <= 200 characters');
29
+ }
30
+ const q = { query };
31
+ if (opts.limit !== undefined) {
32
+ q.limit = String(Math.min(Math.max(opts.limit, 1), 30));
33
+ }
34
+ return { method: 'GET', path: `${BASE}/search`, query: q };
35
+ }
36
+ export function buildNoteCreateCall(a) {
37
+ if (a.content === undefined || a.content === '') {
38
+ throw new ValidationError('content is required (--content; supports @file and -)');
39
+ }
40
+ if (a.content.length > MAX_CONTENT) {
41
+ throw new ValidationError(`content must be <= ${MAX_CONTENT} characters`);
42
+ }
43
+ const body = { content: a.content };
44
+ if (a.isPinned !== undefined) {
45
+ body.is_pinned = a.isPinned;
46
+ }
47
+ return { method: 'POST', path: BASE, body };
48
+ }
49
+ export function buildNoteUpdateCall(noteId, a) {
50
+ if (a.content !== undefined && a.content.length > MAX_CONTENT) {
51
+ throw new ValidationError(`content must be <= ${MAX_CONTENT} characters`);
52
+ }
53
+ const body = {};
54
+ if (a.content !== undefined) {
55
+ body.content = a.content;
56
+ }
57
+ if (a.isPinned !== undefined) {
58
+ body.is_pinned = a.isPinned;
59
+ }
60
+ if (Object.keys(body).length === 0) {
61
+ throw new ValidationError('nothing to update: provide --content and/or --pinned/--unpin');
62
+ }
63
+ return { method: 'PUT', path: `${BASE}/${noteId}`, body };
64
+ }
65
+ export function buildNoteDeleteCall(noteId) {
66
+ return { method: 'DELETE', path: `${BASE}/${noteId}` };
67
+ }
68
+ //# sourceMappingURL=builds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../../src/commands/note/builds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * note カテゴリ登録
3
+ */
4
+ import { execCall } from '../_exec.js';
5
+ import { printOutput } from '../../output/index.js';
6
+ import { ValidationError } from '../../errors/index.js';
7
+ import { parseIntArg, readContentArg } from '../../utils/input.js';
8
+ import { buildNoteListCall, buildNoteShowCall, buildNoteSearchCall, buildNoteCreateCall, buildNoteUpdateCall, buildNoteDeleteCall, } from './builds.js';
9
+ export const noteModule = {
10
+ name: 'note',
11
+ describe: 'Manage your personal notes (list/show/create/update/delete/search)',
12
+ register(program, ctx) {
13
+ const note = program
14
+ .command('note')
15
+ .description('Manage your personal notes (private to you)')
16
+ .addHelpText('after', `
17
+ Notes are personal (the logged-in human user only).
18
+ Examples:
19
+ harvask note list
20
+ harvask note create --content "Remember to review PR #123" --pinned
21
+ harvask note create --content @memo.md
22
+ harvask note search "deploy"
23
+ harvask note update 12 --content "updated" --unpin
24
+ `);
25
+ // list
26
+ note
27
+ .command('list')
28
+ .description('List your notes (pinned first)')
29
+ .option('--page <n>', 'page number', parseIntArg)
30
+ .option('--per-page <n>', 'items per page (max 50)', parseIntArg)
31
+ .action(async (opts) => {
32
+ const call = buildNoteListCall({ page: opts.page, perPage: opts.perPage });
33
+ const result = await execCall(ctx, call);
34
+ printOutput(result, ctx.out);
35
+ });
36
+ // show
37
+ note
38
+ .command('show')
39
+ .description('Show a note')
40
+ .argument('<note>', 'note id (numeric)')
41
+ .action(async (noteRef) => {
42
+ if (!/^\d+$/.test(noteRef)) {
43
+ throw new ValidationError('note must be a numeric id');
44
+ }
45
+ const call = buildNoteShowCall(parseInt(noteRef, 10));
46
+ const result = await execCall(ctx, call);
47
+ printOutput(result, ctx.out);
48
+ });
49
+ // search
50
+ note
51
+ .command('search')
52
+ .description('Search your notes')
53
+ .argument('<query>', 'search text (<=200 chars)')
54
+ .option('--limit <n>', 'max results (max 30)', parseIntArg)
55
+ .action(async (query, opts) => {
56
+ const call = buildNoteSearchCall(query, { limit: opts.limit });
57
+ const result = await execCall(ctx, call);
58
+ printOutput(result, ctx.out);
59
+ });
60
+ // create
61
+ note
62
+ .command('create')
63
+ .description('Create a note')
64
+ .requiredOption('--content <content>', 'note content (@file or - for stdin; <=500000 chars)')
65
+ .option('--pinned', 'pin the note')
66
+ .action(async (opts) => {
67
+ const call = buildNoteCreateCall({
68
+ content: readContentArg(opts.content),
69
+ isPinned: opts.pinned ? true : undefined,
70
+ });
71
+ const result = await execCall(ctx, call);
72
+ printOutput(result, ctx.out);
73
+ });
74
+ // update
75
+ note
76
+ .command('update')
77
+ .description('Update a note')
78
+ .argument('<note>', 'note id (numeric)')
79
+ .option('--content <content>', 'new content (@file or - for stdin)')
80
+ .option('--pinned', 'pin the note')
81
+ .option('--unpin', 'unpin the note')
82
+ .action(async (noteRef, opts) => {
83
+ if (!/^\d+$/.test(noteRef)) {
84
+ throw new ValidationError('note must be a numeric id');
85
+ }
86
+ if (opts.pinned && opts.unpin) {
87
+ throw new ValidationError('use only one of --pinned / --unpin');
88
+ }
89
+ let isPinned;
90
+ if (opts.pinned) {
91
+ isPinned = true;
92
+ }
93
+ else if (opts.unpin) {
94
+ isPinned = false;
95
+ }
96
+ const call = buildNoteUpdateCall(parseInt(noteRef, 10), {
97
+ content: opts.content !== undefined ? readContentArg(opts.content) : undefined,
98
+ isPinned,
99
+ });
100
+ const result = await execCall(ctx, call);
101
+ printOutput(result, ctx.out);
102
+ });
103
+ // delete
104
+ note
105
+ .command('delete')
106
+ .description('Delete a note')
107
+ .argument('<note>', 'note id (numeric)')
108
+ .option('--yes', 'skip confirmation (required for non-interactive use)')
109
+ .action(async (noteRef, opts) => {
110
+ if (!/^\d+$/.test(noteRef)) {
111
+ throw new ValidationError('note must be a numeric id');
112
+ }
113
+ if (!opts.yes && !process.stdout.isTTY) {
114
+ throw new ValidationError('refusing to delete without --yes in non-interactive mode');
115
+ }
116
+ const call = buildNoteDeleteCall(parseInt(noteRef, 10));
117
+ const result = await execCall(ctx, call);
118
+ printOutput(result, ctx.out);
119
+ });
120
+ },
121
+ };
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/note/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * preview-config カテゴリ(/v1/projects/{project}/preview-config)。
3
+ */
4
+ import { execCall, parseProjectArg } from '../_exec.js';
5
+ import { printOutput } from '../../output/index.js';
6
+ import { ValidationError } from '../../errors/index.js';
7
+ import { parseIntArg } from '../../utils/input.js';
8
+ import { API_NS } from '../../api-base.js';
9
+ const BASE = `${API_NS}/projects/{project}/preview-config`;
10
+ export function buildPreviewConfigShowCall() {
11
+ return { method: 'GET', path: BASE };
12
+ }
13
+ export function buildPreviewConfigUpdateCall(a) {
14
+ if (!a.composeFilePath || a.composeFilePath.trim() === '') {
15
+ throw new ValidationError('compose-file is required (--compose-file)');
16
+ }
17
+ if (a.composeFilePath.length > 500) {
18
+ throw new ValidationError('compose-file must be <= 500 characters');
19
+ }
20
+ if (a.composeFilePath.includes('..') || a.composeFilePath.startsWith('/')) {
21
+ throw new ValidationError("compose-file must be a relative path (no '..' and no leading '/')");
22
+ }
23
+ if (a.previewPort !== undefined && (a.previewPort < 1 || a.previewPort > 65535)) {
24
+ throw new ValidationError('preview-port must be between 1 and 65535');
25
+ }
26
+ if (a.previewPath !== undefined && !a.previewPath.startsWith('/')) {
27
+ throw new ValidationError("preview-path must start with '/'");
28
+ }
29
+ if (a.envVariables) {
30
+ for (const e of a.envVariables) {
31
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e.key)) {
32
+ throw new ValidationError(`invalid env key: ${e.key}`);
33
+ }
34
+ }
35
+ }
36
+ const body = { compose_file_path: a.composeFilePath };
37
+ if (a.previewHost !== undefined)
38
+ body.preview_host = a.previewHost;
39
+ if (a.previewPort !== undefined)
40
+ body.preview_port = a.previewPort;
41
+ if (a.previewPath !== undefined)
42
+ body.preview_path = a.previewPath;
43
+ if (a.envVariables !== undefined)
44
+ body.env_variables = a.envVariables;
45
+ return { method: 'PUT', path: BASE, body };
46
+ }
47
+ /**
48
+ * "KEY=VAL" 形式を {key,value} に変換する純粋関数(--env の蓄積パーサ)。
49
+ */
50
+ export function collectEnv(value, previous = []) {
51
+ const eq = value.indexOf('=');
52
+ if (eq <= 0) {
53
+ throw new ValidationError(`--env must be KEY=VALUE (got "${value}")`);
54
+ }
55
+ return [...previous, { key: value.slice(0, eq), value: value.slice(eq + 1) }];
56
+ }
57
+ export const previewConfigModule = {
58
+ name: 'preview-config',
59
+ describe: 'Show/update the project preview config',
60
+ register(program, ctx) {
61
+ const pc = program.command('preview-config').description('Project preview configuration');
62
+ const withProject = (cmd) => cmd.option('-p, --project <key|id>', 'project key (PRJ) or numeric id');
63
+ withProject(pc.command('show'))
64
+ .description('Show preview config')
65
+ .action(async (opts) => {
66
+ printOutput(await execCall(ctx, buildPreviewConfigShowCall(), parseProjectArg(opts.project)), ctx.out);
67
+ });
68
+ withProject(pc.command('update'))
69
+ .description('Create/update preview config')
70
+ .requiredOption('--compose-file <path>', 'compose file path (relative, <=500)')
71
+ .option('--host <host>', 'preview host')
72
+ .option('--port <n>', 'preview port (1-65535)', parseIntArg)
73
+ .option('--path <path>', 'preview path (must start with /)')
74
+ .option('--env <KEY=VAL>', 'env variable (repeatable)', collectEnv, [])
75
+ .action(async (opts) => {
76
+ const call = buildPreviewConfigUpdateCall({
77
+ composeFilePath: opts.composeFile,
78
+ previewHost: opts.host,
79
+ previewPort: opts.port,
80
+ previewPath: opts.path,
81
+ envVariables: opts.env && opts.env.length ? opts.env : undefined,
82
+ });
83
+ printOutput(await execCall(ctx, call, parseProjectArg(opts.project)), ctx.out);
84
+ });
85
+ },
86
+ };
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/preview-config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * project コマンドの buildXxxCall(純粋関数)
3
+ */
4
+ import { ValidationError } from '../../errors/index.js';
5
+ import { API_NS } from '../../api-base.js';
6
+ export const PROJECT_STATUSES = ['active', 'completed', 'archived', 'on_hold'];
7
+ export const PROJECT_ROLES = ['admin', 'member', 'guest'];
8
+ const BASE = `${API_NS}/projects`;
9
+ export function buildProjectListCall(a) {
10
+ const q = {};
11
+ if (a.status) {
12
+ if (!PROJECT_STATUSES.includes(a.status)) {
13
+ throw new ValidationError(`status must be one of: ${PROJECT_STATUSES.join(', ')}`);
14
+ }
15
+ q.status = a.status;
16
+ }
17
+ if (a.search) {
18
+ q.search = a.search;
19
+ }
20
+ if (a.limit !== undefined) {
21
+ q.limit = String(Math.min(Math.max(a.limit, 1), 100));
22
+ }
23
+ if (a.offset !== undefined) {
24
+ q.offset = String(Math.max(a.offset, 0));
25
+ }
26
+ return { method: 'GET', path: BASE, query: q };
27
+ }
28
+ /**
29
+ * 単一プロジェクト取得。{project} は実行段で resolveProjectId 後に置換。
30
+ */
31
+ export function buildProjectShowCall() {
32
+ return { method: 'GET', path: `${BASE}/{project}` };
33
+ }
34
+ export function buildProjectCreateCall(a) {
35
+ if (!a.name || a.name.trim() === '') {
36
+ throw new ValidationError('name is required (--name)');
37
+ }
38
+ if (a.name.length > 255) {
39
+ throw new ValidationError('name must be <= 255 characters');
40
+ }
41
+ if (!a.key || a.key.trim() === '') {
42
+ throw new ValidationError('key is required (--key)');
43
+ }
44
+ if (a.key.length > 10) {
45
+ throw new ValidationError('key must be <= 10 characters');
46
+ }
47
+ if (!/^[A-Za-z0-9]+$/.test(a.key)) {
48
+ throw new ValidationError('key must be alphanumeric (A-Z, 0-9)');
49
+ }
50
+ if (a.status && !PROJECT_STATUSES.includes(a.status)) {
51
+ throw new ValidationError(`status must be one of: ${PROJECT_STATUSES.join(', ')}`);
52
+ }
53
+ const body = { name: a.name.trim(), key: a.key };
54
+ if (a.description !== undefined) {
55
+ body.description = a.description;
56
+ }
57
+ if (a.status) {
58
+ body.status = a.status;
59
+ }
60
+ return { method: 'POST', path: BASE, body };
61
+ }
62
+ export function buildProjectMembersCall() {
63
+ return { method: 'GET', path: `${BASE}/{project}/members` };
64
+ }
65
+ export function buildProjectMemberAddCall(userId, role) {
66
+ if (!PROJECT_ROLES.includes(role)) {
67
+ throw new ValidationError(`role must be one of: ${PROJECT_ROLES.join(', ')}`);
68
+ }
69
+ return {
70
+ method: 'POST',
71
+ path: `${BASE}/{project}/members`,
72
+ body: { user_id: userId, role },
73
+ };
74
+ }
75
+ export function buildProjectMemberRemoveCall(userId) {
76
+ return { method: 'DELETE', path: `${BASE}/{project}/members/${userId}` };
77
+ }
78
+ //# sourceMappingURL=builds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../../src/commands/project/builds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * project カテゴリ登録
3
+ */
4
+ import { execCall, parseProjectArg } from '../_exec.js';
5
+ import { printOutput } from '../../output/index.js';
6
+ import { parseIntArg } from '../../utils/input.js';
7
+ import { buildProjectListCall, buildProjectShowCall, buildProjectCreateCall, buildProjectMembersCall, buildProjectMemberAddCall, buildProjectMemberRemoveCall, PROJECT_STATUSES, PROJECT_ROLES, } from './builds.js';
8
+ export const projectModule = {
9
+ name: 'project',
10
+ describe: 'Manage projects (list/show/create/members)',
11
+ register(program, ctx) {
12
+ const project = program
13
+ .command('project')
14
+ .description('Manage projects')
15
+ .addHelpText('after', `
16
+ Examples:
17
+ harvask project list --status active --search api
18
+ harvask project show PRJ
19
+ harvask project create --name "New Project" --key NP --description "..."
20
+ harvask project members list PRJ
21
+ harvask project members add PRJ --user-id 42 --role member
22
+ `);
23
+ // list
24
+ project
25
+ .command('list')
26
+ .description('List projects you belong to')
27
+ .option('--status <status>', `filter by status (${PROJECT_STATUSES.join('|')}; default active)`)
28
+ .option('--search <text>', 'search by name/description/key')
29
+ .option('--limit <n>', 'max results (max 100)', parseIntArg)
30
+ .option('--offset <n>', 'offset', parseIntArg)
31
+ .action(async (opts) => {
32
+ const call = buildProjectListCall({
33
+ status: opts.status,
34
+ search: opts.search,
35
+ limit: opts.limit,
36
+ offset: opts.offset,
37
+ });
38
+ const result = await execCall(ctx, call);
39
+ printOutput(result, ctx.out);
40
+ });
41
+ // show
42
+ project
43
+ .command('show')
44
+ .description('Show project details (with milestones)')
45
+ .argument('<project>', 'project key (PRJ) or numeric id')
46
+ .action(async (projectRef) => {
47
+ const call = buildProjectShowCall();
48
+ const result = await execCall(ctx, call, parseProjectArg(projectRef));
49
+ printOutput(result, ctx.out);
50
+ });
51
+ // create
52
+ project
53
+ .command('create')
54
+ .description('Create a project')
55
+ .requiredOption('--name <name>', 'project name (<=255 chars)')
56
+ .requiredOption('--key <key>', 'unique project key (<=10 alphanumeric chars)')
57
+ .option('--description <text>', 'description')
58
+ .option('--status <status>', `status (${PROJECT_STATUSES.join('|')}; default active)`)
59
+ .action(async (opts) => {
60
+ const call = buildProjectCreateCall({
61
+ name: opts.name,
62
+ key: opts.key,
63
+ description: opts.description,
64
+ status: opts.status,
65
+ });
66
+ const result = await execCall(ctx, call);
67
+ printOutput(result, ctx.out);
68
+ });
69
+ // members
70
+ const members = project.command('members').description('Manage project members');
71
+ members
72
+ .command('list')
73
+ .description('List project members')
74
+ .argument('<project>', 'project key (PRJ) or numeric id')
75
+ .action(async (projectRef) => {
76
+ const call = buildProjectMembersCall();
77
+ const result = await execCall(ctx, call, parseProjectArg(projectRef));
78
+ printOutput(result, ctx.out);
79
+ });
80
+ members
81
+ .command('add')
82
+ .description('Add a member to a project')
83
+ .argument('<project>', 'project key (PRJ) or numeric id')
84
+ .requiredOption('--user-id <id>', 'user id to add', parseIntArg)
85
+ .requiredOption('--role <role>', `role (${PROJECT_ROLES.join('|')})`)
86
+ .action(async (projectRef, opts) => {
87
+ const call = buildProjectMemberAddCall(opts.userId, opts.role);
88
+ const result = await execCall(ctx, call, parseProjectArg(projectRef));
89
+ printOutput(result, ctx.out);
90
+ });
91
+ members
92
+ .command('remove')
93
+ .description('Remove a member from a project')
94
+ .argument('<project>', 'project key (PRJ) or numeric id')
95
+ .requiredOption('--user-id <id>', 'user id to remove', parseIntArg)
96
+ .action(async (projectRef, opts) => {
97
+ const call = buildProjectMemberRemoveCall(opts.userId);
98
+ const result = await execCall(ctx, call, parseProjectArg(projectRef));
99
+ printOutput(result, ctx.out);
100
+ });
101
+ },
102
+ };
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"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"}