@knpkv/jira-cli 0.1.1 → 1.0.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 (143) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +66 -4
  3. package/dist/IssueService.d.ts +2 -2
  4. package/dist/IssueService.d.ts.map +1 -1
  5. package/dist/IssueService.js +3 -3
  6. package/dist/IssueService.js.map +1 -1
  7. package/dist/JiraAuth.d.ts +14 -14
  8. package/dist/JiraAuth.d.ts.map +1 -1
  9. package/dist/JiraAuth.js +18 -10
  10. package/dist/JiraAuth.js.map +1 -1
  11. package/dist/JiraCliError.d.ts +30 -0
  12. package/dist/JiraCliError.d.ts.map +1 -1
  13. package/dist/JiraCliError.js +14 -0
  14. package/dist/JiraCliError.js.map +1 -1
  15. package/dist/MarkdownWriter.d.ts +4 -4
  16. package/dist/MarkdownWriter.d.ts.map +1 -1
  17. package/dist/MarkdownWriter.js +6 -6
  18. package/dist/MarkdownWriter.js.map +1 -1
  19. package/dist/SyncWorkspace.d.ts +34 -0
  20. package/dist/SyncWorkspace.d.ts.map +1 -0
  21. package/dist/SyncWorkspace.js +105 -0
  22. package/dist/SyncWorkspace.js.map +1 -0
  23. package/dist/VersionService.d.ts +206 -0
  24. package/dist/VersionService.d.ts.map +1 -0
  25. package/dist/VersionService.js +426 -0
  26. package/dist/VersionService.js.map +1 -0
  27. package/dist/bin.js +29 -22
  28. package/dist/bin.js.map +1 -1
  29. package/dist/commands/auth.d.ts +2 -21
  30. package/dist/commands/auth.d.ts.map +1 -1
  31. package/dist/commands/auth.js +6 -6
  32. package/dist/commands/auth.js.map +1 -1
  33. package/dist/commands/get.d.ts +3 -8
  34. package/dist/commands/get.d.ts.map +1 -1
  35. package/dist/commands/get.js +4 -4
  36. package/dist/commands/get.js.map +1 -1
  37. package/dist/commands/index.d.ts +2 -2
  38. package/dist/commands/index.d.ts.map +1 -1
  39. package/dist/commands/index.js +2 -2
  40. package/dist/commands/index.js.map +1 -1
  41. package/dist/commands/issue.d.ts +8 -0
  42. package/dist/commands/issue.d.ts.map +1 -0
  43. package/dist/commands/issue.js +10 -0
  44. package/dist/commands/issue.js.map +1 -0
  45. package/dist/commands/layers.d.ts +6 -18
  46. package/dist/commands/layers.d.ts.map +1 -1
  47. package/dist/commands/layers.js +35 -24
  48. package/dist/commands/layers.js.map +1 -1
  49. package/dist/commands/search.d.ts +3 -8
  50. package/dist/commands/search.d.ts.map +1 -1
  51. package/dist/commands/search.js +8 -8
  52. package/dist/commands/search.js.map +1 -1
  53. package/dist/commands/version.d.ts +12 -0
  54. package/dist/commands/version.d.ts.map +1 -0
  55. package/dist/commands/version.js +179 -0
  56. package/dist/commands/version.js.map +1 -0
  57. package/dist/internal/frontmatter.d.ts.map +1 -1
  58. package/dist/internal/frontmatter.js +14 -1
  59. package/dist/internal/frontmatter.js.map +1 -1
  60. package/dist/internal/oauthServer.d.ts +17 -5
  61. package/dist/internal/oauthServer.d.ts.map +1 -1
  62. package/dist/internal/oauthServer.js +23 -40
  63. package/dist/internal/oauthServer.js.map +1 -1
  64. package/dist/internal/openBrowser.d.ts +10 -0
  65. package/dist/internal/openBrowser.d.ts.map +1 -0
  66. package/dist/internal/openBrowser.js +17 -0
  67. package/dist/internal/openBrowser.js.map +1 -0
  68. package/dist/internal/sync/baseline.d.ts +11 -0
  69. package/dist/internal/sync/baseline.d.ts.map +1 -0
  70. package/dist/internal/sync/baseline.js +18 -0
  71. package/dist/internal/sync/baseline.js.map +1 -0
  72. package/dist/internal/sync/changes.d.ts +15 -0
  73. package/dist/internal/sync/changes.d.ts.map +1 -0
  74. package/dist/internal/sync/changes.js +72 -0
  75. package/dist/internal/sync/changes.js.map +1 -0
  76. package/dist/internal/sync/config.d.ts +12 -0
  77. package/dist/internal/sync/config.d.ts.map +1 -0
  78. package/dist/internal/sync/config.js +53 -0
  79. package/dist/internal/sync/config.js.map +1 -0
  80. package/dist/internal/sync/document.d.ts +9 -0
  81. package/dist/internal/sync/document.d.ts.map +1 -0
  82. package/dist/internal/sync/document.js +173 -0
  83. package/dist/internal/sync/document.js.map +1 -0
  84. package/dist/internal/sync/fieldValues.d.ts +30 -0
  85. package/dist/internal/sync/fieldValues.d.ts.map +1 -0
  86. package/dist/internal/sync/fieldValues.js +91 -0
  87. package/dist/internal/sync/fieldValues.js.map +1 -0
  88. package/dist/internal/sync/manifest.d.ts +12 -0
  89. package/dist/internal/sync/manifest.d.ts.map +1 -0
  90. package/dist/internal/sync/manifest.js +23 -0
  91. package/dist/internal/sync/manifest.js.map +1 -0
  92. package/dist/internal/sync/paths.d.ts +26 -0
  93. package/dist/internal/sync/paths.d.ts.map +1 -0
  94. package/dist/internal/sync/paths.js +22 -0
  95. package/dist/internal/sync/paths.js.map +1 -0
  96. package/dist/internal/sync/schemas.d.ts +128 -0
  97. package/dist/internal/sync/schemas.d.ts.map +1 -0
  98. package/dist/internal/sync/schemas.js +82 -0
  99. package/dist/internal/sync/schemas.js.map +1 -0
  100. package/dist/internal/sync/types.d.ts +144 -0
  101. package/dist/internal/sync/types.d.ts.map +1 -0
  102. package/dist/internal/sync/types.js +17 -0
  103. package/dist/internal/sync/types.js.map +1 -0
  104. package/package.json +13 -12
  105. package/skills/jira/SKILL.md +90 -0
  106. package/skills/jira/agents/openai.yaml +4 -0
  107. package/src/IssueService.ts +34 -28
  108. package/src/JiraAuth.ts +53 -39
  109. package/src/JiraCliError.ts +24 -0
  110. package/src/MarkdownWriter.ts +7 -11
  111. package/src/SyncWorkspace.ts +185 -0
  112. package/src/VersionService.ts +647 -0
  113. package/src/bin.ts +39 -29
  114. package/src/commands/auth.ts +6 -12
  115. package/src/commands/get.ts +4 -4
  116. package/src/commands/index.ts +2 -2
  117. package/src/commands/issue.ts +13 -0
  118. package/src/commands/layers.ts +44 -26
  119. package/src/commands/search.ts +8 -8
  120. package/src/commands/version.ts +267 -0
  121. package/src/internal/frontmatter.ts +15 -1
  122. package/src/internal/oauthServer.ts +43 -70
  123. package/src/internal/openBrowser.ts +31 -0
  124. package/src/internal/sync/baseline.ts +27 -0
  125. package/src/internal/sync/changes.ts +118 -0
  126. package/src/internal/sync/config.ts +76 -0
  127. package/src/internal/sync/document.ts +201 -0
  128. package/src/internal/sync/fieldValues.ts +145 -0
  129. package/src/internal/sync/manifest.ts +32 -0
  130. package/src/internal/sync/paths.ts +48 -0
  131. package/src/internal/sync/schemas.ts +103 -0
  132. package/src/internal/sync/types.ts +192 -0
  133. package/test/SyncWorkspace.test.ts +76 -0
  134. package/test/VersionService.test.ts +266 -0
  135. package/test/commandTree.test.ts +266 -0
  136. package/test/frontmatter.test.ts +69 -0
  137. package/test/integration.test.ts +187 -0
  138. package/test/syncChanges.test.ts +106 -0
  139. package/test/syncConfig.test.ts +138 -0
  140. package/test/syncDocument.test.ts +69 -0
  141. package/test/syncFieldValues.test.ts +101 -0
  142. package/vitest.config.integration.ts +17 -0
  143. package/vitest.config.ts +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownWriter.js","sourceRoot":"","sources":["../src/MarkdownWriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownWriter.js","sourceRoot":"","sources":["../src/MarkdownWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Local workspace I/O for Jira Markdown Sync.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Context from "effect/Context";
7
+ import * as Effect from "effect/Effect";
8
+ import * as FileSystem from "effect/FileSystem";
9
+ import * as Layer from "effect/Layer";
10
+ import * as Path from "effect/Path";
11
+ import { type SyncWorkspacePaths } from "./internal/sync/paths.js";
12
+ import type { SyncBaseline, SyncManifest, WorkspaceConfig } from "./internal/sync/types.js";
13
+ import { SyncWorkspaceError } from "./JiraCliError.js";
14
+ export interface InitWorkspaceInput {
15
+ readonly root: string;
16
+ readonly siteUrl: string;
17
+ }
18
+ export interface SyncWorkspaceShape {
19
+ readonly init: (input: InitWorkspaceInput) => Effect.Effect<SyncWorkspacePaths, SyncWorkspaceError>;
20
+ readonly paths: (root: string, config?: Pick<WorkspaceConfig, "documentsDir">) => Effect.Effect<SyncWorkspacePaths>;
21
+ readonly readConfig: (root: string) => Effect.Effect<WorkspaceConfig, SyncWorkspaceError>;
22
+ readonly writeConfig: (root: string, config: WorkspaceConfig) => Effect.Effect<void, SyncWorkspaceError>;
23
+ readonly readManifest: (root: string) => Effect.Effect<SyncManifest, SyncWorkspaceError>;
24
+ readonly writeManifest: (root: string, manifest: SyncManifest) => Effect.Effect<void, SyncWorkspaceError>;
25
+ readonly readBaseline: (root: string, issueId: string) => Effect.Effect<SyncBaseline, SyncWorkspaceError>;
26
+ readonly writeBaseline: (root: string, baseline: SyncBaseline) => Effect.Effect<void, SyncWorkspaceError>;
27
+ readonly conventionDocumentPath: (root: string, issueKey: string) => Effect.Effect<string, SyncWorkspaceError>;
28
+ }
29
+ declare const SyncWorkspace_base: Context.ServiceClass<SyncWorkspace, "@knpkv/jira-cli/SyncWorkspace", SyncWorkspaceShape>;
30
+ export declare class SyncWorkspace extends SyncWorkspace_base {
31
+ }
32
+ export declare const layer: Layer.Layer<SyncWorkspace, never, FileSystem.FileSystem | Path.Path>;
33
+ export {};
34
+ //# sourceMappingURL=SyncWorkspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncWorkspace.d.ts","sourceRoot":"","sources":["../src/SyncWorkspace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAInC,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;IACnG,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAA;IACnH,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAA;IACzF,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACxG,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IACxF,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACzG,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IACzG,QAAQ,CAAC,aAAa,EAAE,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC/G;;AAED,qBAAa,aAAc,SAAQ,kBAGC;CAAG;AAwIvC,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAGtF,CAAA"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Local workspace I/O for Jira Markdown Sync.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Context from "effect/Context";
7
+ import * as Effect from "effect/Effect";
8
+ import * as FileSystem from "effect/FileSystem";
9
+ import * as Layer from "effect/Layer";
10
+ import * as Path from "effect/Path";
11
+ import { parseSyncBaseline, serializeSyncBaseline } from "./internal/sync/baseline.js";
12
+ import { makeDefaultWorkspaceConfig, parseWorkspaceConfig, serializeWorkspaceConfig } from "./internal/sync/config.js";
13
+ import { makeEmptyManifest, parseSyncManifest, serializeSyncManifest } from "./internal/sync/manifest.js";
14
+ import { baselineFilePath, conventionDocumentPath, resolveWorkspacePaths } from "./internal/sync/paths.js";
15
+ import { SyncWorkspaceError } from "./JiraCliError.js";
16
+ export class SyncWorkspace extends Context.Service()("@knpkv/jira-cli/SyncWorkspace") {
17
+ }
18
+ const mapWorkspaceError = (message, path) => (cause) => new SyncWorkspaceError({ message, path, cause });
19
+ const make = Effect.gen(function* () {
20
+ const fs = yield* FileSystem.FileSystem;
21
+ const path = yield* Path.Path;
22
+ const paths = (root, config) => Effect.succeed(resolveWorkspacePaths(path, root, config));
23
+ const ensureDir = (dir) => fs.makeDirectory(dir, { recursive: true }).pipe(Effect.mapError(mapWorkspaceError("Failed to create sync workspace directory", dir)), Effect.asVoid);
24
+ const writeFile = (filePath, content) => Effect.gen(function* () {
25
+ const dir = path.dirname(filePath);
26
+ yield* ensureDir(dir);
27
+ const tempPath = `${filePath}.tmp.${Date.now()}`;
28
+ yield* fs.writeFileString(tempPath, content).pipe(Effect.mapError(mapWorkspaceError("Failed to write sync workspace file", filePath)));
29
+ yield* fs.rename(tempPath, filePath).pipe(Effect.mapError(mapWorkspaceError("Failed to replace sync workspace file", filePath)));
30
+ });
31
+ const readFile = (filePath) => fs.readFileString(filePath).pipe(Effect.mapError(mapWorkspaceError("Failed to read sync workspace file", filePath)));
32
+ const init = ({ root, siteUrl }) => Effect.gen(function* () {
33
+ const config = makeDefaultWorkspaceConfig(siteUrl);
34
+ const workspacePaths = resolveWorkspacePaths(path, root, config);
35
+ yield* ensureDir(workspacePaths.documentsDir);
36
+ yield* ensureDir(workspacePaths.metadataDir);
37
+ yield* ensureDir(workspacePaths.baselinesDir);
38
+ yield* ensureDir(workspacePaths.historyDir);
39
+ yield* writeFile(workspacePaths.configFile, serializeWorkspaceConfig(config));
40
+ yield* writeFile(workspacePaths.manifestFile, serializeSyncManifest(makeEmptyManifest(siteUrl)));
41
+ return workspacePaths;
42
+ });
43
+ const readConfig = (root) => Effect.gen(function* () {
44
+ const workspacePaths = resolveWorkspacePaths(path, root);
45
+ const content = yield* readFile(workspacePaths.configFile);
46
+ return yield* parseWorkspaceConfig(workspacePaths.configFile, content).pipe(Effect.mapError((cause) => new SyncWorkspaceError({
47
+ message: cause.message,
48
+ path: "path" in cause ? cause.path : workspacePaths.configFile,
49
+ cause
50
+ })));
51
+ });
52
+ const writeConfig = (root, config) => Effect.gen(function* () {
53
+ const workspacePaths = resolveWorkspacePaths(path, root, config);
54
+ yield* ensureDir(workspacePaths.metadataDir);
55
+ yield* writeFile(workspacePaths.configFile, serializeWorkspaceConfig(config));
56
+ });
57
+ const readManifest = (root) => Effect.gen(function* () {
58
+ const workspacePaths = resolveWorkspacePaths(path, root);
59
+ const content = yield* readFile(workspacePaths.manifestFile);
60
+ return yield* parseSyncManifest(workspacePaths.manifestFile, content).pipe(Effect.mapError((cause) => new SyncWorkspaceError({
61
+ message: cause.message,
62
+ path: "path" in cause ? cause.path : workspacePaths.manifestFile,
63
+ cause
64
+ })));
65
+ });
66
+ const writeManifest = (root, manifest) => Effect.gen(function* () {
67
+ const workspacePaths = resolveWorkspacePaths(path, root);
68
+ yield* ensureDir(workspacePaths.metadataDir);
69
+ yield* writeFile(workspacePaths.manifestFile, serializeSyncManifest(manifest));
70
+ });
71
+ const readBaseline = (root, issueId) => Effect.gen(function* () {
72
+ const workspacePaths = resolveWorkspacePaths(path, root);
73
+ const filePath = baselineFilePath(path, workspacePaths, issueId);
74
+ const content = yield* readFile(filePath);
75
+ return yield* parseSyncBaseline(filePath, content).pipe(Effect.mapError((cause) => new SyncWorkspaceError({
76
+ message: cause.message,
77
+ path: "path" in cause ? cause.path : filePath,
78
+ cause
79
+ })));
80
+ });
81
+ const writeBaseline = (root, baseline) => Effect.gen(function* () {
82
+ const workspacePaths = resolveWorkspacePaths(path, root);
83
+ const filePath = baselineFilePath(path, workspacePaths, baseline.issueId);
84
+ yield* ensureDir(workspacePaths.baselinesDir);
85
+ yield* writeFile(filePath, serializeSyncBaseline(baseline));
86
+ });
87
+ const getConventionDocumentPath = (root, issueKey) => Effect.gen(function* () {
88
+ const config = yield* readConfig(root);
89
+ const workspacePaths = resolveWorkspacePaths(path, root, config);
90
+ return conventionDocumentPath(path, workspacePaths, issueKey);
91
+ });
92
+ return SyncWorkspace.of({
93
+ init,
94
+ paths,
95
+ readConfig,
96
+ writeConfig,
97
+ readManifest,
98
+ writeManifest,
99
+ readBaseline,
100
+ writeBaseline,
101
+ conventionDocumentPath: getConventionDocumentPath
102
+ });
103
+ });
104
+ export const layer = Layer.effect(SyncWorkspace, make);
105
+ //# sourceMappingURL=SyncWorkspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncWorkspace.js","sourceRoot":"","sources":["../src/SyncWorkspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Jira project version (release) fetching with people-field resolution.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **API → domain mapping**: {@link VersionService} wraps the generated V3 client,
7
+ * normalising a project version into a {@link Version} object with resolved Driver,
8
+ * Contributors, and Approvers (each rendered as a {@link Person}).
9
+ * - **Expand options**: `approvers,driver,operations,issuesstatus` plus a passthrough
10
+ * for any extra fields the API returns (`contributors` is sent by Jira Premium even
11
+ * though it is not in the public OpenAPI spec).
12
+ * - **Account-id resolution**: account IDs are looked up against
13
+ * `/rest/api/3/user?accountId={id}` and cached per service instance.
14
+ * - **Mutations**: {@link VersionServiceShape.updateVersion} edits version fields
15
+ * (e.g. description) and {@link VersionServiceShape.addRelatedWork} /
16
+ * {@link VersionServiceShape.listRelatedWork} manage the "Related work" links that
17
+ * surface as Confluence pages on a release report. Mutations require the
18
+ * `manage:jira-project` OAuth scope (see `JiraAuth`).
19
+ *
20
+ * **Common tasks**
21
+ *
22
+ * - List versions for a project: `service.listProjectVersions("RPS", { released: true })`
23
+ * - Get a single version: `service.getVersion("12345")`
24
+ * - Set the description: `service.updateVersion("12345", { description: "..." })`
25
+ * - Attach a Confluence page: `service.addRelatedWork("12345", { title, category, url })`
26
+ *
27
+ * @module
28
+ */
29
+ import { JiraApiClient } from "@knpkv/jira-api-client";
30
+ import * as Context from "effect/Context";
31
+ import * as Effect from "effect/Effect";
32
+ import * as Layer from "effect/Layer";
33
+ import { JiraApiError } from "./JiraCliError.js";
34
+ /**
35
+ * A resolved Jira user (account ID + display name).
36
+ *
37
+ * @category Types
38
+ */
39
+ export interface Person {
40
+ readonly accountId: string;
41
+ readonly displayName: string;
42
+ /** Resolved email address (PII). Stripped from `version --json` unless `--emails` is passed. */
43
+ readonly emailAddress: string | null;
44
+ }
45
+ /**
46
+ * One approval line on a version.
47
+ *
48
+ * @category Types
49
+ */
50
+ export interface Approver {
51
+ readonly person: Person;
52
+ /** APPROVED | DECLINED | PENDING (Jira returns it uppercase). */
53
+ readonly status: string;
54
+ readonly declineReason: string | null;
55
+ readonly description: string | null;
56
+ }
57
+ /**
58
+ * A ticket with the version set as its fixVersion. Carries the minimum metadata
59
+ * needed by SOC2-style audits: assignee (for contributor derivation), labels
60
+ * (for impact-tagging checks), and summary (for human-readable evidence).
61
+ *
62
+ * @category Types
63
+ */
64
+ export interface VersionTicket {
65
+ readonly key: string;
66
+ readonly summary: string | null;
67
+ readonly assignee: Person | null;
68
+ readonly labels: ReadonlyArray<string>;
69
+ /**
70
+ * Values of any custom fields the caller asked to include (see
71
+ * {@link ListVersionsOptions.customFieldNames}). Keyed by the field's display
72
+ * name (the same string the caller passed in).
73
+ */
74
+ readonly customFields: Readonly<Record<string, string | null>>;
75
+ }
76
+ /**
77
+ * A project version (release) with people fields resolved.
78
+ *
79
+ * @category Types
80
+ */
81
+ export interface Version {
82
+ readonly id: string;
83
+ readonly name: string;
84
+ readonly description: string | null;
85
+ readonly released: boolean;
86
+ readonly archived: boolean;
87
+ readonly startDate: string | null;
88
+ readonly releaseDate: string | null;
89
+ readonly driver: Person | null;
90
+ readonly contributors: ReadonlyArray<Person>;
91
+ readonly approvers: ReadonlyArray<Approver>;
92
+ readonly tickets: ReadonlyArray<VersionTicket>;
93
+ readonly url: string;
94
+ }
95
+ /**
96
+ * A "Related work" link on a version (e.g. a Confluence page surfaced on the
97
+ * release report). `category` is a free-form string Jira groups by — common
98
+ * values are `Communication`, `Testing`, `Design`.
99
+ *
100
+ * @category Types
101
+ */
102
+ export interface RelatedWork {
103
+ readonly relatedWorkId: string | null;
104
+ readonly title: string | null;
105
+ readonly category: string;
106
+ readonly url: string | null;
107
+ }
108
+ /**
109
+ * Input for attaching a new "Related work" link to a version.
110
+ *
111
+ * @category Types
112
+ */
113
+ export interface AddRelatedWorkInput {
114
+ readonly title: string;
115
+ readonly category: string;
116
+ readonly url: string;
117
+ }
118
+ /**
119
+ * Editable version fields. Only the provided keys are sent to Jira.
120
+ *
121
+ * @category Types
122
+ */
123
+ export interface UpdateVersionInput {
124
+ readonly description?: string;
125
+ }
126
+ /**
127
+ * Filters for listing versions.
128
+ *
129
+ * @category Types
130
+ */
131
+ export interface ListVersionsOptions {
132
+ /** Restrict to released versions. */
133
+ readonly released?: boolean;
134
+ /** Restrict to unreleased versions. */
135
+ readonly unreleased?: boolean;
136
+ /** Hard cap on the number of versions fetched (default: all). */
137
+ readonly maxResults?: number;
138
+ /**
139
+ * Custom field **display names** (e.g. `"Security & Compliance Impact"`)
140
+ * whose values should be populated on each {@link VersionTicket.customFields}
141
+ * map. Names are resolved to per-instance field IDs via `/rest/api/3/field`,
142
+ * cached per service instance.
143
+ */
144
+ readonly customFieldNames?: ReadonlyArray<string>;
145
+ }
146
+ /**
147
+ * VersionService interface.
148
+ *
149
+ * @category Services
150
+ */
151
+ export interface VersionServiceShape {
152
+ readonly listProjectVersions: (projectKey: string, options?: ListVersionsOptions) => Effect.Effect<ReadonlyArray<Version>, JiraApiError>;
153
+ readonly getVersion: (id: string) => Effect.Effect<Version, JiraApiError>;
154
+ /** Update editable fields (currently description) on a version. Needs `manage:jira-project`. */
155
+ readonly updateVersion: (id: string, input: UpdateVersionInput) => Effect.Effect<Version, JiraApiError>;
156
+ /** List the "Related work" links attached to a version. */
157
+ readonly listRelatedWork: (id: string) => Effect.Effect<ReadonlyArray<RelatedWork>, JiraApiError>;
158
+ /** Attach a "Related work" link (e.g. a Confluence page) to a version. Needs `manage:jira-project`. */
159
+ readonly addRelatedWork: (id: string, input: AddRelatedWorkInput) => Effect.Effect<RelatedWork, JiraApiError>;
160
+ }
161
+ declare const VersionService_base: Context.ServiceClass<VersionService, "@knpkv/jira-cli/VersionService", VersionServiceShape>;
162
+ /**
163
+ * VersionService tag.
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * import { Effect } from "effect"
168
+ * import { VersionService } from "@knpkv/jira-cli/VersionService"
169
+ *
170
+ * Effect.gen(function* () {
171
+ * const versions = yield* VersionService
172
+ * const list = yield* versions.listProjectVersions("RPS", { released: true })
173
+ * console.log(`Found ${list.length} released versions`)
174
+ * })
175
+ * ```
176
+ *
177
+ * @category Services
178
+ */
179
+ export declare class VersionService extends VersionService_base {
180
+ }
181
+ /** Loosely-typed record helper for navigating untyped API JSON. */
182
+ type Raw = Record<string, unknown>;
183
+ /**
184
+ * Render a Jira custom-field value as a flat string.
185
+ *
186
+ * Handles the common shapes returned by `/rest/api/3/search/jql`:
187
+ * - cascading select: `{ value, child: { value } }` → `"Parent > Child"`
188
+ * - single select / option: `{ value }` → `"Parent"`
189
+ * - user object: `{ displayName }` → display name
190
+ * - plain string/number → coerced to string
191
+ * - array of any of the above → values joined with `, `
192
+ * - null / unset / unknown shape → `null`
193
+ */
194
+ export declare const renderCustomFieldValue: (raw: unknown) => string | null;
195
+ export declare const personFromObject: (raw: unknown, fallbackId?: string) => Person | null;
196
+ export declare const extractContributorIds: (raw: Raw) => ReadonlyArray<string>;
197
+ /** Normalise a Jira "Related work" entry into a {@link RelatedWork}. */
198
+ export declare const toRelatedWork: (raw: unknown) => RelatedWork;
199
+ /**
200
+ * Layer for VersionService.
201
+ *
202
+ * @category Layers
203
+ */
204
+ export declare const layer: Layer.Layer<VersionService, never, JiraApiClient>;
205
+ export {};
206
+ //# sourceMappingURL=VersionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VersionService.d.ts","sourceRoot":"","sources":["../src/VersionService.ts"],"names":[],"mappings":"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"}