@eyeauras/youtrack-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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/src/agile-commands.d.ts +2 -0
  4. package/dist/src/agile-commands.d.ts.map +1 -0
  5. package/dist/src/agile-commands.js +18 -0
  6. package/dist/src/agile-commands.js.map +1 -0
  7. package/dist/src/agile.d.ts +8 -0
  8. package/dist/src/agile.d.ts.map +1 -0
  9. package/dist/src/agile.js +64 -0
  10. package/dist/src/agile.js.map +1 -0
  11. package/dist/src/article-extras-commands.d.ts +2 -0
  12. package/dist/src/article-extras-commands.d.ts.map +1 -0
  13. package/dist/src/article-extras-commands.js +27 -0
  14. package/dist/src/article-extras-commands.js.map +1 -0
  15. package/dist/src/article-extras.d.ts +8 -0
  16. package/dist/src/article-extras.d.ts.map +1 -0
  17. package/dist/src/article-extras.js +22 -0
  18. package/dist/src/article-extras.js.map +1 -0
  19. package/dist/src/articles-commands.d.ts +3 -0
  20. package/dist/src/articles-commands.d.ts.map +1 -0
  21. package/dist/src/articles-commands.js +25 -0
  22. package/dist/src/articles-commands.js.map +1 -0
  23. package/dist/src/articles.d.ts +11 -0
  24. package/dist/src/articles.d.ts.map +1 -0
  25. package/dist/src/articles.js +41 -0
  26. package/dist/src/articles.js.map +1 -0
  27. package/dist/src/attachment-download-commands.d.ts +2 -0
  28. package/dist/src/attachment-download-commands.d.ts.map +1 -0
  29. package/dist/src/attachment-download-commands.js +19 -0
  30. package/dist/src/attachment-download-commands.js.map +1 -0
  31. package/dist/src/attachment-download.d.ts +16 -0
  32. package/dist/src/attachment-download.d.ts.map +1 -0
  33. package/dist/src/attachment-download.js +127 -0
  34. package/dist/src/attachment-download.js.map +1 -0
  35. package/dist/src/attachment-form.d.ts +2 -0
  36. package/dist/src/attachment-form.d.ts.map +1 -0
  37. package/dist/src/attachment-form.js +20 -0
  38. package/dist/src/attachment-form.js.map +1 -0
  39. package/dist/src/bin.d.ts +3 -0
  40. package/dist/src/bin.d.ts.map +1 -0
  41. package/dist/src/bin.js +10 -0
  42. package/dist/src/bin.js.map +1 -0
  43. package/dist/src/bundle-values-commands.d.ts +3 -0
  44. package/dist/src/bundle-values-commands.d.ts.map +1 -0
  45. package/dist/src/bundle-values-commands.js +30 -0
  46. package/dist/src/bundle-values-commands.js.map +1 -0
  47. package/dist/src/bundle-values.d.ts +13 -0
  48. package/dist/src/bundle-values.d.ts.map +1 -0
  49. package/dist/src/bundle-values.js +24 -0
  50. package/dist/src/bundle-values.js.map +1 -0
  51. package/dist/src/cli-support.d.ts +19 -0
  52. package/dist/src/cli-support.d.ts.map +1 -0
  53. package/dist/src/cli-support.js +81 -0
  54. package/dist/src/cli-support.js.map +1 -0
  55. package/dist/src/cli.d.ts +3 -0
  56. package/dist/src/cli.d.ts.map +1 -0
  57. package/dist/src/cli.js +99 -0
  58. package/dist/src/cli.js.map +1 -0
  59. package/dist/src/client.d.ts +62 -0
  60. package/dist/src/client.d.ts.map +1 -0
  61. package/dist/src/client.js +348 -0
  62. package/dist/src/client.js.map +1 -0
  63. package/dist/src/field-catalog-commands.d.ts +4 -0
  64. package/dist/src/field-catalog-commands.d.ts.map +1 -0
  65. package/dist/src/field-catalog-commands.js +31 -0
  66. package/dist/src/field-catalog-commands.js.map +1 -0
  67. package/dist/src/field-catalog.d.ts +12 -0
  68. package/dist/src/field-catalog.d.ts.map +1 -0
  69. package/dist/src/field-catalog.js +22 -0
  70. package/dist/src/field-catalog.js.map +1 -0
  71. package/dist/src/group-directory-commands.d.ts +3 -0
  72. package/dist/src/group-directory-commands.d.ts.map +1 -0
  73. package/dist/src/group-directory-commands.js +37 -0
  74. package/dist/src/group-directory-commands.js.map +1 -0
  75. package/dist/src/group-directory.d.ts +12 -0
  76. package/dist/src/group-directory.d.ts.map +1 -0
  77. package/dist/src/group-directory.js +23 -0
  78. package/dist/src/group-directory.js.map +1 -0
  79. package/dist/src/index.d.ts +18 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +18 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/dist/src/issue-attachments-commands.d.ts +2 -0
  84. package/dist/src/issue-attachments-commands.d.ts.map +1 -0
  85. package/dist/src/issue-attachments-commands.js +21 -0
  86. package/dist/src/issue-attachments-commands.js.map +1 -0
  87. package/dist/src/issue-attachments.d.ts +5 -0
  88. package/dist/src/issue-attachments.d.ts.map +1 -0
  89. package/dist/src/issue-attachments.js +11 -0
  90. package/dist/src/issue-attachments.js.map +1 -0
  91. package/dist/src/issue-context-commands.d.ts +4 -0
  92. package/dist/src/issue-context-commands.d.ts.map +1 -0
  93. package/dist/src/issue-context-commands.js +47 -0
  94. package/dist/src/issue-context-commands.js.map +1 -0
  95. package/dist/src/issue-context.d.ts +15 -0
  96. package/dist/src/issue-context.d.ts.map +1 -0
  97. package/dist/src/issue-context.js +60 -0
  98. package/dist/src/issue-context.js.map +1 -0
  99. package/dist/src/issue-fields-commands.d.ts +5 -0
  100. package/dist/src/issue-fields-commands.d.ts.map +1 -0
  101. package/dist/src/issue-fields-commands.js +21 -0
  102. package/dist/src/issue-fields-commands.js.map +1 -0
  103. package/dist/src/issue-fields.d.ts +9 -0
  104. package/dist/src/issue-fields.d.ts.map +1 -0
  105. package/dist/src/issue-fields.js +101 -0
  106. package/dist/src/issue-fields.js.map +1 -0
  107. package/dist/src/issue-query-commands.d.ts +3 -0
  108. package/dist/src/issue-query-commands.d.ts.map +1 -0
  109. package/dist/src/issue-query-commands.js +58 -0
  110. package/dist/src/issue-query-commands.js.map +1 -0
  111. package/dist/src/issue-query.d.ts +16 -0
  112. package/dist/src/issue-query.d.ts.map +1 -0
  113. package/dist/src/issue-query.js +75 -0
  114. package/dist/src/issue-query.js.map +1 -0
  115. package/dist/src/issue-relations-commands.d.ts +3 -0
  116. package/dist/src/issue-relations-commands.d.ts.map +1 -0
  117. package/dist/src/issue-relations-commands.js +28 -0
  118. package/dist/src/issue-relations-commands.js.map +1 -0
  119. package/dist/src/issue-relations.d.ts +14 -0
  120. package/dist/src/issue-relations.d.ts.map +1 -0
  121. package/dist/src/issue-relations.js +35 -0
  122. package/dist/src/issue-relations.js.map +1 -0
  123. package/dist/src/issue-time-commands.d.ts +3 -0
  124. package/dist/src/issue-time-commands.d.ts.map +1 -0
  125. package/dist/src/issue-time-commands.js +24 -0
  126. package/dist/src/issue-time-commands.js.map +1 -0
  127. package/dist/src/issue-time.d.ts +9 -0
  128. package/dist/src/issue-time.d.ts.map +1 -0
  129. package/dist/src/issue-time.js +88 -0
  130. package/dist/src/issue-time.js.map +1 -0
  131. package/dist/src/time-settings-commands.d.ts +3 -0
  132. package/dist/src/time-settings-commands.d.ts.map +1 -0
  133. package/dist/src/time-settings-commands.js +27 -0
  134. package/dist/src/time-settings-commands.js.map +1 -0
  135. package/dist/src/time-settings.d.ts +8 -0
  136. package/dist/src/time-settings.d.ts.map +1 -0
  137. package/dist/src/time-settings.js +14 -0
  138. package/dist/src/time-settings.js.map +1 -0
  139. package/dist/src/user-directory-commands.d.ts +3 -0
  140. package/dist/src/user-directory-commands.d.ts.map +1 -0
  141. package/dist/src/user-directory-commands.js +24 -0
  142. package/dist/src/user-directory-commands.js.map +1 -0
  143. package/dist/src/user-directory.d.ts +9 -0
  144. package/dist/src/user-directory.d.ts.map +1 -0
  145. package/dist/src/user-directory.js +15 -0
  146. package/dist/src/user-directory.js.map +1 -0
  147. package/package.json +45 -0
@@ -0,0 +1,58 @@
1
+ import { command } from "@eyeauras/cli-factory";
2
+ import { requiredText } from "./client.js";
3
+ import { pagedRead, projectedRead, readCommand, updateCommand, projectionOptions, readOptions } from "./cli-support.js";
4
+ import { applyCommands, assistCommands, assistSearch, countIssues, getSavedQuery, listSavedQueries, parseIssueSelection, } from "./issue-query.js";
5
+ const queryOptions = [
6
+ ...projectionOptions,
7
+ {
8
+ flags: "--query <query>",
9
+ description: "Required YouTrack query text",
10
+ required: true,
11
+ parse: (value) => requiredText(value, "query"),
12
+ },
13
+ ];
14
+ const issueOption = {
15
+ flags: "--issues <ids>",
16
+ description: "1–20 comma-separated explicit issue IDs, never a search query",
17
+ parse: parseIssueSelection,
18
+ };
19
+ const assistOptions = [
20
+ ...queryOptions,
21
+ {
22
+ flags: "--caret <position>",
23
+ description: "Caret position from zero through the query length",
24
+ parse: (value) => {
25
+ if (!/^\d+$/.test(value) || !Number.isSafeInteger(Number(value))) {
26
+ throw new Error("YouTrack caret must be a nonnegative safe integer.");
27
+ }
28
+ return Number(value);
29
+ },
30
+ },
31
+ ];
32
+ function assistInput(options) {
33
+ return {
34
+ ...readOptions(options),
35
+ query: String(options.query),
36
+ ...(typeof options.caret === "number" ? { caret: options.caret } : {}),
37
+ };
38
+ }
39
+ export const queryRootCommands = [
40
+ command("commands", "Apply issue commands or inspect command suggestions", [
41
+ updateCommand("apply", "Apply a command to 1–20 explicitly selected issues", async (connection, { options }, context) => applyCommands(connection, String(options.query), options.issues, readOptions(options)), [...queryOptions, { ...issueOption, required: true }]),
42
+ readCommand("assist", "Get command suggestions; this does not execute or guarantee a later command", async (connection, { options }, context) => assistCommands(connection, {
43
+ ...assistInput(options),
44
+ ...(options.issues === undefined ? {} : { issues: options.issues }),
45
+ }), [...assistOptions, issueOption]),
46
+ ]),
47
+ command("search", "Inspect YouTrack search suggestions", [
48
+ readCommand("assist", "Get completions for a search query", async (connection, { options }, context) => assistSearch(connection, assistInput(options)), assistOptions),
49
+ ]),
50
+ command("saved-queries", "Read saved YouTrack searches", [
51
+ pagedRead("list", "List one page of visible saved searches", listSavedQueries),
52
+ projectedRead("get <queryID>", "Read a saved search by database ID", getSavedQuery),
53
+ ]),
54
+ ];
55
+ export const queryIssueChildren = [
56
+ readCommand("count", "Count a search once; -1 means counting is pending", async (connection, { options }, context) => countIssues(connection, String(options.query), readOptions(options)), queryOptions),
57
+ ];
58
+ //# sourceMappingURL=issue-query-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-query-commands.js","sourceRoot":"","sources":["../../src/issue-query-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Connection, type PageOptions, type ProjectionOptions, type YouTrackObject } from "./client.js";
2
+ export interface AssistOptions extends ProjectionOptions {
3
+ query: string;
4
+ caret?: number;
5
+ }
6
+ export interface CommandAssistOptions extends AssistOptions {
7
+ issues?: readonly string[];
8
+ }
9
+ export declare function parseIssueSelection(value: string): string[];
10
+ export declare function applyCommands(connection: Connection, query: string, issues: readonly string[], options?: ProjectionOptions): Promise<YouTrackObject | null>;
11
+ export declare function assistCommands(connection: Connection, options: CommandAssistOptions): Promise<YouTrackObject>;
12
+ export declare function assistSearch(connection: Connection, options: AssistOptions): Promise<YouTrackObject>;
13
+ export declare function countIssues(connection: Connection, query: string, options?: ProjectionOptions): Promise<YouTrackObject>;
14
+ export declare const listSavedQueries: (connection: Connection, options?: PageOptions | undefined) => Promise<YouTrackObject[]>;
15
+ export declare const getSavedQuery: (connection: Connection, queryID: string, options?: ProjectionOptions | undefined) => Promise<YouTrackObject>;
16
+ //# sourceMappingURL=issue-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-query.d.ts","sourceRoot":"","sources":["../../src/issue-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAqBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3D;AAsCD,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAUhC;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC,CAUzB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAED,eAAO,MAAM,gBAAgB,0FAAyD,CAAC;AACvF,eAAO,MAAM,aAAa,+GAGzB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { encodedID, fields, mutate, page, readCollection, readCollectionAt, readObject, readObjectAt, requiredText, } from "./client.js";
2
+ const suggestions = "suggestions(option,description,caret,completionStart,completionEnd)";
3
+ const savedQueryFields = "id,name,query,owner(id,login)";
4
+ function selectedIssues(ids) {
5
+ if (ids.length < 1 || ids.length > 20 || new Set(ids).size !== ids.length) {
6
+ throw new Error("YouTrack issues must contain 1–20 distinct explicit issue IDs.");
7
+ }
8
+ return ids.map((id) => {
9
+ requiredText(id, "issue ID");
10
+ if (/^\d+-\d+$/.test(id)) {
11
+ return { id };
12
+ }
13
+ if (/^[^\s,]+-\d+$/.test(id)) {
14
+ return { idReadable: id };
15
+ }
16
+ throw new Error("YouTrack issues require database IDs (2-7) or readable IDs (DEMO-1), not a search query.");
17
+ });
18
+ }
19
+ export function parseIssueSelection(value) {
20
+ const ids = value.split(",").map((id) => id.trim());
21
+ selectedIssues(ids);
22
+ return ids;
23
+ }
24
+ function queryBody(options) {
25
+ const query = requiredText(options.query, "query");
26
+ if (options.caret !== undefined &&
27
+ (!Number.isSafeInteger(options.caret) ||
28
+ options.caret < 0 ||
29
+ options.caret > query.length)) {
30
+ throw new Error("YouTrack caret must be an integer between zero and the query length.");
31
+ }
32
+ return {
33
+ query,
34
+ ...(options.caret === undefined ? {} : { caret: options.caret }),
35
+ };
36
+ }
37
+ function suggestionsResult(value, options) {
38
+ if ((options.fields === undefined || Object.hasOwn(value, "suggestions")) &&
39
+ (!Array.isArray(value.suggestions) ||
40
+ value.suggestions.some((item) => item === null || typeof item !== "object" || Array.isArray(item)))) {
41
+ throw new Error("YouTrack returned invalid suggestions.");
42
+ }
43
+ return value;
44
+ }
45
+ export async function applyCommands(connection, query, issues, options = {}) {
46
+ return mutate(connection, "api/commands", {
47
+ query: requiredText(query, "query"),
48
+ issues: selectedIssues(issues),
49
+ }, fields(options, "query,issues(id,idReadable)"));
50
+ }
51
+ export async function assistCommands(connection, options) {
52
+ return suggestionsResult(await readObject(connection, "api/commands/assist", {
53
+ fields: fields(options, `query,caret,commands(description,error,delete),${suggestions}`),
54
+ }, {
55
+ ...queryBody(options),
56
+ ...(options.issues === undefined ? {} : { issues: selectedIssues(options.issues) }),
57
+ }), options);
58
+ }
59
+ export async function assistSearch(connection, options) {
60
+ return suggestionsResult(await readObject(connection, "api/search/assist", { fields: fields(options, `query,caret,${suggestions}`) }, queryBody(options)), options);
61
+ }
62
+ export async function countIssues(connection, query, options = {}) {
63
+ const value = await readObject(connection, "api/issuesGetter/count", { fields: fields(options, "count") }, { query: requiredText(query, "query") });
64
+ if ((options.fields === undefined || Object.hasOwn(value, "count")) &&
65
+ value.count !== null &&
66
+ (typeof value.count !== "number" ||
67
+ !Number.isSafeInteger(value.count) ||
68
+ value.count < -1)) {
69
+ throw new Error("YouTrack returned an invalid issue count.");
70
+ }
71
+ return value;
72
+ }
73
+ export const listSavedQueries = readCollectionAt("api/savedQueries", savedQueryFields);
74
+ export const getSavedQuery = readObjectAt((queryID) => `api/savedQueries/${encodedID(queryID, "saved query ID")}`, savedQueryFields);
75
+ //# sourceMappingURL=issue-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-query.js","sourceRoot":"","sources":["../../src/issue-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const relationsRootCommands: import("@eyeauras/cli-factory").CommandDefinition[];
2
+ export declare const relationsIssueChildren: import("@eyeauras/cli-factory").CommandDefinition[];
3
+ //# sourceMappingURL=issue-relations-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-relations-commands.d.ts","sourceRoot":"","sources":["../../src/issue-relations-commands.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,qBAAqB,qDASjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,qDA4ClC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { command } from "@eyeauras/cli-factory";
2
+ import { bodyUpdate, pagedRead, projectedRead, updateCommand } from "./cli-support.js";
3
+ import { addIssueLink, addIssueTag, getIssueLink, getLinkType, getTag, listIssueLinks, listIssueTags, listLinkedIssues, listLinkTypes, listTags, removeIssueLink, removeIssueTag, } from "./issue-relations.js";
4
+ export const relationsRootCommands = [
5
+ command("link-types", "Inspect YouTrack issue link types", [
6
+ pagedRead("list", "List one page of issue link types", listLinkTypes),
7
+ projectedRead("get <typeID>", "Read an issue link type", getLinkType),
8
+ ]),
9
+ command("tags", "Inspect existing YouTrack tags", [
10
+ pagedRead("list", "List one page of visible tags", listTags),
11
+ projectedRead("get <tagID>", "Read a tag by database ID", getTag),
12
+ ]),
13
+ ];
14
+ export const relationsIssueChildren = [
15
+ command("links", "Inspect and change issue links; s is outward, t inward, no marker undirected", [
16
+ pagedRead("list <issueID>", "List one page of link groups without embedded issues", listIssueLinks),
17
+ projectedRead("get <issueID> <linkID>", "Read a link group using its full directional link ID", getIssueLink),
18
+ pagedRead("issues <issueID> <linkID>", "List one page of issues linked through this directional link ID", listLinkedIssues),
19
+ bodyUpdate("add <issueID> <linkID>", "Link an existing target issue with body id (database ID)", addIssueLink),
20
+ updateCommand("remove <issueID> <linkID> <targetIssueID>", "Unlink the target issue; neither issue is deleted", async (connection, { args }, context) => removeIssueLink(connection, args.issueID, args.linkID, args.targetIssueID)),
21
+ ]),
22
+ command("tags", "Inspect and change tags assigned to an issue", [
23
+ pagedRead("list <issueID>", "List one page of tags assigned to an issue", listIssueTags),
24
+ bodyUpdate("add <issueID>", "Assign an existing tag with body id (database ID)", addIssueTag),
25
+ updateCommand("remove <issueID> <tagID>", "Remove a tag assignment; the tag is not deleted", async (connection, { args }, context) => removeIssueTag(connection, args.issueID, args.tagID)),
26
+ ]),
27
+ ];
28
+ //# sourceMappingURL=issue-relations-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-relations-commands.js","sourceRoot":"","sources":["../../src/issue-relations-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,MAAM,EACN,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,CAAC,YAAY,EAAE,mCAAmC,EAAE;QACzD,SAAS,CAAC,MAAM,EAAE,mCAAmC,EAAE,aAAa,CAAC;QACrE,aAAa,CAAC,cAAc,EAAE,yBAAyB,EAAE,WAAW,CAAC;KACtE,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,gCAAgC,EAAE;QAChD,SAAS,CAAC,MAAM,EAAE,+BAA+B,EAAE,QAAQ,CAAC;QAC5D,aAAa,CAAC,aAAa,EAAE,2BAA2B,EAAE,MAAM,CAAC;KAClE,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,OAAO,CAAC,OAAO,EAAE,8EAA8E,EAAE;QAC/F,SAAS,CACP,gBAAgB,EAChB,sDAAsD,EACtD,cAAc,CACf;QACD,aAAa,CACX,wBAAwB,EACxB,sDAAsD,EACtD,YAAY,CACb;QACD,SAAS,CACP,2BAA2B,EAC3B,iEAAiE,EACjE,gBAAgB,CACjB;QACD,UAAU,CACR,wBAAwB,EACxB,0DAA0D,EAC1D,YAAY,CACb;QACD,aAAa,CACX,2CAA2C,EAC3C,mDAAmD,EACnD,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CACtC,eAAe,CACb,UAAU,EACV,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,CACnB,CACJ;KACF,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,8CAA8C,EAAE;QAC9D,SAAS,CAAC,gBAAgB,EAAE,4CAA4C,EAAE,aAAa,CAAC;QACxF,UAAU,CAAC,eAAe,EAAE,mDAAmD,EAAE,WAAW,CAAC;QAC7F,aAAa,CACX,0BAA0B,EAC1B,iDAAiD,EACjD,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CACtC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CACvD;KACF,CAAC;CACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type Connection, type YouTrackObject } from "./client.js";
2
+ export declare const listLinkTypes: (connection: Connection, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
3
+ export declare const getLinkType: (connection: Connection, typeID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<YouTrackObject>;
4
+ export declare const listIssueLinks: (connection: Connection, issueID: string, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
5
+ export declare const getIssueLink: (connection: Connection, issueID: string, linkID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<YouTrackObject>;
6
+ export declare const listLinkedIssues: (connection: Connection, issueID: string, linkID: string, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
7
+ export declare function addIssueLink(connection: Connection, issueID: string, linkID: string, input: unknown): Promise<YouTrackObject | null>;
8
+ export declare function removeIssueLink(connection: Connection, issueID: string, linkID: string, targetIssueID: string): Promise<YouTrackObject | null>;
9
+ export declare const listTags: (connection: Connection, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
10
+ export declare const getTag: (connection: Connection, tagID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<YouTrackObject>;
11
+ export declare const listIssueTags: (connection: Connection, issueID: string, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
12
+ export declare function addIssueTag(connection: Connection, issueID: string, input: unknown): Promise<YouTrackObject | null>;
13
+ export declare function removeIssueTag(connection: Connection, issueID: string, tagID: string): Promise<YouTrackObject | null>;
14
+ //# sourceMappingURL=issue-relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-relations.d.ts","sourceRoot":"","sources":["../../src/issue-relations.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAkBrB,eAAO,MAAM,aAAa,gHAAyD,CAAC;AACpF,eAAO,MAAM,WAAW,oIAGvB,CAAC;AACF,eAAO,MAAM,cAAc,iIAG1B,CAAC;AACF,eAAO,MAAM,YAAY,qJAAqC,CAAC;AAC/D,eAAO,MAAM,gBAAgB,iJAG5B,CAAC;AAEF,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAEhC;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAKhC;AAED,eAAO,MAAM,QAAQ,gHAA0C,CAAC;AAChE,eAAO,MAAM,MAAM,mIAGlB,CAAC;AACF,eAAO,MAAM,aAAa,iIAGzB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAEhC;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAEhC"}
@@ -0,0 +1,35 @@
1
+ import { deleteObject, encodedID, issuePath, mutate, mutationBody, narrative, readCollectionAt, readObjectAt, } from "./client.js";
2
+ const linkTypeFields = "id,name,directed,sourceToTarget,targetToSource";
3
+ const linkFields = `id,direction,linkType(${linkTypeFields})`;
4
+ const linkedIssueFields = "id,idReadable,summary";
5
+ const tagFields = "id,name";
6
+ function linkPath(issueID, linkID) {
7
+ return `${issuePath(issueID)}/links/${encodedID(linkID, "link ID")}`;
8
+ }
9
+ function targetBody(input) {
10
+ const body = mutationBody(input, ["id"]);
11
+ const id = narrative(body.id, "target id");
12
+ encodedID(id, "target ID");
13
+ return { id };
14
+ }
15
+ export const listLinkTypes = readCollectionAt("api/issueLinkTypes", linkTypeFields);
16
+ export const getLinkType = readObjectAt((typeID) => `api/issueLinkTypes/${encodedID(typeID, "link type ID")}`, linkTypeFields);
17
+ export const listIssueLinks = readCollectionAt((issueID) => `${issuePath(issueID)}/links`, linkFields);
18
+ export const getIssueLink = readObjectAt(linkPath, linkFields);
19
+ export const listLinkedIssues = readCollectionAt((issueID, linkID) => `${linkPath(issueID, linkID)}/issues`, linkedIssueFields);
20
+ export async function addIssueLink(connection, issueID, linkID, input) {
21
+ return mutate(connection, `${linkPath(issueID, linkID)}/issues`, targetBody(input), linkedIssueFields);
22
+ }
23
+ export async function removeIssueLink(connection, issueID, linkID, targetIssueID) {
24
+ return deleteObject(connection, `${linkPath(issueID, linkID)}/issues/${encodedID(targetIssueID, "target issue ID")}`);
25
+ }
26
+ export const listTags = readCollectionAt("api/tags", tagFields);
27
+ export const getTag = readObjectAt((tagID) => `api/tags/${encodedID(tagID, "tag ID")}`, tagFields);
28
+ export const listIssueTags = readCollectionAt((issueID) => `${issuePath(issueID)}/tags`, tagFields);
29
+ export async function addIssueTag(connection, issueID, input) {
30
+ return mutate(connection, `${issuePath(issueID)}/tags`, targetBody(input), tagFields);
31
+ }
32
+ export async function removeIssueTag(connection, issueID, tagID) {
33
+ return deleteObject(connection, `${issuePath(issueID)}/tags/${encodedID(tagID, "tag ID")}`);
34
+ }
35
+ //# sourceMappingURL=issue-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-relations.js","sourceRoot":"","sources":["../../src/issue-relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const timeRootCommands: import("@eyeauras/cli-factory").CommandDefinition[];
2
+ export declare const timeIssueChildren: import("@eyeauras/cli-factory").CommandDefinition[];
3
+ //# sourceMappingURL=issue-time-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-time-commands.d.ts","sourceRoot":"","sources":["../../src/issue-time-commands.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,gBAAgB,qDAa5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,qDAsB7B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { command } from "@eyeauras/cli-factory";
2
+ import { pagedRead, projectedBodyUpdate, projectedRead, readCommand, pageOptions, readOptions } from "./cli-support.js";
3
+ import { addWorkItem, getIssueWorkItem, getTimeTracking, getWorkItem, listIssueWorkItems, listWorkItems, updateWorkItem, } from "./issue-time.js";
4
+ export const timeRootCommands = [
5
+ command("work-items", "Inspect work items across accessible issues", [
6
+ readCommand("list", "List one page of work items, optionally filtered by issue search", async (connection, { options }, context) => listWorkItems(connection, readOptions(options)), [
7
+ ...pageOptions,
8
+ { flags: "--query <query>", description: "YouTrack issue search query" },
9
+ ]),
10
+ projectedRead("get <itemID>", "Read a work item", getWorkItem),
11
+ ]),
12
+ ];
13
+ export const timeIssueChildren = [
14
+ command("time-tracking", "Inspect issue time tracking", [
15
+ projectedRead("get <issueID>", "Read time-tracking status without expanding work items", getTimeTracking),
16
+ ]),
17
+ command("work-items", "Inspect and record time spent on an issue", [
18
+ pagedRead("list <issueID>", "List one page of issue work items", listIssueWorkItems),
19
+ projectedRead("get <issueID> <itemID>", "Read an issue work item", getIssueWorkItem),
20
+ projectedBodyUpdate("add <issueID>", "Add work time; duration.minutes or duration.presentation is required", addWorkItem),
21
+ projectedBodyUpdate("update <issueID> <itemID>", "Update supplied work-item fields; omitted fields stay unchanged", updateWorkItem),
22
+ ]),
23
+ ];
24
+ //# sourceMappingURL=issue-time-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-time-commands.js","sourceRoot":"","sources":["../../src/issue-time-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxH,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO,CAAC,YAAY,EAAE,6CAA6C,EAAE;QACnE,WAAW,CACT,MAAM,EACN,kEAAkE,EAClE,KAAK,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAC3F;YACI,GAAG,WAAW;YACd,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,6BAA6B,EAAE;SACzE,CACJ;QACD,aAAa,CAAC,cAAc,EAAE,kBAAkB,EAAE,WAAW,CAAC;KAC/D,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,CAAC,eAAe,EAAE,6BAA6B,EAAE;QACtD,aAAa,CACX,eAAe,EACf,wDAAwD,EACxD,eAAe,CAChB;KACF,CAAC;IACF,OAAO,CAAC,YAAY,EAAE,2CAA2C,EAAE;QACjE,SAAS,CAAC,gBAAgB,EAAE,mCAAmC,EAAE,kBAAkB,CAAC;QACpF,aAAa,CAAC,wBAAwB,EAAE,yBAAyB,EAAE,gBAAgB,CAAC;QACpF,mBAAmB,CACjB,eAAe,EACf,sEAAsE,EACtE,WAAW,CACZ;QACD,mBAAmB,CACjB,2BAA2B,EAC3B,iEAAiE,EACjE,cAAc,CACf;KACF,CAAC;CACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Connection, type IssueSearchOptions, type ProjectionOptions, type YouTrackObject } from "./client.js";
2
+ export declare const getTimeTracking: (connection: Connection, issueID: string, options?: ProjectionOptions | undefined) => Promise<YouTrackObject>;
3
+ export declare const listIssueWorkItems: (connection: Connection, issueID: string, options?: import("./client.js").PageOptions | undefined) => Promise<YouTrackObject[]>;
4
+ export declare const getIssueWorkItem: (connection: Connection, issueID: string, itemID: string, options?: ProjectionOptions | undefined) => Promise<YouTrackObject>;
5
+ export declare function listWorkItems(connection: Connection, options?: IssueSearchOptions): Promise<YouTrackObject[]>;
6
+ export declare const getWorkItem: (connection: Connection, itemID: string, options?: ProjectionOptions | undefined) => Promise<YouTrackObject>;
7
+ export declare function addWorkItem(connection: Connection, issueID: string, input: unknown, options?: ProjectionOptions): Promise<YouTrackObject | null>;
8
+ export declare function updateWorkItem(connection: Connection, issueID: string, itemID: string, input: unknown, options?: ProjectionOptions): Promise<YouTrackObject | null>;
9
+ //# sourceMappingURL=issue-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-time.d.ts","sourceRoot":"","sources":["../../src/issue-time.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAQrB,eAAO,MAAM,eAAe,+GAG3B,CAAC;AACF,eAAO,MAAM,kBAAkB,iIAAkD,CAAC;AAClF,eAAO,MAAM,gBAAgB,+HAI5B,CAAC;AAEF,wBAAsB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,6BAK3F;AAED,eAAO,MAAM,WAAW,8GAGvB,CAAC;AA0EF,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,iBAAsB,kCAQhC;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,iBAAsB,kCAQhC"}
@@ -0,0 +1,88 @@
1
+ import { encodedID, fields, issuePath, mutate, mutationBody, nullableText, page, readCollection, readCollectionAt, readObjectAt, requiredText, } from "./client.js";
2
+ const workItemFields = "id,date,duration(minutes,presentation),text,type(id,name),author(id,login),issue(id,idReadable)";
3
+ function workItemsPath(issueID) {
4
+ return `${issuePath(issueID)}/timeTracking/workItems`;
5
+ }
6
+ export const getTimeTracking = readObjectAt((issueID) => `${issuePath(issueID)}/timeTracking`, "id,enabled");
7
+ export const listIssueWorkItems = readCollectionAt(workItemsPath, workItemFields);
8
+ export const getIssueWorkItem = readObjectAt((issueID, itemID) => `${workItemsPath(issueID)}/${encodedID(itemID, "work item ID")}`, workItemFields);
9
+ export async function listWorkItems(connection, options = {}) {
10
+ return readCollection(connection, "api/workItems", {
11
+ ...page(options, workItemFields),
12
+ ...(options.query === undefined ? {} : { query: requiredText(options.query, "query") }),
13
+ });
14
+ }
15
+ export const getWorkItem = readObjectAt((itemID) => `api/workItems/${encodedID(itemID, "work item ID")}`, workItemFields);
16
+ function timestamp(value, name) {
17
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) {
18
+ throw new Error(`YouTrack ${name} must be a safe integer timestamp in milliseconds.`);
19
+ }
20
+ return value;
21
+ }
22
+ function reference(value, name) {
23
+ if (value === null) {
24
+ return null;
25
+ }
26
+ const body = mutationBody(value, ["id"]);
27
+ if (typeof body.id !== "string") {
28
+ throw new Error(`YouTrack ${name}.id must be nonempty text.`);
29
+ }
30
+ return { id: requiredText(body.id, `${name}.id`) };
31
+ }
32
+ function duration(value) {
33
+ const body = mutationBody(value, ["minutes", "presentation"]);
34
+ if (Object.keys(body).length === 0) {
35
+ throw new Error("YouTrack duration requires minutes or presentation.");
36
+ }
37
+ const result = {};
38
+ if (Object.hasOwn(body, "minutes")) {
39
+ if (typeof body.minutes !== "number" ||
40
+ !Number.isSafeInteger(body.minutes) ||
41
+ body.minutes < 0 ||
42
+ body.minutes > 2_147_483_647) {
43
+ throw new Error("YouTrack duration.minutes must be a nonnegative 32-bit integer.");
44
+ }
45
+ result.minutes = body.minutes;
46
+ }
47
+ if (Object.hasOwn(body, "presentation")) {
48
+ if (typeof body.presentation !== "string") {
49
+ throw new Error("YouTrack duration.presentation must be nonempty text.");
50
+ }
51
+ result.presentation = requiredText(body.presentation, "duration.presentation");
52
+ }
53
+ return result;
54
+ }
55
+ function workItemBody(input, creating) {
56
+ const body = mutationBody(input, ["duration", "date", "author", "type", "text", "created", "updated"]);
57
+ if (creating && !Object.hasOwn(body, "duration")) {
58
+ throw new Error("YouTrack work-item creation requires duration.minutes or duration.presentation.");
59
+ }
60
+ if (Object.keys(body).length === 0) {
61
+ throw new Error("YouTrack work-item update requires at least one writable field.");
62
+ }
63
+ const result = {};
64
+ if (Object.hasOwn(body, "duration")) {
65
+ result.duration = duration(body.duration);
66
+ }
67
+ for (const name of ["date", "created", "updated"]) {
68
+ if (Object.hasOwn(body, name)) {
69
+ result[name] = name === "updated" && body[name] === null ? null : timestamp(body[name], name);
70
+ }
71
+ }
72
+ for (const name of ["author", "type"]) {
73
+ if (Object.hasOwn(body, name)) {
74
+ result[name] = reference(body[name], name);
75
+ }
76
+ }
77
+ if (Object.hasOwn(body, "text")) {
78
+ result.text = nullableText(body.text, "work-item text");
79
+ }
80
+ return result;
81
+ }
82
+ export async function addWorkItem(connection, issueID, input, options = {}) {
83
+ return mutate(connection, workItemsPath(issueID), workItemBody(input, true), fields(options, workItemFields));
84
+ }
85
+ export async function updateWorkItem(connection, issueID, itemID, input, options = {}) {
86
+ return mutate(connection, `${workItemsPath(issueID)}/${encodedID(itemID, "work item ID")}`, workItemBody(input, false), fields(options, workItemFields));
87
+ }
88
+ //# sourceMappingURL=issue-time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-time.js","sourceRoot":"","sources":["../../src/issue-time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const timeSettingsRootCommands: import("@eyeauras/cli-factory").CommandDefinition[];
2
+ export declare const timeSettingsProjectChildren: import("@eyeauras/cli-factory").CommandDefinition[];
3
+ //# sourceMappingURL=time-settings-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-settings-commands.d.ts","sourceRoot":"","sources":["../../src/time-settings-commands.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,wBAAwB,qDAqBpC,CAAC;AAEF,eAAO,MAAM,2BAA2B,qDAoBvC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { command } from "@eyeauras/cli-factory";
2
+ import { pagedRead, projectedRead } from "./cli-support.js";
3
+ import { getGlobalTimeSettings, getProjectTimeSettings, getProjectWorkItemType, getWorkItemType, getWorkTimeSettings, listProjectWorkItemTypes, listWorkItemTypes, } from "./time-settings.js";
4
+ export const timeSettingsRootCommands = [
5
+ command("time-tracking", "Inspect global time-tracking conventions", [
6
+ command("settings", "Inspect global time-tracking settings", [
7
+ projectedRead("get", "Read global time settings without expanding work item types", getGlobalTimeSettings),
8
+ ]),
9
+ command("work-time", "Inspect the server work schedule", [
10
+ projectedRead("get", "Read minutes per day, working days and server week conventions", getWorkTimeSettings),
11
+ ]),
12
+ ]),
13
+ command("work-item-type", "Inspect available global work item types", [
14
+ pagedRead("list", "List one page of global work item types", listWorkItemTypes),
15
+ projectedRead("get <type>", "Read a global work item type by database ID", getWorkItemType),
16
+ ]),
17
+ ];
18
+ export const timeSettingsProjectChildren = [
19
+ command("time-tracking", "Inspect project time-tracking settings", [
20
+ projectedRead("get <project>", "Read project time tracking and its estimate and spent-time fields", getProjectTimeSettings),
21
+ ]),
22
+ command("work-item-type", "Inspect work item types attached to a project", [
23
+ pagedRead("list <project>", "List one page of project work item types", listProjectWorkItemTypes),
24
+ projectedRead("get <project> <type>", "Read a work item type attached to the project", getProjectWorkItemType),
25
+ ]),
26
+ ];
27
+ //# sourceMappingURL=time-settings-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-settings-commands.js","sourceRoot":"","sources":["../../src/time-settings-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,OAAO,CAAC,eAAe,EAAE,0CAA0C,EAAE;QACnE,OAAO,CAAC,UAAU,EAAE,uCAAuC,EAAE;YAC3D,aAAa,CACX,KAAK,EACL,6DAA6D,EAC7D,qBAAqB,CACtB;SACF,CAAC;QACF,OAAO,CAAC,WAAW,EAAE,kCAAkC,EAAE;YACvD,aAAa,CACX,KAAK,EACL,gEAAgE,EAChE,mBAAmB,CACpB;SACF,CAAC;KACH,CAAC;IACF,OAAO,CAAC,gBAAgB,EAAE,0CAA0C,EAAE;QACpE,SAAS,CAAC,MAAM,EAAE,yCAAyC,EAAE,iBAAiB,CAAC;QAC/E,aAAa,CAAC,YAAY,EAAE,6CAA6C,EAAE,eAAe,CAAC;KAC5F,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,CAAC,eAAe,EAAE,wCAAwC,EAAE;QACjE,aAAa,CACX,eAAe,EACf,mEAAmE,EACnE,sBAAsB,CACvB;KACF,CAAC;IACF,OAAO,CAAC,gBAAgB,EAAE,+CAA+C,EAAE;QACzE,SAAS,CACP,gBAAgB,EAChB,0CAA0C,EAC1C,wBAAwB,CACzB;QACD,aAAa,CACX,sBAAsB,EACtB,+CAA+C,EAC/C,sBAAsB,CACvB;KACF,CAAC;CACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const getProjectTimeSettings: (connection: import("./client.js").Connection, project: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
2
+ export declare const listProjectWorkItemTypes: (connection: import("./client.js").Connection, project: string, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
3
+ export declare const getProjectWorkItemType: (connection: import("./client.js").Connection, project: string, type: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
4
+ export declare const getGlobalTimeSettings: (connection: import("./client.js").Connection, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
5
+ export declare const listWorkItemTypes: (connection: import("./client.js").Connection, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
6
+ export declare const getWorkItemType: (connection: import("./client.js").Connection, type: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
7
+ export declare const getWorkTimeSettings: (connection: import("./client.js").Connection, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
8
+ //# sourceMappingURL=time-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-settings.d.ts","sourceRoot":"","sources":["../../src/time-settings.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,iLAAmD,CAAC;AACvF,eAAO,MAAM,wBAAwB,6KAGpC,CAAC;AACF,eAAO,MAAM,sBAAsB,+LAIlC,CAAC;AACF,eAAO,MAAM,qBAAqB,gKAGjC,CAAC;AACF,eAAO,MAAM,iBAAiB,4JAG7B,CAAC;AACF,eAAO,MAAM,eAAe,8KAG3B,CAAC;AACF,eAAO,MAAM,mBAAmB,gKAG/B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { encodedID, readCollectionAt, readObjectAt } from "./client.js";
2
+ const globalSettingsPath = "api/admin/timeTrackingSettings";
3
+ const typeFields = "id,name,autoAttached";
4
+ const workTimeFields = "id,minutesADay,workDays,firstDayOfWeek,daysAWeek";
5
+ const projectFields = "id,enabled,estimate(id,field(id,name)),timeSpent(id,field(id,name)),project(id,name,shortName)";
6
+ const projectSettingsPath = (project) => `api/admin/projects/${encodedID(project, "project ID")}/timeTrackingSettings`;
7
+ export const getProjectTimeSettings = readObjectAt(projectSettingsPath, projectFields);
8
+ export const listProjectWorkItemTypes = readCollectionAt((project) => `${projectSettingsPath(project)}/workItemTypes`, typeFields);
9
+ export const getProjectWorkItemType = readObjectAt((project, type) => `${projectSettingsPath(project)}/workItemTypes/${encodedID(type, "work item type ID")}`, typeFields);
10
+ export const getGlobalTimeSettings = readObjectAt(globalSettingsPath, `id,workTimeSettings(${workTimeFields})`);
11
+ export const listWorkItemTypes = readCollectionAt(`${globalSettingsPath}/workItemTypes`, typeFields);
12
+ export const getWorkItemType = readObjectAt((type) => `${globalSettingsPath}/workItemTypes/${encodedID(type, "work item type ID")}`, typeFields);
13
+ export const getWorkTimeSettings = readObjectAt(`${globalSettingsPath}/workTimeSettings`, workTimeFields);
14
+ //# sourceMappingURL=time-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-settings.js","sourceRoot":"","sources":["../../src/time-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AAC5D,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAC1C,MAAM,cAAc,GAAG,kDAAkD,CAAC;AAC1E,MAAM,aAAa,GACjB,gGAAgG,CAAC;AACnG,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE,CAC9C,sBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,uBAAuB,CAAC;AAEhF,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CACtD,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,EACpE,UAAU,CACX,CAAC;AACF,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAChD,CAAC,OAAe,EAAE,IAAY,EAAE,EAAE,CAChC,GAAG,mBAAmB,CAAC,OAAO,CAAC,kBAAkB,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,EACzF,UAAU,CACX,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,kBAAkB,EAClB,uBAAuB,cAAc,GAAG,CACzC,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAC/C,GAAG,kBAAkB,gBAAgB,EACrC,UAAU,CACX,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CACzC,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,kBAAkB,kBAAkB,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,EAC/F,UAAU,CACX,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,GAAG,kBAAkB,mBAAmB,EACxC,cAAc,CACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const userDirectoryUserChildren: import("@eyeauras/cli-factory").CommandDefinition[];
2
+ export declare const userDirectoryBundleChildren: import("@eyeauras/cli-factory").CommandDefinition[];
3
+ //# sourceMappingURL=user-directory-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-directory-commands.d.ts","sourceRoot":"","sources":["../../src/user-directory-commands.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,yBAAyB,qDAErC,CAAC;AAEF,eAAO,MAAM,2BAA2B,qDAoCvC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { command } from "@eyeauras/cli-factory";
2
+ import { pagedRead, projectedRead } from "./cli-support.js";
3
+ import { getUser, getUserBundle, getUserBundleGroup, getUserBundleIndividual, listUserBundleGroups, listUserBundleIndividuals, listUserBundleMembers, listUserBundles, } from "./user-directory.js";
4
+ export const userDirectoryUserChildren = [
5
+ projectedRead("get <user>", "Read a user by database ID or login", getUser),
6
+ ];
7
+ export const userDirectoryBundleChildren = [
8
+ command("user", "Inspect assignee bundles and their attached users and groups", [
9
+ pagedRead("list", "List one page of user bundles without expanding membership", listUserBundles),
10
+ projectedRead("get <bundle>", "Read a user bundle without expanding membership", getUserBundle),
11
+ command("member", "Inspect all bundle users, including users inherited from attached groups", [
12
+ pagedRead("list <bundle>", "List one page of aggregated users, both direct and through groups", listUserBundleMembers),
13
+ ]),
14
+ command("group", "Inspect groups attached to the user bundle", [
15
+ pagedRead("list <bundle>", "List one page of attached groups without expanding their users", listUserBundleGroups),
16
+ projectedRead("get <bundle> <group>", "Read one attached group by database ID", getUserBundleGroup),
17
+ ]),
18
+ command("individual", "Inspect user accounts added directly to the bundle", [
19
+ pagedRead("list <bundle>", "List one page of directly added accounts, excluding group-only membership", listUserBundleIndividuals),
20
+ projectedRead("get <bundle> <user>", "Read one directly added account by database ID", getUserBundleIndividual),
21
+ ]),
22
+ ]),
23
+ ];
24
+ //# sourceMappingURL=user-directory-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-directory-commands.js","sourceRoot":"","sources":["../../src/user-directory-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,aAAa,CAAC,YAAY,EAAE,qCAAqC,EAAE,OAAO,CAAC;CAC5E,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,CAAC,MAAM,EAAE,8DAA8D,EAAE;QAC9E,SAAS,CAAC,MAAM,EAAE,4DAA4D,EAAE,eAAe,CAAC;QAChG,aAAa,CAAC,cAAc,EAAE,iDAAiD,EAAE,aAAa,CAAC;QAC/F,OAAO,CAAC,QAAQ,EAAE,0EAA0E,EAAE;YAC5F,SAAS,CACP,eAAe,EACf,mEAAmE,EACnE,qBAAqB,CACtB;SACF,CAAC;QACF,OAAO,CAAC,OAAO,EAAE,4CAA4C,EAAE;YAC7D,SAAS,CACP,eAAe,EACf,gEAAgE,EAChE,oBAAoB,CACrB;YACD,aAAa,CACX,sBAAsB,EACtB,wCAAwC,EACxC,kBAAkB,CACnB;SACF,CAAC;QACF,OAAO,CAAC,YAAY,EAAE,oDAAoD,EAAE;YAC1E,SAAS,CACP,eAAe,EACf,2EAA2E,EAC3E,yBAAyB,CAC1B;YACD,aAAa,CACX,qBAAqB,EACrB,gDAAgD,EAChD,uBAAuB,CACxB;SACF,CAAC;KACH,CAAC;CACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const listUserBundles: (connection: import("./client.js").Connection, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
2
+ export declare const getUserBundle: (connection: import("./client.js").Connection, bundleID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
3
+ export declare const listUserBundleMembers: (connection: import("./client.js").Connection, bundleID: string, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
4
+ export declare const listUserBundleGroups: (connection: import("./client.js").Connection, bundleID: string, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
5
+ export declare const getUserBundleGroup: (connection: import("./client.js").Connection, bundleID: string, groupID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
6
+ export declare const listUserBundleIndividuals: (connection: import("./client.js").Connection, bundleID: string, options?: import("./client.js").PageOptions | undefined) => Promise<import("./client.js").YouTrackObject[]>;
7
+ export declare const getUserBundleIndividual: (connection: import("./client.js").Connection, bundleID: string, userID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
8
+ export declare const getUser: (connection: import("./client.js").Connection, userID: string, options?: import("./client.js").ProjectionOptions | undefined) => Promise<import("./client.js").YouTrackObject>;
9
+ //# sourceMappingURL=user-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-directory.d.ts","sourceRoot":"","sources":["../../src/user-directory.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe,4JAA6C,CAAC;AAC1E,eAAO,MAAM,aAAa,kLAAyC,CAAC;AACpE,eAAO,MAAM,qBAAqB,8KAGjC,CAAC;AACF,eAAO,MAAM,oBAAoB,8KAGhC,CAAC;AACF,eAAO,MAAM,kBAAkB,mMAI9B,CAAC;AACF,eAAO,MAAM,yBAAyB,8KAGrC,CAAC;AACF,eAAO,MAAM,uBAAuB,kMAInC,CAAC;AACF,eAAO,MAAM,OAAO,gLAGnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { encodedID, readCollectionAt, readObjectAt } from "./client.js";
2
+ const bundleRoot = "api/admin/customFieldSettings/bundles/user";
3
+ const bundleFields = "id,name,isUpdateable";
4
+ const userFields = "id,login,fullName";
5
+ const groupFields = "id,name,usersCount,allUsersGroup";
6
+ const bundlePath = (bundleID) => `${bundleRoot}/${encodedID(bundleID, "user bundle ID")}`;
7
+ export const listUserBundles = readCollectionAt(bundleRoot, bundleFields);
8
+ export const getUserBundle = readObjectAt(bundlePath, bundleFields);
9
+ export const listUserBundleMembers = readCollectionAt((bundleID) => `${bundlePath(bundleID)}/aggregatedUsers`, userFields);
10
+ export const listUserBundleGroups = readCollectionAt((bundleID) => `${bundlePath(bundleID)}/groups`, groupFields);
11
+ export const getUserBundleGroup = readObjectAt((bundleID, groupID) => `${bundlePath(bundleID)}/groups/${encodedID(groupID, "group ID")}`, groupFields);
12
+ export const listUserBundleIndividuals = readCollectionAt((bundleID) => `${bundlePath(bundleID)}/individuals`, userFields);
13
+ export const getUserBundleIndividual = readObjectAt((bundleID, userID) => `${bundlePath(bundleID)}/individuals/${encodedID(userID, "user ID")}`, userFields);
14
+ export const getUser = readObjectAt((userID) => `api/users/${encodedID(userID, "user ID or login")}`, userFields);
15
+ //# sourceMappingURL=user-directory.js.map