centy 0.7.2 → 0.7.3

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 (88) hide show
  1. package/dist/commands/close.d.ts +3 -2
  2. package/dist/commands/close.d.ts.map +1 -1
  3. package/dist/commands/close.js +45 -38
  4. package/dist/commands/close.js.map +1 -1
  5. package/dist/commands/{delete/issue.d.ts → delete.d.ts} +4 -3
  6. package/dist/commands/delete.d.ts.map +1 -0
  7. package/dist/commands/{delete/issue.js → delete.js} +25 -17
  8. package/dist/commands/delete.js.map +1 -0
  9. package/dist/commands/{duplicate/issue.d.ts → duplicate.d.ts} +5 -3
  10. package/dist/commands/duplicate.d.ts.map +1 -0
  11. package/dist/commands/{duplicate/issue.js → duplicate.js} +38 -24
  12. package/dist/commands/duplicate.js.map +1 -0
  13. package/dist/commands/{list/issues.d.ts → list.d.ts} +7 -5
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +96 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/{move/issue.d.ts → move.d.ts} +5 -3
  18. package/dist/commands/move.d.ts.map +1 -0
  19. package/dist/commands/{move/issue.js → move.js} +34 -17
  20. package/dist/commands/move.js.map +1 -0
  21. package/dist/commands/{update/issue.d.ts → update.d.ts} +7 -8
  22. package/dist/commands/update.d.ts.map +1 -0
  23. package/dist/commands/update.js +101 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/daemon/daemon-duplicate-item.d.ts +6 -0
  26. package/dist/daemon/daemon-duplicate-item.d.ts.map +1 -0
  27. package/dist/daemon/daemon-duplicate-item.js +9 -0
  28. package/dist/daemon/daemon-duplicate-item.js.map +1 -0
  29. package/dist/daemon/daemon-list-items.d.ts +6 -0
  30. package/dist/daemon/daemon-list-items.d.ts.map +1 -0
  31. package/dist/daemon/daemon-list-items.js +9 -0
  32. package/dist/daemon/daemon-list-items.js.map +1 -0
  33. package/dist/daemon/daemon-move-item.d.ts +6 -0
  34. package/dist/daemon/daemon-move-item.d.ts.map +1 -0
  35. package/dist/daemon/daemon-move-item.js +9 -0
  36. package/dist/daemon/daemon-move-item.js.map +1 -0
  37. package/dist/daemon/daemon-update-item.d.ts +6 -0
  38. package/dist/daemon/daemon-update-item.d.ts.map +1 -0
  39. package/dist/daemon/daemon-update-item.js +9 -0
  40. package/dist/daemon/daemon-update-item.js.map +1 -0
  41. package/dist/daemon/generated/centy/v1/generic_item.d.ts +36 -0
  42. package/dist/daemon/generated/centy/v1/generic_item.d.ts.map +1 -1
  43. package/dist/daemon/grpc-client-items.d.ts +3 -1
  44. package/dist/daemon/grpc-client-items.d.ts.map +1 -1
  45. package/dist/lib/resolve-item-id/resolve-item-id.d.ts +7 -0
  46. package/dist/lib/resolve-item-id/resolve-item-id.d.ts.map +1 -0
  47. package/dist/lib/resolve-item-id/resolve-item-id.js +23 -0
  48. package/dist/lib/resolve-item-id/resolve-item-id.js.map +1 -0
  49. package/oclif.manifest.json +501 -778
  50. package/package.json +1 -1
  51. package/proto/centy/v1/centy.proto +6 -0
  52. package/proto/centy/v1/generic_item.proto +31 -0
  53. package/dist/commands/close/issue.d.ts +0 -16
  54. package/dist/commands/close/issue.d.ts.map +0 -1
  55. package/dist/commands/close/issue.js +0 -58
  56. package/dist/commands/close/issue.js.map +0 -1
  57. package/dist/commands/delete/doc.d.ts +0 -17
  58. package/dist/commands/delete/doc.d.ts.map +0 -1
  59. package/dist/commands/delete/doc.js +0 -75
  60. package/dist/commands/delete/doc.js.map +0 -1
  61. package/dist/commands/delete/issue.d.ts.map +0 -1
  62. package/dist/commands/delete/issue.js.map +0 -1
  63. package/dist/commands/duplicate/doc.d.ts +0 -19
  64. package/dist/commands/duplicate/doc.d.ts.map +0 -1
  65. package/dist/commands/duplicate/doc.js +0 -87
  66. package/dist/commands/duplicate/doc.js.map +0 -1
  67. package/dist/commands/duplicate/issue.d.ts.map +0 -1
  68. package/dist/commands/duplicate/issue.js.map +0 -1
  69. package/dist/commands/list/docs.d.ts +0 -15
  70. package/dist/commands/list/docs.d.ts.map +0 -1
  71. package/dist/commands/list/docs.js +0 -60
  72. package/dist/commands/list/docs.js.map +0 -1
  73. package/dist/commands/list/issues.d.ts.map +0 -1
  74. package/dist/commands/list/issues.js +0 -86
  75. package/dist/commands/list/issues.js.map +0 -1
  76. package/dist/commands/move/doc.d.ts +0 -18
  77. package/dist/commands/move/doc.d.ts.map +0 -1
  78. package/dist/commands/move/doc.js +0 -82
  79. package/dist/commands/move/doc.js.map +0 -1
  80. package/dist/commands/move/issue.d.ts.map +0 -1
  81. package/dist/commands/move/issue.js.map +0 -1
  82. package/dist/commands/update/doc.d.ts +0 -20
  83. package/dist/commands/update/doc.d.ts.map +0 -1
  84. package/dist/commands/update/doc.js +0 -73
  85. package/dist/commands/update/doc.js.map +0 -1
  86. package/dist/commands/update/issue.d.ts.map +0 -1
  87. package/dist/commands/update/issue.js +0 -107
  88. package/dist/commands/update/issue.js.map +0 -1
@@ -1,10 +1,11 @@
1
1
  import { Command } from '@oclif/core';
2
2
  /**
3
- * Close an issue by display number
3
+ * Close an item by setting its status to closed
4
4
  */
5
5
  export default class Close extends Command {
6
6
  static args: {
7
- identifier: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
9
  };
9
10
  static description: string;
10
11
  static examples: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAWlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IAExC,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAqC;IAGhE,OAAgB,QAAQ,WAIvB;IAGD,OAAgB,KAAK;;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BlC"}
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAYlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IAExC,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAAkD;IAG7E,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwDlC"}
@@ -1,29 +1,35 @@
1
1
  // eslint-disable-next-line import/order
2
2
  import { Args, Command, Flags } from '@oclif/core';
3
- import { daemonUpdateIssue } from '../daemon/daemon-update-issue.js';
3
+ import { daemonUpdateItem } from '../daemon/daemon-update-item.js';
4
4
  import { projectFlag } from '../flags/project-flag.js';
5
- import { CloseEntityError } from '../lib/close/close-entity-error.js';
6
5
  import { ensureInitialized, NotInitializedError, } from '../utils/ensure-initialized.js';
7
6
  import { resolveProjectPath } from '../utils/resolve-project-path.js';
7
+ import { toPlural } from '../utils/to-plural.js';
8
+ import { resolveItemId } from '../lib/resolve-item-id/resolve-item-id.js';
8
9
  /**
9
- * Close an issue by display number
10
+ * Close an item by setting its status to closed
10
11
  */
11
12
  // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
12
13
  export default class Close extends Command {
13
14
  // eslint-disable-next-line no-restricted-syntax
14
15
  static args = {
15
- identifier: Args.string({
16
- description: 'Display number (#N or N) or UUID',
16
+ type: Args.string({
17
+ description: 'Item type (e.g., issue, epic, or custom type)',
18
+ required: true,
19
+ }),
20
+ id: Args.string({
21
+ description: 'Item ID (UUID or display number)',
17
22
  required: true,
18
23
  }),
19
24
  };
20
25
  // eslint-disable-next-line no-restricted-syntax
21
- static description = 'Close an issue by display number';
26
+ static description = 'Close an item by setting its status to closed';
22
27
  // eslint-disable-next-line no-restricted-syntax
23
28
  static examples = [
24
- '<%= config.bin %> close 1',
25
- '<%= config.bin %> close #1',
26
- '<%= config.bin %> close 1 --project centy-daemon',
29
+ '<%= config.bin %> close issue 1',
30
+ '<%= config.bin %> close epic 1',
31
+ '<%= config.bin %> close issue abc123-uuid',
32
+ '<%= config.bin %> close epic 1 --project centy-daemon',
27
33
  ];
28
34
  // eslint-disable-next-line no-restricted-syntax
29
35
  static flags = {
@@ -35,11 +41,7 @@ export default class Close extends Command {
35
41
  };
36
42
  async run() {
37
43
  const { args, flags } = await this.parse(Close);
38
- const displayNumberMatch = args.identifier.match(/^#?(\d+)$/);
39
- if (!displayNumberMatch) {
40
- this.error('Invalid identifier. Please provide a display number (e.g., 1 or #1)');
41
- }
42
- const displayNumber = Number.parseInt(displayNumberMatch[1], 10);
44
+ const itemType = toPlural(args.type);
43
45
  const cwd = await resolveProjectPath(flags.project);
44
46
  try {
45
47
  await ensureInitialized(cwd);
@@ -50,31 +52,36 @@ export default class Close extends Command {
50
52
  }
51
53
  throw error instanceof Error ? error : new Error(String(error));
52
54
  }
53
- await closeIssue(cwd, args.identifier, displayNumber, flags.json, this.log.bind(this));
54
- }
55
- }
56
- async function closeIssue(cwd, issueId, displayNumber, json, log) {
57
- const response = await daemonUpdateIssue({
58
- projectPath: cwd,
59
- issueId,
60
- status: 'closed',
61
- title: '',
62
- description: '',
63
- priority: 0,
64
- customFields: {},
65
- });
66
- if (!response.success) {
67
- throw new CloseEntityError(response.error);
68
- }
69
- if (json) {
70
- log(JSON.stringify({
71
- type: 'issue',
72
- displayNumber: response.issue.displayNumber,
55
+ const itemId = await resolveItemId(args.id, itemType, cwd, msg => this.error(msg));
56
+ const response = await daemonUpdateItem({
57
+ projectPath: cwd,
58
+ itemType,
59
+ itemId,
73
60
  status: 'closed',
74
- }, null, 2));
75
- }
76
- else {
77
- log(`Closed issue #${response.issue.displayNumber}`);
61
+ title: '',
62
+ body: '',
63
+ priority: 0,
64
+ customFields: {},
65
+ });
66
+ if (!response.success) {
67
+ this.error(response.error);
68
+ }
69
+ const item = response.item;
70
+ const meta = item.metadata;
71
+ const displayNum = meta !== undefined && meta.displayNumber > 0
72
+ ? `#${meta.displayNumber}`
73
+ : itemId;
74
+ if (flags.json) {
75
+ this.log(JSON.stringify({
76
+ type: args.type,
77
+ id: item.id,
78
+ displayNumber: meta !== undefined ? meta.displayNumber : undefined,
79
+ status: 'closed',
80
+ }, null, 2));
81
+ }
82
+ else {
83
+ this.log(`Closed ${args.type} ${displayNum}`);
84
+ }
78
85
  }
79
86
  }
80
87
  //# sourceMappingURL=close.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"close.js","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { Command } from '@oclif/core';
2
2
  /**
3
- * Delete an issue
3
+ * Delete an item by type and identifier
4
4
  */
5
- export default class DeleteIssue extends Command {
5
+ export default class Delete extends Command {
6
6
  static args: {
7
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
8
  id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
9
  };
9
10
  static description: string;
@@ -14,4 +15,4 @@ export default class DeleteIssue extends Command {
14
15
  };
15
16
  run(): Promise<void>;
16
17
  }
17
- //# sourceMappingURL=issue.d.ts.map
18
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAYlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IAEzC,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAA0C;IAGrE,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;MAOpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiDlC"}
@@ -1,29 +1,35 @@
1
1
  // eslint-disable-next-line import/order
2
2
  import { Args, Command, Flags } from '@oclif/core';
3
- import { daemonDeleteItem } from '../../daemon/daemon-delete-item.js';
4
- import { projectFlag } from '../../flags/project-flag.js';
5
- import { ensureInitialized, NotInitializedError, } from '../../utils/ensure-initialized.js';
6
- import { resolveProjectPath } from '../../utils/resolve-project-path.js';
3
+ import { daemonDeleteItem } from '../daemon/daemon-delete-item.js';
4
+ import { projectFlag } from '../flags/project-flag.js';
5
+ import { ensureInitialized, NotInitializedError, } from '../utils/ensure-initialized.js';
6
+ import { resolveProjectPath } from '../utils/resolve-project-path.js';
7
+ import { toPlural } from '../utils/to-plural.js';
8
+ import { resolveItemId } from '../lib/resolve-item-id/resolve-item-id.js';
7
9
  /**
8
- * Delete an issue
10
+ * Delete an item by type and identifier
9
11
  */
10
12
  // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
- export default class DeleteIssue extends Command {
13
+ export default class Delete extends Command {
12
14
  // eslint-disable-next-line no-restricted-syntax
13
15
  static args = {
16
+ type: Args.string({
17
+ description: 'Item type (e.g., issue, epic, or custom type)',
18
+ required: true,
19
+ }),
14
20
  id: Args.string({
15
- description: 'Issue ID (UUID) or display number',
21
+ description: 'Item ID (UUID, display number, or slug)',
16
22
  required: true,
17
23
  }),
18
24
  };
19
25
  // eslint-disable-next-line no-restricted-syntax
20
- static description = 'Delete an issue';
26
+ static description = 'Delete an item by type and identifier';
21
27
  // eslint-disable-next-line no-restricted-syntax
22
28
  static examples = [
23
29
  '<%= config.bin %> delete issue 1',
24
- '<%= config.bin %> delete issue abc123-uuid',
25
- '<%= config.bin %> delete issue 1 --force',
26
- '<%= config.bin %> delete issue 1 --project centy-daemon',
30
+ '<%= config.bin %> delete epic 1 --force',
31
+ '<%= config.bin %> delete bug abc123-uuid',
32
+ '<%= config.bin %> delete epic 1 --project centy-daemon',
27
33
  ];
28
34
  // eslint-disable-next-line no-restricted-syntax
29
35
  static flags = {
@@ -35,7 +41,8 @@ export default class DeleteIssue extends Command {
35
41
  project: projectFlag,
36
42
  };
37
43
  async run() {
38
- const { args, flags } = await this.parse(DeleteIssue);
44
+ const { args, flags } = await this.parse(Delete);
45
+ const itemType = toPlural(args.type);
39
46
  const cwd = await resolveProjectPath(flags.project);
40
47
  try {
41
48
  await ensureInitialized(cwd);
@@ -53,7 +60,7 @@ export default class DeleteIssue extends Command {
53
60
  output: process.stdout,
54
61
  });
55
62
  const answer = await new Promise(resolve => {
56
- rl.question(`Are you sure you want to delete issue ${args.id}? (y/N) `, resolve);
63
+ rl.question(`Are you sure you want to delete ${args.type} ${args.id}? (y/N) `, resolve);
57
64
  });
58
65
  rl.close();
59
66
  if (answer.toLowerCase() !== 'y') {
@@ -61,16 +68,17 @@ export default class DeleteIssue extends Command {
61
68
  return;
62
69
  }
63
70
  }
71
+ const itemId = await resolveItemId(args.id, itemType, cwd, msg => this.error(msg));
64
72
  const response = await daemonDeleteItem({
65
73
  projectPath: cwd,
66
- itemType: 'issues',
67
- itemId: args.id,
74
+ itemType,
75
+ itemId,
68
76
  force: false,
69
77
  });
70
78
  if (!response.success) {
71
79
  this.error(response.error);
72
80
  }
73
- this.log(`Deleted issue ${args.id}`);
81
+ this.log(`Deleted ${args.type} ${args.id}`);
74
82
  }
75
83
  }
76
- //# sourceMappingURL=issue.js.map
84
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { Command } from '@oclif/core';
2
2
  /**
3
- * Duplicate an issue (same or different project)
3
+ * Duplicate an item of any type to the same or a different project
4
4
  */
5
- export default class DuplicateIssue extends Command {
5
+ export default class Duplicate extends Command {
6
6
  static args: {
7
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
8
  id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
9
  };
9
10
  static description: string;
@@ -11,8 +12,9 @@ export default class DuplicateIssue extends Command {
11
12
  static flags: {
12
13
  to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
14
  title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'new-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
16
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
17
  };
16
18
  run(): Promise<void>;
17
19
  }
18
- //# sourceMappingURL=issue.d.ts.map
20
+ //# sourceMappingURL=duplicate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate.d.ts","sourceRoot":"","sources":["../../src/commands/duplicate.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAYlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAE5C,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAC6B;IAGxD,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;;;MAYpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4DlC"}
@@ -1,48 +1,57 @@
1
1
  // eslint-disable-next-line import/order
2
2
  import { Args, Command, Flags } from '@oclif/core';
3
- import { daemonDuplicateIssue } from '../../daemon/daemon-duplicate-issue.js';
4
- import { projectFlag } from '../../flags/project-flag.js';
5
- import { ensureInitialized, NotInitializedError, } from '../../utils/ensure-initialized.js';
6
- import { resolveProjectPath } from '../../utils/resolve-project-path.js';
3
+ import { daemonDuplicateItem } from '../daemon/daemon-duplicate-item.js';
4
+ import { ensureInitialized, NotInitializedError, } from '../utils/ensure-initialized.js';
5
+ import { projectFlag } from '../flags/project-flag.js';
6
+ import { resolveProjectPath } from '../utils/resolve-project-path.js';
7
+ import { toPlural } from '../utils/to-plural.js';
8
+ import { resolveItemId } from '../lib/resolve-item-id/resolve-item-id.js';
7
9
  /**
8
- * Duplicate an issue (same or different project)
10
+ * Duplicate an item of any type to the same or a different project
9
11
  */
10
12
  // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
- export default class DuplicateIssue extends Command {
13
+ export default class Duplicate extends Command {
12
14
  // eslint-disable-next-line no-restricted-syntax
13
15
  static args = {
16
+ type: Args.string({
17
+ description: 'Item type (e.g., issue, epic, or custom type)',
18
+ required: true,
19
+ }),
14
20
  id: Args.string({
15
- description: 'Issue ID (UUID) or display number',
21
+ description: 'Item ID (UUID, display number, or slug)',
16
22
  required: true,
17
23
  }),
18
24
  };
19
25
  // eslint-disable-next-line no-restricted-syntax
20
- static description = 'Duplicate an issue (same project or different project)';
26
+ static description = 'Duplicate an item to the same or a different project';
21
27
  // eslint-disable-next-line no-restricted-syntax
22
28
  static examples = [
23
29
  '<%= config.bin %> duplicate issue 1',
24
- '<%= config.bin %> duplicate issue 1 --title "New feature branch"',
25
- '<%= config.bin %> duplicate issue abc123-uuid --to /path/to/other/project',
26
- '<%= config.bin %> duplicate issue 5 --to ../other --title "Copy for testing"',
30
+ '<%= config.bin %> duplicate epic 1 --title "Copy of epic"',
31
+ '<%= config.bin %> duplicate bug abc123-uuid --to /path/to/other/project',
32
+ '<%= config.bin %> duplicate epic 1 --project centy-daemon',
27
33
  ];
28
34
  // eslint-disable-next-line no-restricted-syntax
29
35
  static flags = {
30
36
  to: Flags.string({
31
- char: 't',
32
- description: 'Target project path (defaults to same project if not specified)',
37
+ description: 'Target project path (defaults to same project)',
33
38
  }),
34
39
  title: Flags.string({
40
+ char: 't',
35
41
  description: 'Title for the duplicate (defaults to "Copy of {original}")',
36
42
  }),
43
+ 'new-id': Flags.string({
44
+ description: 'New ID for the copy (for slug-identified types)',
45
+ }),
37
46
  project: projectFlag,
38
47
  };
39
48
  async run() {
40
- const { args, flags } = await this.parse(DuplicateIssue);
49
+ const { args, flags } = await this.parse(Duplicate);
50
+ const itemType = toPlural(args.type);
41
51
  const sourceProjectPath = await resolveProjectPath(flags.project);
42
- const targetProjectPath = flags.to
52
+ const targetProjectPath = flags.to !== undefined
43
53
  ? await resolveProjectPath(flags.to)
44
54
  : sourceProjectPath;
45
- // Ensure source project is initialized
46
55
  try {
47
56
  await ensureInitialized(sourceProjectPath);
48
57
  }
@@ -52,7 +61,6 @@ export default class DuplicateIssue extends Command {
52
61
  }
53
62
  throw error instanceof Error ? error : new Error(String(error));
54
63
  }
55
- // Ensure target project is initialized (if different)
56
64
  if (targetProjectPath !== sourceProjectPath) {
57
65
  try {
58
66
  await ensureInitialized(targetProjectPath);
@@ -64,19 +72,25 @@ export default class DuplicateIssue extends Command {
64
72
  throw error instanceof Error ? error : new Error(String(error));
65
73
  }
66
74
  }
67
- const response = await daemonDuplicateIssue({
75
+ const itemId = await resolveItemId(args.id, itemType, sourceProjectPath, msg => this.error(msg));
76
+ const response = await daemonDuplicateItem({
68
77
  sourceProjectPath,
69
- issueId: args.id,
78
+ itemType,
79
+ itemId,
70
80
  targetProjectPath,
81
+ newId: flags['new-id'] !== undefined ? flags['new-id'] : '',
71
82
  newTitle: flags.title !== undefined ? flags.title : '',
72
83
  });
73
84
  if (!response.success) {
74
85
  this.error(response.error);
75
86
  }
76
- const locationInfo = targetProjectPath !== sourceProjectPath
77
- ? ` in ${targetProjectPath}`
78
- : ' in current project';
79
- this.log(`Duplicated issue → #${response.issue.displayNumber} "${response.issue.title}"${locationInfo}`);
87
+ const newItem = response.item;
88
+ const meta = newItem.metadata;
89
+ const displayNum = meta !== undefined && meta.displayNumber > 0
90
+ ? `#${meta.displayNumber}`
91
+ : newItem.id;
92
+ const locationInfo = targetProjectPath !== sourceProjectPath ? ` in ${targetProjectPath}` : '';
93
+ this.log(`Duplicated ${args.type} → ${displayNum} "${newItem.title}"${locationInfo}`);
80
94
  }
81
95
  }
82
- //# sourceMappingURL=issue.js.map
96
+ //# sourceMappingURL=duplicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate.js","sourceRoot":"","sources":["../../src/commands/duplicate.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,20 @@
1
1
  import { Command } from '@oclif/core';
2
2
  /**
3
- * List all issues in the .centy/issues folder
3
+ * List items of any type
4
4
  */
5
- export default class ListIssues extends Command {
5
+ export default class List extends Command {
6
+ static args: {
7
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
6
9
  static description: string;
7
- static aliases: string[];
8
10
  static examples: string[];
9
11
  static flags: {
10
12
  status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
13
  priority: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'include-deleted': import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
15
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
- draft: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
16
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
17
  };
16
18
  run(): Promise<void>;
17
19
  }
18
- //# sourceMappingURL=issues.d.ts.map
20
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAWlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IAEvC,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAA2B;IAGtD,OAAgB,QAAQ,WAOvB;IAGD,OAAgB,KAAK;;;;;;MAkBpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoDlC"}
@@ -0,0 +1,96 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonListItems } from '../daemon/daemon-list-items.js';
4
+ import { projectFlag } from '../flags/project-flag.js';
5
+ import { ensureInitialized, NotInitializedError, } from '../utils/ensure-initialized.js';
6
+ import { resolveProjectPath } from '../utils/resolve-project-path.js';
7
+ import { toPlural } from '../utils/to-plural.js';
8
+ /**
9
+ * List items of any type
10
+ */
11
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
12
+ export default class List extends Command {
13
+ // eslint-disable-next-line no-restricted-syntax
14
+ static args = {
15
+ type: Args.string({
16
+ description: 'Item type (e.g., issue, doc, epic, or custom type)',
17
+ required: true,
18
+ }),
19
+ };
20
+ // eslint-disable-next-line no-restricted-syntax
21
+ static description = 'List items of any type';
22
+ // eslint-disable-next-line no-restricted-syntax
23
+ static examples = [
24
+ '<%= config.bin %> list issues',
25
+ '<%= config.bin %> list epics',
26
+ '<%= config.bin %> list epics --status open',
27
+ '<%= config.bin %> list epics --priority 1',
28
+ '<%= config.bin %> list bugs --json',
29
+ '<%= config.bin %> list issues --project centy-daemon',
30
+ ];
31
+ // eslint-disable-next-line no-restricted-syntax
32
+ static flags = {
33
+ status: Flags.string({
34
+ char: 's',
35
+ description: 'Filter by status (e.g., open, in-progress, closed)',
36
+ }),
37
+ priority: Flags.integer({
38
+ char: 'p',
39
+ description: 'Filter by priority level (1 = highest)',
40
+ }),
41
+ 'include-deleted': Flags.boolean({
42
+ description: 'Include soft-deleted items',
43
+ default: false,
44
+ }),
45
+ json: Flags.boolean({
46
+ description: 'Output as JSON',
47
+ default: false,
48
+ }),
49
+ project: projectFlag,
50
+ };
51
+ async run() {
52
+ const { args, flags } = await this.parse(List);
53
+ const itemType = toPlural(args.type);
54
+ const cwd = await resolveProjectPath(flags.project);
55
+ try {
56
+ await ensureInitialized(cwd);
57
+ }
58
+ catch (error) {
59
+ if (error instanceof NotInitializedError) {
60
+ this.error(error.message);
61
+ }
62
+ throw error instanceof Error ? error : new Error(String(error));
63
+ }
64
+ const response = await daemonListItems({
65
+ projectPath: cwd,
66
+ itemType,
67
+ status: flags.status !== undefined ? flags.status : '',
68
+ priority: flags.priority !== undefined ? flags.priority : 0,
69
+ includeDeleted: flags['include-deleted'],
70
+ limit: 0,
71
+ offset: 0,
72
+ });
73
+ if (!response.success) {
74
+ this.error(response.error);
75
+ }
76
+ if (flags.json) {
77
+ this.log(JSON.stringify(response.items, null, 2));
78
+ return;
79
+ }
80
+ if (response.items.length === 0) {
81
+ this.log(`No ${itemType} found.`);
82
+ return;
83
+ }
84
+ this.log(`Found ${response.totalCount} ${itemType}:\n`);
85
+ for (const item of response.items) {
86
+ const meta = item.metadata;
87
+ const displayNum = meta !== undefined && meta.displayNumber > 0
88
+ ? `#${meta.displayNumber} `
89
+ : '';
90
+ const status = meta !== undefined && meta.status !== '' ? ` [${meta.status}]` : '';
91
+ const priority = meta !== undefined && meta.priority > 0 ? ` [P${meta.priority}]` : '';
92
+ this.log(`${displayNum}${item.title}${status}${priority}`);
93
+ }
94
+ }
95
+ }
96
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  import { Command } from '@oclif/core';
2
2
  /**
3
- * Move an issue to a different project
3
+ * Move an item of any type to a different project
4
4
  */
5
- export default class MoveIssue extends Command {
5
+ export default class Move extends Command {
6
6
  static args: {
7
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
8
  id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
9
  };
9
10
  static description: string;
10
11
  static examples: string[];
11
12
  static flags: {
12
13
  to: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'new-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
15
  project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
16
  };
15
17
  run(): Promise<void>;
16
18
  }
17
- //# sourceMappingURL=issue.d.ts.map
19
+ //# sourceMappingURL=move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAYlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IAEvC,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAAwC;IAGnE,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;;MAUpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwDlC"}