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.
- package/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/api-base.js +8 -0
- package/dist/api-base.js.map +1 -0
- package/dist/api-client.js +221 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.js +154 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/_exec.js +63 -0
- package/dist/commands/_exec.js.map +1 -0
- package/dist/commands/api/index.js +88 -0
- package/dist/commands/api/index.js.map +1 -0
- package/dist/commands/attachment/index.js +54 -0
- package/dist/commands/attachment/index.js.map +1 -0
- package/dist/commands/auth/index.js +238 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/calendar/index.js +167 -0
- package/dist/commands/calendar/index.js.map +1 -0
- package/dist/commands/chat/index.js +97 -0
- package/dist/commands/chat/index.js.map +1 -0
- package/dist/commands/file/index.js +42 -0
- package/dist/commands/file/index.js.map +1 -0
- package/dist/commands/global-wiki/index.js +196 -0
- package/dist/commands/global-wiki/index.js.map +1 -0
- package/dist/commands/issue/builds.js +160 -0
- package/dist/commands/issue/builds.js.map +1 -0
- package/dist/commands/issue/index.js +169 -0
- package/dist/commands/issue/index.js.map +1 -0
- package/dist/commands/issue/sub.js +149 -0
- package/dist/commands/issue/sub.js.map +1 -0
- package/dist/commands/issue/subbuilds.js +174 -0
- package/dist/commands/issue/subbuilds.js.map +1 -0
- package/dist/commands/milestone/index.js +104 -0
- package/dist/commands/milestone/index.js.map +1 -0
- package/dist/commands/note/builds.js +68 -0
- package/dist/commands/note/builds.js.map +1 -0
- package/dist/commands/note/index.js +122 -0
- package/dist/commands/note/index.js.map +1 -0
- package/dist/commands/preview-config/index.js +87 -0
- package/dist/commands/preview-config/index.js.map +1 -0
- package/dist/commands/project/builds.js +78 -0
- package/dist/commands/project/builds.js.map +1 -0
- package/dist/commands/project/index.js +103 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/scheduled-task/index.js +196 -0
- package/dist/commands/scheduled-task/index.js.map +1 -0
- package/dist/commands/site-credential/index.js +23 -0
- package/dist/commands/site-credential/index.js.map +1 -0
- package/dist/commands/skill/index.js +121 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/storage/index.js +103 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/user/index.js +55 -0
- package/dist/commands/user/index.js.map +1 -0
- package/dist/commands/wiki/builds.js +135 -0
- package/dist/commands/wiki/builds.js.map +1 -0
- package/dist/commands/wiki/index.js +177 -0
- package/dist/commands/wiki/index.js.map +1 -0
- package/dist/commands/workflow/index.js +111 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/config.js +123 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +61 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/hint-map.js +81 -0
- package/dist/errors/hint-map.js.map +1 -0
- package/dist/errors/index.js +132 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/output/format.js +108 -0
- package/dist/output/format.js.map +1 -0
- package/dist/output/index.js +3 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/tty.js +22 -0
- package/dist/output/tty.js.map +1 -0
- package/dist/registry.js +47 -0
- package/dist/registry.js.map +1 -0
- package/dist/token-store.js +92 -0
- package/dist/token-store.js.map +1 -0
- package/dist/types/api.js +8 -0
- package/dist/types/api.js.map +1 -0
- package/dist/utils/bulk.js +29 -0
- package/dist/utils/bulk.js.map +1 -0
- package/dist/utils/download.js +36 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/file-utils.js +58 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/input.js +66 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/issue-resolver.js +20 -0
- package/dist/utils/issue-resolver.js.map +1 -0
- package/dist/utils/loopback.js +86 -0
- package/dist/utils/loopback.js.map +1 -0
- package/dist/utils/pkce.js +20 -0
- package/dist/utils/pkce.js.map +1 -0
- package/dist/utils/project-resolver.js +63 -0
- package/dist/utils/project-resolver.js.map +1 -0
- package/dist/utils/prompt.js +17 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/upload.js +32 -0
- package/dist/utils/upload.js.map +1 -0
- package/package.json +44 -0
- package/skills/harvask/AGENTS.md +131 -0
- package/skills/harvask/GEMINI.md +131 -0
- package/skills/harvask/SKILL.md +134 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wiki コマンドの buildXxxCall(純粋関数)
|
|
3
|
+
*
|
|
4
|
+
* プロジェクト Wiki (/v1/projects/{project}/wiki、旧 /ai-worker/...)。
|
|
5
|
+
* ページは数値 id でルートバインドされる(slug 指定は by-slug 経路)。
|
|
6
|
+
*/
|
|
7
|
+
import { ValidationError } from '../../errors/index.js';
|
|
8
|
+
import { API_NS } from '../../api-base.js';
|
|
9
|
+
import { validateBulkItems, appendAtomic } from '../../utils/bulk.js';
|
|
10
|
+
const BASE = `${API_NS}/projects/{project}/wiki`;
|
|
11
|
+
const MAX_CONTENT = 500000;
|
|
12
|
+
export function buildWikiListCall(a) {
|
|
13
|
+
const q = {};
|
|
14
|
+
if (a.includeChildren === false) {
|
|
15
|
+
q.include_children = 'false';
|
|
16
|
+
}
|
|
17
|
+
if (a.include) {
|
|
18
|
+
q.include = a.include;
|
|
19
|
+
}
|
|
20
|
+
if (a.page !== undefined) {
|
|
21
|
+
q.page = String(Math.max(a.page, 1));
|
|
22
|
+
}
|
|
23
|
+
if (a.perPage !== undefined) {
|
|
24
|
+
q.per_page = String(Math.min(Math.max(a.perPage, 1), 100));
|
|
25
|
+
}
|
|
26
|
+
return { method: 'GET', path: BASE, query: q };
|
|
27
|
+
}
|
|
28
|
+
export function buildWikiShowCall(pageId, opts = {}) {
|
|
29
|
+
const q = {};
|
|
30
|
+
if (opts.versions) {
|
|
31
|
+
q.include_versions = 'true';
|
|
32
|
+
}
|
|
33
|
+
if (opts.version !== undefined) {
|
|
34
|
+
q.version = String(opts.version);
|
|
35
|
+
}
|
|
36
|
+
return { method: 'GET', path: `${BASE}/${pageId}`, query: q };
|
|
37
|
+
}
|
|
38
|
+
export function buildWikiShowBySlugCall(slug) {
|
|
39
|
+
if (!slug || slug.trim() === '') {
|
|
40
|
+
throw new ValidationError('slug is required');
|
|
41
|
+
}
|
|
42
|
+
return { method: 'GET', path: `${BASE}/by-slug/${encodeURIComponent(slug)}` };
|
|
43
|
+
}
|
|
44
|
+
export function buildWikiSearchCall(query, opts = {}) {
|
|
45
|
+
if (!query || query.trim() === '') {
|
|
46
|
+
throw new ValidationError('search query is required');
|
|
47
|
+
}
|
|
48
|
+
const q = { query };
|
|
49
|
+
if (opts.limit !== undefined) {
|
|
50
|
+
q.limit = String(Math.min(Math.max(opts.limit, 1), 50));
|
|
51
|
+
}
|
|
52
|
+
if (opts.include) {
|
|
53
|
+
q.include = opts.include;
|
|
54
|
+
}
|
|
55
|
+
return { method: 'GET', path: `${BASE}/search`, query: q };
|
|
56
|
+
}
|
|
57
|
+
export function buildWikiCreateCall(a) {
|
|
58
|
+
if (!a.title || a.title.trim() === '') {
|
|
59
|
+
throw new ValidationError('title is required (--title)');
|
|
60
|
+
}
|
|
61
|
+
if (a.title.length > 255) {
|
|
62
|
+
throw new ValidationError('title must be <= 255 characters');
|
|
63
|
+
}
|
|
64
|
+
if (a.content === undefined || a.content === '') {
|
|
65
|
+
throw new ValidationError('content is required (--content; supports @file and -)');
|
|
66
|
+
}
|
|
67
|
+
if (a.content.length > MAX_CONTENT) {
|
|
68
|
+
throw new ValidationError(`content must be <= ${MAX_CONTENT} characters`);
|
|
69
|
+
}
|
|
70
|
+
if (a.changeSummary !== undefined && a.changeSummary.length > 500) {
|
|
71
|
+
throw new ValidationError('change-summary must be <= 500 characters');
|
|
72
|
+
}
|
|
73
|
+
const body = { title: a.title.trim(), content: a.content };
|
|
74
|
+
if (a.parentId !== undefined) {
|
|
75
|
+
body.parent_id = a.parentId;
|
|
76
|
+
}
|
|
77
|
+
if (a.changeSummary !== undefined) {
|
|
78
|
+
body.change_summary = a.changeSummary;
|
|
79
|
+
}
|
|
80
|
+
return { method: 'POST', path: BASE, body };
|
|
81
|
+
}
|
|
82
|
+
export function buildWikiUpdateCall(pageId, a) {
|
|
83
|
+
if (a.content === undefined || a.content === '') {
|
|
84
|
+
throw new ValidationError('content is required for update (--content; supports @file and -)');
|
|
85
|
+
}
|
|
86
|
+
if (a.content.length > MAX_CONTENT) {
|
|
87
|
+
throw new ValidationError(`content must be <= ${MAX_CONTENT} characters`);
|
|
88
|
+
}
|
|
89
|
+
if (a.title !== undefined && a.title.length > 255) {
|
|
90
|
+
throw new ValidationError('title must be <= 255 characters');
|
|
91
|
+
}
|
|
92
|
+
if (a.changeSummary !== undefined && a.changeSummary.length > 500) {
|
|
93
|
+
throw new ValidationError('change-summary must be <= 500 characters');
|
|
94
|
+
}
|
|
95
|
+
const body = { content: a.content };
|
|
96
|
+
if (a.title !== undefined) {
|
|
97
|
+
body.title = a.title;
|
|
98
|
+
}
|
|
99
|
+
if (a.parentId !== undefined) {
|
|
100
|
+
body.parent_id = a.parentId;
|
|
101
|
+
}
|
|
102
|
+
if (a.changeSummary !== undefined) {
|
|
103
|
+
body.change_summary = a.changeSummary;
|
|
104
|
+
}
|
|
105
|
+
return { method: 'PUT', path: `${BASE}/${pageId}`, body };
|
|
106
|
+
}
|
|
107
|
+
export function buildWikiDeleteCall(pageId) {
|
|
108
|
+
return { method: 'DELETE', path: `${BASE}/${pageId}` };
|
|
109
|
+
}
|
|
110
|
+
export function buildWikiBulkCreateCall(items, atomic = false) {
|
|
111
|
+
const arr = validateBulkItems(items);
|
|
112
|
+
return { method: 'POST', path: appendAtomic(`${BASE}/bulk`, atomic), body: { items: arr } };
|
|
113
|
+
}
|
|
114
|
+
export function buildWikiBulkUpdateCall(items, atomic = false) {
|
|
115
|
+
const arr = validateBulkItems(items);
|
|
116
|
+
for (const it of arr) {
|
|
117
|
+
if (!it || typeof it !== 'object' || it.id === undefined) {
|
|
118
|
+
throw new ValidationError('each bulk-update item must include an "id"');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { method: 'PATCH', path: appendAtomic(`${BASE}/bulk`, atomic), body: { items: arr } };
|
|
122
|
+
}
|
|
123
|
+
export function buildWikiHistoryCall(ref) {
|
|
124
|
+
if (ref.slug) {
|
|
125
|
+
return {
|
|
126
|
+
method: 'GET',
|
|
127
|
+
path: `${BASE}/by-slug/${encodeURIComponent(ref.slug)}/history`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (ref.pageId === undefined) {
|
|
131
|
+
throw new ValidationError('provide a numeric page id or --slug');
|
|
132
|
+
}
|
|
133
|
+
return { method: 'GET', path: `${BASE}/${ref.pageId}/history` };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=builds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builds.js","sourceRoot":"","sources":["../../../src/commands/wiki/builds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wiki カテゴリ登録
|
|
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, readContentArg, parseJsonArg } from '../../utils/input.js';
|
|
8
|
+
import { buildWikiListCall, buildWikiShowCall, buildWikiShowBySlugCall, buildWikiSearchCall, buildWikiCreateCall, buildWikiUpdateCall, buildWikiDeleteCall, buildWikiHistoryCall, buildWikiBulkCreateCall, buildWikiBulkUpdateCall, } from './builds.js';
|
|
9
|
+
export const wikiModule = {
|
|
10
|
+
name: 'wiki',
|
|
11
|
+
describe: 'Manage project wiki pages (list/show/create/update/search/history)',
|
|
12
|
+
register(program, ctx) {
|
|
13
|
+
const wiki = program
|
|
14
|
+
.command('wiki')
|
|
15
|
+
.description('Manage project wiki pages')
|
|
16
|
+
.addHelpText('after', `
|
|
17
|
+
Requires a project: pass -p, --project <key|id>.
|
|
18
|
+
Long content: --content accepts @file.md or - (stdin).
|
|
19
|
+
Examples:
|
|
20
|
+
harvask wiki list -p PRJ
|
|
21
|
+
harvask wiki show -p PRJ 101 --versions
|
|
22
|
+
harvask wiki show -p PRJ --slug api-documentation
|
|
23
|
+
harvask wiki create -p PRJ --title "API Docs" --content @docs.md
|
|
24
|
+
harvask wiki update -p PRJ 101 --content @docs.md --change-summary "update"
|
|
25
|
+
harvask wiki search -p PRJ "deploy"
|
|
26
|
+
`);
|
|
27
|
+
const withProject = (cmd) => cmd.option('-p, --project <key|id>', 'project key (PRJ) or numeric id');
|
|
28
|
+
// list
|
|
29
|
+
withProject(wiki.command('list'))
|
|
30
|
+
.description('List wiki pages (hierarchical)')
|
|
31
|
+
.option('--no-children', 'do not nest child pages')
|
|
32
|
+
.option('--include <fields>', 'comma-separated extra fields (content,parent,children,versions,author)')
|
|
33
|
+
.option('--page <n>', 'page number', parseIntArg)
|
|
34
|
+
.option('--per-page <n>', 'items per page (max 100)', parseIntArg)
|
|
35
|
+
.action(async (opts) => {
|
|
36
|
+
const call = buildWikiListCall({
|
|
37
|
+
includeChildren: opts.children,
|
|
38
|
+
include: opts.include,
|
|
39
|
+
page: opts.page,
|
|
40
|
+
perPage: opts.perPage,
|
|
41
|
+
});
|
|
42
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
43
|
+
printOutput(result, ctx.out);
|
|
44
|
+
});
|
|
45
|
+
// show
|
|
46
|
+
withProject(wiki.command('show'))
|
|
47
|
+
.description('Show a wiki page (by id, or --slug)')
|
|
48
|
+
.argument('[page]', 'wiki page id (numeric)')
|
|
49
|
+
.option('--slug <slug>', 'show by slug instead of id')
|
|
50
|
+
.option('--versions', 'include version history')
|
|
51
|
+
.option('--version <n>', 'show a specific version', parseIntArg)
|
|
52
|
+
.action(async (page, opts) => {
|
|
53
|
+
const projectArg = parseProjectArg(opts.project);
|
|
54
|
+
let call;
|
|
55
|
+
if (opts.slug) {
|
|
56
|
+
call = buildWikiShowBySlugCall(opts.slug);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
if (!page || !/^\d+$/.test(page)) {
|
|
60
|
+
throw new ValidationError('provide a numeric page id, or use --slug <slug>');
|
|
61
|
+
}
|
|
62
|
+
call = buildWikiShowCall(parseInt(page, 10), {
|
|
63
|
+
versions: Boolean(opts.versions),
|
|
64
|
+
version: opts.version,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const result = await execCall(ctx, call, projectArg);
|
|
68
|
+
printOutput(result, ctx.out);
|
|
69
|
+
});
|
|
70
|
+
// search
|
|
71
|
+
withProject(wiki.command('search'))
|
|
72
|
+
.description('Search wiki pages')
|
|
73
|
+
.argument('<query>', 'search text')
|
|
74
|
+
.option('--include <fields>', 'comma-separated extra fields')
|
|
75
|
+
.option('--limit <n>', 'max results (max 50)', parseIntArg)
|
|
76
|
+
.action(async (query, opts) => {
|
|
77
|
+
const call = buildWikiSearchCall(query, { include: opts.include, limit: opts.limit });
|
|
78
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
79
|
+
printOutput(result, ctx.out);
|
|
80
|
+
});
|
|
81
|
+
// create
|
|
82
|
+
withProject(wiki.command('create'))
|
|
83
|
+
.description('Create a wiki page')
|
|
84
|
+
.requiredOption('--title <title>', 'page title (<=255 chars)')
|
|
85
|
+
.requiredOption('--content <content>', 'Markdown content (@file or - for stdin; <=500000 chars)')
|
|
86
|
+
.option('--parent-id <id>', 'parent page id', parseIntArg)
|
|
87
|
+
.option('--change-summary <text>', 'change summary (<=500 chars)')
|
|
88
|
+
.action(async (opts) => {
|
|
89
|
+
const call = buildWikiCreateCall({
|
|
90
|
+
title: opts.title,
|
|
91
|
+
content: readContentArg(opts.content),
|
|
92
|
+
parentId: opts.parentId,
|
|
93
|
+
changeSummary: opts.changeSummary,
|
|
94
|
+
});
|
|
95
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
96
|
+
printOutput(result, ctx.out);
|
|
97
|
+
});
|
|
98
|
+
// update
|
|
99
|
+
withProject(wiki.command('update'))
|
|
100
|
+
.description('Update a wiki page (content required)')
|
|
101
|
+
.argument('<page>', 'wiki page id (numeric)')
|
|
102
|
+
.requiredOption('--content <content>', 'Markdown content (@file or - for stdin; required)')
|
|
103
|
+
.option('--title <title>', 'new title (<=255 chars)')
|
|
104
|
+
.option('--parent-id <id>', 'new parent page id', parseIntArg)
|
|
105
|
+
.option('--change-summary <text>', 'change summary (<=500 chars)')
|
|
106
|
+
.action(async (page, opts) => {
|
|
107
|
+
if (!/^\d+$/.test(page)) {
|
|
108
|
+
throw new ValidationError('page must be a numeric wiki page id');
|
|
109
|
+
}
|
|
110
|
+
const call = buildWikiUpdateCall(parseInt(page, 10), {
|
|
111
|
+
content: readContentArg(opts.content),
|
|
112
|
+
title: opts.title,
|
|
113
|
+
parentId: opts.parentId,
|
|
114
|
+
changeSummary: opts.changeSummary,
|
|
115
|
+
});
|
|
116
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
117
|
+
printOutput(result, ctx.out);
|
|
118
|
+
});
|
|
119
|
+
// delete
|
|
120
|
+
withProject(wiki.command('delete'))
|
|
121
|
+
.description('Delete a wiki page')
|
|
122
|
+
.argument('<page>', 'wiki page id (numeric)')
|
|
123
|
+
.option('--yes', 'skip confirmation (required for non-interactive use)')
|
|
124
|
+
.action(async (page, opts) => {
|
|
125
|
+
if (!/^\d+$/.test(page)) {
|
|
126
|
+
throw new ValidationError('page must be a numeric wiki page id');
|
|
127
|
+
}
|
|
128
|
+
if (!opts.yes && !process.stdout.isTTY) {
|
|
129
|
+
throw new ValidationError('refusing to delete without --yes in non-interactive mode');
|
|
130
|
+
}
|
|
131
|
+
const call = buildWikiDeleteCall(parseInt(page, 10));
|
|
132
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
133
|
+
printOutput(result, ctx.out);
|
|
134
|
+
});
|
|
135
|
+
// history
|
|
136
|
+
withProject(wiki.command('history'))
|
|
137
|
+
.description('Show wiki page version history (by id, or --slug)')
|
|
138
|
+
.argument('[page]', 'wiki page id (numeric)')
|
|
139
|
+
.option('--slug <slug>', 'use slug instead of id')
|
|
140
|
+
.action(async (page, opts) => {
|
|
141
|
+
let ref;
|
|
142
|
+
if (opts.slug) {
|
|
143
|
+
ref = { slug: opts.slug };
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
if (!page || !/^\d+$/.test(page)) {
|
|
147
|
+
throw new ValidationError('provide a numeric page id, or use --slug <slug>');
|
|
148
|
+
}
|
|
149
|
+
ref = { pageId: parseInt(page, 10) };
|
|
150
|
+
}
|
|
151
|
+
const call = buildWikiHistoryCall(ref);
|
|
152
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
153
|
+
printOutput(result, ctx.out);
|
|
154
|
+
});
|
|
155
|
+
// bulk-create
|
|
156
|
+
withProject(wiki.command('bulk-create'))
|
|
157
|
+
.description('Create up to 50 wiki pages from a JSON array')
|
|
158
|
+
.requiredOption('--items <json>', 'JSON array (@file.json or - for stdin)')
|
|
159
|
+
.option('--atomic', 'all-or-nothing (rollback on any failure)')
|
|
160
|
+
.action(async (opts) => {
|
|
161
|
+
const call = buildWikiBulkCreateCall(parseJsonArg(opts.items), Boolean(opts.atomic));
|
|
162
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
163
|
+
printOutput(result, ctx.out);
|
|
164
|
+
});
|
|
165
|
+
// bulk-update
|
|
166
|
+
withProject(wiki.command('bulk-update'))
|
|
167
|
+
.description('Update up to 50 wiki pages from a JSON array (each item needs "id")')
|
|
168
|
+
.requiredOption('--items <json>', 'JSON array (@file.json or - for stdin)')
|
|
169
|
+
.option('--atomic', 'all-or-nothing (rollback on any failure)')
|
|
170
|
+
.action(async (opts) => {
|
|
171
|
+
const call = buildWikiBulkUpdateCall(parseJsonArg(opts.items), Boolean(opts.atomic));
|
|
172
|
+
const result = await execCall(ctx, call, parseProjectArg(opts.project));
|
|
173
|
+
printOutput(result, ctx.out);
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/wiki/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workflow カテゴリ(ワークフローテンプレート, /v1/projects/{project}/workflows)。
|
|
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, parseNumberList, parseJsonArg } from '../../utils/input.js';
|
|
8
|
+
import { API_NS } from '../../api-base.js';
|
|
9
|
+
const BASE = `${API_NS}/projects/{project}/workflows`;
|
|
10
|
+
export function buildWorkflowListCall(opts = {}) {
|
|
11
|
+
const q = {};
|
|
12
|
+
if (opts.active)
|
|
13
|
+
q.is_active = 'true';
|
|
14
|
+
return { method: 'GET', path: BASE, query: q };
|
|
15
|
+
}
|
|
16
|
+
export function buildWorkflowShowCall(id) {
|
|
17
|
+
return { method: 'GET', path: `${BASE}/${id}` };
|
|
18
|
+
}
|
|
19
|
+
function workflowBody(a) {
|
|
20
|
+
const b = {};
|
|
21
|
+
if (a.name !== undefined)
|
|
22
|
+
b.name = a.name;
|
|
23
|
+
if (a.category !== undefined)
|
|
24
|
+
b.category = a.category;
|
|
25
|
+
if (a.cardDescription !== undefined)
|
|
26
|
+
b.card_description = a.cardDescription;
|
|
27
|
+
if (a.icon !== undefined)
|
|
28
|
+
b.icon = a.icon;
|
|
29
|
+
if (a.isActive !== undefined)
|
|
30
|
+
b.is_active = a.isActive;
|
|
31
|
+
if (a.isDraft !== undefined)
|
|
32
|
+
b.is_draft = a.isDraft;
|
|
33
|
+
if (a.definition !== undefined)
|
|
34
|
+
b.definition = a.definition;
|
|
35
|
+
if (a.siteCredentialIds && a.siteCredentialIds.length)
|
|
36
|
+
b.site_credential_ids = a.siteCredentialIds;
|
|
37
|
+
return b;
|
|
38
|
+
}
|
|
39
|
+
export function buildWorkflowCreateCall(a) {
|
|
40
|
+
if (!a.name || a.name.trim() === '')
|
|
41
|
+
throw new ValidationError('name is required (--name)');
|
|
42
|
+
return { method: 'POST', path: BASE, body: workflowBody(a) };
|
|
43
|
+
}
|
|
44
|
+
export function buildWorkflowUpdateCall(id, a) {
|
|
45
|
+
const body = workflowBody(a);
|
|
46
|
+
if (Object.keys(body).length === 0)
|
|
47
|
+
throw new ValidationError('nothing to update');
|
|
48
|
+
return { method: 'PUT', path: `${BASE}/${id}`, body };
|
|
49
|
+
}
|
|
50
|
+
export const workflowModule = {
|
|
51
|
+
name: 'workflow',
|
|
52
|
+
describe: 'Manage workflow templates',
|
|
53
|
+
register(program, ctx) {
|
|
54
|
+
const wf = program.command('workflow').description('Workflow templates');
|
|
55
|
+
const withProject = (cmd) => cmd.option('-p, --project <key|id>', 'project key (PRJ) or numeric id');
|
|
56
|
+
withProject(wf.command('list'))
|
|
57
|
+
.description('List workflow templates')
|
|
58
|
+
.option('--active', 'only active templates')
|
|
59
|
+
.action(async (opts) => {
|
|
60
|
+
printOutput(await execCall(ctx, buildWorkflowListCall({ active: opts.active }), parseProjectArg(opts.project)), ctx.out);
|
|
61
|
+
});
|
|
62
|
+
withProject(wf.command('show'))
|
|
63
|
+
.description('Show a workflow template')
|
|
64
|
+
.argument('<id>', 'workflow id')
|
|
65
|
+
.action(async (id, opts) => {
|
|
66
|
+
printOutput(await execCall(ctx, buildWorkflowShowCall(parseIntArg(id)), parseProjectArg(opts.project)), ctx.out);
|
|
67
|
+
});
|
|
68
|
+
const writeOpts = (cmd) => cmd
|
|
69
|
+
.option('--category <text>', 'category')
|
|
70
|
+
.option('--card-description <text>', 'card description')
|
|
71
|
+
.option('--icon <text>', 'icon')
|
|
72
|
+
.option('--active', 'mark active')
|
|
73
|
+
.option('--draft', 'mark draft')
|
|
74
|
+
.option('--definition <json>', 'definition object (@file.json or - for stdin)')
|
|
75
|
+
.option('--site-credential-ids <ids>', 'comma-separated site credential ids', parseNumberList);
|
|
76
|
+
writeOpts(withProject(wf.command('create')))
|
|
77
|
+
.description('Create a workflow template')
|
|
78
|
+
.requiredOption('--name <name>', 'name')
|
|
79
|
+
.action(async (opts) => {
|
|
80
|
+
const call = buildWorkflowCreateCall({
|
|
81
|
+
name: opts.name,
|
|
82
|
+
category: opts.category,
|
|
83
|
+
cardDescription: opts.cardDescription,
|
|
84
|
+
icon: opts.icon,
|
|
85
|
+
isActive: opts.active ? true : undefined,
|
|
86
|
+
isDraft: opts.draft ? true : undefined,
|
|
87
|
+
definition: opts.definition !== undefined ? parseJsonArg(opts.definition) : undefined,
|
|
88
|
+
siteCredentialIds: opts.siteCredentialIds,
|
|
89
|
+
});
|
|
90
|
+
printOutput(await execCall(ctx, call, parseProjectArg(opts.project)), ctx.out);
|
|
91
|
+
});
|
|
92
|
+
writeOpts(withProject(wf.command('update')))
|
|
93
|
+
.description('Update a workflow template')
|
|
94
|
+
.argument('<id>', 'workflow id')
|
|
95
|
+
.option('--name <name>', 'name')
|
|
96
|
+
.action(async (id, opts) => {
|
|
97
|
+
const call = buildWorkflowUpdateCall(parseIntArg(id), {
|
|
98
|
+
name: opts.name,
|
|
99
|
+
category: opts.category,
|
|
100
|
+
cardDescription: opts.cardDescription,
|
|
101
|
+
icon: opts.icon,
|
|
102
|
+
isActive: opts.active ? true : undefined,
|
|
103
|
+
isDraft: opts.draft ? true : undefined,
|
|
104
|
+
definition: opts.definition !== undefined ? parseJsonArg(opts.definition) : undefined,
|
|
105
|
+
siteCredentialIds: opts.siteCredentialIds,
|
|
106
|
+
});
|
|
107
|
+
printOutput(await execCall(ctx, call, parseProjectArg(opts.project)), ctx.out);
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/workflow/index.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 接続設定の解決
|
|
3
|
+
*
|
|
4
|
+
* フラグ / 環境変数 / tokens.json から、API 接続情報(apiUrl / token / tenantDomain)を
|
|
5
|
+
* 決定する純粋関数群。テストの中心。
|
|
6
|
+
*
|
|
7
|
+
* 解決の優先順位:
|
|
8
|
+
* tenant 選択 : --tenant > --profile > HARVASK_TENANT > tokens.current
|
|
9
|
+
* apiUrl : --api-url > HARVASK_API_URL > 保存された api_url > https://{tenantDomain}/api
|
|
10
|
+
* token : HARVASK_TOKEN > 保存された token
|
|
11
|
+
*
|
|
12
|
+
* セキュリティ: apiUrl は https を必須とする(http は localhost / *.harvask.test / *.localhost のみ許可)。
|
|
13
|
+
*/
|
|
14
|
+
export class ConfigError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'ConfigError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class NotAuthenticatedError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'NotAuthenticatedError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 開発用ホスト(http 接続を許可する allowlist)か判定する。
|
|
28
|
+
*/
|
|
29
|
+
export function isDevHost(host) {
|
|
30
|
+
return (host === 'localhost' ||
|
|
31
|
+
host === '127.0.0.1' ||
|
|
32
|
+
host === '::1' ||
|
|
33
|
+
host.endsWith('.localhost') ||
|
|
34
|
+
host.endsWith('.harvask.test'));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* apiUrl が安全か検証する。https 必須(開発ホストのみ http 許可)。
|
|
38
|
+
*/
|
|
39
|
+
export function assertSafeApiUrl(apiUrl) {
|
|
40
|
+
let u;
|
|
41
|
+
try {
|
|
42
|
+
u = new URL(apiUrl);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new ConfigError(`Invalid API URL: ${apiUrl}`);
|
|
46
|
+
}
|
|
47
|
+
if (u.protocol === 'https:') {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (u.protocol === 'http:' && isDevHost(u.hostname)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
throw new ConfigError(`Insecure API URL: ${apiUrl}. https is required (http is allowed only for localhost / *.harvask.test).`);
|
|
54
|
+
}
|
|
55
|
+
function selectTenant(input) {
|
|
56
|
+
const { flags, env, store } = input;
|
|
57
|
+
const tenant = flags.tenant ?? flags.profile ?? env.HARVASK_TENANT ?? store.current ?? null;
|
|
58
|
+
const entry = tenant ? store.tenants[tenant] : undefined;
|
|
59
|
+
return { tenant, entry };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 接続先(apiUrl / tenantDomain)のみを解決する。token は不要(login 用)。
|
|
63
|
+
*/
|
|
64
|
+
export function resolveTarget(input) {
|
|
65
|
+
const { flags, env } = input;
|
|
66
|
+
const { tenant, entry } = selectTenant(input);
|
|
67
|
+
const tenantDomain = flags.tenant ?? entry?.tenant_domain ?? tenant ?? undefined;
|
|
68
|
+
const apiUrl = flags.apiUrl ??
|
|
69
|
+
env.HARVASK_API_URL ??
|
|
70
|
+
entry?.api_url ??
|
|
71
|
+
(tenantDomain ? `https://${tenantDomain}/api` : undefined);
|
|
72
|
+
if (!apiUrl) {
|
|
73
|
+
throw new ConfigError('Tenant/API URL not resolved. Use --tenant <domain> or --api-url <url>, or run `harvask login`.');
|
|
74
|
+
}
|
|
75
|
+
assertSafeApiUrl(apiUrl);
|
|
76
|
+
return { apiUrl, tenantDomain: tenantDomain || undefined };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* token を含む完全な接続設定を解決する。token が無ければ NotAuthenticatedError。
|
|
80
|
+
*/
|
|
81
|
+
export function resolveConnection(input) {
|
|
82
|
+
const { env } = input;
|
|
83
|
+
const { entry } = selectTenant(input);
|
|
84
|
+
const { apiUrl, tenantDomain } = resolveTarget(input);
|
|
85
|
+
const token = env.HARVASK_TOKEN ?? entry?.token;
|
|
86
|
+
if (!token) {
|
|
87
|
+
throw new NotAuthenticatedError('Not authenticated. Run `harvask login --tenant <domain>` first.');
|
|
88
|
+
}
|
|
89
|
+
// 保存済みトークンを使う場合、apiUrl のホストはテナントドメインと一致していなければならない。
|
|
90
|
+
// これを強制しないと `--api-url https://evil.example` で別テナントの Bearer トークンを
|
|
91
|
+
// 攻撃者ホストへ送ってしまう(エージェント操作前提なので特に重要)。
|
|
92
|
+
// HARVASK_TOKEN を明示指定したケース(CI 等)は利用者の責任とみなし対象外。
|
|
93
|
+
const usingStoredToken = !env.HARVASK_TOKEN && Boolean(entry?.token);
|
|
94
|
+
if (usingStoredToken && tenantDomain) {
|
|
95
|
+
let host;
|
|
96
|
+
try {
|
|
97
|
+
host = new URL(apiUrl).hostname;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new ConfigError(`Invalid API URL: ${apiUrl}`);
|
|
101
|
+
}
|
|
102
|
+
if (host !== tenantDomain) {
|
|
103
|
+
throw new ConfigError(`Refusing to send the stored token for "${tenantDomain}" to a different host ("${host}"). ` +
|
|
104
|
+
`The API URL host must equal the tenant domain. Use --tenant/--api-url consistently, or set HARVASK_TOKEN explicitly.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
apiUrl,
|
|
109
|
+
token,
|
|
110
|
+
tenantDomain,
|
|
111
|
+
timeout: intEnv(env.HARVASK_TIMEOUT, 30000),
|
|
112
|
+
retryAttempts: intEnv(env.HARVASK_RETRY_ATTEMPTS, 3),
|
|
113
|
+
retryDelay: intEnv(env.HARVASK_RETRY_DELAY, 1000),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function intEnv(value, fallback) {
|
|
117
|
+
if (!value) {
|
|
118
|
+
return fallback;
|
|
119
|
+
}
|
|
120
|
+
const n = parseInt(value, 10);
|
|
121
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* コマンド実行コンテキスト
|
|
3
|
+
*
|
|
4
|
+
* グローバルフラグ(出力オプション・プロファイル)を保持し、
|
|
5
|
+
* 必要時に api-client を遅延生成する。
|
|
6
|
+
*/
|
|
7
|
+
import { HarvaskApiClient } from './api-client.js';
|
|
8
|
+
import { resolveConnection, resolveTarget } from './config.js';
|
|
9
|
+
import { readStore } from './token-store.js';
|
|
10
|
+
import { supportsColor } from './output/tty.js';
|
|
11
|
+
export class CommandContext {
|
|
12
|
+
flags = {};
|
|
13
|
+
client;
|
|
14
|
+
get out() {
|
|
15
|
+
return {
|
|
16
|
+
json: Boolean(this.flags.json),
|
|
17
|
+
raw: Boolean(this.flags.raw),
|
|
18
|
+
data: Boolean(this.flags.data),
|
|
19
|
+
color: this.flags.color !== false && supportsColor(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
resolveFlags() {
|
|
23
|
+
return {
|
|
24
|
+
profile: this.flags.profile,
|
|
25
|
+
tenant: this.flags.tenant,
|
|
26
|
+
apiUrl: this.flags.apiUrl,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 認証済み api-client を取得(token 必須)。未認証なら NotAuthenticatedError。
|
|
31
|
+
*/
|
|
32
|
+
getApiClient() {
|
|
33
|
+
if (this.client) {
|
|
34
|
+
return this.client;
|
|
35
|
+
}
|
|
36
|
+
this.client = this.freshApiClient();
|
|
37
|
+
return this.client;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* キャッシュを使わず新しい api-client を生成する(複数テナント操作・logout --all 用)。
|
|
41
|
+
*/
|
|
42
|
+
freshApiClient(extra = {}) {
|
|
43
|
+
const config = resolveConnection({
|
|
44
|
+
flags: { ...this.resolveFlags(), ...extra },
|
|
45
|
+
env: process.env,
|
|
46
|
+
store: readStore(),
|
|
47
|
+
});
|
|
48
|
+
return new HarvaskApiClient(config);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 接続先(apiUrl / tenantDomain)のみを解決(login で token 取得前に使う)。
|
|
52
|
+
*/
|
|
53
|
+
getTarget(extra = {}) {
|
|
54
|
+
return resolveTarget({
|
|
55
|
+
flags: { ...this.resolveFlags(), ...extra },
|
|
56
|
+
env: process.env,
|
|
57
|
+
store: readStore(),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=context.js.map
|